【解决方案】yolov10多卡训练报错

yolov8或者yolov10多卡训练存在以下报错

问题描述1

subprocess.CalledProcessError: Command ...... returned non-zero exit status 1

解决方案1
控制GPU上的进程数,其中nproc_per_node为分配GPU的数量

python -m torch.distributed.run --nproc_per_node=2 train.py --device 2,3  # 官方方法
或者
python -m torch.distributed.launch --nproc_per_node=2 train.py  # 常用方法

SyncBatchNorm

python -m torch.distributed.run --nproc_per_node 2 train.py --sync-bn
> 可以提高多 GPU 训练的精确度,但会大大降低训练速度。它只适用于多 GPU 分布式数据并行训练。最好在每个 GPU 的batch-size 较小(<= 8)时使用。

问题描述2

Setting OMP_NUM_THREADS environment variable for each process to be 1 in default

解决方案2
环境变量中 OMP_NUM_THREADS 的默认值为1,根据需求重新配置线程数

  • 1.临时设置(终端当前会话中有效)
    export OMP_NUM_THREADS=2 
    
  • 2.永久设置(编辑.bashrc文件):
    cd ~
    vim .bashrc
    export OMP_NUM_THREADS=2  # 在最后一行加上
    source ~/.bashrc
    

问题描述3

RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemv(handle, op, m, n, &alpha, a, lda, x, incx, &beta, y, incy)

解决方案3
更换loss.pypred_dist计算
在这里插入图片描述

# pred_dist = pred_dist.view(b, a, c // 4, 4).transpose(2,3).softmax(3).matmul(self.proj.type(pred_dist.dtype))
pred_dist = (pred_dist.view(b, a, c // 4, 4).softmax(2) * self.proj.type(pred_dist.dtype).view(1, 1, -1, 1)).sum(2)

问题描述4

UserWarning: floordiv is deprecated, and its behavior will change in a future version of pytorch. It currently rounds toward 0 (like the 'trunc' function NOT 'floor'). This results in incorrect rounding for negative values. To keep the current behavior, use torch.div(a, b, rounding_mode='trunc'), or for actual floor division, use torch.div(a, b, rounding_mode='floor').index = index // nc

解决方案4
调整ops.py的index除法取整运算
在这里插入图片描述

官方解决方案

GitHub 加速计划 / yo / yolov10
41
5
下载
YOLOv10: Real-Time End-to-End Object Detection
最近提交(Master分支:1 个月前 )
6fbaf42b - 3 个月前
cd2f79c7 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