想象你是一位荒野求生专家,随身带着一台卫星电话和一块太阳能充电板。在没有任何插座的大山里,每一毫安时的电量都弥足珍贵。你不能像在城市里那样24小时开机、屏幕常亮、随时刷视频——你必须规划每一次通话,把非核心的功能全部关闭,只在关键时刻唤醒设备。 TinyML(微型机器学习)干的就是这件事:让AI模型在纽扣电池供电的微控制器上跑起来。它不是把大模型“缩小一点”,而是一场关于能耗的极限生存挑战——如何在每秒钟只消耗几毫瓦电量、只拥有几百KB内存的“数字荒野”里,让智能依然存活。今天,我们就用这套“荒野省电哲学”,拆解模型超低功耗的五大核心策略。

岗位关联

掌握TinyML功耗优化,你将成为边缘计算时代的“能效设计师”——用最少的电,跑最聪明的AI,在可穿戴设备、智能传感领域建立不可替代的技术壁垒。

目录
  1. 可视化演示
  2. 功耗源头剖析
  3. 轻量化结构
  4. 低比特量化
  5. 动态频率调节
  6. 间歇计算模式
  7. 工程实践权衡
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示模型推理能耗三源分解、量化剪枝等优化策略对功耗精度的影响与占空比调度时序,交互切换查看TinyML超低功耗核心机制。

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

能耗分解:计算访存空闲三源 访存能耗搬运权重激活常高于计算本身 空闲漏电在占空比低时主导总能耗 E = E_comp + E_mem + E_idle 超低功耗需同时优化三个能耗源

功耗源头剖析

荒野求生的第一步,不是急着生火,而是先盘点装备里哪个耗电最大。你的卫星电话屏幕上赫然显示:信号发射模块耗电40%,屏幕背光耗电30%,GPS定位耗电25%,剩下的5%才是留给“思考”的。TinyML的世界里也一样——你以为AI推理是耗电大户?错了,数据搬运才是藏在暗处的“电老虎”。

在微控制器(MCU)上运行神经网络时,功耗主要来自三个方面:计算单元(MAC运算)、存储访问(SRAM/Flash读取)、以及待机漏电。你可能直觉地认为计算最耗电,但芯片设计领域的经典结论是:一次SRAM访问的能耗,约等于一次32位MAC运算的5到10倍。也就是说,把数据从内存搬到计算单元的过程,比计算本身更“烧钱”。

这就解释了为什么TinyML的第一条军规是:少搬数据,多算本地。就像你在野外不会反复翻背包找地图,而是先把地图记在脑子里。理解了功耗源头,后面的策略就顺理成章了。

Etotal=Ecompute+Ememory+EleakE_{\text{total}} = E_{\text{compute}} + E_{\text{memory}} + E_{\text{leak}}
总能耗 = 计算能耗 + 存储访问能耗 + 漏电能耗。
  1. 计算能耗每次乘加运算消耗的能量。
    Ecompute=NMAC×eMACE_{\text{compute}} = N_{\text{MAC}} \times e_{\text{MAC}}
  2. 存储访问能耗从内存读写数据的能量,通常是计算能耗的数倍。
    Ememory=Naccess×eaccessE_{\text{memory}} = N_{\text{access}} \times e_{\text{access}}
  3. 漏电能耗即使在待机状态,晶体管也在缓慢“漏水”。
    Eleak=Vdd×Ileak×TidleE_{\text{leak}} = V_{\text{dd}} \times I_{\text{leak}} \times T_{\text{idle}}

轻量化结构

既然存储访问是“电老虎”,那就从减少计算量和模型体积入手。回到荒野求生的情景:你不需要背全套登山装备,一把多功能军刀就能覆盖80%的场景。神经网络也是一样——MobileNet系列告诉我们,不一定非得用标准卷积。

