所以我遵循iml
小插曲中关于并行运行计算的例子。但是,我遇到了一些我不理解的问题。
首先,在示例中,他调用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 个观测值的数据集时,没有并行的实时 = ~30 秒,有平行的实时 = ~50 秒。
我的问题是,这是怎么回事?我是否错过了一些关于并行计算的基本概念,或者我实现它错了?为什么在进行并行计算时,挂钟(实时(时间会慢得多?
[额外问题]cores
和workers
有什么区别?future
包有 2 个函数,分别称为availableCores
和availableWorkers
,但我不确定有什么区别?
平行不是灵丹妙药。 如果与工作人员之间传递数据所花费的时间比并行处理数据所节省的时间要长,那么挂钟时间会更长。cores
表示存在或可供分配的物理 CPU 内核数。workers
是要在可用或分配的cores
之间分配多少个进程。
您还没有告诉我们Mac的处理器芯片是什么以及它有多少物理内核,因此很难评论要创建的最佳workers
数。
除此之外,我可能会建议查看bigparallelr
和parallel
软件包,以了解有关用法的更多信息,并查看它们是否更适合您的需求。