想象你是一名背包客,要独自穿越一片 24 小时的荒野。背包里只有一天的口粮,却要完成找路、翻山、扎营、求救等一连串任务。你的每一口食物都对应一个动作:走路耗能、看地图耗能,甚至睡觉时身体也在悄悄消耗基础代谢。而你要做的,就是在口粮耗尽前抵达终点——不多吃一口,也绝不能饿倒在半路。 这个小设备(比如智能手表、无线传感器)就是这位背包客。电池里的电量就是口粮,机器学习模型每一次“看”数据、“想”问题,都要从这笔固定预算里扣钱。问题是:钱花在哪了?有没有办法花得更少?如何评估这趟旅程划算不划算?这就是 TinyML 功耗优化要回答的三件事。本文从功耗来源、测量方法、量化、剪枝、动态调频、系统节能和能效指标七个角度,帮你给这位“AI 背包客”做一份精细的省电攻略。

岗位关联

对 AI 从业者来说,功耗优化是让模型从“能跑”走向“能卖”的最后一公里。掌握能效分析与调优方法,你才能在智能穿戴、物联网终端、工业传感器等真实产品中,做出既聪明又持久的边缘 AI 方案。

目录
  1. 可视化演示
  2. 功耗来源剖析
  3. 功耗测量工具
  4. 模型量化节能
  5. 模型剪枝瘦身
  6. 动态电压调频
  7. 系统级节能
  8. 能效评估指标
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

\u5c55\u793aMapReduce\u7f16\u7a0b\u6a21\u578b\u7684\u4e09\u9636\u6bb5\u5904\u7406\u8fc7\u7a0b\uff1aMap\u62c6\u5206\u3001Shuffle\u805a\u5408\u3001Reduce\u6c47\u603b\uff0c\u5b9e\u73b0\u5927\u89c4\u6a21\u6570\u636e\u7684\u5e76\u884c\u8ba1\u7b97\u3002

本节配有交互动效(进入视口后自动加载,约 3KB)。

MapReduce\u4e09\u9636\u6bb5\u5904\u7406 Map\uff1a\u5c06\u8f93\u5165\u6570\u636e\u62c6\u5206\u4e3a\u952e\u503c\u5bf9 Shuffle\uff1a\u6309\u952e\u805a\u5408\u5e76\u6392\u5e8f (k,v) \u2192 Map \u2192 Shuffle \u2192 Reduce \u2192 (k,sum) Reduce\uff1a\u5bf9\u6bcf\u7ec4\u503c\u6c42\u548c

功耗来源剖析

背包客的每一口食物都有去处。爬山时大腿肌肉剧烈收缩,那是“计算功耗”;停下来翻地图、看指南针,那是“访存功耗”;哪怕深夜躺在睡袋里,心跳呼吸也在消耗,那是“静态泄漏功耗”;而对讲机呼救一按,瞬间耗掉一大截电量,这就是“无线通信功耗”。想省钱,先得知道钱花在了哪里。

在 TinyML 设备上,能量去向同样可以分成四笔账。最直观的是计算功耗——MCU(微控制器)执行乘加运算时,内部晶体管不停充放电,推理的卷积层、全连接层都要靠它。第二笔是访存功耗:模型权重存在 Flash 或 SRAM 里,每取一次数据都要为地址总线和数据总线付电费,而这笔钱常常被低估。第三笔是静态泄漏功耗,芯片即使什么都不干,晶体管也会悄悄漏电。最后一笔是无线传输功耗,蓝牙、LoRa 一发数据,瞬间电流能顶几十次运算。

四笔账不是平均分的。很多应用中访存和无线才是“隐形大户”,计算反而占比不高。所以先测后优化,绝不拍脑袋。背包客出发前清点口粮,嵌入式工程师拿到板子第一件事也是测功耗分布。

