InternVideo 蒸馏实践:如何把1B教师模型压缩为轻量S/B/L学生模型
【免费下载链接】InternVideo[ECCV2024] Video Foundation Models & Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideo
InternVideo 是 OpenGVLab 推出的视频基础模型与多模态理解数据项目。本文将带你掌握 InternVideo2 的模型蒸馏实践:使用 1B 参数量的 InternVideo2 Stage2 教师模型,通过中间特征对齐把知识迁移到 Small / Base / Large 三种轻量学生模型,最终得到 S/14、B/14、L/14 蒸馏模型,在 Kinetics 等分类任务上最高达到 90.4% Top-1 精度,同时大幅降低推理成本。
一、为什么需要蒸馏:轻量视频模型的价值
大型视频基础模型精度领先,但部署成本高。InternVideo 系列通过知识蒸馏(Knowledge Distillation),把大模型学到的时空表征"压缩"进小模型:
- 📉参数量降低:1B 教师 → 3 个规模递减的学生模型(S/B/L,patch size 均为 14)
- 🚀推理更快:小模型可直接用于移动端、边缘设备与低延迟服务
- 🎯精度损失可控:得益于中间层特征对齐 + 注意力引导的 token 选择,学生模型在 K710 上仍可达 86.2% Top-1(L/14)
二、蒸馏方案核心思路:像 MILAN 一样对齐中间特征
InternVideo2 的蒸馏不是简单的"输出对齐",而是同时对齐中间层特征与最终池化特征,这与 MILAN 的思路一致。整个训练流程可以概括为三步:
- 教师输出引导采样:1B 教师模型(InternVideo2 Stage2-1B)对视频做前向,同时输出中间层特征、最终特征与注意力分布;
- 注意力引导 token 选择:利用教师注意力分数挑出"最重要的" 20% token 参与学生模型计算(
--mask_type attention、--mask_ratio 0.8),相当于让学生只关注教师认为重要的区域; - 双层特征对齐损失:学生模型通过多个
MLP_Decoder把自己的中间层特征映射到教师特征空间(L2 归一化后计算余弦距离),同时对齐最终的 AttentionPooling 特征。
涉及的关键源码模块
| 模块 | 路径 | 作用 |
|---|---|---|
| 蒸馏训练入口 | run_distill.py | 参数解析、模型构建、DeepSpeed 启动 |
| 学生模型定义 | internvideo2_distill.py | S/B/L 学生模型 + Linear/MLP 解码器 |
| 教师模型封装 | internvideo2_teacher.py | 1B/6B 教师模型加载与特征输出 |
| 蒸馏训练引擎 | engine_for_distill.py | 注意力掩码生成与对齐损失计算 |
| 蒸馏脚本 | scripts/distillation/ | S/B/L 三个一键启动脚本 |
三、S / B / L 学生模型怎么选
三个学生模型都继承自 ViT 结构,仅在宽度、深度上不同(定义见 internvideo2_distill.py):
| 模型 | embed_dim | 层数 | 特点 | K710 Top-1 |
|---|---|---|---|---|
| S/14 | 384 | 12 | 最轻量,适合端侧部署 | 79.6% |
| B/14 | 768 | 12 | 精度与速度平衡 | 83.5% |
| L/14 | 1024 | 24 | 精度最接近大模型 | 86.2% |
以上为仅预训练结果;若在 K710 上继续微调,L/14 可达90.4%(K400 微调后数据见 MODEL_ZOO.md)。
四、一键启动蒸馏训练
环境安装请参考 INSTALL.md,数据准备见 DATASET.md。安装完成后,只需运行对应的蒸馏脚本:
bash ./scripts/distillation/S14_dist_1B_stage2.sh # 蒸馏 Small 模型 bash ./scripts/distillation/B14_dist_1B_stage2.sh # 蒸馏 Base 模型 bash ./scripts/distillation/L14_dist_1B_stage2.sh # 蒸馏 Large 模型以 B14_dist_1B_stage2.sh 为例,核心参数一目了然:
| 参数 | 示例值 | 含义 |
|---|---|---|
--model | distill_internvideo2_base_patch14_224 | 学生模型规格(S/B/L 对应不同脚本) |
--clip_teacher | teacher_internvideo2_stage2_1B | 指定 1B Stage2 教师模型 |
--mask_type/--mask_ratio | attention/0.8 | 按教师注意力保留 20% token |
--clip_teacher_embed_dim | 1408 | 教师中间层特征维度 |
--clip_teacher_final_dim | 768 | 教师最终特征维度(0 表示不蒸馏最终特征) |
--clip_return_layer | 6 | 对齐的教师中间层数量 |
--clip_student_decoder | MLP_Decoder | 学生侧解码器,官方推荐 MLP 对齐效果更好 |
--num_frames/--num_segments | 8/8 | 稀疏采样 8 帧(--sampling_rate 1) |
--enable_deepspeed/--bf16 | 开启 | DeepSpeed ZeRO-1 + BF16 混合精度 |
--epochs | 101 | 与预训练保持一致的超参风格 |
💡官方提示:蒸馏训练沿用与预训练相同的设置,但把解码器换成MLP_Decoder以获得更好的特征对齐效果。
五、训练中的实用技巧
- 🧊显存紧张时:开启
--use_checkpoint并调整--checkpoint_num,用激活重计算换显存; - 💾断点续训:训练过程中会自动保存
latest检查点,--save_ckpt_freq可设大一些; - 📊观察指标:日志中分别记录
loss_clip_middle(中间层对齐损失)与loss_clip_final(最终特征对齐损失),两者都应平稳下降; - 🔁教师加载机制:run_distill.py 通过注册表安全加载教师模型,支持 1B 与 6B 教师,可按需替换。
六、蒸馏后怎么用
蒸馏得到的 S/14、B/14、L/14 模型可以直接进入微调流程。以 K400 全量微调为例,脚本位于 scripts/finetuning/full_tuning/k400/ 目录,微调后 L/14 在 Kinetics-400 上达到90.4% Top-1。
七、总结
InternVideo 的蒸馏实践展示了视频基础模型"以大带小"的完整路径:
- ✅ 用InternVideo2 Stage2-1B作为教师,输出中间特征、最终特征与注意力;
- ✅ 用注意力引导 token 选择降低学生模型计算量;
- ✅ 用MLP_Decoder 双层对齐损失把知识稳定注入 S/B/L 学生模型;
- ✅ 最终得到精度接近大模型、部署友好的轻量视频模型。
跟着 README.md 中的 Distillation 章节,配合本文的参数讲解,你也能在几天内复现出一套属于自己的轻量视频理解模型。
【免费下载链接】InternVideo[ECCV2024] Video Foundation Models & Data for Multimodal Understanding项目地址: https://gitcode.com/OpenGVLab/InternVideo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考