Slurm - 运行 同一节点上有多个阵列?
Slurm - run more than one array on the same node?
我正在 运行在 slurm 集群上编写大约 200 个 matlab 代码。这些代码不是并行化的,而是使用密集的矢量化符号。所以每个代码使用大约 5-6 个核心的处理能力。
我使用的批处理代码如下:
#!/bin/bash
#SBATCH --job-name=sdmodel
#SBATCH --output=logs/out/%a
#SBATCH --error=logs/err/%a
#SBATCH --nodes=1
#SBATCH --partition=common
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --array=1-225
module load Matlab/R2021a
matlab -nodisplay -r "run('main_cluster2.m'); exit"
现在上面的代码将为每个 matlab 任务(225 个这样的任务)分配一个集群节点。但是,一些集群节点有 20 个或更多核心。这意味着我可以高效地使用一个节点同时 运行 3 或 4 个任务。有没有办法修改上面的代码呢?
如果集群配置为允许节点共享,您可以删除要求为数组中的每个作业分配一个完整节点的行#SBATCH --exclusive
,并将其替换为
SBATCH --cpus-per-task=5
为数组中的每个作业在同一节点上请求 5 个 CPU。
在 20 核节点上,Slurm 将能够放置 4 个这样的作业。
如果不允许节点共享,那么你应该可以在脚本中使用多个srun
命令来细分节点。如果您想为每个任务使用 4 个核心(在 20 个核心节点上),那么您的脚本将更改为:
#!/bin/bash
#SBATCH --job-name=sdmodel
#SBATCH --output=logs/out/%a
#SBATCH --error=logs/err/%a
#SBATCH --nodes=1
#SBATCH --partition=common
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --array=1-225
module load Matlab/R2021a
for i in $(seq 1 5)
do
srun --ntasks=4 --exact matlab -nodisplay -r "run('main_cluster2.m'); exit" &
done
wait
每个 srun
命令末尾的“&”将命令置于后台,因此您可以跳到启动多个副本。最后的 wait
确保脚本在退出之前等待所有后台进程完成。
请注意,如果每个单独的 matlab 命令花费的时间非常不同,这可能会导致资源浪费,因为有些运行会先于其他运行完成,从而使内核空闲。
我正在 运行在 slurm 集群上编写大约 200 个 matlab 代码。这些代码不是并行化的,而是使用密集的矢量化符号。所以每个代码使用大约 5-6 个核心的处理能力。
我使用的批处理代码如下:
#!/bin/bash
#SBATCH --job-name=sdmodel
#SBATCH --output=logs/out/%a
#SBATCH --error=logs/err/%a
#SBATCH --nodes=1
#SBATCH --partition=common
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --array=1-225
module load Matlab/R2021a
matlab -nodisplay -r "run('main_cluster2.m'); exit"
现在上面的代码将为每个 matlab 任务(225 个这样的任务)分配一个集群节点。但是,一些集群节点有 20 个或更多核心。这意味着我可以高效地使用一个节点同时 运行 3 或 4 个任务。有没有办法修改上面的代码呢?
如果集群配置为允许节点共享,您可以删除要求为数组中的每个作业分配一个完整节点的行#SBATCH --exclusive
,并将其替换为
SBATCH --cpus-per-task=5
为数组中的每个作业在同一节点上请求 5 个 CPU。
在 20 核节点上,Slurm 将能够放置 4 个这样的作业。
如果不允许节点共享,那么你应该可以在脚本中使用多个srun
命令来细分节点。如果您想为每个任务使用 4 个核心(在 20 个核心节点上),那么您的脚本将更改为:
#!/bin/bash
#SBATCH --job-name=sdmodel
#SBATCH --output=logs/out/%a
#SBATCH --error=logs/err/%a
#SBATCH --nodes=1
#SBATCH --partition=common
#SBATCH --exclusive
#SBATCH --mem=0
#SBATCH --array=1-225
module load Matlab/R2021a
for i in $(seq 1 5)
do
srun --ntasks=4 --exact matlab -nodisplay -r "run('main_cluster2.m'); exit" &
done
wait
每个 srun
命令末尾的“&”将命令置于后台,因此您可以跳到启动多个副本。最后的 wait
确保脚本在退出之前等待所有后台进程完成。
请注意,如果每个单独的 matlab 命令花费的时间非常不同,这可能会导致资源浪费,因为有些运行会先于其他运行完成,从而使内核空闲。