SLURM sbatch执行PyTorch分布式任务超时,交互式srun成功
问题诊断与解决方案
核心问题定位
你的SBATCH脚本存在关键参数错误:--node_rank 使用了 $SLURM_PROCID,但该变量是全局任务ID(多节点场景下取值为0、1),而torch.distributed.run要求--node_rank传入节点序号(从0开始),正确变量应为$SLURM_NODEID。
这个错误会导致节点无法识别自身集群角色,直接引发节点会合(rendezvous)阶段的Socket超时。
修正后的SBATCH脚本
#!/bin/bash #SBATCH --job-name=rtx-distribution-test # name #SBATCH --nodes=2 # nodes #SBATCH --ntasks-per-node=1 # crucial - only 1 task per dist per node! #SBATCH --cpus-per-task=4 # number of cores per tasks #SBATCH --partition=clara #SBATCH --gres=gpu:rtx2080ti:1 # number of gpus #SBATCH --time 01:15:00 # maximum execution time (HH:MM:SS) #SBATCH --output=clara_rtx/%x-%j.out # output file name #SBATCH --mail-type=ALL # 仅在主节点安装依赖,避免多节点重复执行 if [ "$SLURM_NODEID" -eq 0 ]; then module load Python pip install --user -r requirements.txt fi # 等待主节点依赖安装完成 srun wait MASTER_PORT=12340 MASTER_ADDR=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1) echo "MASTER_ADDR="$MASTER_ADDR GPUS_PER_NODE=1 export NCCL_DEBUG=INFO LOGLEVEL=INFO # 关键修正:--node_rank 使用 SLURM_NODEID 而非 SLURM_PROCID srun bash -c "NCCL_DEBUG=INFO python -m torch.distributed.run --nproc_per_node $GPUS_PER_NODE --nnodes $SLURM_NNODES --node_rank $SLURM_NODEID --master_addr $MASTER_ADDR --master_port $MASTER_PORT torch-distributed-gpu-test_no_flock.py"
额外优化点
- 依赖安装优化:原脚本
srun pip install会在所有节点重复执行,改为仅主节点执行后等待,减少冗余操作。 - 环境一致性:将
module load Python放在条件判断外,确保所有节点加载相同Python环境(若集群模块系统需要全局加载)。
验证逻辑补充
交互式执行成功是巧合:你手动指定了--master_addr clara06,且交互式srun的单任务场景下,$SLURM_PROCID恰好等于SLURM_NODEID(0和1),但这并非正确用法。SBATCH场景下若调度到不同节点,SLURM_PROCID取值可能与节点序号不匹配,直接导致集群连接失败。
已尝试方法的无效原因
torchrun与torch.distributed.run是同一工具的不同调用方式,核心参数错误未修正则仍会超时。- 引号替换不影响变量解析的核心问题,因此无效。
- 更换GPU型号无法解决节点会合的配置错误。
内容的提问来源于stack exchange,提问作者Scorix
相关产品推荐
相关产品推荐

