【问题标题】:Passing an entire package to a snow cluster将整个包裹传递给雪团
【发布时间】:2012-09-02 01:00:02
【问题描述】:

我正在尝试并行化(使用snow::parLapply)一些依赖于包(即snow 之外的包)的代码。在parLapply 调用的函数中引用的对象必须使用clusterExport 显式传递给集群。有没有办法将整个包传递给集群,而不必在clusterExport 中显式命名每个函数(包括用户函数调用的包的内部函数!)?

【问题讨论】:

    标签: r parallel-processing scope


    【解决方案1】:

    在所有节点上安装包,并通过可用命令之一在所有节点上调用library(thePackageYouUse) 代码,例如

     clusterApply(cl, library(thePackageYouUse))
    

    我认为最近的 R 版本附带的 parallel 包有示例 - 例如,请参见此处来自 help(clusterApply)boot 包被加载到任何地方:

     ## A bootstrapping example, which can be done in many ways:
     clusterEvalQ(cl, {
       ## set up each worker.  Could also use clusterExport()
       library(boot)
       cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
       cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
       NULL
     })
    

    【讨论】:

    • 谢谢德克。有什么理由说明clusterExport(ls()) 会很危险吗?这无助于从包中传递函数,但快速并行化依赖大量全局变量的 for 循环(其他人,不是我的!)会省去很多麻烦。
    • 这只是一个糟糕的设计,因为它使用了分散式加厨房水槽的方法。在串行解决方案中设计您需要的内容,然后使其并行。
    • 有些问题比较棘手。让每个节点获取其数据而不是从主节点发送数据可能是有意义的,但有时您不能。这一切都取决于 - 你必须尝试一下。当通信成本相对于计算成本真的很高时,你的收益将是有限的。 r-sig-hpc 列表适合更深入的问题。
    • 我意识到这是一篇旧帖子,但我认为第一个建议 (clusterApply) 应该是:clusterCall(cl, function() library(thePackageYouUse))
    • @CnrL 谢谢你的评论。这正是我所需要的。
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多