北京深夜的胡同口,小王推着他的小餐车出摊了。这辆车只有一平方米案板、一个煤气灶和一个调料架,可他想卖“智能煎饼”——煎饼机要能自动识别客人递过来的是真币还是假币,还要根据排队人数自动调节火力。放在两年前,这得把识别算法放到云端服务器的“大厨房”里做:每次判断都要把图片传出去,等大厨算完再把结果送回来。可胡同口信号差、出餐慢,前半夜的电费也烧不起。于是小王开始琢磨:能不能把AI大厨的看家本领浓缩成一套能装进小推车的简易菜谱?这就是 TinyML——让机器学习模型在只有几十KB内存、几十MHz主频的微控制器(MCU)上直接完成推理。没有操作系统,没有大算力,靠的全是压缩、裁剪和精打细算。本文就沿着小王从中央厨房学艺到小餐车出品的完整路线,把模型训练、压缩转换、MCU选型、内存优化和功耗管理这一整套流程讲透。

岗位关联

学会 TinyML 全流程,你就能独立完成“云端训练 → 端侧部署”的智能硬件落地,成为算法与嵌入式双栖的稀缺 AI 工程师。

目录
  1. 可视化演示
  2. TinyML基础:为什么要在火柴盒里开餐厅
  3. 模型训练:在中央厨房里研发配方
  4. 模型压缩:把菜谱缩印成小卡片
  5. 模型转换:翻译成推车师傅能懂的暗号
  6. MCU 平台:选一辆趁手的小推车
  7. 内存优化:一平方米案板的艺术
  8. 功耗管理:省着烧煤气
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态展示部署流程、MCU内存分配、平台能力对比与功耗管理策略四个视角,直观理解嵌入式设备端到端ML落地。

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

TinyML基础:为什么要在火柴盒里开餐厅

小王的第一反应是:干脆把煤气罐、案板、调料架都放大一倍不就行了?可胡同口就这点地方。更关键的是,客人等着拿煎饼的时间只有十几秒,把图片传到云端再等结果,来回要两三秒,还会把客人喜欢吃辣这种隐私信息暴露给大厨房。小推车的价值恰恰在于“守着客人本地开火”——不用跑腿,不用排队,断网也能做生意。

TinyML 就是“在微控制器上做机器学习推理”的整套工程体系。MCU 是指甲盖大小的芯片,把 CPU、内存、Flash 集成在一起,特点是便宜、省电、体积小,但没有操作系统、内存只有几十到几百 KB。要判断模型能不能塞进去,先要会算一笔账:

小王算完明白了:问题不是把厨房变大,而是把菜谱变小。一百万个 float32 参数要占 4MB 空间,远超 MCU 的容量;同样参数用 8 位整数只有 1MB,再剪枝一番就能塞进芯片。目标只有一个——让模型小到能装进小推车,同时煎饼还得好吃。这就是 TinyML 的第一课:在严格约束里做减法,而不是一味堆料。

Size=N×b8\displaystyle \text{Size} = \frac{N \times b}{8}
这个公式是 TinyML 的“门槛尺”:一个模型的权重占多少字节,能不能装进 MCU 的 Flash,全靠它说了算。
  1. Size(体积)模型权重占用的字节数,相当于菜谱装订后的厚度,直接决定能不能塞进小推车的调料架。
    Size\displaystyle \text{Size}
  2. N(参数量)神经网络所有权重的个数,相当于整本菜谱里食材配料的条目总数。
    N\displaystyle N
  3. × b(位宽)每个权重用 b 个比特来存,32 位浮点就是 4 字节,8 位整数只有 1 字节,位宽越省越占地越少。
    ×b\displaystyle \times b
  4. ÷ 8(比特转字节)计算机里 8 比特等于 1 字节,好比菜市场里 500 克等于一斤,单位换算后才能比大小。
    ÷8\displaystyle \div 8

模型训练:在中央厨房里研发配方

小王不敢自己瞎编菜谱。他请来一位米其林大厨,在中央厨房里用最好的食材反复试做,最后总结出“薄脆三克、甜面酱五克”的精确配方——这就是在云端用大数据训练模型。TinyML 的训练阶段和普通深度学习没有本质区别,但心里要时刻记着:这道菜最终是在小推车上做,食材和工序必须克制。