Etotal=E计算+E访存+E泄漏+E无线E_{\text{total}} = E_{\text{计算}} + E_{\text{访存}} + E_{\text{泄漏}} + E_{\text{无线}}
总能耗等于四类开销之和,优化时先确认大头在哪,再对症下药。
  1. 计算功耗执行乘加运算时晶体管充放电消耗的能量,是推理的核心开销。
    E计算=NMAC×E单次E_{\text{计算}} = N_{\text{MAC}} \times E_{\text{单次}}
  2. 访存功耗读取或写入模型参数与中间特征图时消耗的能量,通常与读写字节数成正比。
    E访存=B读写×E每字节E_{\text{访存}} = B_{\text{读写}} \times E_{\text{每字节}}
  3. 泄漏功耗晶体管即使不翻转也有漏电流,这部分与电压和温度强相关。
    E泄漏=P静态×T上电时间E_{\text{泄漏}} = P_{\text{静态}} \times T_{\text{上电时间}}
  4. 无线功耗射频收发瞬间电流很大,发射功率直接决定这一项的多少。
    E无线=P射频×T发射E_{\text{无线}} = P_{\text{射频}} \times T_{\text{发射}}

功耗测量工具

怎么知道背包客每天消耗了多少卡路里?我们可以用量表称食物、用手环测心率、再写一本食物日记。对应到芯片上,测量能耗有三种工具:示波器看瞬时电流、功率分析仪记长期账单、软件工具做估算。

最朴素的方法是示波器 + 采样电阻。在电池和开发板之间串联一个几十毫欧的采样电阻,用示波器测电阻两端电压,欧姆定律算出电流,再乘电压得到功率。这个方法便宜直观,但波形分析要靠人工。更专业的是功率分析仪或专用能量追踪器,比如 Joulescope、Nordic Power Profiler Kit,它们能自动记录一段程序跑完后的总能量,直接给出“一次推理耗了多少微焦”。

如果手头没有硬件,还可以用软件模拟估算:把 MCU 的时钟频率、外设开关、运行时间代入功耗模型,算出近似值。这类工具适合在项目早期快速筛选方案,精度不如实测,但方向不会错。无论哪种方法,本质都是在回答同一个问题:一段时间内,功率对时间的累积到底是多少?

测量是省电的第一步。没有精确的“食物日记”,你永远不知道是翻地图费粮还是走路费粮。同样,没有实测数据,你可能把力气花在优化计算上,却忽略了访存这个隐形吞电兽。

E=∫0TP(t) dtE = \int_{0}^{T} P(t) \, dt
能耗不是某一瞬间的功率,而是功率在时间上的累积,就像路程等于速度对时间积分。
  1. 功率曲线采样记录每一个瞬间的功率值,相当于每隔一秒记一次手环上的卡路里数。
    P(t)=V(t)×I(t)P(t) = V(t) \times I(t)
  2. 时间积分把所有时刻的功率加起来,得到这段时间消耗的总能量。
    E=∫0TP(t) dtE = \int_{0}^{T} P(t) \, dt
  3. 典型场景分离把工作、睡眠、通信三段分开积分,就能看出谁是大胃王。
    E会话=E工作+E睡眠+E通信E_{\text{会话}} = E_{\text{工作}} + E_{\text{睡眠}} + E_{\text{通信}}

模型量化节能

背包客想省力,最直接的办法是把食物做成压缩饼干:同样多的营养,体积只有原来的四分之一。模型量化就是这个思路——把 32 位浮点数权重换成 8 位整数甚至更低精度,模型体积骤减,运算时存取的数据量也大幅下降。

在 MCU 上,float32 运算往往需要软件模拟浮点指令,慢且费电;而 int8 是硬件原生支持的点运算。更重要的是,模型运行时的主要能量消耗在“搬数据”——权重从 Flash 搬到 SRAM、再从 SRAM 送进计算单元。数据量减到四分之一,搬家的次数也减到四分之一,访存能耗自然跟着降。这就是量化省电的底层逻辑:它主要不是让“计算”更快,而是让“搬砖”更少。

当然,压缩饼干味道差一些——量化后精度会有轻微损失。工程上常用“校准数据集”统计浮点和整数的数值范围差异,再用量化感知训练把损失压到最低。这就像压缩饼干虽然口感一般,但加点调料(微调)也能让人吃下去。

