2、推理能耗模型:能耗的组成、测量与建模基础

各位同学,咱们今天聊聊推理能耗模型。说实话,这章是整个课程里最“硬核”的部分之一。你想想看,如果你连能耗从哪来、怎么测、怎么建模都不清楚,那后面谈优化就是空中楼阁。

我个人习惯是,拿到一个新板子,先跑一遍能耗基线。不是跑什么复杂模型,就一个简单的矩阵乘法。为什么?因为能耗的三大块——计算、内存、通信——在这个操作里全都能暴露出来。

2.1 能耗的三大组成部分

推理能耗,说白了就是三件事在吃电:

  • 计算能耗:CPU/GPU/NPU 做乘加运算时消耗的能量
  • 内存能耗:数据在 SRAM、DRAM 之间搬来搬去消耗的能量
  • 通信能耗:芯片之间、板卡之间、甚至设备到云端传输数据消耗的能量

我刚开始做边缘推理时,一直以为计算是最耗电的。直到有一次在 Jetson Nano 上跑 MobileNet,用功率计一测,发现内存访问占了将近 60%。嗯,当时我就意识到,直觉靠不住,数据才靠谱。

关键认知: 在边缘设备上,内存访问能耗往往远高于计算能耗。一次 DRAM 访问的能耗,大约是一次乘加运算的 100-200 倍。

2.1.1 计算能耗

计算能耗主要来自算术逻辑单元(ALU)和乘法器。对于神经网络来说,主要是卷积和全连接层的乘加运算。

我一般用这个公式估算:

E_compute = N_mac × E_mac

其中 N_mac 是乘加操作次数,E_mac 是单次乘加能耗。不同硬件差异很大,比如:

硬件平台 单次乘加能耗 (pJ) 备注
ARM Cortex-A72 ~20 pJ 通用CPU,效率一般
NVIDIA Jetson GPU ~5 pJ 并行度高,但功耗大
Edge TPU ~2 pJ 专用加速器,效率高
定制ASIC <1 pJ 极致优化,但灵活性差

我的经验: 别太迷信芯片手册上的理论值。实际跑起来,因为内存带宽瓶颈、散热降频等因素,真实能耗往往是理论值的 1.5-2 倍。我习惯在手册值基础上加 30% 的余量。

2.1.2 内存能耗

内存能耗是边缘设备上最大的“隐形杀手”。为什么?因为数据搬移比计算本身更耗电。

我举个例子:在 STM32F4 上跑一个 3×3 卷积,计算本身可能只花 0.1 mJ,但为了把输入特征图和权重从 Flash 搬到 SRAM,再搬回去,内存访问能耗可能高达 0.5 mJ。

内存能耗的组成:

  • 片上内存(SRAM):速度快,能耗低,但容量小(通常几十 KB 到几 MB)
  • 片外内存(DRAM/Flash):容量大,但每次访问能耗高一个数量级

我常用的估算公式:

E_memory = N_read × E_read + N_write × E_write

其中 E_read 和 E_write 取决于内存层级。比如:

内存层级 读取能耗 (pJ/bit) 延迟 (ns)
L1 SRAM ~0.5 ~1
L2 SRAM ~2 ~5
LPDDR4 ~20 ~50
NAND Flash ~100 ~1000

避坑指南: 我曾经在一个项目里,为了省成本选了低端 MCU,结果模型跑起来发热严重。一查才发现,Flash 读取能耗占了 70%。后来换了带更大 SRAM 的芯片,能耗直接降了一半。所以,选型时别只看算力,内存子系统同样关键。

2.1.3 通信能耗

通信能耗在单芯片推理中占比不大,但在分布式推理或端云协同场景下,就成了大头。

我做过一个实验:在 ESP32 上跑一个语音唤醒模型,本地推理只耗 50 mJ,但把音频数据传到云端推理,Wi-Fi 传输就耗了 200 mJ。你想想看,这多不划算。

通信能耗主要来自:

  • 无线传输:Wi-Fi、蓝牙、4G/5G 的射频功耗
  • 有线传输:SPI、I2C、USB 等接口的驱动功耗
  • 协议开销:数据打包、解包、重传等

粗略估算:

E_comm = Data_size × E_per_bit + E_overhead

不同无线协议的每比特能耗差异巨大:

通信方式 每比特能耗 (nJ/bit) 典型场景
BLE 5.0 ~0.5 传感器数据上传
Wi-Fi 802.11n ~5 视频流传输
4G LTE ~50 远程监控
LoRa ~0.1 低速率远距离

我的建议: 如果通信能耗占比超过 20%,就该考虑做数据压缩或本地预处理了。我习惯在模型输出端加一个“变化检测”,只有数据变化超过阈值才传输,能省 80% 的通信能耗。

2.2 能耗测量方法

理论说得再好,不如实际测一测。我见过太多人拿着芯片手册算能耗,结果实际跑起来差好几倍。所以,测量是必须的。

2.2.1 硬件测量方法

最直接的方法,就是在电源路径上串一个采样电阻,用 ADC 采集电压和电流。

我常用的工具:

  • INA219/INA226:I2C 接口的电流/功率监测芯片,精度 1% 左右,适合嵌入式场景
  • Joulescope:专业功耗分析仪,采样率 2 MHz,能捕捉微秒级的功耗波动
  • 示波器 + 电流探头:最灵活,但设置麻烦,适合调试阶段

硬件测量的基本电路:

电源 → 采样电阻 (0.1Ω) → 目标设备
          ↓
        ADC 采集电压差 → 计算电流 → 积分得能耗

注意: 采样电阻不能太大,否则压降会影响设备正常工作。我一般选 0.01-0.1Ω,功耗损失控制在 1% 以内。

2.2.2 软件测量方法

如果手头没有硬件工具,也可以用软件方法估算。虽然精度差一些,但胜在方便。

我常用的软件方法:

  • Linux 的 powercap 接口:读取 CPU/GPU 的能耗计数器,精度约 10%
  • MCU 的 DWT 计数器:通过统计指令执行周期,结合手册功耗数据估算
  • 性能计数器 + 能耗模型:统计内存访问次数、MAC 操作次数,代入能耗模型计算

举个例子,在 Linux 系统上:

# 读取 CPU 能耗
cat /sys/class/powercap/intel-rapl/intel-rapl:0/energy_uj

# 读取 GPU 能耗(NVIDIA)
nvidia-smi --query-gpu=power.draw --format=csv

我的经验: 软件测量适合做相对比较,比如对比不同优化策略的能耗差异。但绝对数值别太当真,我测过几次,软件读数比实际功耗低 15-20%。所以,关键决策还是要靠硬件测量。

2.3 能耗建模基础

有了测量数据,下一步就是建模。为什么要建模?因为测量只能得到“是什么”,建模才能回答“为什么”和“如果...会怎样”。

2.3.1 经验模型

最简单的建模方法,就是基于测量数据拟合一个公式。比如:

E_total = a × N_mac + b × N_mem + c × N_comm

其中 a、b、c 是通过实验数据拟合出来的系数。我一般用最小二乘法,跑 10-20 个不同配置的测试用例,就能得到不错的拟合结果。

优点:简单、直观、容易实现。
缺点:泛化能力差,换一个硬件或模型就得重新拟合。

2.3.2 分析模型

分析模型基于硬件架构的物理特性来建模。比如,对于计算能耗:

E_compute = V^2 × f × C_eff × N_cycle

其中 V 是电压,f 是频率,C_eff 是有效电容,N_cycle 是执行周期数。

这种模型更精确,但需要深入了解硬件细节。我一般在做芯片选型或架构设计时用分析模型,日常优化还是用经验模型多。

2.3.3 机器学习模型

最近几年,也有人用机器学习来预测能耗。输入是模型结构、硬件配置、输入数据特征,输出是能耗预测值。

我试过用随机森林做能耗预测,在 5 种不同硬件上训练,预测误差在 5% 以内。但问题是,训练数据收集很麻烦,而且模型本身也有能耗开销。

我的建议: 对于大多数边缘推理场景,经验模型就够用了。别为了追求精度把问题搞复杂。先跑起来,再优化,这是我一贯的原则。

2.4 小结

这一章我们聊了能耗的三大组成——计算、内存、通信。记住了,内存是最大的“电老虎”。测量方法上,硬件测量最准,软件测量最方便。建模方面,从经验模型开始,够用就好。

下一章,我们会把这些知识用起来,开始做实际的能耗优化。到时候,我会拿一个具体的模型,一步步演示怎么分析、怎么优化。嗯,敬请期待。