如何通过命令行给PBS脚本传GPU数量,配置资源与torchrun?
解决PBS脚本中动态传递GPU数量的问题
错误原因
PBS的#PBS开头指令是由qsub在提交阶段解析的,此时脚本还未被shell执行,脚本中的位置参数$1还未被赋值。qsub会直接把"$1"当作字符串处理,导致gpus参数无法识别为有效整数,从而抛出错误。
可行解决方案
方案1:使用qsub -v传递环境变量(推荐)
这是最简洁且常用的方法,通过qsub的-v参数将GPU数量作为环境变量传递,同时在脚本的PBS指令和torchrun命令中使用该变量。
修改后的myjob.pbs脚本:
#!/bin/sh #PBS -l "nodes=1:ppn=12:gpus=$GPU_COUNT" torchrun --standalone --nnodes=1 --nproc_per_node=$GPU_COUNT myscript.py
提交命令:
qsub -v GPU_COUNT=4 myjob.pbs
原理:qsub -v会将指定的环境变量注入到作业的运行环境中,同时qsub在解析#PBS指令时会自动替换环境变量的值,确保gpus参数是有效整数。
方案2:动态生成临时PBS脚本
如果需要更灵活的参数控制,可以写一个辅助脚本,根据输入的GPU数量动态生成临时PBS脚本并提交。
创建辅助脚本submit_job.sh:
#!/bin/bash # 接收GPU数量作为第一个参数 GPU_NUM=$1 # 生成临时PBS脚本 cat > temp_job.pbs << EOF #!/bin/sh #PBS -l "nodes=1:ppn=12:gpus=$GPU_NUM" torchrun --standalone --nnodes=1 --nproc_per_node=$GPU_NUM myscript.py EOF # 提交临时脚本 qsub temp_job.pbs # 删除临时脚本 rm temp_job.pbs
赋予执行权限并运行:
chmod +x submit_job.sh ./submit_job.sh 4
原理:通过shell的Here Document语法生成包含具体GPU数量的PBS脚本,qsub解析时直接拿到整数参数,避免变量替换问题。
方案3:提交时覆盖PBS资源参数
如果不想修改原脚本,可以在提交时通过qsub命令行直接指定-l gpus=参数,同时用-v传递变量给torchrun使用。
原脚本myjob.pbs(去掉gpus参数):
#!/bin/sh #PBS -l "nodes=1:ppn=12" torchrun --standalone --nnodes=1 --nproc_per_node=$GPU_COUNT myscript.py
提交命令:
qsub -v GPU_COUNT=4 -l gpus=4 myjob.pbs
原理:qsub命令行指定的-l参数会覆盖脚本中的对应设置,同时通过-v传递变量让torchrun获取GPU数量。
内容的提问来源于stack exchange,提问作者Bram Vanroy
相关产品推荐
相关产品推荐