M_{\text{int8}} \approx \frac{1}{4} M_{\text{fp32}}, \qquadE_{\text{量化}} \approx E_{\text{浮点}} \times \frac{M_{\text{int8}}}{M_{\text{fp32}}} \approx \frac{E_{\text{浮点}}}{4}
量化将模型内存降为原来的四分之一,当访存是主要能耗时,总能耗也大致降为四分之一。
  1. 位宽缩小每个权重从 32 位变成 8 位,存储量缩小四倍。
    Mint8=328×Mfp32×14=Mfp324M_{\text{int8}} = \frac{32}{8} \times M_{\text{fp32}} \times \frac{1}{4} = \frac{M_{\text{fp32}}}{4}
  2. 访存能耗同步缩放假设能耗主要由搬运数据决定,则总能耗按内存比例缩放。
    E量化=E浮点×Mint8Mfp32E_{\text{量化}} = E_{\text{浮点}} \times \frac{M_{\text{int8}}}{M_{\text{fp32}}}
  3. 代入比例四分之一的内存,对应大约四分之一的访存能耗。
    E量化≈E浮点4E_{\text{量化}} \approx \frac{E_{\text{浮点}}}{4}

模型剪枝瘦身

吃完压缩饼干,背包客还要学会“断舍离”。翻遍背包,发现那个带了三天都没用过的折叠锅,果断扔掉。模型剪枝做的就是这件事:把权重矩阵里那些对输出几乎没贡献的“零碎装备”删掉。

剪枝分两种。权重剪枝是把矩阵里绝对值很小的权重直接置零,矩阵变得稀疏;结构剪枝更狠,直接删掉一整颗卷积核或一整层神经元,硬件实现更规整。剪完之后模型体重下降,但精度通常也会掉,这时需要重新训练微调,让剩下的权重学会弥补损失,就像背包客减重后重新规划行进路线。

剪枝和量化是黄金搭档。量化把每个数字变小,剪枝把数字变少;量化减的是“每块砖的重量”,剪枝减的是“砖的数量”。两者叠加,模型往往能瘦到原来的十分之一甚至更少。背包客又扔锅又换压缩饼干,自然身轻如燕。

s = 1 - \frac{N_{\text{保留}}}{N_{\text{总}}}, \qquadE_{\text{剪枝}} \approx (1 - s) \times E_{\text{稠密}} + E_{\text{稀疏开销}}
剪枝率越高、保留的权重越少,计算能耗越低;但稀疏存储和索引会带来额外开销,不能无限剪。
  1. 计算剪枝率剪枝率 s 表示被删掉的权重占全部权重的比例。
    s=N剪枝N总s = \frac{N_{\text{剪枝}}}{N_{\text{总}}}
  2. 计算能耗按保留比例缩减稠密模型的计算量近似乘以保留比例。
    E核心=(1−s)×E稠密E_{\text{核心}} = (1 - s) \times E_{\text{稠密}}
  3. 加入稀疏开销非零权重需要额外记录位置索引,这部分成本不能忽略。
    E剪枝=E核心+E稀疏开销E_{\text{剪枝}} = E_{\text{核心}} + E_{\text{稀疏开销}}

动态电压调频

会走山路的背包客都知道:平路大步流星,上坡放慢节奏,天黑了就找地方宿营。动态电压频率调节(DVFS)就是让芯片学这套“看路下菜碟”的本领——任务重时拉高主频猛干,任务轻时降低电压和频率慢慢来,空闲时干脆歇着。

芯片动态功耗和电压的平方成正比,和频率成正比。这意味着降低一点点电压,省电效果会被“平方”放大;而降低频率虽然能让任务跑得久一点,但只要任务不紧急,慢就是快——总能耗其实和频率关系不大,真正决定能耗的是电压。MCU 上的 DVFS 通常配合负载预测:传感器数据来了,预测这次推理要多少算力,动态切到合适的工作点。

DVFS 就像智能徒步表:平路快走、上坡缓行、入夜扎营。在 TinyML 场景中,推理任务往往是突发性的——大部分时间芯片无事可做,只有收到数据才需要“跑起来”。能否在“需要时才全速,不需要立刻躺平”之间丝滑切换,直接决定设备能撑多久。

P动态=αCV2fP_{\text{动态}} = \alpha C V^{2} f
动态功耗与电压平方成正比。降压一寸,省电一尺;降频不影响总能量,但能平滑功耗峰值。
  1. 活动因子与电容α 是电路翻转密度,C 是等效电容,两者描述芯片“翻动”的剧烈程度。
    P动态=αCV2fP_{\text{动态}} = \alpha C V^{2} f
  2. 电压平方项电压从 3.0V 降到 2.7V(降 10%),功耗约降 19%。
    P2P1=(2.73.0)2≈0.81\frac{P_{2}}{P_{1}} = \left(\frac{2.7}{3.0}\right)^{2} \approx 0.81
  3. 频率线性项频率减半,瞬时功率减半,但执行时间加倍,总能量不变。
    E任务=P×T∝V2×(周期数)E_{\text{任务}} = P \times T \propto V^{2} \times (\text{周期数})

