【问题标题】:Running iml package in parallel results in slower wall-clock time in R?并行运行 iml 包会导致 R 中的挂钟时间变慢?
【发布时间】:2020-11-07 00:41:44
【问题描述】:

所以我遵循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。

我的问题是,这里发生了什么?我是否遗漏了一些关于并行计算的基本概念,还是我实施错误?为什么在进行并行计算时挂钟(实时)时间会慢很多?

[附赠问题]coresworkers 有什么区别? future 包有 2 个函数,分别称为 availableCoresavailableWorkers,但我不确定有什么区别?

【问题讨论】:

    标签: r iml


    【解决方案1】:

    并行并不是万能的。如果将数据传入和传出工作人员所花费的时间比并行处理数据所节省的时间要长,那么挂钟时间会更长。 cores 表示有多少物理 CPU 内核存在或可用于分配。 workers 是您希望在可用或分配的cores 中分配多少进程。

    您还没有告诉我们您的 Mac 的处理器芯片是什么以及它有多少物理内核,因此很难评论要创建的最佳workers 数量。

    除此之外,我可能会建议您查看 bigparallelrparallel 软件包,以了解更多关于使用的信息并查看它们是否更适合您的需求。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多