如何并行执行多Python脚本并避免双GPU的CUDA内存不足问题
解决GPU内存不足的并行任务调度问题
方法1:直接限制GNU Parallel的并行数
根据你2块GPU的显存容量,先估算单条Python任务占用的显存(比如单任务占4G,16G显存的GPU可跑3-4个任务),然后用-j参数限制总并行数:
cat generateData.sh | parallel -j 6
如果不确定合适的并行数,可以从2开始逐步上调,观察GPU内存占用情况,找到不触发显存溢出的最大值。
方法2:让任务自动等待GPU空闲内存
写一个包装脚本run_with_gpu_check.sh,先检查GPU是否有足够空闲显存再执行任务:
#!/bin/bash # 单任务所需最小空闲显存(单位:MiB),根据你的任务实际占用调整 REQUIRED_MEM=4096 while true; do # 获取所有GPU中最大的空闲显存值 FREE_MEM=$(nvidia-smi --query-gpu=memory.free --format=csv,noheader,nounits | sort -nr | head -n1) if [ "$FREE_MEM" -ge "$REQUIRED_MEM" ]; then # 找到空闲显存最多的GPU编号 GPU_ID=$(nvidia-smi --query-gpu=index,memory.free --format=csv,noheader,nounits | sort -k2nr | head -n1 | cut -d, -f1) # 指定GPU执行任务 CUDA_VISIBLE_DEVICES=$GPU_ID "$@" break fi # 无足够显存时等待5秒再重试 sleep 5 done
修改generateData.sh中的每条命令,改为:
./run_with_gpu_check.sh python create_video.py input output --param1 --param2 --param3
之后再用原命令并行执行:
cat generateData.sh | parallel
这样每个任务会自动等待有空闲显存的GPU,避免同时启动过多任务导致显存溢出。
方法3:绑定任务到特定GPU,分队列调度
如果需要固定任务到某块GPU,可将任务分成两个队列,分别绑定到GPU0和GPU1,并限制每块GPU的并行数:
# 将奇数行命令分配给GPU0,最多并行3个任务 awk 'NR%2==1' generateData.sh | parallel -j 3 "CUDA_VISIBLE_DEVICES=0 {}" & # 将偶数行命令分配给GPU1,最多并行3个任务 awk 'NR%2==0' generateData.sh | parallel -j 3 "CUDA_VISIBLE_DEVICES=1 {}" & # 等待所有任务完成 wait
内容的提问来源于stack exchange,提问作者Florian Delcour
相关产品推荐
相关产品推荐