标准卷积就像让一位全能冠军每个动作都全力以赴,而深度可分离卷积则把任务拆成两步:先用轻量级的深度卷积(Depthwise Convolution)在单个通道内做空间特征提取,再用点卷积(Pointwise Convolution,即1×1卷积)进行跨通道信息融合。这样一拆,计算量直接从标准卷积的 \(K^2 \times C_{\text{in}} \times C_{\text{out}}\) 降为 \(K^2 \times C_{\text{in}} + C_{\text{in}} \times C_{\text{out}}\),在3×3卷积下几乎减少了8到9倍的乘法运算。

除了深度可分离卷积,还有一个关键设计叫瓶颈层——先用1×1卷积压缩通道数,再在低维空间做深度卷积,最后用1×1卷积恢复通道数。这就像你先用压缩袋把羽绒服压小再放进行李箱,空间直接省了一半。神经架构搜索(NAS)则在自动化地寻找“最省的背包打包方式”。

ParamsMobileNetParamsVGG=∑(K2×Ci×Co/8+Ci×Co)NVGG\frac{\text{Params}_{\text{MobileNet}}}{\text{Params}_{\text{VGG}}} = \frac{\sum (K^2 \times C_i \times C_o / 8 + C_i \times C_o)}{N_{\text{VGG}}}
轻量化网络模型参数量比传统网络少一个数量级。
  1. 标准卷积计算量每个输出特征图都要在所有输入通道上做完整卷积。
    Coststd=K2×Cin×Cout×Hout×Wout\text{Cost}_{\text{std}} = K^2 \times C_{\text{in}} \times C_{\text{out}} \times H_{\text{out}} \times W_{\text{out}}
  2. 深度卷积计算量每个通道独立卷积,通道间不混合。
    Costdepth=K2×Cin×Hout×Wout\text{Cost}_{\text{depth}} = K^2 \times C_{\text{in}} \times H_{\text{out}} \times W_{\text{out}}
  3. 点卷积计算量用1×1卷积核融合通道信息。
    Costpoint=Cin×Cout×Hout×Wout\text{Cost}_{\text{point}} = C_{\text{in}} \times C_{\text{out}} \times H_{\text{out}} \times W_{\text{out}}
  4. 计算量比值深度可分离卷积与标准卷积的总计算量之比。
    Ratio=1Cout+1K2\text{Ratio} = \frac{1}{C_{\text{out}}} + \frac{1}{K^2}

低比特量化

结构轻量化后,下一个大杀器是量化——用8位整数(INT8)替代32位浮点数(FP32)。回到荒野求生:你不需要用高精度卫星地图来找近处的溪流,手机里下载的简化版地图就足够了。量化就是给模型降维:权重和激活值从FP32变成INT8,模型体积直接缩小4倍,内存带宽需求同步降低。

但量化的核心挑战是:如何用低精度表示高精度信息却不让精度崩塌?答案是尺度缩放因子。我们把原始浮点范围的 [min, max] 映射到INT8的 [−128, 127],公式如下:

其中 \(r\) 是原始实数值,\(q\) 是量化后的整数值,\(S\) 是缩放因子(浮点数),\(Z\) 是零点偏移(整数)。推理时用 \(q\) 做整数运算,需要反量化时才用 \(S\) 和 \(Z\) 还原。这在硬件上极其友好,因为整数乘加比浮点乘加快一个数量级且功耗更低。

量化的另一个高级形态是权重共享:多个权重聚簇到同一个代表值,类似你用一张“套餐卡”覆盖多种通讯需求。更进一步的混合精度量化则根据每层敏感度分配不同比特——对精度敏感的关键层用INT16,不敏感的层用INT4,像经验丰富的登山者知道哪些装备值得背重量,哪些可以轻量化。

r=S×(q−Z)r = S \times (q - Z)
MemoryINT8=14×MemoryFP32\text{Memory}_{\text{INT8}} = \frac{1}{4} \times \text{Memory}_{\text{FP32}}
量化后模型体积缩小到原来的四分之一。
  1. 量化映射浮点数到整数的线性映射关系。
    r=S×(q−Z)r = S \times (q - Z)
  2. 缩放因子浮点范围与整数范围的比值。
    S=rmax⁡−rmin⁡qmax⁡−qmin⁡S = \frac{r_{\max} - r_{\min}}{q_{\max} - q_{\min}}
  3. 零点偏移浮点最小值对应的整数值。
    Z=qmin⁡−rmin⁡SZ = q_{\min} - \frac{r_{\min}}{S}
  4. 反量化从整数还原浮点数的过程。
    r^=S×(q−Z)\hat{r} = S \times (q - Z)

