r语言 - 在Slurm中使用作业数组并行化Rscript



我想运行一个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"文件。

我想要的,是填充文件夹~/test/与10个文件,1。, 2。了,……10。输出,并且每个文件必须包含任务id(简单的数字1,2,…),或10)。

注:请注意,我也试着玩Sys.getenv(),但我认为我不能正确设置。该选项生成10个文件和一个1。输出文件,包含编号10.

注:2:这是19.05.5。我正在conda环境中运行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 

然后小心在你的脚本中,你没有使用相同的变量作为字符串和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,因为它有更多标准的参数约定。

最新更新