Oneflow-Inc/one-yolov5

8卡ddp增加batch_size,精度值严重下降

ccssu opened this issue · 8 comments

ccssu commented

Multi-GPU Training ultralytics/yolov5#475

问题描述

增加 batch_size ,在300个epoch训练下,mAP_0.5:0.95 精度值下降了2.4750000000000014

数据表如下所示:

gpu batch_size cfg metrics/mAP_0.5, metrics/mAP_0.5:0.95,
目标 2 64 yolov5n.yaml 45.6 27.7
实验01 8 256 yolov5n.yaml 44.132 26.936
实验02 8 512 yolov5n.yaml 40.69, 24.461,

趋势图:
image

注意:

  • 实验01 启动指令 python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 256
  • 实验02 启动指令 python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 512

复现实验数据

  1. 在oneflow最新master分支即可
  2. one-yolov5 请切换到 recurrence_batch_have_an_impact_on_mAP
  3. 不在a100机器 请修改 data/coco.yaml文件中数据集路径 path: /data/detection_datasets/coco # dataset root dir
  4. 实验01 启动指令 python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 256
  5. 实验02 启动指令 python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 512

实验环境

  • 两次实验使用的为同一oneflow版本 同一 one-yolov5代码
  • oneflow版本:2deed1b849 (HEAD -> fuse_get_ciou_result )
  • one-yolov5版本: 33d2e89 (HEAD -> main)
  • 机器: a100
BBuf commented

我认为需要确认两个问题:

  1. pytorch在这种情况是否也有严重的精度下降问题?
  2. 打开sync-bn的话我们是否还存在精度严重下降问题?

从2卡到8卡学习率是不是应该调整一下,乘以4?应该有个公式计算的

ccssu commented

我认为需要确认两个问题:

  1. pytorch在这种情况是否也有严重的精度下降问题?
  2. 打开sync-bn的话我们是否还存在精度严重下降问题?

补两组实验

实验01

使用ultralytics/yolov5最新的main分支代码。

配置:

  • cfg = yolov5n.yaml
  • batch_size = 512
  • gpu = 8
  • sync-bn = False

启动指令:
python -m torch.distributed.run --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg yolov5s.yaml --batch 512 --epochs 300

实验02

使用one-yolov5最新main分支代码

配置:

  • cfg = yolov5n.yaml
  • batch_size = 512
  • gpu = 8
  • sync-bn = True

启动指令:
python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 512 --sync-bn

BBuf commented

从2卡到8卡学习率是不是应该调整一下,乘以4?应该有个公式计算的

我觉得可以先确认一下这个问题 @ccssu

ccssu commented

从2卡到8卡学习率是不是应该调整一下,乘以4?应该有个公式计算的

我觉得可以先确认一下这个问题 @ccssu

嗯嗯,好

lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937 # SGD momentum/Adam beta1
weight_decay: 0.0005 # optimizer weight decay 5e-4

@Ldpe2G 德澎哥 请问下我调整学习率只要将 lrf , lr0 乘4就行了吗

请问下我调整学习率只要将 lrf , lr0 乘4就行了吗

官方文档有没有讲8卡训练要做哪些修改,还有就是确认下晓雨说的,代码中有没有根据卡数自动修改 lr

ccssu commented

请问下我调整学习率只要将 lrf , lr0 乘4就行了吗

官方文档有没有讲8卡训练要做哪些修改,还有就是确认下晓雨说的,代码中有没有根据卡数自动修改 lr

  1. ultralytics/yolov5官方文档没有讲8卡训练要做哪些修改,官方介绍如下:

image

  1. 已和晓雨确认,ultralytics/yolov5 代码中有没有根据卡数自动修改 lr
  1. 修改 lrf , lr0 乘4 mAP@.5:.95 更低 数据如下:
epoch batch gpu lr0 lrf mAP@.5 mAP@.5:.95
对照实验 53 512 8 0.01 0.01 37.813 21.698
本次实验 53 512 8 0.04 0.04 31.869 17.304
本次-对照 53 -5.944000000000005 -4.394000000000001

图中画红框的为本次实验数据曲线.
2ba0607c12ed3fff56faff30dce25a3

注意:

  • epoch从0开始计数
  • 复现在oneflow master分支, one-yolov5 main分支(注释掉保存模型这一行"model": deepcopy(de_parallel(model)).half(),) 即可
  • 启动指令: python -m oneflow.distributed.launch --nproc_per_node 8 train.py --data data/coco.yaml --weights ' ' --cfg models/yolov5n.yaml --batch 512
  • 使用机器a100

更多数据
hyp.txt
opt.txt
results.csv

可以再跑两组实验,4卡 和 6卡都分别跑下,看下精度怎样,学习率就保持和2卡一样的就行了