libai
libai copied to clipboard
Swin Transformer V2 基于LiBai复现 (关于CCF的pr整合)
项目介绍
Swin-Transformer V2 [Liu et al.2021] 是微软对原有 Swin-Transformer 的继续深入研究。原有的 Swin-Transformer 通过引入图像自身的先验知识(shift 窗口来实现)在图像分类,目标检测,语义分割上取得了良好的性能。然而由于一系列问题: 大模型训练产生的激活阈值过大,下游任务的分辨率太大而预训练的分辨率太低导致相对位置编码损害了性能,以及预训练需要大量标记数据的问题。作者分别采用将 Layernorm 移动至 MLP 以及 Attention 的后方,采用 log-spaced 的元网络生成,利用 SimMIM 来辅助训练解决了上述问题。最后设计了一个具备 3 亿参数量的模型在众多数据集上取得了极为优异的性能。本课题的目标便是通过 Libai 复现网络,并且能够拓展模型,支持各种并行形式的训练。并在 ImageNet-21k, ImageNet-1k V1, V2 上进行完整训练,达到论文中的基准线。
模型和示例
模型介绍
模型架构大致和Swin Transformer基本相同,除了以下三点不同需要改动:
-
将LayerNorm移动至MLP和Attention的后方
-
通过余弦计算相似度替换原来的内积
-
使用元网络来实现相对位置编码,同时应用log-based实现
具体可以见下图: teaserv6.pdf
实现难点
- 各种并行训练的实现,以及精度对齐问题。
- Oneflow和Pytorch算子的一些不对齐问题。
可借鉴的代码
- libai中原有关于VIT,Swin的实现
- facebook官方关于SwinV2的实现
中期考核前提交的pr
- swinv2复现,数据并行验证实现,CIFAR-100精度对齐,已经合并:https://github.com/Oneflow-Inc/libai/pull/321
- 流水并行实现,同时添加单元测试验证并行正确性,已经合并:https://github.com/Oneflow-Inc/libai/pull/348
- 添加swinv2_loader.py ,实现huggingface和libai的权重导入,以及其对应的单元测试文件,未合并:https://github.com/Oneflow-Inc/libai/pull/353
关于swin精度不对齐问题,在commit
- https://github.com/Oneflow-Inc/libai/commit/7275a1c7bbb7e29f821dab18630e0a31e8a697d4 之前的log是这样的,和pytorch版本差距巨大: libai: log.txt facebook: log_swin_tiny_patch4_window7_224.txt
精度不对齐详细讨论在:https://github.com/Oneflow-Inc/libai/discussions/366