在SLURM中的多个目录上运行一个脚本的首选方法

时间:2018-08-03 16:15:25

标签: hpc slurm

我最典型的用例是在多个目录(通常是R或Matlab)上运行单个脚本。我可以访问高性能计算环境(基于SLURM)。到目前为止,从我的研究来看,我尚不清楚哪种方式可以更有效地利用可用的CPU /内核。我还想确保我不会不必要地占用系统资源,所以我想仔细检查以下两种方法中哪一种最合适。

方法1:

  1. 在脚本(MPI)中并行化代码。
  2. 将其包装在将脚本应用于所有目录的循环中。
  3. 将其作为SLURM脚本作为单个MPI作业提交。

方法2:

  1. 在脚本(MPI)中并行化代码。
  2. 创建一个MPI作业数组,每个目录一个作业,每个作业在该目录上运行脚本。

我对此还是很陌生,所以如果我在这里混淆了一些东西,或者您需要更多详细信息来回答这个问题,请告诉我。

2 个答案:

答案 0 :(得分:1)

对我来说,答案是显而易见的,假设获得良好的并行性通常很困难。

在第一种方法中,您要求SLURM提供一组资源,但是如果您要求使用许多CPU,则可能会浪费很多资源(如果您要求使用32个CPU,而加速仅为4倍,那是在浪费您的资源) 28个CPU)。这样一来,集群中的一小部分将处理一个文件夹,另一个文件夹处理。

在第二种方法中,您将要求SLURM为每个文件夹运行一个作业。将有许多作业同时运行,他们可以要求更少的资源。假设您要为每个作业请求4个CPU(加速是3倍,这意味着每个作业浪费1 cpu)。同时运行8个作业将采用与第一种方法相同的32个CPU,但是只会浪费8个CPU,同时会处理8个文件夹。

最后,必须在确定哪个是CPU数量不同的情况下进行加速后才能做出决定,但是我的感觉是通常会首选第二种方法,除非您获得了很好的加速效果,在这种情况下,两种方法都是等效的。

答案 1 :(得分:1)

如果您未在原始R或Matlab脚本中明确使用MPI,建议您完全避免使用MPI,而应使用job arrays

假设您有一个脚本<div class="container-fluid d-flex flex-column" style="height: 100vh;"> <div class="row d-flex flex-column no-gutters"> <app-top class="col"></app-top> <div class="row flex-row no-gutters" style="margin-top: 38px;"> <app-left class="col flex-shrink-0"></app-left> <div class="col"> <router-outlet></router-outlet> </div> <app-right class="col flex-shrink-0"></app-right> </div> </div> </div>和一组子目录myscript.Rdata01,...,data02,并且这些脚本将目录的名称设为输入参数,您可以执行以下操作。

在数据目录的父目录中创建提交脚本:

data10

此脚本将创建一个作业数组,其中每个作业将以数据目录之一作为参数运行#!/bin/bash #SBATCH --ntasks 1 #SBATCH --cpus-per-task 1 #SBATCH --mem-per-cpu=2G #SBATCH --time 1-0 #SBATCH --array=1-10 DIRS=(data*/) # Create a Bash array with all data directories module load R Rscript myscript.R ${DIRS[$SLURM_ARRAY_TASK_ID]} # Feed the script with the data directory # corresponding to the task ID in the array

当然,您需要调整内存和时间的值,并调查每个作业使用一个以上的CPU是否对您有利。并根据您的情况将myscript.R参数调整为实际的目录数。