在哪里并行化?构造一个bash脚本以在多个节点上并行化

时间:2019-02-06 09:33:33

标签: r bash cluster-computing slurm

我想在多个节点上并行处理作业。每个内核应运行特定的参数组合,然后将结果保存为文件。 使用srun启动R脚本会使所有节点和核心执行相同的代码。不使用srun只会在一个节点上启动代码,然后在该节点上并行运行,但不会在其他节点上使用内核。

我尝试为--nodes = [],--tasks-per-node = [],--cpus-per-task = []或--ntasks = []提供不同的条目,并尝试了一些选项srun。
另一方面,我尝试从R脚本中调用其他节点。

我需要的是一个脚本,该脚本将任务分配到所有核心,同时为它们提供应评估的参数组合。此时,我什至不确定问题的哪些部分需要在bash脚本中处理,哪些应该在执行的脚本中处理。

2 个答案:

答案 0 :(得分:1)

从R脚本内部处理

在使用srun运行R脚本时,使所有实例执行不同操作的方法(不同于使用MPI,这是不平凡的)是引用SLURM_PROC_ID环境变量。

插入一行,例如

idx = as.numeric(Sys.getenv('SLURM_PROC_ID'))

,并在列表中包含所有参数组合。然后根据idx从列表中选择组合。

使用Bash提交脚本进行处理

您还可以使用以下结构(使用https://www.gnu.org/software/parallel/parallel_tutorial.html)来管理提交脚本中的分发

parallel srun --exclusive -n 1 -c1 Rscript myscript.R ::: {1..10}

运行myscript.R 10次,其中一个参数分别为1到10。然后,您可以使用commandArgs()

在R脚本中获取参数的值

答案 1 :(得分:0)

这似乎是MPI(一种用于编写分布式内存应用程序的标准)的用例。还可与R一起使用。

但是,如果您现有的脚本可以接受指定问题子集的参数,并且可以多次提交给群集,则建议的方法可能比重写用于MPI的脚本更可行。

>

在这种情况下,我建议按原样使用您的脚本,但编写一个bash脚本(如您自己建议)来处理节点上的分发。该bash脚本应简单地向集群提交(srun)多个具有不同参数组合的R脚本执行。根据要投入的工作量,您可以编写代码以根据可用核心的总数和要执行的脚本运行次数来自动查找适当的srun参数。您也可以手动找出每次执行应消耗多少核心。

  

使用srun启动R脚本会导致所有节点和核心执行相同的代码。

对此,我不完全了解。如果srun的R脚本具有不同的参数组合,则不同的节点将计算问题的不同部分。当然,您将必须手动或自动在bash脚本中汇总结果。