YoloV7多GPU训练持续报RuntimeError等三类问题求助
YOLOv7多GPU分布式训练报错解决方案
处理OMP_NUM_THREADS警告
直接在启动命令前显式设置环境变量,就能消除自动设置的警告:
OMP_NUM_THREADS=1 python -m torch.distributed.run --nproc_per_node 4 train.py --batch 64 --data ~/yolo4iris/data.yaml --weights yolov7_training.pt
要是还弹警告,就在train.py开头加这段代码强制设置:
import os os.environ['OMP_NUM_THREADS'] = '1'
解决RuntimeError:进程组未初始化
- 检查YOLOv7的train.py有没有分布式初始化逻辑:找
torch.distributed.init_process_group相关代码,没有的话手动加在训练流程最前面:
import torch import torch.distributed as dist import os if torch.cuda.is_available() and dist.is_available(): dist.init_process_group(backend='nccl') local_rank = int(os.environ.get('LOCAL_RANK', 0)) torch.cuda.set_device(local_rank)
- 给train.py加local_rank参数:有些旧版YOLOv7没处理这个参数,需要在argparse部分添上:
parser.add_argument('--local_rank', type=int, default=0)
解决ChildFailedError
这个错误是子进程崩溃导致的,重点查这几点:
- 显存不够:4GPU总batch设64的话,单GPU实际是16,比单GPU的4大很多,显存扛不住。要么把总batch降到32(单GPU 8),要么加
--accumulate 2参数做梯度累积,效果等价于单GPU batch=16但显存占用更低。 - 数据加载没适配分布式:分布式训练必须用
DistributedSampler,检查dataloader代码,没加的话改成这样:
from torch.utils.data.distributed import DistributedSampler # 初始化dataset后 sampler = DistributedSampler(dataset) if dist.is_initialized() else None dataloader = torch.utils.data.DataLoader( dataset, batch_size=batch_size, sampler=sampler, shuffle=(sampler is None), # 分布式下用sampler控制shuffle,不要自己设shuffle=True ... )
- Torch版本不兼容:你用的Torch 2.1.0+cu121太新,YOLOv7官方代码可能适配的是旧版本。降级到1.13.1+cu117试试:
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
- 检查GPU状态:在EC2上跑
nvidia-smi,确认4个GPU都正常,没有被占用或者硬件异常。
推荐的完整启动命令
把上面的修复整合后,用这个命令启动:
OMP_NUM_THREADS=1 python -m torch.distributed.run --nproc_per_node 4 train.py --batch 32 --accumulate 2 --data ~/yolo4iris/data.yaml --weights yolov7_training.pt
内容的提问来源于stack exchange,提问作者Apricot
相关产品推荐
相关产品推荐

