1. 激活压缩概述:为什么需要激活压缩?
大家好,我是你们这门课的老朋友。今天咱们聊聊一个很实在的问题——激活压缩。
你可能听过这个词,也可能觉得它离自己有点远。但我可以负责任地告诉你:在现在的芯片设计里,激活压缩已经不是「锦上添花」,而是「雪中送炭」了。
为什么这么说?
咱们先看一个数字。我几年前做过一个中等规模的卷积神经网络加速器,光是一层卷积的激活值,就要占掉几十兆字节的片上存储。你想想看,几十兆在先进工艺里是什么概念?那几乎要把整个芯片的面积吃掉一大块。
所以,激活压缩的核心目的就两个:省面积、省带宽。
1.1 激活值在芯片中的存储与带宽瓶颈
先说说存储。激活值是什么?说白了,就是神经网络每一层计算完的输出。这些数据要暂存在片上,等下一层来用。
我见过不少团队,算法跑得挺欢,一到硬件实现就傻眼了——激活值太大,SRAM 放不下。怎么办?要么加面积,要么降性能。加面积意味着成本飙升,降性能意味着产品竞争力下降。两头都难受。
再说带宽。现代神经网络推理,大部分时间都花在数据搬运上。你算得快没用,数据送不过来。激活值在芯片内部、芯片与外部存储器之间来回倒腾,带宽就成了真正的瓶颈。
核心矛盾:计算能力增长快于存储与带宽增长。激活值越大,这个矛盾越突出。
我举个例子。假设你有一个 256 通道的特征图,尺寸是 56×56,每个激活值用 8 比特表示。这一层就要 256 × 56 × 56 × 1 字节 ≈ 800 KB。如果芯片上有 8 层这样的数据同时驻留,那就是 6.4 MB。对于很多边缘芯片来说,这已经是片上 SRAM 的全部家当了。
所以,压缩激活值,本质上就是在跟物理定律做交易——用计算换存储,用算法换带宽。
1.2 激活压缩的收益:一张图看懂
下面这张图,是我自己画的一个框架图。它把激活压缩在整个芯片设计中的位置和收益讲清楚了。
从这张图可以看得很清楚:激活压缩不是孤立的技术,它直接作用于存储、带宽和功耗三个维度。这三个维度,恰恰是芯片设计中最难啃的骨头。
1.3 为什么现在非做不可?
你可能要问:以前不压缩不也活得好好的吗?
嗯,这个问题问得好。我简单说三点:
- 模型越来越大。几年前 ResNet-50 算大的,现在 ViT、LLM 动辄几百兆参数。激活值也跟着水涨船高。
- 工艺进步变慢。摩尔定律放缓,片上 SRAM 密度提升有限。你没法指望工艺自动帮你解决问题。
- 实时性要求变高。自动驾驶、工业检测这些场景,延迟是硬指标。数据搬来搬去,时间就浪费了。
一个小技巧:我习惯在项目早期就做激活值分布分析。用 Python 跑一遍推理,把每层激活值的直方图画出来。你会发现,大部分激活值集中在零附近——这就是压缩的空间。
1.4 激活压缩的常见方法概览
在正式开始讲具体技术之前,我先列一个表格,让你对「工具箱」有个整体印象。后面每一章都会深入展开。
| 方法 | 核心思想 | 典型压缩比 | 硬件代价 |
|---|---|---|---|
| 量化 | 用更少比特表示激活值(如 FP32→INT8) | 4× | 低(只需量化单元) |
| 稀疏编码 | 只存储非零激活值及其索引 | 2×~5× | 中(需要索引解码) |
| 剪枝 | 去除冗余的激活通道或神经元 | 2×~3× | 中(需要重训练) |
| 低秩分解 | 用低秩矩阵近似激活值张量 | 1.5×~3× | 高(需要矩阵运算) |
| 预测编码 | 利用相邻激活值的相关性做差分编码 | 2×~4× | 中(需要预测器) |
你看,每种方法都有自己的「脾气」。有的压缩比高但硬件代价大,有的实现简单但压缩比有限。选哪种,取决于你的芯片目标——是做极致能效,还是做快速上市。
我曾经踩过一个坑:在一个项目里,我们一股脑用了最高压缩比的方案,结果解码延迟太大,反而拖慢了整体推理速度。后来我学乖了——压缩不是越狠越好,要在压缩比和硬件开销之间找平衡。
1.5 激活压缩的适用场景
不是所有芯片都需要激活压缩。我总结了几类典型场景:
- 边缘 AI 芯片:SRAM 资源极其有限,能省一点是一点。比如智能摄像头、TWS 耳机。
- 数据中心推理卡:带宽是命门,压缩激活值能显著提升吞吐量。
- 自动驾驶域控制器:实时性要求高,减少数据搬运就是减少延迟。
- 可穿戴设备:功耗是第一位,压缩激活值能省下宝贵的毫瓦。
反过来,如果你的芯片片上存储足够大、带宽足够宽、功耗预算足够宽松——那确实没必要折腾压缩。但说实话,我做了这么多年芯片,这种「三足够」的项目,一个都没遇到过。
1.6 本章小结
激活压缩,说白了就是跟数据较劲。它解决的是芯片设计中「存储墙」和「带宽墙」这两个老大难问题。
我个人认为,未来五年,激活压缩会成为 AI 芯片的标配技术。原因很简单:模型越来越大,芯片面积越来越贵,能效要求越来越高。你不压缩,就只能在成本上吃亏。