TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

打造小模型:深度可分离卷积、剪枝、蒸馏,以及 EfficientTAM

状态:草稿(2026-10-16),部分为实测数据。 亲自尝试的内容包括笔记本电脑 CPU 示例(code/04_small_models.py,耗时在 1 秒左右)以及实验型 GPU 上的 EfficientTAM 测试(第 6 节,家庭实验室的一张 8GB 级笔记本 GPU,一次性 Pod)。论文中的数据直接引自原文并保留了相关条件,硬件则以等级标出。 系列文章《阅读视觉模型 3》第 4 篇。关于蒸馏的学习原理,请参考 《阅读视觉模型 2》第 4 篇;关于 EfficientTAM 的结构,请参考 《阅读视觉模型 1》第 10 篇。

目录

1. 我们在减少什么:计算量、参数量与内存访问

把模型做“小”这个说法混淆了三个不同的概念。

这三者并不是同步变化的。本文的大部分实测结果都展示了这种不一致性。

2. 改变结构:深度可分离卷积(MobileNet)

작게 만드는 세 가지 길 ① 구조: 깊이별 분리 합성곱(MobileNet) 보통 3×3 채널을 섞으며 공간을 본다 K²·M·N 깊이별 3×3 채널마다 따로 K²·M + 1×1 채널 섞기 M·N 곱셈-덧셈 8.4배↓, 그러나 이 노트북 CPU 시간은 1.6배↓ (채널 128 — 4편 code/04 실측) ② 가지치기: 어디를 0 으로 만드나 비구조적 구조적(행 통째) 모양은 그대로 밀집 곱은 0 도 곱한다 작은 밀집 행렬이 된다 → 바로 빠름 ③ 증류: 큰 교사의 출력을 작은 학생이 따라 배운다 교사 크고 느림 학생 작고 빠름 부드러운 정답
图:通常的 3×3 卷积被拆分为深度 3×3 与 1×1 的 MobileNet 构想、非结构化与结构化剪枝的形态差异、从教师模型到学生模型的蒸馏

通常的 3×3 卷积在生成每个输出通道时,都会查看所有输入通道的 3×3 邻域。这相当于同时在做“观察空间”和“混合通道”。Howard 等人提出的 MobileNet(2017)将这两者分开了。

  1. 深度(depthwise)3×3:每个通道单独使用一个 3×3 滤波器,只观察空间。
  2. 逐点(pointwise)1×1:混合相同位置的通道。

如果输入通道为 M,输出通道为 N,滤波器边长为 K,特征图大小为 H×W,则

보통 합성곱        H·W·M·N·K²
깊이별 분리        H·W·M·K²  +  H·W·M·N
비율(분리 ÷ 보통)  1/N + 1/K²

为。当 K=3 且 N 很大时,计算量大约是原来的九分之一。论文在 3.1 节中指出,相比 3×3 卷积,计算量减少了 8 到 9 倍。

模型(ImageNet,输入 224) Top-1 准确率 乘加运算 参数量
同等结构,普通卷积 71.7% 4,866M 29.3M
MobileNet(深度可分离) 70.6% 569M 4.2M

(摘自 MobileNet 论文表 4。)牺牲了 1% 的准确率,将计算量减少了约 8.6 倍。计算量的 95% 集中在 1×1 卷积上(表 2)也是设计意图之一,因为 1×1 卷积本质上是矩阵乘法,可以在任何机器上快速运行。

MobileNet 提供了两个用于选择大小的旋钮。 宽度乘数 α(乘以通道数)将计算量和参数量大约按 α² 减少, 分辨率乘数 ρ 则仅将计算量按 ρ² 减少(参数量保持不变)。在论文表 6 和表 7 中,当 α=0.5 时,准确率从 70.6% 降至 63.7%(乘加运算 149M);当输入为 128 时,准确率为 64.4%(186M)。正如我们在第 5 篇中所看到的,降低分辨率会付出“小物体消失”的另一代价。

MobileNetV2(Sandler 等人,2018)采用了 反向残差结构:先通过 1×1 将狭窄的瓶颈放大 6 倍,然后进行深度 3×3 卷积,最后再将其变窄。再次变窄的最后一个 1×1 卷积不使用 ReLU 激活函数(根据观察,在低维空间使用 ReLU 会粉碎信息)。在手机 CPU 的单个大核心上,V1 耗时 113ms 降至 V2 的 75ms,Top-1 准确率从 70.6% 提升至 72.0%(表 4)。

