[英]R programming - submitting jobs on a multiple node linux cluster using PBS
我在多节点 Linux 集群上运行 R。 我想使用脚本或批处理模式在 R 上运行我的分析,而不使用 MPI 或 snow 等并行计算软件。
我知道这可以通过划分输入数据来完成,以便每个节点运行数据的不同部分。
我的问题是我该怎么做呢? 我不确定我应该如何编码我的脚本。 一个例子会很有帮助!
到目前为止,我一直在使用 PBS 运行我的脚本,但它似乎只在一个节点上运行,因为 R 是一个单线程程序。 因此,我需要弄清楚如何调整我的代码,以便将劳动力分配到所有节点。
到目前为止,这是我一直在做的事情:
1)命令行:
> qsub myjobs.pbs
2)myjobs.pbs:
> #!/bin/sh
> #PBS -l nodes=6:ppn=2
> #PBS -l walltime=00:05:00
> #PBS -l arch=x86_64
>
> pbsdsh -v $PBS_O_WORKDIR/myscript.sh
3)myscript.sh:
#!/bin/sh
cd $PBS_O_WORKDIR
R CMD BATCH --no-save my_script.R
4) my_script.R:
> library(survival)
> ...
> write.table(test,"TESTER.csv",
> sep=",", row.names=F, quote=F)
任何建议将不胜感激! 谢谢!
-CC
这是一个 PBS 问题; 我通常会制作一个 R 脚本(在 #! 之后使用 Rscript 路径)并让它收集一个参数(使用commandArgs
函数)来控制当前实例应该制作的“工作的一部分”。 因为我经常使用multicore
,所以我通常只需要使用 3-4 个节点,所以我只提交了一些使用每个可能的控制参数值调用这个 R 脚本的作业。
另一方面,你对pbsdsh
的使用应该可以完成它的工作......然后PBS_TASKNUM
的值可以用作控制参数。
这是对相关问题的回答 - 但它也是对上述评论的回答(也是)。
对于我们的大部分工作,我们确实使用 qsub(代替)并行运行多个 R 会话。
如果是针对多个文件,我通常会这样做:
while read infile rest
do
qsub -v infile=$infile call_r.pbs
done < list_of_infiles.txt
call_r.pbs:
...
R --vanilla -f analyse_file.R $infile
...
analyze_file.R:
args <- commandArgs()
infile=args[5]
outfile=paste(infile,".out",sep="")...
然后我之后合并所有输出......
这个问题似乎非常适合使用 GNU 并行。 GNU parallel在这里有一个很好的教程。 我不熟悉pbsdsh
,而且我是 HPC 的新手,但在我看来pbsdsh
的用途与 GNU parallel
类似。 我也不熟悉从带有参数的命令行启动 R,但这是我对 PBS 文件外观的猜测:
#!/bin/sh
#PBS -l nodes=6:ppn=2
#PBS -l walltime=00:05:00
#PBS -l arch=x86_64
...
parallel -j2 --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
Rscript myscript.R {} :::: infilelist.txt
其中infilelist.txt
列出了您要处理的数据文件,例如:
inputdata01.dat
inputdata02.dat
...
inputdata12.dat
您的myscript.R
将访问命令行参数以加载和处理指定的输入文件。
我这个答案的主要目的是指出 GNU 并行的可用性,它是在原始问题发布后出现的。 希望其他人可以提供一个更具体的例子。 此外,我仍然对我使用的parallel
感到不安,例如,我不确定-j2
选项。 (请参阅我的相关问题。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.