动态频率调节

结构、数值都优化到了极致,但功耗战场还有一个“看不见的调节旋钮”——芯片本身的工作频率。回想你的荒野求生方案:白天太阳足时,卫星电话可以高功率发射信号;阴天电量告急时,就切换成低功率省电模式。这叫动态电压频率调节(DVFS)。

MCU的功耗与频率、电压的关系如下:

其中 \(P\) 是动态功耗,\(\alpha\) 是翻转率(平均每周期有多少晶体管翻转),\(C\) 是负载电容,\(V_{dd}\) 是供电电压,\(f\) 是时钟频率。关键在于:功耗与电压的平方成正比,电压与频率又呈近似线性关系。这意味着——把频率降低20%,电压跟着降低,功耗能下降到原来的约60%。

实际工程中,TinyML设备会根据任务复杂度动态切换工作状态:系统空闲时降到几十MHz的“省电巡航”,高强度推理时拉高到几百MHz的“全力冲刺”。任务感知调度甚至能预先判断“这是个简单的小猫检测,还是复杂的人脸识别”,从而智能决定CPU频率档位,就像老练的越野车司机根据路况切换四驱模式。

P=α×C×Vdd2×fP = \alpha \times C \times V_{dd}^2 \times f
Pratio=(flowfhigh)3P_{\text{ratio}} = \left(\frac{f_{\text{low}}}{f_{\text{high}}}\right)^3
频率降低一半,动态功耗降为原来的八分之一。
  1. 动态功耗公式翻转率 × 电容 × 电压平方 × 频率。
    P=αCVdd2fP = \alpha C V_{dd}^2 f
  2. 电压-频率关系频率降低,所需最小电压也降低。
    Vmin∝fV_{\text{min}} \propto f
  3. 功耗比频率变化后的功耗比例,近似为频率比的三次方。
    Pratio=(flow/fhigh)3P_{\text{ratio}} = \left(f_{\text{low}} / f_{\text{high}}\right)^3

间歇计算模式

如果DVFS是“省电开车”,那么间歇计算就是“停车熄火”。在TinyML场景中,很多传感器不需要连续工作——智能门铃只需在有人经过时启动AI识别,温度传感器每10秒采一次样即可。与其让芯片在空闲时待机,不如让它彻底进入深度睡眠。

深度睡眠模式下,MCU的电流可以降到几个微安,与运行时的几十毫安相比,差了四个数量级。策略的核心是占空比——设备大部分时间“沉睡”,只在极短的窗口内“苏醒”并完成推理:

其中 \(D\) 是占空比(活跃时间占比)。假设每秒唤醒10毫秒做推理,\(D = 0.01\),平均功耗几乎被压到峰值的百分之一。

间歇计算的关键技术是现场快照(Checkpoint):MCU在进入深度睡眠前,把当前模型推理的中间状态存入非易失性存储器(如Flash),苏醒后从快照继续执行而不是从头开始。这就好比你在长途徒步中每隔一段就在树上做个标记,休息后再从标记出发,省去了原路返回的体力消耗。事件驱动触发则用传感器作为“闹钟”——只有当震动、声音或红外超过阈值时才唤醒全系统,其余时间系统连时钟都几乎停摆。

Pavg=D×Pactive+(1−D)×PsleepP_{\text{avg}} = D \times P_{\text{active}} + (1 - D) \times P_{\text{sleep}}
D=TactiveTactive+TsleepD = \frac{T_{\text{active}}}{T_{\text{active}} + T_{\text{sleep}}}
占空比 = 活跃时间 ÷ 总时间。
  1. 平均功耗按活跃与睡眠时间比例加权。
    Pavg=D×Pactive+(1−D)×PsleepP_{\text{avg}} = D \times P_{\text{active}} + (1 - D) \times P_{\text{sleep}}
  2. 占空比活跃时间占总周期的比例。
    D=TactiveTactive+TsleepD = \frac{T_{\text{active}}}{T_{\text{active}} + T_{\text{sleep}}}
  3. 节能倍数不间歇与间歇的功耗差距。
    PcontPavg=1D\frac{P_{\text{cont}}}{P_{\text{avg}}} = \frac{1}{D}

