如何通过Slurm的sbatch实现MPI Rank到指定节点的绑定
实现指定MPI Rank到节点的绑定配置
要搞定你这个MPI Rank绑定的需求(把Rank 0固定在node001,剩下7个Rank分配到node002-node004),有两种实用的方法,我给你详细拆解下:
方法一:直接通过sbatch + srun参数配置
这种方式不用额外创建配置文件,直接在sbatch脚本里就能搞定:
- 先写一个sbatch脚本(比如命名为
mpi_bind_job.sh):
#!/bin/bash #SBATCH --nodes=4 #SBATCH --nodelist=node001,node002,node003,node004 #SBATCH --ntasks=8 #SBATCH --cpus-per-task=1 # 这里根据你的任务实际CPU需求调整,不需要的话可以去掉 # 用srun的分段语法拆分Rank组:Rank0绑node001,其余绑剩下的节点 srun --rank 0 --nodelist=node001 ./your_mpi_program : \ --rank 1-7 --nodelist=node002,node003,node004 ./your_mpi_program
参数说明:
--nodes=4和--nodelist明确指定要使用的4个目标节点--ntasks=8声明总共有8个MPI任务(也就是8个Rank)srun的:是分隔符,把不同Rank组的配置分开:- 第一组锁定Rank 0到node001
- 第二组把Rank 1-7分配到node002-node004,MPI默认会均匀分配这7个Rank到三个节点(你要是想手动分配每个节点的Rank数,可以在第二组加
--ntasks-per-node=3,2,2这样的参数,指定每个节点分别跑3、2、2个Rank)
- 提交脚本的命令:
sbatch mpi_bind_job.sh
方法二:使用MPI Rankfile文件做精细控制
如果需要更精准地指定每个Rank对应的节点(甚至绑定到具体CPU核心),可以用rankfile文件:
- 创建一个
rankfile.txt,内容如下:
rank 0=node001 slot=0 rank 1=node002 slot=0 rank 2=node002 slot=1 rank 3=node002 slot=2 rank 4=node003 slot=0 rank 5=node003 slot=1 rank 6=node004 slot=0 rank 7=node004 slot=1
注:如果只需要绑定到节点而不用指定CPU核心,
slot填0就行;要是需要绑定到具体核心,就把slot改成对应的核心编号。
- 编写sbatch脚本:
#!/bin/bash #SBATCH --nodes=4 #SBATCH --nodelist=node001,node002,node003,node004 #SBATCH --ntasks=8 # 告诉MPI要使用我们的rankfile export MPI_RANKFILE=./rankfile.txt srun ./your_mpi_program
- 提交脚本:
sbatch mpi_bind_job.sh
一些额外提醒
- 确保你的MPI实现(比如OpenMPI、MPICH)支持这些配置,不同版本的MPI参数可能有细微差异,OpenMPI对rankfile的支持是比较完善的
- 如果需要把Rank绑定到具体CPU核心,可以在
srun里加上--cpu-bind=core参数,结合rankfile里的slot来精准控制 - 提交任务前,建议用
sinfo命令确认node001-node004节点处于可用状态
内容的提问来源于stack exchange,提问作者Yoni4949
相关产品推荐
相关产品推荐

