部分Slurm输出环境变量为空,分布式训练脚本报错求助
问题:Slurm环境变量SLURM_NTASKS_PER_NODE为空导致torchrun报错
我的SBATCH脚本
#!/bin/bash ## Job Misc #SBATCH --job-name=dummy_job # Job name #SBATCH --output=dummy_run.out # name of output file #SBATCH --error=dummy_run.err # name of error file #SBATCH --partition=GPU # Partition to run on ## Node config #SBATCH --nodes=1 # node count #SBATCH --ntasks-per-node=2 # total number of tasks per node ## Job Config #SBATCH --cpus-per-task=4 # cpu cores to use per task export NCCL_DEBUG=INFO # Cleans out the modules loaded in interactive and inherited by default module purge # Load software module load CUDA/11.8.0 # prints the date and time date ##### Number of total processes ##### echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " echo "Nodelist:= " $SLURM_JOB_NODELIST echo "Number of nodes:= " $SLURM_JOB_NUM_NODES echo "Ntasks:= " $SLURM_NTASKS echo "Ntasks-per-node:= " $SLURM_NTASKS_PER_NODE echo "cpus := " $SLURM_TRES_PER_TASK echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " nodes=( $( scontrol show hostnames $SLURM_JOB_NODELIST ) ) nodes_array=($nodes) head_node=${nodes_array[0]} head_node_ip=$(srun --nodes=1 --ntasks=1 -w "$head_node" hostname --ip-address) echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " echo "Nodes:= " $nodes echo "nodes_array:= " $nodes_array echo "head_node:= " $head_node echo "head_node_ip:= " $head_node_ip echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX " echo "Running training session..." # Run python script srun torchrun \ --nnodes=$SLURM_NNODES \ --nproc_per_node=$SLURM_NTASKS_PER_NODE \ --rdzv_id=$RANDOM \ --rdzv_backend=c10d \ --rdzv_endpoint=$head_node_ip:12345 \ /PATH/TO/PYTHON_SCRIPT/train_distributed.py echo "Training session completed."
报错情况
提交作业后出现以下错误:
return int(nproc_per_node) ValueError: invalid literal for int() with base 10: ''
我添加echo语句检查环境变量,发现SLURM_NTASKS_PER_NODE和SLURM_TRES_PER_TASK是空值,但其他Slurm变量能正常返回正确值。尝试了多种方法,这两个变量依然为空。请问是否可能是HPC管理员未启用这些变量的导出?
回答
确实有可能是HPC管理员没有配置Slurm导出SLURM_NTASKS_PER_NODE和SLURM_TRES_PER_TASK这两个环境变量。Slurm的环境变量导出权限由管理员通过配置文件控制,比如调整slurm.conf参数或PAM设置,可能会限制部分变量的导出。
你可以用以下方案临时解决问题:
- 对于
SLURM_NTASKS_PER_NODE,可以通过已有变量计算得到:单节点场景下,直接用总任务数SLURM_NTASKS即可;多节点场景则用总任务数除以节点数,即$((SLURM_NTASKS / SLURM_JOB_NUM_NODES))。修改torchrun命令如下:srun torchrun \ --nnodes=$SLURM_NNODES \ --nproc_per_node=$((SLURM_NTASKS / SLURM_JOB_NUM_NODES)) \ --rdzv_id=$RANDOM \ --rdzv_backend=c10d \ --rdzv_endpoint=$head_node_ip:12345 \ /PATH/TO/PYTHON_SCRIPT/train_distributed.py - 对于
SLURM_TRES_PER_TASK,你已经在脚本中指定了--cpus-per-task=4,可以直接用SLURM_CPUS_PER_TASK变量替代,或者直接使用硬编码值4。
如果需要彻底解决,建议联系HPC管理员确认是否有意限制了这两个变量的导出,或者是否存在Slurm版本配置问题。
内容的提问来源于stack exchange,提问作者Marios Constantinou
相关产品推荐
相关产品推荐