工程实践权衡

万事俱备,但真正让TinyML方案落地的,是权衡的艺术。这不是简单的“省电越多越好”,而是在功耗、精度、延迟、成本之间找到适合应用场景的最优解。荒野求生的终极目标不是“最省电”,而是“活到救援来临”——你的AI系统也一样,关键是保证任务精度达标的前提下,功耗尽可能低。

实践中,开发者会结合多种策略进行联合优化:先用NAS搜索轻量网络结构,再做量化压缩,最后配合DVFS和间歇计算。但每一步都有代价——越激进的量化精度掉得越多,太低的频率会让推理时间超过实时要求。这就是经典的Pareto最优前沿:你不可能同时在功耗和精度两个维度上都做到最好,只能在它们之间选择平衡点:

其中 \(\theta\) 是模型参数,\(\text{Loss}\) 是任务损失(精度),\(\text{Energy}\) 是推理能耗,\(\lambda\) 是权衡系数。当 \(\lambda = 0\) 时只优化精度,\(\lambda\) 越大越强调省电。

在真实项目中,场景感知是一切策略的灵魂。智能手表在用户跑步时的功耗策略与静坐时完全不同——前者需要高频心率采样和持续GPS,后者只需低频姿态检测。现代的TinyML框架(如TensorFlow Lite Micro)提供了功耗分析工具,你可以在PC上模拟不同策略组合下的电池寿命,再在真实硬件上验证。这条路没有银弹,只有反复迭代、不断测量的工匠精神。

F(λ)=arg⁡min⁡θ(Loss(θ)+λ×Energy(θ))F(\lambda) = \arg\min_{\theta} \left( \text{Loss}(\theta) + \lambda \times \text{Energy}(\theta) \right)
ϵ=EbatteryPavg×3600(小时)\epsilon = \frac{E_{\text{battery}}}{P_{\text{avg}} \times 3600} \text{(小时)}
电池续航 = 电池容量 ÷ 平均功耗。
  1. 联合优化目标在损失与能耗之间取加权和。
    min⁡(Loss(θ)+λ×Energy(θ))\min \left( \text{Loss}(\theta) + \lambda \times \text{Energy}(\theta) \right)
  2. 权衡系数λ控制对能耗的重视程度。
    λ∈[0,∞)\lambda \in [0, \infty)
  3. 电池寿命电池能量除以平均功耗得到使用时长。
    T=EbatteryPavgT = \frac{E_{\text{battery}}}{P_{\text{avg}}}

AI 应用场景

智能可穿戴设备的心率监测

阶段:推理部署与功耗优化

解决的问题:传统可穿戴设备连续运行神经网络心率分析,电池撑不过一天。通过TinyML的低比特量化 + 间歇计算,把心率AI模型压缩至INT8并只在检测到运动状态时唤醒推理,平均功耗从5mW降至0.3mW,续航从18小时延长至7天。

具体案例:某运动手环新品中,工程师用DVFS把CPU频率从96MHz动态下调至48MHz(日常场景),结合RTC每秒唤醒一次采集PPG信号、10秒推理一次,最终实现了“一次充电使用一周”的市场卖点。

智慧农业的土壤监测节点

阶段:数据采集与边缘推理

解决的问题:农田中的土壤传感器节点分布广泛、更换电池困难。传统方案需要人工定期采集数据,AI自动判断湿度/养分状态后,传感器只需在事件触发时唤醒(如湿度低于阈值)并完成本地推理,无线传输频率降低90%。

具体案例:某农业科技公司在LoRa节点上部署推理模型,采用深度可分离卷积和4-bit混合量化,事件驱动模式下的待机功耗仅3μA,2节AA电池可用3年。相比云端方案,避免了大流量传输的巨额电费。