系统级节能

背包客最省力的时刻不是走得更快,而是根本不动。夜晚钻进帐篷,深睡眠让基础代谢降到最低。这就是系统级节能的精髓——睡眠模式。MCU 的深度睡眠能把电流压到微安级,比工作状态低好几个数量级。

但光会睡还不行,还得会“被叫醒”。事件驱动唤醒让芯片始终监听一个极低功耗的中断引脚:传感器有数据才醒来,处理完立刻又睡。同时,外设管理要求把不用的 ADC、I2C、SPI 外设统统关掉——它们就像帐篷里还亮着的头灯,看着不起眼,一夜下来也耗掉不少。最后是任务分批执行:与其每来一个数据醒一次、搬一次数据,不如攒够一批再集中处理,减少状态切换的浪费。

对于一天只醒几十次的环境监测设备,睡眠功耗甚至比推理功耗更重要。背包客整夜安眠省下的体力,可能比白天少走一公里还多。很多工程师把精力全花在优化模型上,却忘了把设备塞进“睡袋”里——这才是最大的省电漏洞。

E一天=E单次推理×N推理+P睡眠×T睡眠E_{\text{一天}} = E_{\text{单次推理}} \times N_{\text{推理}} + P_{\text{睡眠}} \times T_{\text{睡眠}}
一天的能耗由“干活时的推理能耗”和“睡觉时的静态功耗”两部分构成。大部分 IoT 设备 99% 时间在睡觉,睡眠功耗往往决定续航。
  1. 活跃部分每次推理消耗固定的能量,乘以一天推理次数得到总活跃能耗。
    E活跃=E单次推理×N推理E_{\text{活跃}} = E_{\text{单次推理}} \times N_{\text{推理}}
  2. 睡眠部分睡眠功率乘以睡眠时长,睡眠时间越长、功率越低,这部分越小。
    E睡眠=P睡眠×T睡眠E_{\text{睡眠}} = P_{\text{睡眠}} \times T_{\text{睡眠}}
  3. 合计两部分相加就是一天的总能耗,对应电池可用天数的倒数。
    E一天=E活跃+E睡眠E_{\text{一天}} = E_{\text{活跃}} + E_{\text{睡眠}}

能效评估指标

走到终点,该算总账了。背包客的成绩单上写着几个数字:总耗粮、平均每公里耗粮、以及每公斤负重走了多远。对应 TinyML 设备,我们需要一套统一的尺子来评价“谁更省电、更能打”。

最常用的指标是单次推理能耗(μJ/推断),它直接告诉你做一次 AI 判断花多少电。更进一步,能量延迟积(EDP)把能耗和延迟乘在一起——有些方案虽然省电但慢得离谱,EDP 能把这种“省电但不可用”的方案拉下马。面向算力评价,业界常用 TOPS/W(每瓦特多少万亿次运算)来横向比较芯片架构的效率。最后,落到产品上一切回归实测续航天数:同样一块电池,你的设备撑几天?

指标不是摆设,而是产品决策的语言。你对老板说“这套方案能耗降低了 40%”,不如说“同样电池,续航从 15 天延长到 25 天”——后者才是客户听得懂的终点线。背包客的旅程结束了,希望你手里的设备,也能带着这份“口粮账本”走得更远。

η=N推断E总,EDP=E单次×T延迟\eta = \frac{N_{\text{推断}}}{E_{\text{总}}}, \qquad\mathrm{EDP} = E_{\text{单次}} \times T_{\text{延迟}}
能效 η 表示每单位能量能做多少次推理;EDP 同时惩罚高能耗和长延时,适合评估交互式 AI 任务。
  1. 能效比计算总推断次数除以总能耗,得到每焦耳能完成的推理次数。
    η=N推断E总\eta = \frac{N_{\text{推断}}}{E_{\text{总}}}
  2. 能量延迟积单次能耗乘以单次延迟,乘积越小说明“又快又省”。
    EDP=E单次×T延迟\mathrm{EDP} = E_{\text{单次}} \times T_{\text{延迟}}
  3. 换算为续航电池总能量除以每日能耗,得到可用天数。
    T续航=E电池E一天T_{\text{续航}} = \frac{E_{\text{电池}}}{E_{\text{一天}}}

