0

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

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

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

4

2 回答 2

2

从 R 脚本中处理

使用 运行 R 脚本时srun,让所有实例执行不同操作的方法(除了使用 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.R10 次,一个参数的范围分别为 1 到 10。然后,您可以使用 R 脚本中的参数值commandArgs()

于 2019-02-07T09:55:56.457 回答
0

这似乎是MPI的用例,一种用于编写分布式内存应用程序的标准。它也可用于 R。

但是,如果您有一个现有脚本可以接受指定问题子集的参数,并且您可以多次将其提交到集群,那么您建议的方法可能比重写脚本以与 MPI 一起使用更可行。

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

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

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

于 2019-02-07T08:51:58.593 回答