R:使用clusterExport()将库加载到群集中

eh57zj3b  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(210)

我正在尝试用R的parallel包寻找加快将对象加载到集群中的方法:
到目前为止,我一直使用这种方法将对象加载到集群中:

# Generate cluster
cl <- parallel::makeCluster(n_threads)

# Load constants into each node's environment
parallel::clusterEvalQ(cl, expr = {
  library(glmGamPoi)
  NULL
})
parallel::clusterExport(cl, list('neg_binomial_fit', # Functions
                                 'cell_attr', 'bin_size'), env = environment()) # Objects

然而,我注意到我也可以像这样将主进程中加载的库导出到集群中(这是我的下游代码的一部分),而且它加载包的速度似乎快得多(我假设是因为它只是从主进程复制库):

# Load constants into each node's environment
parallel::clusterExport(cl, list('Matrix', # Packages
                                 'corcounts_and_calcresvar', # Functions
                                 'cell_attr', 'min_var', 'clip_range', 'bin_size'), env = environment()) # Objects

这里我没有使用clusterEvalQ(cl, { library(package_name) })Matrix包加载到每个节点(需要它,以便集群知道如何对稀疏矩阵进行子集化),而是使用clusterExport导出加载的包。当我尝试使用glmGamPoi的初始代码执行此操作时,由于某种原因,它不起作用,而是返回Error in get(name, envir = envir) : object 'glmGamPoi' not found
现在我在想Matrix是一个独特的例子,或者glmGamPoi隐藏在我的全局环境中,所以我不能发送它,除非通过某种特殊的方式访问它。我试过在导出它之前加载库,但也不起作用,所以我只是不知所措。我也试过其他随机包,如BiocManager,这些也不起作用。

qkf9rpyu

qkf9rpyu1#

正如您在后续评论中所说,导出"Matrix"将导出Matrix::Matrix对象,这将触发Matrix包被 loaded,而不是 attached

parallel::clusterEvalQ(cl, loadedNamespace("Matrix"))

如果您在新的R会话中执行以下操作,则可以看到这一点:

> cl <- parallel::makeCluster(1L)
> parallel::clusterEvalQ(cl, "Matrix" %in% loadedNamespaces())
[[1]]
[1] FALSE   ## 'Matrix' is not loaded on the parallel worker

然后继续:

library(Matrix)
> parallel::clusterEvalQ(cl, "Matrix" %in% loadedNamespaces())
[[1]]
[1] FALSE   ## still not loaded ("obviously")

> parallel::clusterExport(cl, "Matrix")
> parallel::clusterEvalQ(cl, "Matrix" %in% loadedNamespaces())
[[1]]
[1] TRUE    ## 'Matrix' was loaded because of the export of Matrix::Matrix

注意矩阵只是 * 加载 *,不是 * 附加 *;

> parallel::clusterEvalQ(cl, "package::Matrix" %in% search())
[[1]]
[1] FALSE

这很好;所有特定于Matrix的运算符都能正常工作,包括子集化。
因此,您可以更换:

parallel::clusterEvalQ(cl, library("Matrix"))

以及

parallel::clusterEvalQ(cl, loadedNamespace("Matrix"))

明确说明您在并行工作者中依赖于哪些包,同时清楚地表明它们不需要被 attached

相关问题