状态:草稿(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)
- 4. 均衡扩展:EfficientNet
- 5. 精简:剪枝
- 7. 知识转移:蒸馏
- 8. 示例:精简了 SAM 2 的 EfficientTAM
- 9. 局限性
- 10. 与我们项目的关联
- 参考文献
1. 我们在减少什么:计算量、参数量与内存访问
把模型做“小”这个说法混淆了三个不同的概念。
- 乘加运算数(MACs,约为 FLOPs 的一半):单次推理中的计算总量。
- 参数量:需要下载的大小以及加载到内存中的大小。
- 内存访问量:为计算而读取和写入的字节数。正如第 1 篇的《一帧的一生》中所述,往往正是这个因素决定了实际运行时间。
这三者并不是同步变化的。本文的大部分实测结果都展示了这种不一致性。
2. 改变结构:深度可分离卷积(MobileNet)
通常的 3×3 卷积在生成每个输出通道时,都会查看所有输入通道的 3×3 邻域。这相当于同时在做“观察空间”和“混合通道”。Howard 等人提出的 MobileNet(2017)将这两者分开了。
- 深度(depthwise)3×3:每个通道单独使用一个 3×3 滤波器,只观察空间。
- 逐点(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 篇中已经介绍了其结构,此处仅重新列出被精简的部分。
- 将编码器替换为小型扁平 ViT:用 ViT-Tiny/Small 替代分层 Hiera。这属于改变结构的做法(第 2 节)。
- 预训练采用模仿大模型特征的方式:EfficientSAM 的 SAMI 预训练(从被遮挡的碎片中恢复 SAM 2 编码器的特征)——这属于广义上的蒸馏(第 5 节)。
- 将记忆块平均为 2×2: 将内存交叉注意力(Memory Cross-Attention)的键和值减少到四分之一。这是减少计算量的一侧(与第 4 节的精神相同)。
| 模型(论文表 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 |
- 参数总量均为 3,406 万个,其中图像编码器为 2,235 万个,与论文中的 34M 相符。
- 即使输入为 512×288,模型也会将图像放大至 1024×1024 进行编码。因此,单次查找绝大部分的时间(69.4ms 中的 67.0ms)都花在了编码器上。 即便将手机屏幕画面缩小发送,该模型的计算量也不会减少。
- 从 FP32 到 16 位,编码器速度提升了 3.1 倍。在同一 GPU 上,球模型(卷积)的提升为 1.5 倍(第 2 篇)。这是因为 Transformer 的大型矩阵乘法能够更好地利用 16 位专用计算单元(张量核心,Tensor Core)。
- 批次 4 时,每张图的时间几乎相同。该 GPU 处理单张图就已经饱和了(第 6 篇)。
- 512×512 版本是通过调整位置嵌入(position embedding)缩放后适配的,因此 未测量准确度(未实测)。如果不像论文表 5 那样重新训练,准确度可能会下降。仅从时间来看,在 1024 四分之一的像素下,速度快了 4.6 倍(FP32)到 3.1 倍(BF16)。
7. 局限性
- 计算量不等于运行时间。 第 2 节和第 4 节的实测就是例子。不能只看表格里的计算量和参数量来挑选,必须在目标设备上进行实测。
- 精简之后失去了什么,取决于具体的任务。 MobileNet 的 1%p 是 ImageNet 分类的数据。在屏幕上寻找几个像素大小的球这一任务中,是否会按同等比例损失精度,目前无法保证(未实测)。
- 剪枝比例只代表存储大小。 只有在结构上进行了擦除,或者拥有专用内核与硬件时,才能带来速度上的提升。
8. 与我们项目的联系
- TT Score 的球模型(BlurBall)虽然属于 HRNet 系列,但已经很小了。通道数为 16–128,参数量为 1.49M。即便如此,在 512×288 分辨率下,单帧仍需几毫秒到十几毫秒,原因不在于计算量,而在于 保持分辨率到最后的结构(因为球只有几个像素,无法缩减)。因此,比起将该模型做得更小,我们优先考虑了精度(第 2 篇)和输入尺寸(第 5 篇)。
- 由于乒乓球桌查找只需在比赛开始时进行一次,EfficientTAM 的大小不成问题。正如第 6 节的实测那样,如果单次查找耗时 30–70ms,接下来的步骤就是“在手机上实现查找”(第 7 篇)。
- “录像教师 → 实时学生”蒸馏是 TT Score 正在进行的研究。至于学生的结构应该如何设计,我们打算采用本文的测量方法(在目标设备上直接测量)来进行挑选。
下一篇文章将介绍在保持模型不变的情况下, 降低频率、缩小范围 运行的方法。
TT 点评。 乘法运算减少了 8 倍,但时间只减少了 1.6 倍。有时候数据读取比计算还要慢。比起天平(计算量),更要相信时钟(实测)!
参考文献
- Howard, A. G. et al. (2017). MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. arXiv. https://arxiv.org/abs/1704.04861
- Sandler, M. et al. (2018). MobileNetV2: Inverted Residuals and Linear Bottlenecks. CVPR 2018. https://arxiv.org/abs/1801.04381
- Tan, M., Le, Q. V. (2019). EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. ICML 2019. https://arxiv.org/abs/1905.11946
- Ma, N. et al. (2018). ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design. ECCV 2018. https://arxiv.org/abs/1807.11164
- Han, S., Mao, H., Dally, W. J. (2016). Deep Compression. ICLR 2016. https://arxiv.org/abs/1510.00149
- Li, H. et al. (2017). Pruning Filters for Efficient ConvNets. ICLR 2017. https://arxiv.org/abs/1608.08710
- Xiong, Y. et al. (2024). Efficient Track Anything. arXiv. https://arxiv.org/abs/2411.18933
- 示例代码与输出:此文件夹中的
code/04_small_models.py,code/04_small_models.out.txt