工业预测性维护的振动传感器

阶段:模型压缩与系统部署

解决的问题:工厂电机振动监测需要高频采样(20kHz),持续传输到云端分析功耗极大且延迟高。用TinyML在传感器本地完成FFT特征提取 + 轻量级分类器推理,只上传异常报警而不是原始波形。

具体案例:某制造企业为每台电机安装振动传感器,MCU以80MHz运行INT8量化后的MobileNetV2,通过快照保存现场、自适应唤醒策略,功耗从650mW降至15mW,同时异常检测精度保持在95%以上。

Python 演示

python87 行
"""TinyML模型超低功耗优化演示:量化+剪枝+模拟功耗评估"""import copyimport math  class TinyMLModel:    def __init__(self, weights):        self.weights = weights        self.activations = [1.0] * len(weights)        self.bit_width = 32        self.energy_per_mac = 0.1  # uJ        self.memory_read_energy = 0.5  # uJ per byte        self.frequency_mhz = 100.0        self.voltage_v = 1.2        self.sleep_power_uw = 2.0        self.active_time_ms = 10.0        self.sleep_time_ms = 990.0     def quantize(self, bits):        self.bit_width = bits        scale = (2 ** (bits - 1)) - 1        quantized = []        for w in self.weights:            q = max(-scale, min(scale, round(w * scale)))            quantized.append(q / scale)        self.weights = quantized        return self     def prune(self, threshold=0.1):        pruned = []        for w in self.weights:            pruned.append(w if abs(w) > threshold else 0.0)        self.weights = pruned        return self     def set_dvfs(self, frequency_mhz):        self.frequency_mhz = frequency_mhz        self.voltage_v = max(0.6, 0.7 + 0.005 * frequency_mhz)        return self     def compute_energy(self):        compute_energy = len(self.weights) * self.energy_per_mac        memory_bytes = len(self.weights) * (self.bit_width / 8)        memory_energy = memory_bytes * self.memory_read_energy        return compute_energy + memory_energy     def compute_power_avg(self):        active_ratio = self.active_time_ms / (self.active_time_ms + self.sleep_time_ms)        active_power = self.compute_energy() * 1000 / (self.active_time_ms / 1000)        return active_ratio * active_power + (1 - active_ratio) * self.sleep_power_uw     def accuracy_estimate(self, base_acc=95.0):        quant_loss = abs(self.bit_width - 32) * 0.5        prune_loss = sum(1.0 for w in self.weights if w == 0.0) / len(self.weights) * 3.0        return max(60.0, base_acc - quant_loss - prune_loss)  def main():    weights = [math.sin(i / 5.0) + 0.3 * math.cos(i / 2.0) for i in range(100)]    model = TinyMLModel(weights)     print("=== TinyML 功耗优化前 ===")    print("参数量: {}, 比特宽度: {}".format(len(model.weights), model.bit_width))    print("单次推理能耗: {:.2f} uJ".format(model.compute_energy()))    print("平均功耗: {:.2f} uW".format(model.compute_power_avg()))    print("预估精度: {:.1f}%".format(model.accuracy_estimate()))    print()     model.quantize(8).prune(0.15).set_dvfs(80)     print("=== TinyML 功耗优化后 ===")    print("参数量: {}, 比特宽度: {}".format(        len([w for w in model.weights if w != 0]), model.bit_width))    print("单次推理能耗: {:.2f} uJ".format(model.compute_energy()))    print("平均功耗: {:.2f} uW".format(model.compute_power_avg()))    print("预估精度: {:.1f}%".format(model.accuracy_estimate()))    print()     baseline = TinyMLModel(weights).quantize(32).set_dvfs(100)    energy_saving = (1 - model.compute_energy() / baseline.compute_energy()) * 100    print("能耗降低: {:.1f}%".format(energy_saving))  if __name__ == "__main__":    main()
目的:演示TinyML模型在量化、剪枝和DVFS调节前后的功耗与精度变化。
  1. model.quantize(8)将32位权重量化为INT8,模拟低比特量化。
  2. model.prune(0.15)剪掉绝对值小于阈值的权重,模拟稀疏化。
  3. model.set_dvfs(80)将CPU频率从100MHz降到80MHz,降低动态功耗。
  4. compute_energy()估算单次推理的能量消耗。
  5. compute_power_avg()结合活跃/睡眠占空比计算平均功耗。
  6. accuracy_estimate()粗略估计量化+剪枝后的精度损失。
  7. energy_saving计算优化前后的能耗降低百分比。