所以网络结构要选轻量路线:MobileNet 这类深度可分离卷积、适合时序信号的 1D-CNN、以及各种微型 MLP。数据增强(旋转、裁剪、加噪声)相当于给菜谱做压力测试:既怕“过拟合”到只会认某一种葱花的形状,也怕“欠拟合”到连青椒和辣椒都分不清。训练时用损失函数来衡量预测与真值的差距:

配方在中央厨房研发完毕还不是终点——米其林大厨的配方写满三页纸,小推车的案板根本放不下。小王盯着厚厚的手稿,决定下一步动刀:把菜谱缩印成一张火柴盒大小的卡片。训练阶段的目标与其说是“更准”,不如说是“在尽量小的模型里装下尽量多的火候”。

Loss=1n∑i=1n(yi−y^i)2\displaystyle \text{Loss} = \frac{1}{n}\sum_{i=1}^{n}\left(y_i - \hat{y}_i\right)^2
均方误差是最直观的“差距温度计”:预测值和真实值偏离越远,数值就越大,训练就是不断把这个数压小。
  1. y_i(真值)第 i 个样本的真实答案,相当于大厨亲口尝出来的标准味道。
    yi\displaystyle y_i
  2. ŷ_i(预测值)模型自己给出的预测,是学徒临场发挥出来的味道。
    y^i\displaystyle \hat{y}_i
  3. 平方差差值平方后让偏离越远罚得越狠,同时避免正负误差互相抵消,像考试按“差距的平方”扣分。
    (yi−y^i)2\displaystyle (y_i - \hat{y}_i)^2
  4. 1/n 求和(平均)把所有样本的误差平均,得出整桌菜的总体水平,训练就是不断降低这个平均分。
    1n∑i=1n\displaystyle \frac{1}{n}\sum_{i=1}^{n}

模型压缩:把菜谱缩印成小卡片

小王对三页配方动了三刀:第一刀,把所有食材切成均匀的小丁,统一规格好存放——这就是量化;第二刀,把可有可无的装饰配菜全扔了,客人根本吃不出来——这就是剪枝;第三刀,请师父亲自口传心授,让徒弟用更简单的动作做出八分像的菜——这就是知识蒸馏。

量化是最立竿见影的手段。它把连续的浮点权重映射到离散的整数格点上,以 8 位对称量化为例子:

其中 $r$ 是原始浮点权重,$\Delta$ 是由权重范围决定的缩放步长。量化后存储直接缩到原来的四分之一,推理时还可以用整数运算加速。剪枝则是把绝对值接近零的权重直接置零,让模型变稀疏;知识蒸馏则是让一个小模型去模仿大模型的“软输出”,像徒弟偷师师父的火候。

三刀下去,三页配方变成一张卡片,煎饼的味道只差了那么一丁点。小王很满意,但新的问题来了:卡片上写的“125℃小火两分钟”,小推车的燃气灶刻度根本对不上——这张卡片上的暗号,师傅还看不懂,需要再翻译一道。

q=round(rΔ),r≈Δ×q\displaystyle q = \text{round}\left(\frac{r}{\Delta}\right), \quad r \approx \Delta \times q
量化公式是压缩的“菜刀”:怎么切、切多碎、切完味道损失多少,全在 $\Delta$ 和取整这一步里。
  1. r(浮点权重)原始的连续实数权重,比如 0.618 这样的小数,像一根长短不一的葱。
    r\displaystyle r
  2. Δ(缩放步长)量化格子的宽度,由权重的最小最大值决定,相当于把葱切成统一规格的“标准段”。
    Δ\displaystyle \Delta
  3. round(取整)四舍五入落到最近的格子里,切丁时难免切歪一点点,误差就来自这里。
    round(⋅)\displaystyle \text{round}\left(\cdot\right)
  4. 逆变换从整数 $q$ 乘回 $\Delta$ 还原近似值,取整损失就是“切歪”的那一小截葱。
    r≈Δ×q\displaystyle r \approx \Delta \times q

模型转换:翻译成推车师傅能懂的暗号

