news 2026/9/9 10:12:15

深入浅出TinyML 20:如何在准确率、延迟、内存和功耗之间选择模型?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入浅出TinyML 20:如何在准确率、延迟、内存和功耗之间选择模型?

TinyML模型很少在所有指标上同时最好。更深网络可能提高少量识别效果,却让Arena、推理时间和能量超过系统预算。模型选择应先淘汰不满足硬约束的方案,再比较剩余候选的业务收益。

Pareto前沿提供一种清晰方法:当一个模型在效果不低于另一个模型的同时占用更少资源,后者就没有继续保留的理由。

先用Flash、RAM、截止时间和最低效果做硬筛选,再在可行模型中比较功耗、维护和误报漏报成本。
完成本篇后,你应该能够
  1. 区分硬约束、优化目标和测量噪声。
  2. 用Pareto前沿删除被全面支配的模型。
  3. 运行候选筛选脚本,并输出可追溯的最终决策记录。

模型选择没有单一最高分。先淘汰超过Flash、RAM或截止时间的方案,再在合格方案中比较效果和余量。

一、把硬约束与优化目标分开

Flash上限、RAM上限、最坏执行时间和最低召回率通常属于硬约束,任何一项不满足都不能进入候选。平均功耗、模型大小和宏平均F1可以作为进一步优化目标。

约束需要留有余量。Arena刚好不报错、推理平均值刚好低于步长,都无法覆盖异常路径和时间抖动。

图1:效果提升趋缓时,资源更大的候选可能被Pareto前沿淘汰

二、统一实验条件才能公平比较

所有候选使用相同训练集、验证集、测试集和预处理。量化方式、运行时、编译优化、主频和Cache状态也要固定。

如果一个模型使用更长窗口或额外频谱特征,预处理成本必须计入总时间和能量。模型推理时间单独比较会低估系统成本。

表1:候选模型评审表应同时包含效果与资源

类别至少记录判定方式
效果每类Precision/Recall/F1、未知拒识独立测试集
内存固件Flash、静态RAM、Arena峰值构建报告与运行时记录
实时预处理、推理、后处理、P95/WCET目标板测量
能量单次能量与每秒推理次数电流波形积分

三、Pareto前沿删除被全面支配的模型

模型A效果更高、资源更少时,模型B被全面支配。保留前沿上的候选,再根据错误成本选择偏向效果或偏向资源的点。

独立测试效果差异很小时,还要考虑统计波动。多次训练或置信区间能够避免把随机差异当成稳定提升。

四、最终选择写成决策记录

决策记录应列出候选、淘汰原因、测试环境和已知限制。这样后续硬件变化或新增类别时,可以重新判断哪些模型值得恢复评估。

选择较小模型不意味着停止优化数据。很多项目继续改善标签、设备覆盖和未知类别,收益高于增加网络深度。

Python:按硬约束筛选候选模型

def feasible(m, limits):
return (
m["flash"] <= limits["flash"] and
m["ram_peak"] <= limits["ram_peak"] and
m["p95_ms"] <= limits["deadline_ms"] and
m["recall"] >= limits["min_recall"]
)

survivors = [m for m in candidates if feasible(m, limits)]
survivors.sort(key=lambda m: (-m["f1"], m["energy_uj"]))

先写硬门槛,避免训练结果改变验收口径

硬门槛来自产品:关键类别召回率至少多少、每小时误报不超过多少、最坏推理时间小于多少、Arena与Flash上限是多少。它们应在候选模型出现前确定。

准确率、延迟、RAM和能量使用不同单位,直接加权求一个总分会隐藏越界。模型即使准确率高1%,只要最坏延迟超过采样步长,仍不能进入部署。

测量要带条件和重复统计。延迟记录预热、主频、Cache、编译优化和中断状态;能量记录工作周期;模型效果使用固定独立数据。没有统一条件的表格无法比较。

候选模型决策字段

类别字段用途
效果分组recall/FP率满足业务错误成本
资源Flash/Arena/栈满足容量与余量
实时P50/P95/max满足截止时间
维护算子/版本/复杂度降低升级风险

