所以我遵循了iml短片中的例子,关于在找到here的情况下并行运行计算。然而,我有几个我不理解的问题。
首先,在示例中,他调用了future库和future.callr库,然后创建了一个具有2个内核的PSOCK集群,如下所示:
library("future")
library("future.callr")
# Creates a PSOCK cluster with 2 cores
plan("callr", workers = 2)然而,这对我来说一点也不管用...如果我使用plan("callr", workers = 2),那么,当我尝试进行任何计算时,它都会永远挂起,直到我终止该进程。
相反,我使用的是plan(cluster),它至少看起来完成了计算。但是,如果我继续按照插图中的示例来计算交互强度,那么处理时间确实要快得多……但挂钟时间现在慢了很多。下面的代码概述了这一点:
library("iml")
library("randomForest")
library("future") # used for parallel computing
library("bench") # used to measure system time
# Get data
data("Boston", package = "MASS")
X <- Boston[which(names(Boston) != "medv")]
# create randomForest model
rf <- randomForest(medv ~ ., data = Boston)
# iml predictor
predictor <- Predictor$new(rf, data = X, y = Boston$medv)
# run interaction calc sequentially
system_time({
plan(sequential)
Interaction$new(predictor)
})
# process = 15.9s real = 11.2s
# run interaction calc in parallel
system_time({
plan(cluster, workers = 2)
Interaction$new(predictor)
})
# process = 760ms real = 15.1s因此,正如上面所看到的,处理时间要快得多。但实时速度明显较慢,这似乎有点违背了并行计算的目的!?当你增加变量/观察值的数量时,这个问题似乎变得更加普遍。当我使用一个有10个变量和300个观测值的数据集时,没有并行的实时= ~30s,并行= ~50s。
我的问题是,这是怎么回事?我是否遗漏了一些关于并行计算的基本概念,或者我的实现是错误的?为什么在进行并行计算时,挂钟(实时)时间会变得如此缓慢?
奖金问题cores和workers的区别是什么?future包有两个名为availableCores和availableWorkers的函数,但我不确定有什么区别?
发布于 2020-06-24 03:04:22
并行并不是万能的。如果将数据传入和传出工作进程所需的时间比并行处理数据所节省的时间要长,那么挂钟时间将会更长。cores表示有多少物理CPU核心存在或可供分配。workers是您希望在可用或已分配的cores之间分配的进程数。
您还没有告诉我们您的Mac机的处理器芯片是什么&它有多少物理核心,所以很难评论要创建的workers的最佳数量。
除此之外,我可能会建议您查看bigparallelr和parallel包,以了解更多的用法,并了解它们是否更适合您的需求。
https://stackoverflow.com/questions/62540317
复制相似问题