JDAI-CV / fast-reid

SOTA Re-identification Methods and Toolbox
Apache License 2.0
3.43k stars 838 forks source link

多卡训练效果变差 #82

Closed wbfor closed 3 years ago

wbfor commented 4 years ago

我在训练mgn网络时发现,相同超参下如果使用多卡训练,loss的下降速度明显变慢,最终效果会差比较多,考虑到可能是bn的问题,如果把backbone和heads中的bn换为syncBN也没有改善这个问题,请问有什么好的办法或经验使用多卡训练吗,谢谢

L1aoXingyu commented 4 years ago

可以发一下你的 config.yaml 文件吗? 我用64的batchsize,syncBN,效果和单卡是一致的

zhanghongruiupup commented 4 years ago

可以发一下你的 config.yaml 文件吗? 我用64的batchsize,syncBN,效果和单卡是一致的

谢谢你的分享,关注你半年了,真的太强了 请问backbone 和 head都设置为syncBN吗? 冻结层只是在前2000 iter冻结骨干网络? 谢谢

L1aoXingyu commented 4 years ago

是的,就是按照单卡的config,把bn换成syncbn,效果应该和单卡差不多

wbfor commented 4 years ago

可以发一下你的 config.yaml 文件吗? 我用64的batchsize,syncBN,效果和单卡是一致的

我的config设置是: BASE: "../Base-MGN.yml"

MODEL: BACKBONE: PRETRAIN_PATH: "/home/wbfor/pretrained/ibn/r50_ibn_a.pth" WITH_IBN: True NORM: 'syncBN' HEADS: NUM_CLASSES: 751 NORM: 'syncBN'

DATASETS: NAMES: ("Market1501",) TESTS: ("Market1501",)

OUTPUT_DIR: "logs/market/mgn_R50-ibn" 然后用单卡和双卡分别训练对比如下: image 蓝色是双卡的loss,橙色是单卡的loss image 单卡最终结果是: image 双卡最终结果是: image 之前还跑过三卡和其他多卡的结果确实是变差,不过结果没有截图,能帮忙分析下是什么原因吗,谢谢

L1aoXingyu commented 4 years ago

你的 cls_layer 用的是 linear 吗?可以放一个完整的 config.yaml,这个可以再你的 OUPUT_DIR 里面找到。

wbfor commented 4 years ago

你的 cls_layer 用的是 linear 吗?可以放一个完整的 config.yaml,这个可以再你的 OUPUT_DIR 里面找到。


cls_layer使用的是circle

CUDNN_BENCHMARK: true DATALOADER: NUM_INSTANCE: 16 NUM_WORKERS: 16 PK_SAMPLER: true DATASETS: COMBINEALL: false NAMES:

L1aoXingyu commented 4 years ago

you help me find a bug, there is a single-GPU BN in mgn pool_reduce

https://github.com/JDAI-CV/fast-reid/blob/94d85fe11cde1d972cbd16b4c3d5cd91c54c74cb/fastreid/modeling/meta_arch/mgn.py#L108

I think this is exactly the reason why the multi-GPU training performance is lower than sinlge-GPU training.

I have fixed it.

wbfor commented 4 years ago

thank u!

finger-monkey commented 4 years ago

you help me find a bug, there is a single-GPU BN in mgn pool_reduce

https://github.com/JDAI-CV/fast-reid/blob/94d85fe11cde1d972cbd16b4c3d5cd91c54c74cb/fastreid/modeling/meta_arch/mgn.py#L108

I think this is exactly the reason why the multi-GPU training performance is lower than sinlge-GPU training.

I have fixed it.

sbs_R101-ibn.yml这个的多卡训练效果也会变差(没有改动任何配置)。精度先是升高然后不断降低。 还有想问一下:您之前修正的 mgn pool_reduce bug更新到github里了吗

finger-monkey commented 4 years ago

you help me find a bug, there is a single-GPU BN in mgn pool_reduce https://github.com/JDAI-CV/fast-reid/blob/94d85fe11cde1d972cbd16b4c3d5cd91c54c74cb/fastreid/modeling/meta_arch/mgn.py#L108

I think this is exactly the reason why the multi-GPU training performance is lower than sinlge-GPU training. I have fixed it.

sbs_R101-ibn.yml这个的多卡训练效果也会变差(没有改动任何配置)。精度先是升高然后不断降低。 还有想问一下:您之前修正的 mgn pool_reduce bug更新到github里了吗 另外还想问一下:训练 sbs_R101-ibn (resnet101_ibn_a.pth)的模型里是否使用了随机擦除?

L1aoXingyu commented 4 years ago

@finger-monkey 如果多卡的话,你要用 syncBN 才行,不能用默认配置,默认配置都是在单卡上跑的。

BTW, 那个 bug 已经 fix 了。

969191832 commented 4 years ago

拉取了最新的代码,在bagtricks设置下,Baseline,market1501数据集,分别在一块gpu,和两块gpu(使用syncBN)跑了实验,

image

image 两卡设置的是syncBN,性能还是明显对不上,请问还有哪里设置需要修改么,谢谢

L1aoXingyu commented 4 years ago

现在多卡使用的是 DDP 的方式,因为多卡之间的通讯机制以及跨卡梯度无法传递的问题,triplet loss 确实存在掉点,这个问题还没有很好的解决方法。我们目前采用的是 memory bank 的方式来解决大规模 DDP 训练。

zhanghongruiupup commented 4 years ago

现在多卡使用的是 DDP 的方式,因为多卡之间的通讯机制以及跨卡梯度无法传递的问题,triplet loss 确实存在掉点,这个问题还没有很好的解决方法。我们目前采用的是 memory bank 的方式来解决大规模 DDP 训练。

请问最新的多卡分布式训练解决掉点问题了吗?

L1aoXingyu commented 4 years ago

请问最新的多卡分布式训练解决掉点问题了吗?

应该几乎不掉点了,you can try it by yourself.

22wei22 commented 3 years ago

现在多卡使用的是 DDP 的方式,因为多卡之间的通讯机制以及跨卡梯度无法传递的问题,triplet loss 确实存在掉点,这个问题还没有很好的解决方法。我们目前采用的是 memory bank 的方式来解决大规模 DDP 训练。

请问最新的多卡分布式训练解决掉点问题了吗?

请问最新的多卡分布式训练解决掉点问题了吗?

应该几乎不掉点了,you can try it by yourself.

请问使用memory bank 的方式来解决大规模 DDP 训练,相关代码在哪个位置?