DynamicViT T-PAMI扩展版深度解析:动态空间稀疏化如何把token剪枝带到ConvNeXt与Swin
【免费下载链接】DynamicViT[NeurIPS 2021] [T-PAMI] DynamicViT: Efficient Vision Transformers with Dynamic Token Sparsification项目地址: https://gitcode.com/gh_mirrors/dy/DynamicViT
DynamicViT 是一个面向视觉模型的动态 token 稀疏化框架(NeurIPS 2021 原始版本)。其被 T-PAMI 收录的扩展版将方法升级为通用的动态空间稀疏化框架,把 token 剪枝从 Vision Transformer 推广到ConvNeXt 与 Swin Transformer,并扩展到目标检测、语义分割等下游任务:FLOPs 降低超30%,吞吐量提升超40%,而精度损失控制在0.5%以内。
从 token 剪枝到动态空间稀疏化:扩展版改了什么?
NeurIPS 2021 的 DynamicViT 只支持 DeiT、LV-ViT 这类标准 Vision Transformer;T-PAMI 期刊版则回答了一个更普遍的问题:"按输入动态删掉冗余空间位置"这件事,能不能做成所有视觉网络通用的模块?答案是能,对比如下:
| 维度 | NeurIPS 2021(DynamicViT) | T-PAMI 扩展版(动态空间稀疏化) |
|---|---|---|
| 支持网络 | DeiT、LV-ViT 等 ViT 家族 | 新增 ConvNeXt(CNN)、Swin Transformer |
| 下游任务 | 图像分类 | 新增目标检测、语义分割 |
| 剪枝对象 | ViT 的 token 序列 | 通用空间特征图,天然适配 CNN |
| 保留率设计 | ρ、ρ²、ρ³ | ρ、ρ−0.2、ρ−0.4 |
代码层面,保留率与剪枝位置的设定集中在 infer.py 中:ViT 系网络用KEEP_RATE1 = [ρ, ρ², ρ³],ConvNeXt/Swin 则用KEEP_RATE2 = [ρ, ρ−0.2, ρ−0.4];剪枝点PRUNING_LOC设在各个 stage 交界处(例如 ConvNeXt-Tiny 在[1,2,3],Swin-Small 在[2,4,6])。对应的三套网络实现分别位于models/dyvit.py、models/dyconvnext.py、models/dyswin.py。
动态空间稀疏化如何工作:网络自己决定剪哪里 🎯
1. 输入依赖的动态打分
在每个剪枝点,网络会额外预测一张空间重要性分数图:分数高的位置(通常是前景、物体主体)保留,分数低的冗余区域(背景、纹理重复区)被剪掉。也就是说,剪哪些位置不是固定的,而是每张图都不一样——这正是"动态"二字的含义。
上图是viz_example.ipynb可视化 notebook 的官方输出示例:从左到右是网络逐层剪枝的过程,背景区域逐渐"消失",而木勺(前景)始终完整保留。
2. 师生蒸馏 + 比例约束损失
训练时无需两阶段流程,直接用一个未剪枝的教师网络做知识蒸馏。losses.py 中提供了两个损失模块:
DistillDiffPruningLoss_dynamic:面向 ViT 家族,做 token 级别的特征对齐;ConvNextDistillDiffPruningLoss:面向 ConvNeXt,做空间位置级别的对齐。
总损失由三部分构成:分类 KL 蒸馏 + token/特征蒸馏 + 比例约束损失(ratio_weight控制),其中比例约束会把各剪枝层实际的保留率拉向目标 ρ,让网络"学会按预算剪枝"。
ImageNet 分类性能清单:精度几乎不掉,算力省三成
扩展版提供的 ImageNet 预训练模型主要指标如下(ρ 为 base_rate):
| 模型 | ρ | Top-1 | Top-5 | FLOPs |
|---|---|---|---|---|
| DynamicViT-DeiT-S | 0.7 | 79.32 | 94.68 | 2.9G |
| DynamicViT-DeiT-B | 0.7 | 81.43 | 95.46 | 11.4G |
| DynamicViT-LVViT-M | 0.7 | 83.82 | 96.58 | 8.5G |
| DynamicCNN-T(ConvNeXt-T) | 0.7 | 81.59 | 95.72 | 3.6G |
| DynamicCNN-S(ConvNeXt-S) | 0.7 | 82.57 | 96.29 | 5.8G |
| DynamicCNN-B(ConvNeXt-B) | 0.9 | 83.96 | 96.76 | 11.9G |
| DynamicSwin-T(Swin-T) | 0.7 | 80.91 | 95.42 | 4.0G |
| DynamicSwin-S(Swin-S) | 0.7 | 83.21 | 96.33 | 6.9G |
| DynamicSwin-B(Swin-B) | 0.7 | 83.43 | 96.45 | 12.1G |
⚡ 另一个实用亮点:推理时保留率可以自由调节(--base_rate参数),同一套权重就能在不同算力预算下灵活权衡速度与精度,无需重新训练。
3 步快速上手 DynamicViT 本地部署 🚀
第 1 步:获取代码与安装依赖
git clone https://gitcode.com/gh_mirrors/dy/DynamicViT cd DynamicViT核心依赖:torch>=1.8.0、torchvision>=0.9.0、timm==0.3.2、fvcore(后者用于 FLOPs 统计,实现在calc_flops.py)。
第 2 步:单卡评估预训练模型
python infer.py --data_path /path/to/ILSVRC2012/ --model convnext-t \ --model_path /path/to/model --base_rate 0.7--model支持deit-s、deit-b、lvvit-s/m、convnext-t/s/b、swin-t/s/b等名称;--base_rate越小稀疏度越高、推理越快。
第 3 步:从零训练稀疏网络(8 卡示例)
python -m torch.distributed.launch --nproc_per_node=8 --use_env main.py \ --output_dir logs/dynamic_conv-t --model convnext-t --input_size 224 \ --batch_size 128 --data_path /path/to/ILSVRC2012/ --epochs 120 \ --base_rate 0.7 --lr 4e-3 --drop_path 0.2 --update_freq 4 --lr_scale 0.2训练主流程在main.py与engine.py中,Swin/ConvNeXt 还可通过run_with_submitit.py提交到多机集群训练。
小结:适合谁来用 DynamicViT?
- 想给现成的 ViT / ConvNeXt / Swin 模型加速,又不想重新设计网络结构——动态空间稀疏化几乎即插即用;
- 研究模型压缩、动态推理的工程师与算法同学,可把它作为"输入自适应剪枝"的完整参考实现(含训练、蒸馏、评估全流程);
- 不想直接跑训练?可以打开可视化 notebook
viz_example.ipynb或线上演示colab_demo.ipynb,几分钟就能直观看到逐层剪枝效果。
一句话总结:T-PAMI 扩展版让"动态 token 剪枝"从 ViT 的专属技巧,变成了通用视觉骨干网络的标配加速手段。
【免费下载链接】DynamicViT[NeurIPS 2021] [T-PAMI] DynamicViT: Efficient Vision Transformers with Dynamic Token Sparsification项目地址: https://gitcode.com/gh_mirrors/dy/DynamicViT
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考