AI 应用场景

智能手表心率监测

阶段:模型部署与功耗调优

解决的问题:传统方案让模型常驻运行、屏幕全开,手表一天一充。借助量化将 float32 模型压到 int8,再开启 DVFS 与深度睡眠,只在检测到剧烈运动时才拉高功耗工作,使单次心率推理能耗从 8mJ 降到 1.5mJ,续航从不足 1 天提升到 5 天。

具体案例:某穿戴设备团队检测到用户静息时心率数据 95% 为空闲,于是把推理频率从“每秒一次”降为“每 10 秒一次 + 异常唤醒”,结合事件驱动唤醒,手环待机电流从 400μA 降到 18μA。

无线环境监测传感器

阶段:系统架构与能效评估

解决的问题:森林防火传感器靠两节 AA 电池工作一年,传统方案每次上报数据都开无线模块,通信能耗占总能耗 60% 以上。AI 在本地完成异常判断,只有检测到温度骤升才唤醒 LoRa 发射,把无线功耗按需压缩。

具体案例:某农业 IoT 方案在节点上部署剪枝后的轻量分类模型,权重剪枝率 70%,再配合任务分批执行——每 15 分钟统一处理一批采样数据,单次会话能耗降低 70%,实测续航从 4 个月延长到 14 个月。

工业设备预测性维护

阶段:功耗测量与指标对比

解决的问题:工厂振动传感器需要持续监测轴承状态,若用 4G 上传原始波形,每月流量和功耗都不可承受。改为边缘 AI 提取特征、只上传异常等级,并引入能量追踪工具对比三种方案的 μJ/推断与 EDP,选型决策从“拍脑袋”变成“看数据”。

具体案例:某电机监测项目用 150mAh 锂电池为振动传感器供电,原方案日均能耗 66J,通过量化 + DVFS + 睡眠调度优化到 9J,设备部署周期从每周充电一次变为三个月维护一次。

Python 演示

python35 行
def estimate_inference_energy(mac_ops, bit_width=32, mem_bytes=0,                              energy_per_mac=1e-6,                              energy_per_byte=5e-7,                              freq_mhz=64):    # 估算一次推理能耗:乘加运算 + 内存访问(单位 mJ)    calc_mj = mac_ops * energy_per_mac * (bit_width / 32.0)    mem_mj = mem_bytes * energy_per_byte    total_mj = calc_mj + mem_mj    time_ms = mac_ops * 1000.0 / (freq_mhz * 1e6)    return {"energy_mj": total_mj, "time_ms": time_ms}  def battery_days(battery_mah, voltage_v, energy_per_inference_mj,                 inferences_per_day):    # 电池总能量(mJ) / 每日消耗能量(mJ) = 续航天数    battery_mj = battery_mah * voltage_v * 3.6    daily_mj = energy_per_inference_mj * inferences_per_day    return battery_mj / daily_mj  def main():    configs = [        ("基线 fp32", 2000000, 32, 800000),        ("量化 int8", 2000000, 8, 200000),        ("剪枝+int8", 500000, 8, 50000),    ]    for name, macs, bits, mem in configs:        r = estimate_inference_energy(macs, bits, mem)        days = battery_days(100, 3.3, r["energy_mj"], 1000)        print(f"{name}: {r['energy_mj']:.3f} mJ/次, "              f"推理 {r['time_ms']:.2f} ms, 续航约 {days:.1f} 天")  if __name__ == "__main__":    main()
目的:用简化的能耗模型对比“基线 fp32 / 量化 int8 / 剪枝+量化”三种配置下,同一电池能撑多少天,帮助你快速筛选优化方向。
  1. mac_ops * energy_per_mac * (bit_width / 32.0)乘加运算次数按位宽缩放,位宽减半能耗减半,模拟量化效果。
  2. mem_bytes * energy_per_byte访存能耗按搬运字节数计算,剪枝后特征图变小,这里自然变小。
  3. battery_mj = battery_mah * voltage_v * 3.6把电池毫安时换算成毫焦耳,是续航计算的基础。
  4. daily_mj = energy_per_inference_mj * inferences_per_day每日总能耗,对应正文中“一天口粮”的总账。
  5. print(f"{name}: ...")输出三种方案对比结果,实测中你会在 Joulescope 上看到同样量级的数据。

