【问题标题】:Running doRedis- Object not found even when it's been exported运行doRedis-即使已导出也找不到对象
【发布时间】:2014-03-28 19:27:43
【问题描述】:

我正在通过在一台机器上运行工作者和在另一台机器上运行主/服务器来测试 doRedis 包。我的master上的代码是这样的:

 #Register ...
 r <- foreach(a=1:numreps, .export(...)) %dopar% {
        train <- func1(..)

        best <- func2(...)

        weights <- func3(...)

        return ...
      }

在每个函数中,都会访问一个全局变量,但不会对其进行修改。我已经在 foreach 循环的 .export 部分中导出了全局变量,但是每当我运行代码时,都会出现一个错误,指出找不到该变量。有趣的是,当我的所有工作人员都在一台机器上时,代码可以工作,但当我有一个“外部”工作人员时会崩溃。任何想法为什么会发生此错误,以及如何纠正它?

谢谢!

更新:我在这里有一些代码的要点:https://gist.github.com/liangricha/fbf29094474b67333c3b

UPDATE2:我问了另一个与doRedis相关的问题:“是否有可能允许每台工作机器利用其所有内核?

@Steve Weston 回复:“每个核心启动一个 redis worker 通常会充分利用一台机器。”

【问题讨论】:

  • 我认为我们需要查看更多代码。也许是要点中一些扩展 sn-ps 的链接?
  • 嗨!抱歉回复晚了。我在这里上传了一个要点:gist.github.com/liangricha/fbf29094474b67333c3b。并行化发生在“howmanypulses”函数中,“parttable”全局变量的访问发生在“createdataset”函数中。根据 doRedis 的日志,前 300 个作业运行良好,但在第一批 300 个后程序崩溃,并指出找不到对象“parttable1”。诊断此问题的任何帮助都将是最有帮助的。非常感谢!

标签: r parallel-processing redis cluster-computing r-doredis


【解决方案1】:

这种代码在过去对 doParallel、doSNOW 和 doMPI 包来说是个问题,但在过去一年左右的时间里它们进行了改进以更好地处理它。问题是变量被导出到一个特殊的“导出”环境,不是到全局环境。这在各种方面都是可取的,但这意味着后端必须做更多的工作,以便导出的变量在导出函数的范围内。看起来 doRedis 尚未更新以使用这些改进。

这是一个说明问题的简单示例:

library(doRedis)
registerDoRedis('jobs')
startLocalWorkers(3, 'jobs')
glob <- 6
f1 <- function() {
  glob
}
f2 <- function() {
  foreach(1:3, .export=c('f1', 'glob')) %dopar% {
    f1()
  }
}

f2()  # fails with the error: "object 'glob' not found"

如果使用doParallel后端,则成功:

library(doParallel)
cl <- makePSOCKcluster(3)
registerDoParallel(cl)

f2()  # works with doParallel

一种解决方法是定义函数“f1”inside函数“f2”:

f2 <- function() {
  f1 <- function() {
    glob
  }
  foreach(1:3, .export=c('glob')) %dopar% {
    f1()
  }
}

f2()  # works with doParallel and doRedis

另一种解决方案是使用某种机制将变量导出到每个工人的全局环境中。使用 doParallel 或 doSNOW,您可以使用 clusterExport 函数执行此操作,但我不确定如何使用 doRedis 执行此操作。

我会将这个问题报告给 doRedis 包的作者,并建议他更新 doRedis 以处理像 doParallel 这样的导出函数。

【讨论】:

  • @liangricha 每个核心启动一个 redis worker 通常会充分利用机器。
  • 再次感谢您的帮助!由于一个小的语法错误删除了我原来的评论,但用你的跟进更新了我的问题。
  • clusterExport() 的 doRedis 等价物是 setExport() 函数
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2015-04-04
  • 2019-06-20
相关资源
最近更新 更多