配方卡片上的专业术语,小推车师傅看不懂;训练框架导出的模型文件,MCU 也看不懂。模型转换就是翻译:把 PyTorch/Keras 里训练好的模型,转换成 MCU 能直接运行并烧录的二进制“暗号”。

典型链路是:PyTorch/Keras 训练 → 导出为 ONNX 或直接转成 TFLite 格式 → 用 TFLite Micro 运行时在 MCU 上执行;STM32 则可以用 ST 官方的 X-CUBE-AI 工具一键生成 C 代码。转换时要逐个检查算子兼容性:MCU 的算子库很精简,不支持的算子要替换成等价的简化版本,否则要么报错,要么运行时悄悄退化成极慢的实现。最终固件里除了模型权重,还要带上推理内核和任务栈:

翻译完成,小王把固件烧进小推车的主控板,第一次测试:识别一枚硬币花了 300 毫秒,有点慢,但方向对了。他需要的是一辆更趁手的车——选 MCU 平台,就像选一辆真正适合自己出摊路线的推车。

FlashMCU≥Modelbin+Runtimekernel+Stacktask\displaystyle \text{Flash}_{\text{MCU}} \geq \text{Model}_{\text{bin}} + \text{Runtime}_{\text{kernel}} + \text{Stack}_{\text{task}}
这条不等式决定了烧录能不能成功:小推车的仓库(Flash)必须同时装得下模型、锅铲(运行时)和操作区(任务栈)。
  1. Flash_MCU芯片里可写可读的非易失存储,相当于小推车用来囤货的仓库容量。
    FlashMCU\displaystyle \text{Flash}_{\text{MCU}}
  2. Model_bin(模型本体)压缩后模型文件的体积,是仓库里最占地方的那袋面粉。
    Modelbin\displaystyle \text{Model}_{\text{bin}}
  3. Runtime_kernel(运行时)执行卷积、全连接等算子的内核代码,相当于锅铲灶具这些必备厨具。
    Runtimekernel\displaystyle \text{Runtime}_{\text{kernel}}
  4. Stack_task(任务栈)函数调用与局部变量需要的栈空间,相当于案板上临时摆开的操作区。
    Stacktask\displaystyle \text{Stack}_{\text{task}}

MCU 平台:选一辆趁手的小推车

胡同口出摊常见两种车:一种是带电池和 WiFi 的电动三轮车,跑得快、能联网,但耗电大;一种是轻便省电的手推车,稳当耐用,可惜没有无线模块。选车是 TinyML 落地最关键的第一步,STM32 和 ESP32 就是这两类车的代表。

STM32 家族基于 ARM Cortex-M 核,工业级稳定性好,ST 官方提供 X-CUBE-AI 工具链,低功耗模式丰富,适合工业控制、医疗设备这类“重稳定轻联网”的场景。ESP32 采用双核 Xtensa 架构,主频最高 240MHz,自带 WiFi 和蓝牙,价格便宜,社区资料多,是 IoT 原型和智能家居的首选。推理耗时的估算公式是:

$C_{\text{MAC}}$ 是模型需要的乘加运算总次数,$f_{\text{CLK}}$ 是主频,$\eta$ 是实际计算效率。选型要同时看 RAM/Flash 容量、算力、外设接口、工具链成熟度和价格——没有最好的芯片,只有最合适的推车。

小王最后选了带 WiFi 的电动三轮车 ESP32,因为煎饼摊还要联网更新菜谱;但他心里盘算,等以后做纯离线版就换成 STM32 手推车。选车要看菜谱、看路况、看电费——但无论选哪辆车,上车后的第一件事永远是整理案板。

Tinfer=CMACfCLK×η\displaystyle T_{\text{infer}} = \frac{C_{\text{MAC}}}{f_{\text{CLK}} \times \eta}
推理耗时公式就是“出餐速度预估”:菜品的工序总数除以炉子的火力,再乘上一个打折系数,因为实际炒菜总做不到理论效率。
  1. C_MAC(计算量)模型所有乘加运算的总次数,相当于一桌菜的工序总数,工序越多越费功夫。
    CMAC\displaystyle C_{\text{MAC}}
  2. f_CLK(主频)芯片的主时钟频率,单位时间内能赶工多少道工序,相当于炉子的火力标称值。
    fCLK\displaystyle f_{\text{CLK}}
  3. η(利用率)实际效率系数,由于访存 stalls 和指令开销通常远小于 1,像大火炒菜时总有翻不匀的角落。
    η\displaystyle \eta

