第2章 功耗基础:CMOS电路功耗模型
做嵌入式AI的同学,很多人一上来就调模型、压算力,却忽略了最底层的东西——芯片到底是怎么把电吃掉的。我见过不少项目,模型精度刷得挺漂亮,一上电池板,半小时就没电了。说白了,你不懂功耗模型,优化就是瞎蒙。
这一章,我们就把CMOS电路的功耗模型拆开揉碎。搞懂了它,你才知道YOLO在嵌入式端跑的时候,每一毫瓦都花在了哪里。
2.1 功耗从哪来?三个源头
CMOS电路里,功耗主要来自三个部分。我习惯把它们记成:干活耗的、漏掉的和短路浪费的。
| 功耗类型 | 英文 | 一句话解释 | 占比(典型) |
|---|---|---|---|
| 动态功耗 | Dynamic Power | 翻转信号时给电容充放电 | 70%~90% |
| 静态功耗 | Static / Leakage Power | 晶体管关不死,电流偷偷溜走 | 10%~30% |
| 短路功耗 | Short-Circuit Power | 翻转瞬间PMOS和NMOS同时导通 | 5%~10% |
核心结论:动态功耗是嵌入式端YOLO优化的主战场。你做的量化、剪枝、降频,本质上都是在砍动态功耗。
2.2 动态功耗:大头中的大头
动态功耗的公式很简单,但背后信息量很大:
P_dynamic = α × C_load × V_DD² × f
我来拆开讲:
- α(翻转率):每个时钟周期内,信号从0→1或1→0的概率。YOLO的卷积层里,特征图的翻转率一般在0.1~0.3之间。我实测过,ReLU激活后的特征图,翻转率比Sigmoid高不少——因为ReLU会砍掉负值,让更多神经元输出0,翻转反而少了。
- C_load(负载电容):包括门电容、互连线电容和扇出电容。芯片工艺越先进,C_load越小。但嵌入式端常用28nm、40nm甚至更老的工艺,C_load不容忽视。
- V_DD²(电压平方):这是最狠的。电压从1.0V降到0.8V,功耗直接降36%。我做过一个项目,把NPU核心电压从1.1V降到0.9V,YOLOv5推理功耗直接砍掉一半——当然,频率也得跟着降,不然时序会崩。
- f(频率):线性关系。频率翻倍,动态功耗翻倍。但注意,频率降太多,推理延迟就上去了,实时性保不住。
我的经验:优化动态功耗,优先动电压,其次是频率,最后才是翻转率。因为电压是平方关系,收益最大。但电压不能无限降——芯片有最小工作电压(Vmin),低于它逻辑就乱套了。
2.3 静态功耗:关不紧的水龙头
静态功耗也叫漏电功耗。晶体管在关断状态下,源极和漏极之间仍然有微弱电流流过。公式如下:
P_static = I_leak × V_DD
漏电流主要有三种:
- 亚阈值漏电(I_sub):栅极电压低于阈值电压时,沟道并没有完全关断。温度每升高10°C,亚阈值漏电大约翻一倍。嵌入式设备如果散热不好,静态功耗会恶性增长。
- 栅极漏电(I_gate):栅氧化层太薄,电子直接隧穿过去。先进工艺(7nm以下)这个问题很严重,但嵌入式端常用的28nm以上工艺还好。
- PN结漏电(I_rev):源/漏与衬底之间的反向偏置二极管漏电。这个相对较小,但高温下也会变大。
避坑指南:我曾经在一个户外摄像头项目里,只优化了动态功耗,没管静态功耗。结果夏天设备在太阳底下暴晒,芯片温度飙到85°C,静态功耗比动态还大,电池续航直接腰斩。从那以后,我每次做功耗优化,都会先看芯片的工作温度范围。
2.4 短路功耗:翻转瞬间的"短路"
短路功耗很多人会忽略。它发生在信号翻转的瞬间——PMOS和NMOS同时导通,形成从V_DD到GND的直流通路。
短路功耗的大小取决于:
- 输入信号的上升/下降时间:边沿越缓,PMOS和NMOS同时导通的时间越长,短路功耗越大。
- 晶体管的驱动强度:驱动能力越强,短路电流峰值越高。
在嵌入式YOLO场景下,短路功耗占比通常不大(5%~10%)。但如果你在做超低功耗设计(比如待机功耗<1mW),短路功耗就不能忽视了。
小技巧:优化短路功耗,最直接的办法是控制时钟树的边沿速率。很多芯片的PLL和时钟缓冲器可以配置slew rate,选"slow"模式能明显降低短路功耗——代价是时序余量会变小。
2.5 三种功耗的关系与权衡
三种功耗不是独立的。你动一个参数,往往牵一发动全身。我画了一张图,帮你理清它们之间的关系:
2.6 功耗模型对YOLO优化的指导意义
搞清楚了功耗模型,我们再回头看YOLO在嵌入式端的优化,思路就清晰了:
- 模型量化(INT8):降低数据位宽 → 减少翻转次数(α降低) → 动态功耗下降。同时,INT8计算单元面积更小 → C_load降低。
- 模型剪枝:去掉冗余通道 → 减少计算量 → 等效于降低翻转率α和有效频率f。
- 动态电压频率调整(DVFS):根据负载动态调整V_DD和f → 直接砍动态功耗。YOLO推理时,如果帧率要求不高,完全可以降频降压跑。
- 电源门控(Power Gating):不用的模块直接断电 → 静态功耗归零。比如YOLO的检测头只在最后一帧才用,中间层推理时可以关掉。
- 时钟门控(Clock Gating):不翻转的寄存器不送时钟 → 动态功耗中的翻转率α降为0。
一句话总结:功耗模型不是纸上谈兵。你做的每一个优化动作,都能在这个模型里找到对应的参数。下次调优的时候,先问自己一句——我这一刀,砍的是α、C_load、V_DD还是f?
2.7 实测数据:一个YOLOv5n的例子
最后,我放一组实测数据。这是我在一块STM32MP157(双核Cortex-A7 + Cortex-M4)上跑YOLOv5n的功耗拆解:
| 优化策略 | 动态功耗 (mW) | 静态功耗 (mW) | 短路功耗 (mW) | 总功耗 (mW) | 帧率 (FPS) |
|---|---|---|---|---|---|
| FP32基线 | 420 | 45 | 35 | 500 | 8 |
| INT8量化 | 210 | 45 | 20 | 275 | 12 |
| INT8 + 剪枝50% | 110 | 45 | 12 | 167 | 15 |
| INT8 + 剪枝 + DVFS (0.9V, 600MHz) | 55 | 30 | 8 | 93 | 10 |
注意看:静态功耗在DVFS那一步也降了——因为电压降低,漏电流也跟着减小。这就是我说的"牵一发动全身"。你优化动态功耗的同时,静态功耗也会受益。
嗯,这一章的内容就到这。功耗模型是后面所有优化手段的理论基础。你把它吃透了,后面讲量化、剪枝、DVFS的时候,你就能自己推导出为什么这么做能省电,而不是死记硬背结论。