one-yolov5 icon indicating copy to clipboard operation
one-yolov5 copied to clipboard

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

Open ccssu opened this issue 2 years ago • 8 comments

Multi-GPU Training https://github.com/ultralytics/yolov5/issues/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

ccssu avatar Nov 25 '22 02:11 ccssu

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

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

BBuf avatar Nov 25 '22 02:11 BBuf

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

Ldpe2G avatar Nov 25 '22 02:11 Ldpe2G

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

  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

ccssu avatar Nov 25 '22 02:11 ccssu

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

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

BBuf avatar Nov 25 '22 02:11 BBuf

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

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

嗯嗯,好 https://github.com/Oneflow-Inc/one-yolov5/blob/eee679329ba1b7acf39c231d42ca74560d719fe3/data/hyps/hyp.scratch-low.yaml#L6-L9

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

ccssu avatar Nov 25 '22 02:11 ccssu

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

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

Ldpe2G avatar Nov 25 '22 02:11 Ldpe2G

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

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

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

image

  1. 已和晓雨确认,ultralytics/yolov5 代码中有没有根据卡数自动修改 lr
  1. 修改 lrf , lr0 乘4 [email protected]:.95 更低 数据如下:
epoch batch gpu lr0 lrf [email protected] [email protected]:.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

ccssu avatar Nov 28 '22 01:11 ccssu

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

Ldpe2G avatar Nov 28 '22 02:11 Ldpe2G