内存优化:一平方米案板的艺术

小推车的案板只有一平方米,却要同时摆开调味罐、煎锅和装饼的纸袋。AI 推理也一样:运行时必须同时装下输入、中间特征图和输出,这些都在 RAM 里。内存优化的本质,就是在一个平方米案板上把空间用到极致。

几个实战技巧:第一,静态分配——在编译期就把所有缓冲区定好,绝不用 malloc/free,因为动态分配会产生内存碎片,像随手乱放调料瓶导致再也没地方放锅;第二,权重放 Flash——常量权重不需要进 RAM,推理时按需读取;第三,张量内存复用——TFLite Micro 的 arena 机制让生命周期不重叠的中间张量共用同一块缓冲:

峰值占用从“所有层之和”降为“同一时刻存活张量之和”,效果立竿见影。真实项目中,一个原本要 200KB RAM 的模型,优化后常常能压进 40KB。

经过一番腾挪,小王的案板做到了“一锅到底”——前一个特征图算完立刻腾地方给下一个,内存占用从 200KB 降到 40KB。案板收拾利索了,最后一个大问题摆在面前:胡同后半夜没人来,火还开着,煤气费哗哗地流。

RAMpeak≈max⁡t∑i∈live(t)si\displaystyle \text{RAM}_{\text{peak}} \approx \max_{t} \sum_{i \in \text{live}(t)} s_i
这条公式是“案板最高占用”的数学表达:只统计同一时刻还在用的东西,用完立刻收盘,案板自然就够用了。
  1. live(t)(存活集合)在 t 时刻仍被后续计算需要的张量集合,相当于此刻案板上还必须摆着的东西。
    live(t)\displaystyle \text{live}(t)
  2. 求和 s_i把所有存活张量的大小加起来,就是这一瞬间案板被占用的总面积。
    ∑i∈live(t)si\displaystyle \sum_{i \in \text{live}(t)} s_i
  3. max(取峰值)遍历整个推理过程,找出案板最挤的那一刻,内存规划只需要为这个峰值兜底。
    max⁡t\displaystyle \max_{t}

功耗管理:省着烧煤气

晚上九点以后,胡同口几乎没客人,小王可不会傻傻地一直大火开着。燃气费才是出摊最大的隐性成本。MCU 同理:功耗等于电压乘电流,省电的关键不是把火调小,而是“没客人就熄火,来人了再点火”。

具体手段有三招。第一,低功耗模式:STM32 的 stop/standby 模式、ESP32 的 deep sleep 模式,能把电流从毫安级压到微安级,相当于把大火关成只剩一颗小火苗。第二,事件唤醒:用传感器中断或定时器把芯片叫醒,代替每隔几毫秒就轮询一次的“傻等”。第三,突发式推理:平时深度睡眠,事件到来才全速跑完推理,算完立刻接着睡。平均功耗的模型是:

如果只有 1% 的时间在忙、99% 的时间在睡,平均功耗就被摊薄到接近休眠水平——这是 TinyML 产品续航的真相:芯片大多数时间都在“装睡”。

小王给煎饼摊设计了一个值班策略:每五秒醒来一次看看有没有人排队,其余时间深度睡眠。一块小电瓶愣是撑了一个月。他站在胡同口,看着自己的小火柴盒厨房——AI 大菜做出来了,成本还压到了最低。这正是 TinyML 的终极浪漫:在最小的芯片上,用最省的力气,干最聪明的活。