常见误区

误区我听说 int8 模型会损失很多精度,所以做 TinyML 时坚决不敢量化,宁可用更耗电的 float32。

正解量化确实会带来精度损失,但通过校准和量化感知训练,大部分任务可以把损失控制在 1% 以内。就像压缩饼干虽然口感变差,但加点调料照样能吃饱。精度掉 5% 和功耗省 75%,这笔账大多数产品都算得过来。

为何常见:网上很多教程只讲“量化的数学原理”,不讲“校准和微调补救方法”,让人误以为量化是一锤子买卖,精度掉了就找不回来。

误区剪枝很简单,把绝对值小的权重设成 0 部署上去就完事,不用再管了。

正解直接删权重往往导致精度暴跌,正确流程是“剪枝 → 重新训练微调 → 再剪枝”循环。就像背包客扔掉锅之后,还要重新规划行进路线、调整步伐,才能适应新的负重。不微调的剪枝不是减肥,是截肢。

为何常见:剪枝的直观描述(删除不重要连接)让人误以为这是无痛操作,忽略了模型是高度耦合的系统,删除任意部件都会影响全局。

误区既然动态功耗和频率成正比,那把频率调得越低,芯片就越省电。

正解降低频率会让任务执行时间变长,而总能量 ≈ 电压平方 × 周期数,和频率关系不大。真正省电的关键是降低电压。频率调节的价值在于“削峰填谷”——避免瞬时大电流把电源效率拖垮。就像下坡放慢速度并不会省卡路里,反而可能拖到天黑多耗体力。

为何常见:人们习惯用“工作时间短 = 省电”的日常直觉理解芯片,忽略了低频带来的时间延长会抵消功率下降的好处。

误区MCU 进入深度睡眠就完全不耗电了,所以只需把睡眠时间拉满就好。

正解深度睡眠只是关闭了时钟和大部分外设,晶体管漏电流依然存在。有的芯片睡眠电流仍有 1μA,用 30mAh 电池算下来相当于每天耗尽 0.8% 电量,一年损失近三成。就像人睡着了心肺仍在工作,只是消耗变少,不是归零。

为何常见:芯片厂商宣传“睡眠电流 0.1μA”时用的是理想条件,实际产品中电源漏电、外设漏电、板级漏电都会叠加,很少有人去测真实睡眠电流。

误区两款方案对比时,谁的峰值电流大谁就更耗电,选峰值小的就行。

正解续航由总能量决定,而能量是功率对时间积分,峰值高但持续时间短可能反而更省。比如一次性快速完成任务然后进入睡眠,可能比慢悠悠低功耗运行更省电。就像短跑冲刺比一直小跑更省总体力(如果冲刺完能马上休息)。

为何常见:示波器上最显眼的就是峰值尖峰,人眼会自然被大数值吸引,忽略了时间维度这个更关键的因素。

面试题

Q1. 在 TinyML 设备上做推理,最需要优先权衡的指标是什么?

单选题 · easy

  • A.模型参数量
  • B.每次推理能耗← 正确答案
  • C.学习率大小
  • D.云端带宽

答案:B。TinyML 设备以电池供电,续航是硬指标,因此每次推理能耗是最核心的权衡对象。参数量影响内存但不直接决定续航;学习率是训练期概念;云端带宽在离线推理中几乎无关。背包客最关心的永远是“走一公里花多少口粮”。

Q2. 将 float32 模型量化成 int8 后,模型权重占用的内存大约降为原来的多少?

单选题 · easy

  • A.原来的 1/2
  • B.原来的 1/4← 正确答案
  • C.原来的 1/8
  • D.原来的 1/16

答案:B。int8 每个权重占 8 位,float32 占 32 位,8/32 = 1/4。这和压缩饼干的道理一样:同样营养体积缩四倍。选项中的 1/2、1/8、1/16 分别是 16 位、4 位、2 位的缩放比例,不是 int8 的答案。

Q3. 用示波器测量设备电流并估算功耗时,最常用的做法是?

单选题 · easy

  • A.串联采样电阻← 正确答案
  • B.并联大电容
  • C.串联滤波电感
  • D.并联稳压二极管

