Oneflow-Inc / one-yolov5

A more efficient yolov5 with oneflow backend 🎉🎉🎉
https://start.oneflow.org/oneflow-yolo-doc
GNU General Public License v3.0
212 stars 19 forks source link

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

Open ccssu opened 1 year ago

ccssu commented 1 year ago

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

注意:

复现实验数据

  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

实验环境

BBuf commented 1 year ago

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

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

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

ccssu commented 1 year ago

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

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

补两组实验

实验01

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

配置:

启动指令: 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分支代码

配置:

启动指令: 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 1 year ago

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

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

ccssu commented 1 year ago

从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就行了吗

Ldpe2G commented 1 year ago

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

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

ccssu commented 1 year ago

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

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

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

image

  1. 已和晓雨确认,ultralytics/yolov5 代码中有没有根据卡数自动修改 lr

  2. 修改 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

注意:

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

Ldpe2G commented 1 year ago

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