我有一个包含20个内核的节点,我想知道如何在这个节点的每10个内核中创建两个作业。 (两个jobs.sh都是一样的,启动job.sh后我修改了main.R的参数然后再次运行job.sh。)
#!/bin/bash
#SBATCH --job-name=main
#SBATCH --mail-use=abc@gmail.com
#SBATCH --mail-type=ALL
#SBATCH --nodes=1 # number of nodes
#SBATCH --ntasks-per-node=10 # number of cores
#SBATCH --time=24:00:00 # walltime
#SBATCH --output=sortie/job.out
#SBATCH --error=sortie/error.err
module load python
module load R
# module load openmpi
R CMD BATCH '--args ../../' main.R sortie/main.Rout
答案 0 :(得分:1)
执行此操作的一种方法是请求所有20个核心:
#SBATCH --ntasks-per-node=20
然后调用两个R脚本并在后台运行它们。每个都不应该使用超过10个核心。所以不要使用detectCores()或类似函数来设置R中的核心数,而是将核心数设置为10:
R CMD BATCH '--args ../../' main1.R sortie/main1.Rout &
R CMD BATCH '--args ../../' main2.R sortie/main2.Rout &
wait
同时,不清楚为什么需要在一个批处理脚本中运行2个脚本。更优化的方法是提交2个作业,其中10个核心分别运行单个R脚本。您可以将参数传递给您提交的shell脚本,然后使用它们传递给R脚本。例如,
如果您正在运行R脚本main.R并希望传递2个值,则可以在提交脚本中执行:
module load R
Rscript main.R $1 $2
然后调用此脚本两次:
sbatch myscript.sh 3.14 outfile1.csv
sbatch myscript.sh 1.57 outfile2.csv
然后第一份工作将以:
运行Rscript main.R 3.14 outfile1.csv
第二个: Rscript main.R 1.57 outfile1.csv
如果您比Rscript更喜欢R CMD BATCH格式,您也可以使用它。只需使用$ 1,$ 2等作为R脚本的参数。