3. 亲自实测:计算量减少 8.4 倍,时间也会缩短 8.4 倍吗?

我们在通道数为 128、特征图为 72×128(512×288 输入的四分之一大小)的条件下,使用笔记本电脑 CPU 的单个线程,对普通 3×3 卷积与深度可分离卷积进行了耗时测量(9 次运行的中位数): code/04_small_models.out.txt).

参数量 乘加运算 CPU 时间 每秒乘加运算量
普通 3×3 147,456 1,359.0M 4.23ms 321G/s
深度 3×3 + 1×1 17,536 161.6M 2.62ms(深度 2.06 + 1×1 0.28) —
其中仅深度 3×3 1,152 10.6M 2.06ms 5.2G/s
其中仅 1×1 16,384 151.0M 0.28ms 548G/s

计算量减少了 8.4 倍,但时间仅缩短了 1.6 倍。罪魁祸首是深度 3×3 卷积。它的计算量只占总体的 7%,却消耗了 79% 的时间。由于深度卷积不混合通道,根据读取的单个数值所进行的计算非常少(算术强度低)。专用的矩阵乘法硬件只有在“用读取的一个数值进行大量计算”时才快,因此深度卷积几乎让该硬件处于闲置状态。由于这台笔记本电脑 CPU 带有矩阵加速器,使稠密卷积异常迅速,这种差距可能显得更大(未对其他 CPU/GPU 进行实测)。

正面探讨这一现象的论文是 Ma 等人的 ShuffleNet V2(2018)。计算量相近的结构在 GPU 和手机 CPU 上的运行速度顺序各不相同,因此他们总结道:“计算量只是速度的代理指标,请在目标设备上直接测量。”其中提出的四条准则中有两条与上述结果吻合:不要过度使用分组卷积(在保持计算量不变的情况下将组数从 1 增加到 8,会使桌面级 GPU 的吞吐量从 2,451 下降到 634);不要忽视逐元素运算(ReLU、加法)(如果在 ResNet 块中去掉这两个运算,GPU 和手机 CPU 的速度都会提升约 20%)(表 2、4)。

4. 均衡扩展:EfficientNet

Tan 和 Le 的 EfficientNet(2019)提出了一个相反方向的问题:当拥有一个小型基准网络时, 应该扩展深度、宽度还是分辨率?只扩展其中一个很快就会达到饱和,因此他们按固定的比例同时扩展这三者。

깊이 d = α^φ,  폭 w = β^φ,  해상도 r = γ^φ,   조건 α·β²·γ² ≈ 2   (α, β, γ ≥ 1)

由于卷积的计算量与深度成正比,且与宽度和分辨率的平方成正比,因此 φ 每增加 1,计算量大约增加 2 倍。基准网络 B0 是通过神经网络结构搜索(NAS)找到的,其参数为 α=1.2、β=1.1、γ=1.15。

模型 Top-1 准确率 参数量 计算量(FLOPs)
EfficientNet-B0(输入 224) 77.1% 5.3M 0.39B
EfficientNet-B7 84.3% 66M 37B

(摘自论文表 2。)摘要中的“比当时最好的模型小 8.4 倍,快 6.1 倍”,其中的“快”指的是 单个服务器 CPU 核心、批次大小为 1 时的延迟(19.0 秒对 3.1 秒,表 4)。在摘要中往往会省略这并非指 GPU 吞吐量的前提条件。

5. 精简:剪枝

这是一种将训练结束后的网络中的微小权重归零,然后重新进行少量训练以恢复准确率的方法。Han 等人的 Deep Compression(2016)通过剪枝 → 权重聚类(卷积 8 比特,全连接 5 比特)→ 哈夫曼编码,在保持准确率的同时,将 AlexNet 的体积从 240MB 缩减到 6.9MB(35 倍),VGG-16 从 552MB 缩减到 11.3MB(49 倍)(表 1)。仅通过剪枝,AlexNet 的连接数就减少了 9 倍,VGG-16 减少了 13 倍。