Pˉ=Pactive⋅Tactive+Psleep⋅TsleepTactive+Tsleep\displaystyle \bar{P} = \frac{P_{\text{active}} \cdot T_{\text{active}} + P_{\text{sleep}} \cdot T_{\text{sleep}}}{T_{\text{active}} + T_{\text{sleep}}}
平均功耗公式本质是“煤气费分摊”:把忙碌时的大火和待机时的小火苗加起来,除以整个出摊时间,算出平均每小时烧多少气。
  1. active 项全速推理期间的功率乘以忙碌时长,是烧气的大头,像晚高峰那一小时的爆炒。
    Pactive⋅Tactive\displaystyle P_{\text{active}} \cdot T_{\text{active}}
  2. sleep 项休眠期间的超低功率乘以待机时长,是几乎看不见的小火苗。
    Psleep⋅Tsleep\displaystyle P_{\text{sleep}} \cdot T_{\text{sleep}}
  3. 除以总时长把两部分的煤气消耗总和摊平到整个周期,得出一个“平均每小时气费”。
    ÷(Tactive+Tsleep)\displaystyle \div (T_{\text{active}} + T_{\text{sleep}})

AI 应用场景

智能家居唤醒词检测

阶段:端侧推理 + 功耗管理

解决的问题:传统智能音箱需要把音频持续上传到云端识别唤醒词,延迟高且隐私敏感。TinyML 方案把唤醒词模型直接烧进设备端 ESP32,本地完成“小爱同学/OK Google”的检测,只有命中后才联网进入正式对话。

具体案例:某智能台灯厂商用 ESP32 跑一个微型 CNN 唤醒词模型,单次推理只要 30ms,待机功耗降至 20µA,一颗纽扣电池支撑半年以上,唤醒响应却比云端方案快一倍。

工业设备预测性维护

阶段:模型压缩 + 内存优化

解决的问题:传统振动监测要把波形数据传给服务器分析,工厂网络一断就失效,而且海量数据上传成本极高。TinyML 把 1D-CNN 量化后烧进 STM32,在设备旁就地提取振动特征、判断轴承是否异常。

具体案例:某制造厂在电机旁部署 STM32F4 加加速度计,每 10 分钟做一次 256 点 FFT 加异常分类,模型内存占用仅 38KB,异常检出精度达到 96%,彻底摆脱了对车间网络的依赖。

可穿戴健康监测

阶段:模型训练 + 压缩 + 功耗管理

解决的问题:24 小时连续心电采集如果全靠云端分析,既费电又费流量。TinyML 在腕表的小芯片上实时跑心律失常分类,只在检测到异常时才通过蓝牙上报手机。

具体案例:某手环方案用知识蒸馏把 120 万参数的心电模型压缩到 80KB,在 Cortex-M4 上每分钟推理一次,整机续航从原来的 3 天提升到 15 天,异常事件召回率保持 95% 以上。

Python 演示

python46 行
import numpy as np  def symmetric_quantize(weights, bits=8):    """对称量化: 将 float32 权重映射到 int8, 返回整数表和缩放步长"""    scale = np.max(np.abs(weights)) / (2 ** (bits - 1) - 1)    q = np.clip(np.round(weights / scale), -(2 ** (bits - 1)), 2 ** (bits - 1) - 1)    return q.astype(np.int8), scale  def dequantize(q, scale):    """按缩放步长把 int8 权重还原为近似的 float32"""    return q.astype(np.float32) * scale  def prune(weights, ratio=0.5):    """剪枝: 把绝对值最小的 ratio 比例权重置零"""    w = weights.copy()    threshold = np.percentile(np.abs(w), ratio * 100)    w[np.abs(w) < threshold] = 0.0    return w  def main():    rng = np.random.default_rng(42)    model = {        "fc1": rng.normal(0, 0.3, (256, 128)),        "fc2": rng.normal(0, 0.3, (128, 10)),    }    float_bytes = sum(w.nbytes for w in model.values())    print("原始 float32 模型: %d 字节 (%.1f KB)" % (float_bytes, float_bytes / 1024.0))     quant_bytes = 0    errors = []    for name, w in model.items():        q, scale = symmetric_quantize(prune(w, 0.5), 8)        quant_bytes += q.nbytes        rebuilt = dequantize(q, scale)        errors.append(np.mean(np.abs(w - rebuilt)))    print("剪枝加量化后 int8 模型: %d 字节 (%.1f KB)" % (quant_bytes, quant_bytes / 1024.0))    print("压缩比: %.1fx" % (float_bytes / quant_bytes))    print("平均绝对误差: %.5f" % float(np.mean(errors)))  if __name__ == "__main__":    main()
目的:模拟 TinyML 压缩管线的核心两步——先剪枝扔掉一半小权重,再对称量化成 int8,直观对比压缩前后的模型体积与精度损失。
  1. scale = np.max(np.abs(weights)) / (2 ** (bits - 1) - 1)计算量化步长,把权重最大绝对值映射到 int8 的 127。
  2. q = np.clip(np.round(weights / scale), ...)加 clip 防止极端值越界,像切菜时把特别长的葱也限制在砧板长度内。
  3. threshold = np.percentile(np.abs(w), ratio * 100)求出切掉 50% 小权重的那把“剪刀”的阈值。
  4. w[np.abs(w) < threshold] = 0.0绝对值小于阈值的权重全部置零,这就是剪枝。
  5. float_bytes = sum(w.nbytes for w in model.values())遍历模型所有层,统计原始 float32 总字节数。
  6. q, scale = symmetric_quantize(prune(w, 0.5), 8)先剪枝再量化,两步压缩一气呵成。