常见误区

误区我试过一次INT8量化,精度直接从95%掉到70%,这说明低比特量化不适合生产环境。

正解精度大幅下降通常是因为缺乏量化感知训练——模型在训练阶段没有模拟量化的误差。正确做法是用伪量化算子(如TensorFlow的fake_quant)让网络在训练时学会适应量化噪声,或者用校准集调整缩放因子。INT8量化在现代模型上通常能保持1%以内的精度损失。

为何常见:大多数初学者直接在训练好的FP32模型上做“后训练量化”,没有针对量化进行重新训练或校准。

误区既然动态功耗与频率的关系是三次方,那我直接把CPU频率降到最低,功耗一定最小。

正解频率过低会导致推理时间变长,设备需要更长时间保持活跃状态,此时活跃功耗占空比上升——省下的频率功耗被“拉长的活跃时间”吃掉了。极端情况下,总功耗反而更高。正确做法是找到“最低频率 × 最短活跃时间”的最优平衡点。

为何常见:人们只注意动态功耗公式 \(P = \alpha C V^2 f\),却忽略了与占空比的耦合关系。

误区间歇计算就是让MCU进入睡眠模式,再定时醒来继续跑。

正解标准的间歇计算需要现场保存与恢复机制。MCU在进入睡眠前要把当前推理状态(中间层激活值、循环变量、寄存器内容)保存到非易失存储中,否则唤醒后只能从零开始。真正高效的间歇系统还会根据任务是否完成决定是否“一次性睡透”,而不是傻乎乎地定时启停。

为何常见:初学者在简单实验中发现“醒来继续跑也没报错”,忽略了中间状态丢失的隐患。

误区实测电流波形太麻烦,用TI的EnergyTrace或Joulescope之类工具跑一遍就够了。

正解工具只提供宏观功耗曲线,真正的低功耗调优需要逐段分析——哪段是无线传输、哪段是传感器采集、哪段是推理计算。例如推理段的起始Memory访问往往产生尖峰电流,需要单独优化数据布局。实践经验是:工具用于定位大方向,逻辑分析仪和示波器用于精确定位瓶颈。

为何常见:许多教程只展示工具给的“总功耗数字”,没有教会读者如何拆解功耗曲线。

面试题

Q1. TinyML优化中,为什么说“数据搬运比计算更耗电”?

单选题 · easy

  • A.因为数据必须通过无线电发送
  • B.存储访问的能耗系数高于MAC运算← 正确答案
  • C.数据在Flash中会自然衰减
  • D.搬运数据需要额外的CPU核心

答案:B。在CMOS工艺中,一次SRAM访问的能耗约等于5-10次MAC运算。TinyML的核心优化目标就是减少内存访问次数和带宽需求,而非单纯减少计算量。无线电发送只在无线场景,不是通用原因。

Q2. 以下哪项是深度可分离卷积的优势?

单选题 · easy

  • A.提升模型精度到100%
  • B.减少标准卷积约8-9倍的乘法计算量← 正确答案
  • C.消除所有非线性激活函数
  • D.让模型可以自动学习学习率

答案:B。深度可分离卷积将标准卷积拆为深度卷积+点卷积,在3×3卷积核下计算量约为标准卷积的1/8-1/9。它不保证更高的精度,而是以极小的精度损失换巨量计算节省。

Q3. 量化公式 \(r = S \times (q - Z)\) 中,\(Z\) 代表什么?

单选题 · mid

  • A.缩放因子的倒数
  • B.浮点最小值对应的整数偏移← 正确答案
  • C.激活函数的饱和阈值
  • D.权重的L2正则化系数

