多个集群并行处理中的某些节点不可用的对象

时间:2016-09-01 11:03:05

标签: r function parallel-processing

我正在尝试使用genoud中的R遗传优化器来优化函数,library(rgenoud)R的一部分。我限制了在genoud中设置并行处理的经验。

cluster内置makeClusters选项localhost,其名称已知。我想在单个多核机器上设置并行处理。我理解本地机器的名称是genout <- genoud(sin, 1, cluster=c('localhost','localhost','localhost')) ,并且重复该名称将在机器上使用多个核心。

这种方法似乎适用于简单的函数,例如:

fun1 <- function(x) {sin(x)}
fun2 <- function(x) {
  x  <- fun1(x)
  ret <- x + cos(x)
  return(ret)
  }
genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost'))

然而,当我优化更复杂的功能结构时,某些机器或环境找不到所有功能。这是一个例子:

Error in checkForRemoteErrors(val) : 
  3 nodes produced errors; first error: could not find function "fun1"

这会产生错误

fun1

一种解决方案似乎是将fun2嵌入fun2。但是,如果fun1运行了很多次(在其他情况下比愚蠢的例子),这似乎效率低下。解决此问题的唯一方法是在fun2嵌入fun2吗?

修改:即使在嵌入时,当需要通过genoud将对象传递给y=1 fun2 <- function(x,z) { fun1 <- function(x) {sin(x)} x <- fun1(x) ret <- x + cos(x)*z return(ret) } genout <- genoud(fun2, 1, cluster=c('localhost','localhost','localhost'), z=y) >Error in checkForRemoteErrors(val) : 3 nodes produced errors; first error: object 'y' not found 时,还有更多问题,请参阅:

clear: both

1 个答案:

答案 0 :(得分:1)

我认为问题是genoud函数没有正确评估并向工作人员发送其他参数。在这种情况下,参数z将被发送给工作人员而不进行评估,因此工作人员必须对其进行评估,但由于变量y未发送给工作人员,因此它们会失败。 / p>

解决方法是使用clusterExport将必要的变量导出到工作人员,这需要您显式创建要使用的genoud的集群对象:

library(rgenoud)
library(parallel)
cl <- makePSOCKcluster(3)
fun1 <- function(x) {sin(x)}
fun2 <- function(x, z) {
  x  <- fun1(x)
  x + cos(x) * z
}
y <- 1
clusterExport(cl, c('fun1', 'y'))
genout <- genoud(fun2, 1, cluster=cl, z=y)

这也会导出fun1,这是必要的,因为genoud并不知道fun2依赖它。