常见误区

误区微控制器那点内存连张图片都存不下,怎么可能跑 AI?所谓 TinyML 就是噱头,MCU 顶多采集传感器数据传上去。

正解TinyML 已经在真实执行神经网络推理,CNN、RNN 都能在几十 KB 的模型里跑起来。关键在于把模型压缩到与任务匹配:小推车做不了国宴,但做煎饼绰绰有余。关键词检测、异常分类这类轻任务本来就是“煎饼级”问题。

为何常见:大家习惯了 GPU 和大内存,默认“AI = 大模型”,忽略了模型经过量化剪枝后可以缩小一个数量级。

误区float32 变 int8,精度肯定一落千丈,所以我宁可用完整精度模型烧录。

正解8 位量化通常只损失 1% 到 2% 的精度,配合量化感知训练甚至接近无损。真正导致精度崩盘的原因是用整型直接硬截断原始模型,就像把烂食材硬切成丁,怎么切都不好吃——问题不在切,而在食材。

为何常见:很多人拿一个没经过压缩友好训练的模型直接量化,得出“量化有害”的错误结论。

误区反正 Flash 比 RAM 大得多,模型权重全放 Flash 不就行了,RAM 不够的问题就解决了。

正解Flash 适合放常量权重,但推理时中间特征图必须在 RAM 里计算;而且每层都从 Flash 读权重,访存速度会严重拖慢推理。正确做法是“冷数据放 Flash、热数据放 RAM”,再用张量复用压低 RAM 峰值。

为何常见:混淆了仓库(Flash)和案板(RAM)的职责——仓库再大,菜还是得在案板上做。

误区PyTorch 模型转成 TFLite 或 C 代码就是改个后缀的事,烧进去就能跑。

正解转换后必须做算子兼容检查、端侧精度验证和性能测试。MCU 的算子库极简,不支持的算子可能被替换成低效实现,甚至直接转换失败。在电脑模拟器上跑通,离在 MCU 上跑通还差着十万八千里。

为何常见:只在 x86 模拟环境验证,忽略 MCU 指令集、内存对齐和算子内核差异。

误区只要采购时选标称低功耗的 MCU,整机功耗自然就低了,软件不用操心。

正解整机功耗 = 硬件底噪 + 软件行为功耗。深度睡眠、中断唤醒、突发式推理这些软件策略能把平均功耗压低两个数量级;如果代码里没有休眠逻辑,再“低功耗”的芯片也会一直满负荷耗电。

为何常见:把功耗问题完全归因于硬件选型,忽略了“占空比”这个决定平均功耗的关键变量。

面试题

Q1. TinyML 通常把人工智能推理放在哪里执行?

单选题 · easy

  • A.云端 GPU 数据中心
  • B.微控制器 MCU 内部← 正确答案
  • C.个人电脑显卡上面
  • D.边缘服务器集群里

答案:B。TinyML 的核心理念就是把推理放到 MCU 这类端侧设备上,而不是依赖云端大算力。就像小王做煎饼一定在小推车上现做,不会把饼送到大饭店厨房加工再端回来。

Q2. 参数从 float32 量化为 int8 后,同参数量的模型体积约为原来的多少?

单选题 · easy

  • A.二分之一大小
  • B.四分之一大小← 正确答案
  • C.八分之一大小
  • D.体积完全不变