Pareto前沿保留真正的权衡方案

若模型A准确率更高、延迟更低、RAM更少,则模型B被A全面支配,可以删除。Pareto前沿上的模型各有至少一个优势,需要结合业务优先级选择。

前沿不能代替硬门槛。一个RAM超限但准确率很高的模型即使在数学前沿上,也应先淘汰。通过门槛后,可以偏向更大资源余量,避免后续协议栈、日志或模型更新无空间。

最终决策应记录未选择方案及原因。未来硬件或需求变化时,可以从历史候选重新评估,而不必凭记忆重复实验。

A支配B:A在所有目标上不差于B,并至少一项严格更好。
效果指标越大越好;延迟、RAM、Flash和能量越小越好。

动手:筛选硬约束并计算Pareto前沿

脚本包含6个假设候选模型。它先按召回率、Arena和延迟门槛筛选,再找出非支配方案。数值只用于学习决策方法。

实验环境与输入

  • Python 3标准库。
  • 保存为 `pareto_models.py` 并运行。
  • 将来用统一测试报告替换示例数据。

按顺序完成实验

  1. 运行并查看被硬门槛淘汰的原因。
  2. 核对Pareto前沿中的模型互有优劣。
  3. 把延迟门槛从15 ms收紧到10 ms。
  4. 增加一个全面优于候选B的模型,确认B从前沿消失。

可直接运行:硬门槛与Pareto筛选

models = [
{"name":"A", "recall":0.94, "latency":9.5, "arena":82, "flash":140},
{"name":"B", "recall":0.96, "latency":13.0, "arena":96, "flash":155},
{"name":"C", "recall":0.91, "latency":7.0, "arena":64, "flash":118},
{"name":"D", "recall":0.97, "latency":22.0, "arena":110, "flash":170},
{"name":"E", "recall":0.95, "latency":11.0, "arena":76, "flash":135},
{"name":"F", "recall":0.88, "latency":6.0, "arena":58, "flash":105},
]
limits = {"recall":0.92, "latency":15.0, "arena":100}

eligible = []
for m in models:
fail = [k for k, limit in limits.items()
if (m[k] < limit if k == "recall" else m[k] > limit)]
print(m["name"], "PASS" if not fail else "FAIL " + str(fail))
if not fail:
eligible.append(m)

def dominates(a, b):
no_worse = (a["recall"] >= b["recall"] and a["latency"] <= b["latency"]
and a["arena"] <= b["arena"] and a["flash"] <= b["flash"])
better = (a["recall"] > b["recall"] or a["latency"] < b["latency"]
or a["arena"] < b["arena"] or a["flash"] < b["flash"])
return no_worse and better

front = [m for m in eligible if not any(dominates(other, m)
for other in eligible if other is not m)]
print("eligible:", [m["name"] for m in eligible])
print("pareto:", [m["name"] for m in front])

先读懂代码中的关键路径

  1. 硬门槛先构造eligible集合,失败模型不会进入Pareto计算。
  2. dominates要求所有目标不差且至少一项更好,避免完全相同候选互相删除。
  3. 效果用越大越好,资源用越小越好;新增指标时必须明确方向。
  4. 示例数字是假设候选,真实表必须来自同一数据和固件条件。

你应该观察到什么

  • D因延迟或Arena失败,F因召回率失败。
  • 前沿只保留没有被其他合格模型全面压过的候选。
  • 收紧门槛会先改变合格集合,再改变前沿。

成功标准

  1. 所有候选在同一数据、固件和测量条件下产生。
  2. 任何硬门槛失败都不能被综合分抵消。
  3. 决策记录包含选择理由、余量和未选方案。

失败时从哪里查起

多目标选择偏差

现象问题改进
每次选择都变测量条件或数据变化固定版本并报告重复统计
高分模型仍无法部署硬约束混入加权总分先门禁再排序
前沿候选太多目标过多或测量噪声按业务合并指标并设置实质差异

候选选择的价值在于让取舍可审计;最终模型是满足约束且保留合理余量的方案。

把实验迁移到真实MCU项目