答案:A。示波器测电压,无法直接测电流,因此需要在供电回路中串联一个低阻值采样电阻,测电阻两端电压再换算电流。并联电容会平滑掉真实电流信号,串联电感会阻碍瞬态变化,稳压管更与电流测量无关。

Q4. 芯片动态功耗与工作电压、时钟频率的关系是?

单选题 · mid

  • A.与电压平方和频率成正比← 正确答案
  • B.与电压和频率平方成正比
  • C.与电压和频率一次方成正比
  • D.与电压平方和频率平方成正比

答案:A。动态功耗公式 P = αCV²f,电压带平方、频率带一次方。所以降压比降频更划算:电压降 10%,功耗降约 19%。这就像上坡放缓速度(降频)省不了多少体力,但减轻背包重量(降压)立竿见影。

Q5. 以下哪种做法最适合降低模型在 MCU 上的访存能耗?

单选题 · mid

  • A.提高芯片主频
  • B.改用 int8 量化← 正确答案
  • C.增大片上缓存
  • D.加强散热片

答案:B。访存能耗与搬运的数据量成正比。int8 量化把权重从 32 位缩到 8 位,搬运字节数直接降为四分之一。提高主频会加快搬运但单字节能耗不变;增大缓存能减少部分重复搬运,但对流式推理帮助有限;散热片不改变数据搬运量。

Q6. 模型剪枝之后,通常需要做什么来恢复精度?

单选题 · mid

  • A.重新随机初始化
  • B.微调训练恢复性能← 正确答案
  • C.把学习率调得极大
  • D.提高芯片工作电压

答案:B。剪枝相当于给背包客扔装备,扔完必须重新练习走路来适应新负重。微调训练让剩余权重学习补偿被删连接的功能。随机初始化是推倒重来,极大学习率会导致震荡,提高电压与恢复精度毫无关系。

Q7. 以下哪些属于系统级节能手段?

多选题 · hard

  • A.进入深度睡眠模式← 正确答案
  • B.事件驱动唤醒机制← 正确答案
  • C.减少乘法累加次数
  • D.外设电源门控管理← 正确答案

答案:ABD。睡眠、事件唤醒、外设门控都是系统层面的功耗管理策略,它们不改变算法本身,而是让芯片“没事就睡、有事才醒、外设按需供电”。减少乘加次数属于算法优化(剪枝、量化),不属于系统级节能,正如少背物资是“打包策略”,不是“休息策略”。

Q8. 某设备推理一次耗能 500mJ,空闲功耗 0.1mW,电池总能量 1188J。若每天推理 100 次、其余时间空闲,该设备大约能用几天?

单选题 · extreme

  • A.大约 10 天
  • B.大约 20 天← 正确答案
  • C.大约 40 天
  • D.大约 80 天

答案:B。每日活跃能耗 = 500mJ × 100 = 50000mJ = 50J;每天空闲能耗 = 0.1mW × 86400s = 8.64J;每日总能耗约 58.6J。1188J ÷ 58.6J ≈ 20.3 天,选 B。这题提醒我们:对低频次推理设备,空闲功耗对续航的影响相当可观,就像睡觉时的呼吸也会消耗口粮。

Q9. 以下哪些是常用于评估 TinyML 方案能效的指标?

多选题 · mid

  • A.单次推理耗能← 正确答案
  • B.能量延迟积← 正确答案
  • C.TOPS/W 能效← 正确答案
  • D.模型参数数量

答案:ABC。单次推理耗能是基础尺度,能量延迟积兼顾速度与能耗,TOPS/W 比较算子效率。参数数量只反映模型规模,不能直接说明功耗——一个大而稀疏且高效的模型可能比一个小而低效的模型更省电,就像装备多但会打包的人不一定走得更慢。

Q10. 关于 DVFS 节能策略,下列说法正确的是?

多选题 · hard

  • A.降低电压可显著降低动态功耗← 正确答案
  • B.降低频率会延长任务执行时间← 正确答案
  • C.电压理论上可以无限调低
  • D.需要根据负载动态调整工作点← 正确答案

答案:ABD。电压以平方形式影响动态功耗,是 DVFS 省电的主要来源;频率降低则任务时间等比例变长。电压有物理下限——低于阈值晶体管无法可靠翻转,因此 C 错误。DVFS 的“动态”二字正是指根据实时负载切换电压频率组合,如同登山者根据坡度调整步伐。