我正在尝试在 conda 环境“myenv”内通过 qsub 提交的大学计算集群上运行单节点作业。一旦我在 R 脚本中开始并行化,不同的处理器就会从基本环境而不是“myenv”开始。测试并行化在基本环境中完美运行,因此问题是为所有处理器启动“myenv”。环境“myenv”也适用于第一个处理器。
我通过 qsub 提交以下 bash 脚本(1 个节点,20 个处理器):
source /mypath/conda.sh
conda activate myenv
Rscript myscript.R
我正在使用具有最新 R 版本和特定软件包的 conda 环境。集群上的基础环境有一个非常过时的 R 版本,它与我需要的包(例如 raster)不兼容。 (根据 IT 的说法,更新集群上的基础环境是不可能的)。
这是我的 R 脚本:
require(raster)
require(doSNOW)
r1 <- raster("raster1.tif") # works perfectly (conda environment is activated here)
nc = 19
cl = makeSOCKcluster(nc)
registerDoSNOW(cl)
foreach(f=1:19) %dopar% {
require(raster) # does not work (conda environment is not activated here)
# (error: there is no package called raster)
r2 <- raster("raster2.tif")
}
我已经尝试过(没有一个对我有用):
foreach(f=1:19, .packages = c("raster")) %dopar% {...}
sytem2
)加载 conda 环境%dofuture%
.libPaths("mypath")
从包文件夹加载包:适用于某些包,但不适用于与旧的base-R版本不兼容的其他包请问有人可以帮忙吗?非常感谢。
尝试以下使用 MPI 的 shell 脚本。这与您的套接字集群差不多,只是它使用 MPI,这在 HPC 集群上更常见。它只会运行您的代码的 19 个副本。您的
module load
名称和要求可能因集群而异。在运行此命令之前,您还需要在登录节点 R 会话中install.packages("pbdMPI")
。
#!/bin/bash
#PBS <your-pbs-requests>
#PBS ...
module load conda
module load OpenMPI
module load r
source /mypath/conda.sh
conda activate myenv
mpirun -n 19 Rscript myscript.R
和 R 脚本
require(raster)
require(pbdMPI)
rank = comm.rank()
# you probably need to form file names from ranks
filename = paste0("raster", rank, ".tif")
r <- raster(filename)
# rest of your code
如果您运行 19 个代码副本,则实例排名将为 0 到 18,从而导致读取不同的文件名。
这简化了您的 R 代码。如果需要合并 19 个副本的结果,请考虑
pbdMPI中的
allreduce()
和 allgather()
。这种方法称为单程序多数据(SPMD),它比 doSNOW 的管理器-工人风格更加通用和可扩展。