You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:54:21