在R foreach()下并行运行时无法识别动态库依赖项
我正在使用在R foreach()下并行运行时无法识别动态库依赖项,r,linux,environment-variables,parallel-foreach,R,Linux,Environment Variables,Parallel Foreach,我正在使用Rfast包,它导入包RcppZiggurat。我正在Linux集群(Red Hat 6.1)上运行R3.6.3。软件包安装在我的本地目录上,但R安装在系统范围内 当我直接调用Rfast函数(例如,colsums())时,它们工作得很好。但是当我在foreach()循环中调用它们时,如下所示(编辑:正如Rui Barradas指出的那样,我添加了注册集群的代码,但它没有解决问题) 库(Rfast) 图书馆(双平行) 图书馆(foreach) 核心以下工作没有问题。与问题中的代码不同,它
Rfast
包,它导入包RcppZiggurat
。我正在Linux集群(Red Hat 6.1)上运行R3.6.3。软件包安装在我的本地目录上,但R安装在系统范围内
当我直接调用Rfast函数(例如,colsums()
)时,它们工作得很好。但是当我在foreach()
循环中调用它们时,如下所示(编辑:正如Rui Barradas指出的那样,我添加了注册集群的代码,但它没有解决问题)
库(Rfast)
图书馆(双平行)
图书馆(foreach)
核心以下工作没有问题。与问题中的代码不同,它首先检测可用内核的数量,创建一个集群并使其可供foreach
使用
library(Rfast)
library(doParallel)
library(foreach)
cores <- detectCores()
cl <- makeCluster(cores)
registerDoParallel(cl)
set.seed(2020)
A <- matrix(rnorm(1e6), 1000, 1000)
cm <- foreach(n = 1:4,
.combine = rbind,
.packages = "Rfast") %dopar% {
colmeans(A)
}
stopCluster(cl)
str(cm)
#num [1:4, 1:1000] -0.02668 -0.02668 -0.02668 -0.02668 0.00172 ...
# - attr(*, "dimnames")=List of 2
# ..$ : chr [1:4] "result.1" "result.2" "result.3" "result.4"
# ..$ : NULL
库(Rfast)
图书馆(双平行)
图书馆(foreach)
coresforeach的foreach
package在当时非常棒。但是,现在,应该使用future
进行并行计算,只为静态代码分析处理正确的输出到工人。因此,在future
方法下,不需要向.packages=
注册包。此外,future
镜像了通常的R代码,只对设置输出变量作为listenv
进行了轻微更改。例如,我们有:
库(“未来”)
图书馆(“listenv”)
图书馆(“Rfast”)
计划(调整(多进程,工人=2L))
#对于所有磁芯,直接使用:
#计划(多进程)
#生成矩阵一次
A感谢@RuiBarradas和@coatless的回答,我意识到问题不在于foreach()
,因为(1)问题发生在我使用future
运行代码时,以及(2)问题发生在foreach()
代码时,即使在错误的调用中,我没有注册集群。当没有注册群集时,foreach()
将抛出警告并以顺序模式运行。但那没有发生
因此,我意识到问题一定是在调用foreach()
之前发生的。在日志中,它出现在消息加载包RcppZiggurat
之后。加载此程序包时一定出了问题
然后,我检查了RcppZiggurat
的依赖关系,发现它依赖于另一个名为RcppGSL
的包,该包连接R和GSL库。答对了,这就是调用RcppZiggurat时需要libgsl.so.0
的地方
因此,我制作了一个名为test gsl.R
的R脚本,它有以下两行代码
库(RcppZiggurat)
打印('确定')
现在,我在head节点上运行以下命令
$ module load R/3.6.3
$ Rscript test-gsl.R
一切正常。“确定”被打印出来
但是,如果我在计算节点上提交作业,这将不起作用。首先,名为test.sh
的PBS脚本如下
### Resources request
#PBS -l select=1:ncpus=1:mem=1GB
### Walltime
#PBS -l walltime=00:01:00
echo Working directory is $PBS_O_WORKDIR
cd $PBS_O_WORKDIR
### Run R
module load R/3.6.3
Rscript test-gsl.R
然后我跑了
qsub test.sh
错误突然出现了。这意味着在我的系统上,compute节点和head节点之间有一些不同,与包无关。我联系了系统管理员,他向我解释说GSL库在head节点的默认路径上可用,但在compute节点上不可用。因此,在我的shell脚本中,我需要在运行R脚本之前添加模块加载gsl/2.1
。我测试了一下,一切正常
这个解决方案似乎很简单,但我对实现它的Linux管理知之甚少。只有在四处打听并尝试(相当盲目地)许多事情之后,我才最终得出这个解决方案。因此,感谢那些提供帮助的人,我一开始无法准确描述问题,这是我的过错。我还尝试了export-LD\u-LIBRARY\u-PATH=$LD\u-LIBRARY\u-PATH:/usr/lib64/
,并在foreach()
调用中添加了.packages=c('Rfast',RcppZiggurat')
。两个都失败了。你试过重新安装包Rfast
?为什么要在这里重复发布?对不起,@DirkEddelbuettel。我在脆弱和沮丧的时刻发布了GitHub问题。我迫切需要代码来工作,因为我将在一个月内提交我的论文。几天来我一直在尝试解决依赖关系,但它们总是一个接一个地出现,我想放弃。但是在发布GitHub问题几个小时后,我平静下来,做了一些测试,意识到这是因为并行处理。所以我觉得在这里发帖是合适的。我不知道交叉张贴是不合适的。吸取的教训。我很抱歉。@RuiBarradas是的,我尝试过重新安装,首先是RcppZiggurat
,然后是Rfast
,但它没有解决问题。我只是测试了一下,但不幸的是,这对我来说不起作用。我的例子不正确,它意外地再现了错误。但是在实际的用例中,foreach()
是从GA::GA()
调用的,它本身已经完成了集群注册。在Windows上,我不需要单独注册,代码可以正常工作。当我移植到Linux时,它失败了。如果您的问题(@Drumy)是GA::GA
没有成功导出库(我认为这是包中的一个bug),您是否尝试过1)更新包?2) 覆盖函数定义,手动添加导出。这可以使用函数定义的复制粘贴或使用edit(GA::GA)
手动完成。函数本身只调用了一个foreach
,因此很容易修复。谢谢你,奥利弗。是的,GA软件包已更新(实际上它是一个新安装)。但我认为这不仅仅是GA,因为手动导出上面的Rui代码也不起作用。谢谢你的建议。我刚刚尝试了您的代码,但仍然出现相同的错误。@Drumy我删除了futureOf()
部分。如果你经营abo
### Resources request
#PBS -l select=1:ncpus=1:mem=1GB
### Walltime
#PBS -l walltime=00:01:00
echo Working directory is $PBS_O_WORKDIR
cd $PBS_O_WORKDIR
### Run R
module load R/3.6.3
Rscript test-gsl.R
qsub test.sh