在 conda 环境中的计算集群上为 R 中的所有处理器运行单节点作业时出现问题

问题描述 投票:0回答:1

我正在尝试在 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")

}

我已经尝试过(没有一个对我有用):

  1. foreach(f=1:19, .packages = c("raster"))  %dopar% {...}
  2. 在循环中使用系统调用(通过 R 中的
    sytem2
    )加载 conda 环境
  3. 通过
    %dofuture%
  4. 实现并行 for 循环的未来包
  5. 在旧的base-R安装中运行作业并通过
    .libPaths("mypath")
    从包文件夹加载包:适用于某些包,但不适用于与旧的base-R版本不兼容的其他包

请问有人可以帮忙吗?非常感谢。

r parallel-processing conda cluster-computing
1个回答
0
投票

尝试以下使用 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 的管理器-工人风格更加通用和可扩展。

© www.soinside.com 2019 - 2024. All rights reserved.