答案:B。\(Z\) 是零点(zero point),即浮点最小值映射到的整数值。它保证浮点0在整数域中有一个确定的整数表示,避免量化后的零点偏移。\(S\) 是缩放因子,非倒数关系。

Q4. 动态功耗公式 \(P = \alpha C V^2 f\) 中,\(\alpha\) 表示什么?

单选题 · mid

  • A.温度系数
  • B.晶体管翻转率← 正确答案
  • C.电压增益
  • D.时钟相位差

答案:B。\(\alpha\) 是翻转率,表示每个时钟周期内发生状态翻转的晶体管比例。它与输入数据的随机性相关,取值范围通常在0.1-0.5之间。温度和电压分别不是这个公式里的主流变量。

Q5. 为什么INT8量化能将模型内存占用减少到FP32的四分之一?

单选题 · mid

  • A.因为INT8支持四位并行运算
  • B.因为8位整数占1个字节,32位浮点占4个字节← 正确答案
  • C.因为FP32有额外的校验字节
  • D.因为量化会删除全部冗余权重

答案:B。FP32占32位=4字节,INT8占8位=1字节,因此4字节/1字节=4倍压缩。这不涉及并行运算或校验。注意量化后模型体积确实变为原来1/4,但运行时内存可能因对齐稍大。

Q6. 间歇计算的典型组成部分包括哪些?

多选题 · mid

  • A.RTC定时唤醒← 正确答案
  • B.现场快照保存到非易失存储← 正确答案
  • C.事件驱动触发← 正确答案
  • D.模型动态量化

答案:ABC。RTC定时唤醒、快照保存、事件触发是间歇计算的三大要素。模型动态量化是离线或部署时的优化手段,不在间歇计算概念内。

Q7. 在DVFS优化中,为什么频率降低一半,功耗理论上降为原来的1/8?

单选题 · hard

  • A.因为频率与功耗线性相关
  • B.因为动态功耗与电压平方、频率近似满足 \(P \propto f^3\)← 正确答案
  • C.因为频率下降导致电容同步缩小
  • D.因为低频率会触发睡眠模式

答案:B。动态功耗 \(P = \alpha C V^2 f\)。频率减半时,所需最小电压随之降低,近似 \(V_{\text{low}} = V_{\text{high}} / 2\),代入得 \((1/2)^2 \times (1/2) = 1/8\)。这是DVFS能大幅省电的物理基础。

Q8. 以下哪些属于TinyML模型压缩的有效手段?

多选题 · hard

  • A.深度可分离卷积← 正确答案
  • B.权重剪枝与共享← 正确答案
  • C.混合精度量化← 正确答案
  • D.模型蒸馏至教师网络

答案:ABC。深度可分离卷积(结构压缩)、权重剪枝/共享(稀疏化)、混合精度量化(低比特表示)都是有效手段。D选项说反了——是把教师网络蒸馏到轻量学生网络,而非把学生蒸馏到教师。

Q9. 以下哪项最适合用于事件驱动的间歇计算唤醒?

单选题 · easy

  • A.每毫秒定时查询一次状态
  • B.外设中断信号触发唤醒← 正确答案
  • C.使用看门狗持续复位
  • D.让AI模型持续运行并自动决策

答案:B。事件驱动依赖外设(如GPIO、模拟比较器或传感器中断)在事件发生时触发唤醒,CPU平时全速休眠。定时查询会浪费功耗,看门狗只用于异常恢复。

Q10. 关于TinyML的工程实践,哪些说法正确?

多选题 · easy

  • A.功耗精度联合优化可建模为加权和最小化← 正确答案
  • B.场景感知是动态策略切换的依据← 正确答案
  • C.电池寿命等于电池能量除以平均功耗← 正确答案
  • D.模型参数量越少精度必然越高

答案:ABC。联合优化 \( \text{Loss} + \lambda \times \text{Energy} \) 是常见框架;场景感知决定策略切换;电池寿命 \(E/P\) 是基本估算。参数减少只是空间,不决定精度,精度由结构和训练共同决定。