在这里,我们必须区分“变小了”和“变快了”。论文报告的 3-4 倍速度提升是在 仅全连接层、批次大小为 1 的情况下测得的,论文自己也承认在较大批次下这种优势会消失(6.3 节,附录 A)。

6. 亲自实测:90% 为零会有 10 倍的速度提升吗?

我们测试了 2048×2048 全连接层乘以 64 个输入的耗时(笔记本电脑 CPU,单线程,9 次运行的中位数)。

权重 时间
稠密(剪枝前) 0.59ms
任意位置 90% 归零(非结构化),稠密乘法 0.59ms
将相同矩阵转换为稀疏格式(CSR)进行相乘 6.83ms
整行 90% 直接删除(结构化),稠密乘法 0.06ms

非结构化剪枝的形状没有改变,因此稠密乘法也会对零进行相乘。如果转换为稀疏格式,虽然可以跳过零,但在这种规模和稀疏度下,由于不规则的访问开销,反而 慢了 11.6 倍。只有将整行删去的结构化剪枝才能继续作为较小的稠密乘法运行,速度提升了约 10 倍。这就是 Li 等人(2017)提出直接删除卷积滤波器的方法的原因。在 CIFAR-10 的 VGG-16 上,计算量减少了 34%,在桌面级 GPU(批次大小 128)上,测试时间从 1.23 秒缩短至 0.73 秒(表 1、3)。非结构化稀疏性如果有专用内核或硬件支持也可能会变快,但我们没有对此进行测量(未实测)。

7. 知识转移:蒸馏

如果从一开始就使用小型结构进行训练,通常无法学到像大模型那样好的效果。 知识蒸馏是将大模型(教师模型)的软输出与小模型(学生模型)的目标标签结合起来共同学习。其原理与数据可在 《阅读视觉模型 2》第 4 篇中找到详细说明。从实时性的角度来看,只需记住一点: 蒸馏不会改变结构。 学生的运行速度由学生的结构(第 2-4 节)决定,蒸馏只是帮助该结构更接近其可能达到的准确率极限。

8. 示例:精简了 SAM 2 的 EfficientTAM

Xiong 等人的 EfficientTAM(2024)是将上述方法共同应用到视频分割模型中的一个实例。 《阅读视觉模型 1》第 10 篇中已经介绍了其结构,此处仅重新列出被精简的部分。

模型(论文表 1) 参数量 数据中心 GPU FPS 手机延迟 SA-V 测试 J&F
SAM 2(对比对象) 81M 43.8 — 74.7
EfficientTAM-S 34M 85.0 1,010.8ms 74.5
EfficientTAM-Ti/2 18M 109.4 261.4ms 70.8

(1024×1024 输入,GPU 批次为 1。手机为 2023 年高端机型,测量精度和输入尺寸未在论文中说明。)在将输入缩减至 512×512 的表 5 中,手机端为 80.6ms,SA-V 为 71.5。正如《视觉模型阅读 1》的第 10 篇所指出,摘要中接近“手机约 10 FPS”的数字仅适用于这个 512 输入的版本。

我们的实测:在实验 GPU 上运行 EfficientTAM-S

TT Lab 的乒乓球桌查找功能使用了 EfficientTAM-S。我们在家实验室的一张 8GB 级别笔记本 GPU 上测试了相同的权重(sha256 校验)。采用一次性 Pod,无其他 GPU 任务,为预热 5 次后 10 次 × 3 组的中位数。

项目 FP32 FP16 BF16
图像编码器,1024×1024,批次 1 58.8ms 18.7ms 18.7ms
同上,批次 4(每张图) 60.9ms 20.4ms 20.5ms
单次查找(512×288 画面 → 编码 + 根据一个点生成掩码) 69.4ms — 29.9ms
其中仅掩码解码器(编码后根据一个点) 3.9ms — —
将编码器输入改为 512×512 的版本,批次 1 12.8ms — 5.9ms

7. 局限性

8. 与我们项目的联系

下一篇文章将介绍在保持模型不变的情况下, 降低频率、缩小范围 运行的方法。

TT 点评。 乘法运算减少了 8 倍,但时间只减少了 1.6 倍。有时候数据读取比计算还要慢。比起天平(计算量),更要相信时钟(实测)!

参考文献

登录后即可点赞

评论

还没有评论。

登录后即可发表评论