在 Slurm 中使用作业数组并行化 Rscript

Paralelizing an Rscript using a job array in Slurm

我想 运行 Rscript.R 在 Slurm 中使用数组作业,包含 1-10 个任务,作业中的任务 ID 将被定向到 Rscript,以写入一个文件名为“'task id'.out”,在其主体中包含 'task id'。然而,事实证明这比我预期的更具挑战性哈哈我正在尝试以下操作:

~/bash_test.sh 看起来像:

#!/bin/bash -l
#SBATCH --time=00:01:00
#SBATCH --array=1-10
conda activate R
cd ~/test 
R CMD BATCH --no-save --no-restore ~/Rscript_test.R $SLURM_ARRAY_TASK_ID 

~/Rscript_test.R 看起来像:

#!/usr/bin/env Rscript
taskid = commandArgs(trailingOnly=TRUE)
# taskid <- Sys.getenv('SLURM_ARRAY_TASK_ID')
taskid <- as.data.frame(taskid)
# print task number
print(paste0("the number processed was... ", taskid))
write.table(taskid, paste0("~/test/",taskid,".out"),quote=FALSE, row.names=FALSE, col.names=FALSE)

在我提交作业后 (sbatch bash_test.sh),看起来 R 并没有真正看到 SLURM_ARRAY_TASK_ID。该脚本正在生成 10 个文件(1、2、...、10 - 只是数字 - 可能对应于任务 ID),但它没有写入扩展名为“.out”的文件:脚本写入了一个空的“整数( 0).out”文件。

我想要的是用 10 个文件 1.out、2.out、...、10.out 填充文件夹 ~/test/,并且每个文件都必须包含任务 ID(分别为数字 1、2、... 或 10)。

P.S.: 请注意,我也尝试过使用 Sys.getenv(),但我认为我无法正确设置它。该选项生成 10 个文件和一个 1.out 文件,其中包含数字 10.

P.S.2:这是 slurm 19.05.5。我在 conda 环境中 运行ning R。

您应该避免使用“R CMD BATCH”。它不像大多数函数那样处理参数。一段时间以来,“Rscript”一直是推荐的选项。通过调用“R CMD BATCH”,您基本上忽略了脚本的“#!/usr/bin/env Rscript”部分。

所以将脚本文件更改为

#!/bin/bash -l
#SBATCH --time=00:01:00
#SBATCH --array=1-10
conda activate R
cd ~/test 
Rscript ~/Rscript_test.R $SLURM_ARRAY_TASK_ID 

然后请注意您的脚本中没有使用与字符串 a data.frame 相同的变量。例如,您无法轻松地将 data.frame 粘贴到文件路径中。所以

taskid <- commandArgs(trailingOnly=TRUE)
# taskid <- Sys.getenv('SLURM_ARRAY_TASK_ID')  # This should also work

print(paste0("the number processed was... ", taskid))

outdata <- as.data.frame(taskid)
outfile <- paste0("~/test/", taskid, ".out")

write.table(outdata, outfile, quote=FALSE, row.names=FALSE, col.names=FALSE)

由于 R CMD BATCH 的用法是

,因此创建了仅包含数组编号的额外文件
R CMD BATCH [options] infile [outfile]

因此,您在命令行中传递的 $SLURM_ARRAY_TASK_ID 值被视为输出文件名。相反,该值需要作为选项传递。但是同样,最好使用具有更多标准参数约定的 Rscript。