在自动化测试中,每个模型生成一条带哈希的记录:效果报告、tflite字节、map、Arena、周期和能量。脚本拒绝缺少字段的候选。

前沿上最终选择可偏向资源余量与维护简单度。算子更少、内核更成熟的模型可能比准确率仅高一点但逼近资源上限的模型更稳妥。

候选差异小于测量波动时,不应宣称某模型更优。保存重复试验分布,规定最小实质差异;若两个方案效果相当,优先选择结构简单、余量更大的方案。

把结果再向前推进一步

  1. 写出你项目不可协商的三项硬门槛。
  2. 确定每项指标的测量条件和数据来源。
  3. 为最终选择记录至少一个被拒绝候选及原因。
这篇文章的结论模型选择是受约束的多目标决策。先淘汰越过资源和效果底线的方案,再在Pareto前沿上根据业务成本选点。

参考资料:
TensorFlow Lite Micro 官方代码仓库
Arm CMSIS-NN 官方文档
STMicroelectronics:STM32H743/753 官方资料
更新时间:2026 年 8 月 5 日

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 23:40:02

基于卷积神经网络的水果识别分类系统实战:从CNN原理到TensorFlow实现

简介&#xff1a;这是一套面向计算机专业本科生的毕业设计与课程大作业实战资源&#xff0c;聚焦基于卷积神经网络的水果图像识别分类任务&#xff0c;解决从数据预处理、模型构建、训练调优到部署演示的全流程实践需求。资源包共2000个文件&#xff0c;含30个核心Python脚本&a…

作者头像 李华
网站建设 2026/9/6 1:41:38

DELF B2备考:B2.1阶段听力口语能力构建全攻略

想考 DELF B2&#xff0c;B2.1 阶段应该怎么练&#xff1f;很多人一开始准备 DELF B2 就做错了一件事&#xff1a;直接拿真题刷&#xff0c;指望靠"题海战术"硬冲过去。结果往往是听力听不懂、口语说不出&#xff0c;做了五套模拟题分数还在 40 分边缘徘徊&#xff0…

作者头像 李华
网站建设 2026/9/5 18:33:30

用HTML、CSS与JavaScript打造三只宠物的互动展示小站

看到这个标题&#xff0c;很多读者可能会好奇&#xff1a;文章是打算晒三只小动物的日常吗&#xff1f;其实不是。这是我在整理前端练习素材时冒出来的一个灵感——与其拿千篇一律的“Todo List”或“登录表单”练手&#xff0c;不如做一个充满童趣的宠物展示小网站&#xff0c…

作者头像 李华
网站建设 2026/9/4 15:16:06

AI辅助开发学习小网页:从提示词到静态页面完整实践

要用 AI 做学习工网页&#xff0c;最容易低估的反而是需求拆得不够细。一开始我以为不过是把单词卡、口算题丢给 AI&#xff0c;让它吐一个 HTML 页面出来就算完事。真跑过几轮之后发现&#xff0c;一套稳定的做法要从“需求描述 → 提示词 → 代码生成 → 本地验证 → 数据批量…

作者头像 李华
网站建设 2026/9/8 5:14:57

爱奇艺C方向笔试题深度解析:从指针内存到数据结构

作为2019年参加过秋招的人&#xff0c;爱奇艺这套C方向笔试题&#xff08;A&#xff09;我印象还挺深的。那时候刷题刷到头秃&#xff0c;拿到卷子一看&#xff0c;倒不是难到无从下手&#xff0c;而是很多题看着眼熟&#xff0c;真要手写代码或者辨析概念&#xff0c;却处处是…

作者头像 李华
网站建设 2026/9/6 7:51:27

浏览器本地批量视频编辑:技术原理与最小Demo实现

当第一次看到 Apollodorus Video 这个项目时&#xff0c;最值得关注的点不是它做了多少花哨的滤镜&#xff0c;而是它把“批量视频编辑”和“浏览器本地运行”这两件事放在了一起。传统视频批处理要么依赖安装客户端软件&#xff0c;要么把素材上传到云端转码服务&#xff1b;而…

作者头像 李华