使用Slurm与Intel MPI指定网络接口的方法及脚本验证
在Slurm中为PyTorch DDP(MPI后端)指定InfiniBand接口
一、核心实现方式
在Slurm环境下,无法直接像mpirun那样用iface参数指定接口,需要通过MPI环境变量配合Slurm参数来实现:
- 对于Intel MPI(你的脚本采用的是该实现),核心是通过
I_MPI_FABRICS、I_MPI_OFI_PROVIDER指定通信框架和适配InfiniBand的provider - Slurm的
--network=ib0参数用于告知调度器优先分配IB资源,但实际通信路径由MPI环境变量控制
二、示例脚本的验证与调整
正确的配置项
- Slurm任务参数:
--ntasks=16、--nodes=4、--ntasks-per-node=4匹配DDP多节点多进程的部署需求 - Intel MPI核心变量:
I_MPI_FABRICS=shm:ofi:本地进程用共享内存通信,跨节点用OFI框架,兼顾性能和跨节点需求I_MPI_OFI_PROVIDER=psm2:指定PSM2作为InfiniBand通信的provider,是IB环境下的标准配置I_MPI_DEBUG=5:开启调试日志,方便排查通信异常
- srun参数:
--mpi=pmi2指定用PMI2协议和Slurm交互,兼容性良好
需要调整的内容
- 启用
FI_TCP_IFACE=ib0:
脚本中注释掉的export FI_TCP_IFACE=ib0必须打开,OFI框架需要明确指定IB接口,否则可能自动 fallback 到以太网 - 删除无效的
SLURM_NETWORK=ib0:
Slurm不存在这个环境变量,设置了也没用,直接删掉 - 开启
I_MPI_FALLBACK=0:
打开注释的export I_MPI_FALLBACK=0,强制MPI只使用指定的通信fabric,防止IB不可用时自动切到以太网,确保通信走IB - (可选)确认mpiP路径:
如果不需要性能分析,可以去掉LD_PRELOAD相关配置;如果需要,确保mpiP的库路径正确且和当前MPI版本兼容
调整后的完整脚本
#!/bin/bash #SBATCH --job-name=resnet50_cifar100_job #SBATCH --output=resnet50_cifar100_output_opx_%j.txt #SBATCH --error=resnet50_cifar100_error_opx_%j.txt #SBATCH --ntasks=16 #SBATCH --nodes=4 #SBATCH --ntasks-per-node=4 # Source the environment setup script source $HOME/activate_environment.sh # Activate the Python virtual environment source $HOME/torch_mpi_env/bin/activate # 强制绑定IB接口,禁用以太网 fallback export FI_TCP_IFACE=ib0 export FI_PROVIDER=psm2 export I_MPI_FABRICS=shm:ofi export I_MPI_FALLBACK=0 export I_MPI_DEBUG=5 export I_MPI_OFI_PROVIDER=psm2 export MPIP="-f ./mpip_results" # 启动任务 srun --mpi=pmi2 --network=ib0 \ --export=ALL,LD_PRELOAD=$HOME/mpiP_build/lib/libmpiP.so \ python $HOME/torch_projects/resnet50_cifar100.py --epochs 200 # 退出虚拟环境 deactivate
三、验证通信是否走IB的方法
- 查看任务输出日志(
I_MPI_DEBUG=5的输出),搜索fabric或provider关键词,确认显示psm2和ib0 - 在节点上执行
ibstat或ip link,查看ib0接口的流量统计,确认任务运行期间有数据传输
内容的提问来源于stack exchange,提问作者Jonathan Ato Markin
相关产品推荐
相关产品推荐

