3. 计算与存储的能耗模型:MAC运算能耗、数据搬运能耗(内存墙)
好,咱们进入正题。今天聊的这个话题,说白了就是芯片部署里最烧钱的两个地方——算力和搬数据。我经常跟团队说,你搞懂了MAC运算和数据搬运的能耗,你就搞懂了模型部署优化的半壁江山。
3.1 MAC运算能耗:算力的真实成本
先说说MAC运算。MAC就是乘加运算,一个乘法加一个加法。神经网络里90%以上的计算都是这个。你想想看,一个卷积层,几百个MAC,一个模型几千万甚至上亿个MAC,这能耗能小吗?
我个人习惯把MAC运算能耗拆成三块来看:
- 乘法器能耗:占大头,大概60%-70%
- 加法器能耗:占20%-30%
- 寄存器读写能耗:剩下的10%左右
嗯,这里要注意,不同工艺节点下这个比例会变。我在7nm项目上测过,乘法器能耗占比会更高一些,因为漏电流的影响变小了。
关键数据:一次32位浮点MAC运算,在28nm工艺下大约消耗3-5pJ。换成INT8量化后,能降到0.2-0.5pJ。差了10倍不止。所以量化为什么重要?这就是原因。
3.2 数据搬运能耗:被忽视的巨兽
接下来聊数据搬运。这个才是真正的能耗大户。我刚开始做部署时,总觉得计算最费电,后来一测才发现——搬数据才是真正的电老虎。
为什么会这样?我给你算笔账:
| 操作类型 | 能耗(相对值) | 说明 |
|---|---|---|
| 一次MAC运算 | 1x | 基准 |
| 读一次SRAM | 5-10x | 比计算贵5倍 |
| 读一次DRAM | 200-500x | 比计算贵几百倍 |
看到没?从DRAM搬一次数据,够你做几百次MAC运算了。这就是所谓的内存墙——计算速度跟上了,但数据搬运速度跟不上,能耗也跟不上。
避坑指南:我曾经在一个边缘设备项目上,模型算力优化得特别好,MAC次数压到了最低。结果一上板子,功耗还是超标。查了三天才发现,问题出在频繁的DRAM访问上。每次推理都要从外部DDR搬几MB的权重,这能耗比计算本身还高。从那以后,我每次做优化都会先看数据流,再看计算量。
3.3 内存墙的本质:存储层次与能耗
内存墙说白了就是存储层次的问题。现代芯片的存储结构像个金字塔:
- 寄存器:最快,最贵,容量最小
- SRAM(片上缓存):快,贵,容量有限
- DRAM(片外内存):慢,便宜,容量大
你想想看,模型权重放在DRAM里,每次计算都要从DRAM搬到片上SRAM,再从SRAM搬到寄存器。这一趟下来,能耗全花在路上了。
我建议你记住这个原则:数据搬得越远,能耗越高;搬得越频繁,能耗越高。
3.4 实战中的优化策略
那怎么破?我总结了几条实战经验:
- 数据复用最大化:同一个权重尽量多用几次。比如卷积的权重共享,一次搬进来,算完所有通道再换。
- 片上缓存利用:能放SRAM的别放DRAM。我习惯把最常用的权重和激活值常驻片上。
- 计算与搬运重叠:用双缓冲或者乒乓操作,计算的同时搬下一批数据。这样搬运的延迟就被隐藏了。
- 量化压缩:INT8比FP32数据量少4倍,搬运能耗也少4倍。这个性价比极高。
个人经验:我在做某个视觉模型部署时,发现模型有大量重复的权重访问模式。于是做了个简单的数据预取策略——提前把下一层需要的权重搬到SRAM里。就这么一个小改动,整体功耗降了15%。有时候优化不需要多复杂,关键是找对方向。
3.5 能耗模型的计算公式
最后给个实用的能耗模型公式,我平时做方案评估时经常用:
总能耗 = 计算能耗 + 数据搬运能耗
计算能耗 = MAC次数 × 单次MAC能耗
数据搬运能耗 = Σ(各级存储访问次数 × 对应能耗)
其中:
- 单次MAC能耗 ≈ 0.2-5pJ(取决于数据类型和工艺)
- SRAM访问能耗 ≈ 1-5pJ/bit
- DRAM访问能耗 ≈ 50-100pJ/bit
嗯,这个公式看着简单,但用起来很有效。你只要把模型的计算图和存储层次画出来,就能估算出大概的能耗分布。我每次做方案选型前都会先跑一遍这个模型,看看瓶颈在哪。
好了,这一节就到这。记住一句话:算力是成本,数据搬运是更大的成本。下一节咱们聊聊具体的量化技术怎么落地。