答案:B。float32 每个参数占 4 字节,int8 只占 1 字节,所以存储量变为四分之一。这正是量化压缩最直接的收益,也是 TinyML 能把模型塞进 MCU 的关键。

Q3. 下列哪项最符合“剪枝”技术的核心思路?

单选题 · mid

  • A.降低每个权重的位宽
  • B.用大模型指导小模型训练
  • C.剔除接近零的冗余权重← 正确答案
  • D.增加网络中神经元的数量

答案:C。剪枝是把绝对值接近零的权重直接删掉,让模型变稀疏,相当于扔掉可有可无的装饰配菜。降低位宽是量化,用大模型指导小模型是知识蒸馏,增加神经元是反向操作。

Q4. 下列哪些属于模型压缩的主流方法?

多选题 · mid

  • A.权重量化降低位宽← 正确答案
  • B.结构化剪枝删减连接← 正确答案
  • C.知识蒸馏传递能力← 正确答案
  • D.无限制扩充训练数据

答案:ABC。量化、剪枝、知识蒸馏是 TinyML 三大压缩法宝,分别对应切丁、扔配菜、师传徒。扩充数据属于训练阶段的常规操作,不会减小模型体积。

Q5. 对称量化中缩放步长 scale 的计算方式是哪一项?

单选题 · mid

  • A.权重最大值直接除以二
  • B.绝对值最大值除以量化上限← 正确答案
  • C.权重均值除以标准差
  • D.任意整数都可以直接使用

答案:B。对称量化用权重绝对值的最大值除以 int8 的上限 127,得到每个量化格子的宽度 Δ,相当于把最大尺寸的食材均匀切成 255 段的标准段宽。

Q6. TFLite Micro 与标准 TFLite 的关键区别是什么?

单选题 · mid

  • A.模型参数规模完全不受限
  • B.只支持浮点推理计算
  • C.为 MCU 精简运行时内核← 正确答案
  • D.必须依赖完整操作系统

答案:C。TFLite Micro 去掉了文件系统、动态内存等重依赖,专门为裸机 MCU 裁剪出极简推理内核,像为小推车定制的迷你锅具,而不是把饭店后厨整套搬来。

Q7. ESP32 相比 STM32 的最突出特点是什么?

单选题 · mid

  • A.内置 WiFi 与蓝牙通信← 正确答案
  • B.工业级稳定可靠性
  • C.官方 AI 工具链更完善
  • D.静态待机功耗更低

答案:A。ESP32 自带 WiFi 和蓝牙,联网能力是它的招牌,适合 IoT 原型和智能家居;STM32 则在工业稳定性、低功耗模式和官方 AI 工具链上见长。选型要看场景。

Q8. 降低推理时 RAM 峰值最有效的办法是哪一项?

单选题 · mid

  • A.将所有权重常驻于 RAM
  • B.使用动态内存分配函数
  • C.无限提高芯片供电电压
  • D.张量内存复用共享缓冲← 正确答案

答案:D。张量内存复用(arena 机制)让生命周期不重叠的中间特征图共用同一块缓冲,峰值从“所有层之和”降到“最大单层量”,是 MCU 上最有效的内存优化手段。

Q9. 下列哪些软件策略能显著降低 MCU 平均功耗?

多选题 · hard

  • A.推理完成后进入深度睡眠← 正确答案
  • B.用中断事件唤醒设备← 正确答案
  • C.突发式全速推理后休眠← 正确答案
  • D.采用高频轮询持续运行

答案:ABC。深度睡眠、中断唤醒、突发式推理共同把占空比压到极低,平均功耗被摊薄到接近休眠水平。高频轮询意味着芯片一直在傻等,是省电的大敌。

Q10. TinyML 端侧推理相对云端推理的优势有哪些?

多选题 · mid

  • A.数据传输延迟更低← 正确答案
  • B.用户隐私保护更强← 正确答案
  • C.断网状态下仍可工作← 正确答案
  • D.模型推理精度必定更高

答案:ABC。端侧推理免去了数据传输的往返时间,数据不出设备更隐私,断网也能用。但精度并不能保证更高——相反,为了塞进 MCU 通常要牺牲一点精度,这是 TinyML 的取舍。