projects/example_largemodel/README_zh-CN.md
本工程用于探索如何在消费级显卡上成功训练相对大的视觉模型。
虽然视觉模型并没有像 LLM 那样有极其夸张的参数量,但是即使常用的以 Swin Large 为 backbone 的模型,都需要在 A100 上才能成功训练,这无疑阻碍了用户在视觉大模型上的探索和实验。因此本工程将探索在 3090 等 24G 甚至更小显存的消级显卡上如何训练视觉大模型。
本工程主要涉及到的训练技术有 FSDP、DeepSpeed 和 ColossalAI 等常用大模型训练技术。
本工程将不断更新完善,如果你有比较好的探索和意见,也非常欢迎提 PR
mmengine >=0.9.0 # 案例 1
deepspeed # 案例 2
fairscale # 案例 2
dino-5scale_swin-l_fsdp_8xb2-12e_coco.pycd mmdetection
./tools/dist_train.sh projects/example_largemodel/dino-5scale_swin-l_fsdp_8xb2-12e_coco.py 8
./tools/dist_train.sh projects/example_largemodel/dino-5scale_swin-l_fsdp_8xb2-12e_coco.py 8 --amp
| ID | AMP | GC of Backbone | GC of Encoder | FSDP | Peak Mem (GB) | Iter Time (s) |
|---|---|---|---|---|---|---|
| 1 | 49 (A100) | 0.9 | ||||
| 2 | √ | 39 (A100) | 1.2 | |||
| 3 | √ | 33 (A100) | 1.1 | |||
| 4 | √ | √ | 25 (A100) | 1.3 | ||
| 5 | √ | √ | 18 | 2.2 | ||
| 6 | √ | √ | √ | 13 | 1.6 | |
| 7 | √ | √ | √ | 14 | 2.9 | |
| 8 | √ | √ | √ | √ | 8.5 | 2.4 |
从上表可以看出:
dino-5scale_swin-l_deepspeed_8xb2-12e_coco.pycd mmdetection
./tools/dist_train.sh projects/example_largemodel/dino-5scale_swin-l_deepspeed_8xb2-12e_coco.py 8
很遗憾,到目前为止这依然是一个失败的案例,因为梯度始终会溢出导致精度很低。
| ID | AMP | GC of Backbone | GC of Encoder | DeepSpeed | Peak Mem (GB) | Iter Time (s) |
|---|---|---|---|---|---|---|
| 1 | 49 (A100) | 0.9 | ||||
| 2 | √ | 39 (A100) | 1.2 | |||
| 3 | √ | √ | 25 (A100) | 1.3 | ||
| 4 | √ | √ | √ | 10.5 | 1.5 | |
| 5 | √ | √ | √ | 13 | 1.6 | |
| 6 | √ | √ | √ | √ | 5.0 | 1.4 |
从上表可以看出:
auto_wrap_policy 这个需要用户自行设置的参数从上述分析可知,如果 DeepSpeed 能够在不降低性能情况下成功训练 DINO 模型,那么其将比 FSDP 具备比较大的优势。如果您对 DeepSpeed 和 Apex 有比较深入的了解同时有兴趣排查精度问题,欢迎反馈或者提 PR
前面说过由于 Apex AMP O2 的特殊性,目前的 MMDetection 无法训练 DINO 模型,考虑到这是一个失败的案例,因此将修改的代码放在了 https://github.com/hhaAndroid/mmdetection/tree/dino_deepspeed 分支,其对应修改见 commit。如果您有兴趣尝试,可以拉取该分支进行试验。