8卡ddp增加batch_size,精度值严重下降
ccssu opened this issue · 8 comments
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, |
注意:
实验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
复现实验数据
- 在oneflow最新master分支即可
- one-yolov5 请切换到
recurrence_batch_have_an_impact_on_mAP
- 不在a100机器 请修改 data/coco.yaml文件中数据集路径 path: /data/detection_datasets/coco # dataset root dir
实验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
实验环境
- 两次实验使用的为同一oneflow版本 同一 one-yolov5代码
- oneflow版本:2deed1b849 (HEAD -> fuse_get_ciou_result )
- one-yolov5版本: 33d2e89 (HEAD -> main)
- 机器: a100
我认为需要确认两个问题:
- pytorch在这种情况是否也有严重的精度下降问题?
- 打开sync-bn的话我们是否还存在精度严重下降问题?
从2卡到8卡学习率是不是应该调整一下,乘以4?应该有个公式计算的
我认为需要确认两个问题:
- pytorch在这种情况是否也有严重的精度下降问题?
- 打开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
从2卡到8卡学习率是不是应该调整一下,乘以4?应该有个公式计算的
我觉得可以先确认一下这个问题 @ccssu
嗯嗯,好
one-yolov5/data/hyps/hyp.scratch-low.yaml
Lines 6 to 9 in eee6793
@Ldpe2G 德澎哥 请问下我调整学习率只要将 lrf
, lr0
乘4就行了吗
请问下我调整学习率只要将
lrf
,lr0
乘4就行了吗
官方文档有没有讲8卡训练要做哪些修改,还有就是确认下晓雨说的,代码中有没有根据卡数自动修改 lr
请问下我调整学习率只要将
lrf
,lr0
乘4就行了吗官方文档有没有讲8卡训练要做哪些修改,还有就是确认下晓雨说的,代码中有没有根据卡数自动修改 lr
- ultralytics/yolov5官方文档没有讲8卡训练要做哪些修改,官方介绍如下:
- 已和晓雨确认,ultralytics/yolov5 代码中有没有根据卡数自动修改 lr
- 修改 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 |
注意:
- 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卡一样的就行了