上个月,一位做工业设备的老工程师来找我看方案。他的需求很朴素:电机振动数据别再全部传回服务器,设备自己判断要不要报警。这件事的本质,是把AI推理拆到板子端,而且是低功耗、电池供电、装上去就不想频繁换电池的板子。最近两三年,“AI进开发板”从口号变成了现实,很多嵌入式工程师都在问:机会是不是真的,低功耗智能设备到底怎么落地?我结合自己做过的端侧推理项目,把趋势判断、功耗预算、选型思路、模型压缩和排坑经验一次说清楚。
1. 从“采集上报”到“边缘决策”:AI进板子靠的不是口号,而是三个变量同时到位
1.1 模型缩小、算力上涨、推理引擎成熟
AI进开发板这件事,放在五年前还只是玩票。当时的模型动辄上百MB,板子算力也撑不住,跑一个演示程序要么靠云服务器,要么靠开发板上的GPU硬扛,功耗和成本都完全不实际。但最近两三年,三个变量凑到了一起:
轻量化模型把参数量压到几十万到几百万级别,内存占用降到几十KB到几百KB。这不是理论上的探索,而是很多开源社区已经在做并且跑通的事情,专门为嵌入式场景设计的小模型逐渐成了标配,分类、检测、唤醒、异常识别都有对应的压缩方案。单片机算力也在往上走,从早期单纯的控制内核,到带DSP指令和高性能浮点单元的M4级别内核,再到带向量扩展能力的M7/M55级别,主频到了几百兆赫,已经能扛住小规模卷积运算。端侧推理引擎同样成熟了,可以在几十KB的RAM里做静态内存规划,把模型图和中间缓冲区都安排得明明白白,支持INT8量化之后速度还能再上一个台阶。
三个变量同时到位,“能不能跑”就从争论变成了测试问题。现在更值得讨论的是“跑什么任务、跑多快、耗多少电、成本能不能接受”。
1.2 连接瓶颈与延迟把决策逼向设备端
第二个变量是连接。很多设备装在现场,无线信号差、带宽有限,就算网络条件好,把原始音频、高频振动波形、视频帧持续传回去也不现实。一个振动监测设备,一秒采几十次高频波形,一天的数据量可能几百MB,每月流量费用远超设备本身的价格。与其把数据全传上来再判断,不如在本地完成初步判断,只上传异常片段或最终结果。
延迟也是因素。云上判断一圈,网络来回几百毫秒,对需要立即响应的工业停机保护、安防告警、语音交互来说都太慢。设备端直接决策可以把响应时间压到几十毫秒甚至更低。而且“设备知道自己状态”这件事本身就是一个刚需:空调滤网脏不脏、电机轴承有没有磨损、门窗有没有被异常打开,这些判断不需要一个庞大的数据中心,一块几十块钱的板子就能完成。
1.3 嵌入式工程师真正该盯住的机会位
这几个变量叠加,意味着嵌入式工程师以前学的C语言、实时系统、硬件调试、功耗设计这些基本功,突然从“支持型技能”变成了AI落地的关键能力。
会训练模型的人很多,但能把一个几十KB的模型装进设备、把功耗压到电池可接受范围、让它在现场稳定跑一年的人,反而稀缺。机会位不在算法研究,而在“让模型在真实设备上跑起来”这件事本身。这里面牵扯到模型压缩、内存规划、算子适配、功耗测量、传感器配置,每一个环节都是嵌入式工程师的舒适区。
2. 低功耗设备的第一道算术题:用电池寿命倒推功耗预算
2.1 一年续航意味着什么:平均功耗只有1mW级
先别急着聊AI,先算一笔账。假设一个设备用3.7V、3000mAh的锂电池,能量是11.1Wh(3.7V乘以3Ah)。如果甲方要求一年换一次电,一年是8760小时,那平均功耗预算只有约1.27mW。这个数字非常小,意味着设备绝大部分时间必须处于深度睡眠状态。
再看另一个角度。如果设备峰值工作电流是50mA@3.3V,功率约165mW,连续工作只能撑67小时左右。想撑一年,设备超过99%的时间必须“睡着”。AI推理任务无论多轻量,都会带来瞬间的毫安级甚至几十毫安级电流,所以它的功耗逻辑不是“跑得快不快”,而是“多久跑一次、一次跑多久、不跑的时候睡得多深”。
我给那位老工程师画过一张时间线图:休眠、醒来、采样、推理、上报、再休眠。真正决定电池寿命的,是这段循环里每个状态的时间占比和电流值,推理只是其中一小段。
2.2 不同AI任务对算力的真实需求
不同任务对算力的需求差别非常大,可以用MACs(乘加次数)来估算量级。关键词唤醒、简单事件检测这类任务,一次推理只需要几M到几十M MACs,几十KB内存就够,纯MCU完全可以扛。传感器异常检测、简单分类,几十M到几百M MACs,内存几十到几百KB,也在MCU的射程内。小尺寸图像分类到几百M MACs,就需要更高主频的MCU或加一颗NPU协处理器。实时视频目标检测是几个G MACs以上,内存几十MB起步,基本要Linux单板机级别的平台。
| 任务类型 | 单次推理算力量级 | 典型内存占用 | 适合的硬件路线 |
|---|---|---|---|
| 关键词唤醒/事件检测 | 几M到几十M MACs | 几十KB | 纯MCU |
| 传感器异常检测/简单分类 | 几十M到几百M MACs | 几十到几百KB | 纯MCU |
| 小尺寸图像分类 | 几百M MACs | 几百KB到几MB | 高性能MCU或MCU+NPU |
| 实时视频目标检测 | 几个G MACs以上 | 几十MB以上 | Linux单板机/NPU平台 |
为什么强调量级?因为很多项目一上来就选了算力很高的平台,最后发现任务只需要十分之一的算力,功耗却高了几十倍。反过来也有任务在MCU上硬跑导致推理时间过长,设备长时间处于唤醒状态,电池很快耗尽。把任务量级估算准,选型才不会翻车。
2.3 推理再快也救不了频繁唤醒:睡眠策略才是大头
睡眠策略往往比推理优化更决定电池寿命。举一个实际数字:推理时平均电流30mA@3.3V,约99mW,一次推理50ms。如果每小时醒来一次,一年下来推理消耗约0.001375mW(99乘0.05再除以3600),几乎可以忽略;但如果每秒醒一次,占空比5%,平均功耗接近4.95mW,直接超出1.27mW的预算。
结论很明显:优化方向不是模型快那几毫秒,而是降低唤醒频率、缩短每次唤醒时长、保证睡眠态电流真正到uA级。AI部分做得再快,只要唤醒次数从每小时一次变成每秒一次,省下的电全被高频唤醒吃掉了。所以我做低功耗AI项目时,先把时间预算表和电流表架起来,再谈模型优化。
3. 开发板选型三路:MCU、MCU+NPU、Linux单板机怎么选
3.1 纯MCU路线:小模型、强实时、uA级待机
第一类平台是纯MCU。适合的任务是关键词唤醒、声音事件检测、振动异常分类、工业预测性维护这一类标量或小卷积任务。优点非常直接:待机电流可以做到个位数uA甚至更低,实时响应可控,外围简单,成本低。限制也明确:内存、flash和算子支持都有限。
模型压缩后大小通常在几十KB到两三百KB,推理时的内存规划要精确计算。开发方式还是熟悉的C语言加RTOS或裸机,RTOS处理任务调度,但任务栈不要分配太大,浪费RAM。选型时建议用M4级别以上的内核,带DSP指令和FPU,跑定点INT8推理比较合适。M7/M55级别算力更强,但功耗也略高,要结合具体电池预算来权衡。
3.2 MCU+NPU路线:中等算力的折中选择
第二类路线是MCU加NPU协处理器的组合。适合人脸检测、语音识别、小尺寸图像分类这类矩阵运算密集的任务。主MCU负责传感器、通信、电源管理,NPU专门跑卷积等密集计算,两边通过共享内存或DMA交换数据。
好处是能把算力提升好几倍,同时保留MCU级别的低功耗特性。坏处是系统复杂度明显上来了,要处理驱动、内存同步、中断优先级,而且NPU的空闲功耗要认真评估。我见过几个项目把这些平台做砸,原因不是NPU推理功耗高,而是频繁在两个芯片之间拷贝数据,额外开销甚至超过推理本身。数据要尽量在原位处理,搬运次数越少越好。
3.3 Linux单板机路线:高算力的代价是功耗
第三类路线是Linux单板机。算力高、内存大,可以跑完整的端侧推理框架,甚至训练好的模型可以直接部署,开发效率最高。适合实时视频目标检测、视觉导航、多模型组合这类任务。
但功耗代价很明显,整板电流往往几百mA到几A,一个10Wh的电池就算全速跑不到一天,靠电池长期供电非常困难。如果产品本来就是插电的,这类平台很合适;如果电池供电且续航以月或年计算,就要非常谨慎。真要用,通常得做系统级休眠、外设电源域管理,把设备大部分时间停在Linux的suspend状态,但系统复杂度会上升不少。
| 路线 | 算力上限 | 内存 | 典型待机功耗 | 适配任务 | 开发复杂度 |
|---|---|---|---|---|---|
| 纯MCU | 较低 | 几十到几百KB | uA级 | 关键词、异常检测、简单分类 | 中 |
| MCU+NPU | 中等 | 几百KB到几MB | mA级需优化 | 人脸检测、语音识别 | 高 |
| Linux单板机 | 高 | 几十MB以上 | 百mA到A级 | 视频检测、视觉导航 | 中高 |
4. 把模型塞进几十KB内存:量化、剪枝与端侧推理引擎
4.1 量化:FP32到INT8的第一刀,也是性价比最高的一刀
模型压不下来,后面都是空的。第一刀通常是量化,把FP32权重和激活值缩到INT8。好处很直观:内存直接降到原来的四分之一,用整数乘加指令做推理,速度经常能翻倍甚至更多,尤其在带DSP或向量指令的内核上。
实操上有两种方式:训练后量化(PTQ)和量化感知训练(QAT)。PTQ动手快,拿真实数据跑一遍校准,统计激活值的动态范围,精度损失通常可以控制在可接受范围;如果掉精度厉害,比如分类准确率掉了好几个点,就得考虑QAT,在训练阶段就模拟量化误差,让模型主动适应低精度表示。
一个经验:校准数据一定要覆盖真实场景。背景噪声、光照变化、姿态差异都要有,否则量化范围定得不准,极端输入容易溢出造成推理结果异常。量化做完之后,必须在目标开发板上重新跑一遍验证集,不能只看训练时的指标。
4.2 剪枝和蒸馏之外,输入侧降维往往更立竿见影
剪枝和蒸馏是两条常见路径。结构化剪枝直接去掉不重要的卷积通道,模型体积和推理时间一起下降,对硬件友好;非结构化剪枝虽然压缩率高,但在很多常规硬件上没有加速效果,除非端侧推理引擎专门支持稀疏计算。蒸馏则是用一个大模型当老师,教一个小模型达到接近的效果,特别适合任务边界相对固定的场景。
但根据我的实际经验,投入产出比最高的往往是输入侧降维。音频任务降低采样率,从48kHz降到8kHz,数据量直接少6倍;图像任务降低输入分辨率;特征计算简化。很多任务的需求没那么精密,输入侧一降,内存和算力同时轻松不少。曾经有个音频事件检测项目,只是把采样率从48kHz降到16kHz,特征维数减半,模型精度几乎没有下降,但推理耗时和内存占用大幅改善。
4.3 端侧推理引擎的选型逻辑与静态内存规划
轻量推理引擎的选型,核心看四件事。第一,目标算子是否有高效实现,很多引擎只支持一部分算子,模型转换时一旦遇到不支持的算子就卡住。第二,内存占用和flash占用是否在预算内,尤其要看推理时的峰值内存。第三,是否支持INT8或混合量化,纯FP32在MCU上跑会非常尴尬。第四,是否能在低功耗模式下配合,比如推理完尽快释放外设资源。
选型时可以先做一次模型分析,看各算子的占比,再决定用哪个引擎。内存规划上,端侧推理引擎普遍采用一次性分配的arena机制,所有中间buffer都从这块静态内存里拿,不跑动态分配。这样做的原因很实际:避免堆碎片,启动时间稳定,峰值内存可预测。
实际做的时候,要把arena尺寸放到编译期或启动早期计算好,同时预留一定余量,再用边界填充字去检查是否溢出。一旦发现溢出,优先调整arena大小,而不是靠运气。
5. 低功耗落地的三板斧:睡眠、事件驱动与本地门控
5.1 睡得好,设备才能活一年
低功耗产品的第一要务是睡得好。常见的睡眠模式分几档:运行态几十mA,浅睡几mA,停止或深度睡眠uA级。省电的核心不是选多强的芯片,而是把绝大多数时间放在最深的睡眠态。
唤醒源头一般是RTC定时器或外部中断,比如传感器的事件引脚。一个典型的低功耗音频唤醒流程是:前端始终有一个极低功耗的音频监听模块在运行,检测到声压超过阈值才把主MCU拉起来做完整推理。这个分级唤醒思路可以复制到所有传感器场景:粗检测用外设硬件完成,只有确认有事件才让AI出场。
5.2 传感器与DMA:让CPU从“被数据淹没”里解放出来
传感器是另一个容易被忽视的耗电源头。很多传感器的规格书电流看着不高,但配置不对时会持续产生中断,导致CPU反复醒来。采样侧要做三件事:降低采样率到刚好够用;优先用阈值中断或FIFO,让传感器自己在硬件层判断事件;传感器在两次采样之间主动进入待机。
DMA也很关键,尤其是音频、振动这类高通量数据。DMA直接把数据搬到内存,等缓冲区满了再通知CPU。这样CPU一秒钟可以只醒来一次处理一批数据,而不是每个采样点都响应中断。曾经有个加速度计项目,就是靠阈值中断加FIFO批量读取,让CPU的唤醒次数从每秒几十次降到每秒一次,整机功耗下降了一个数量级。
5.3 本地门控:跑不跑模型,先问一句值不值得
本地门控是我在所有低功耗AI项目里最推荐的手段,没有之一。简单说,就是在完整模型前面加一个极轻量的判断逻辑:这个数据值不值得跑模型。
它可以用时域特征实现,比如均方根、过零率;也可以用频域能量比,甚至只是一个阈值。只有当门控通过,才触发完整推理。比如异常声音检测,环境里一直有背景噪声,可以先算能量变化,没有明显变化就不跑模型;一旦能量跳变,再判断是不是目标事件。
门控逻辑往往就是几十行C代码,省掉的通电时间却是几十倍。上报侧同样克制:能上报几十字节结论就不上报原始数据,无线传输的功耗经常会比推理功耗还高,这一点很容易被忽略。
6. 实测排坑:从静态电流翻车到推理进程随机崩溃
6.1 静态电流比理论高两个数量级,我建议这样排查
先讲一个我印象深刻的案例。一个可穿戴设备原型,理论待机电流应该是个位数uA,实测休眠电流0.3mA,算下来一年续航直接缩水一大半。排查的思路是逐个拔掉外设:把传感器排线全部断开,电流立刻掉到uA级,说明元凶在传感器侧。然后逐个接回来,发现一个加速度计没有正确进入睡眠配置,问题锁定。
后来又发现几个没用的GPIO引脚悬空,悬空引脚会通过内部保护二极管漏电,也有微安级电流。处理方式是把不用的引脚统一配置成高阻或固定在确定电平,把传感器总线在休眠前手动关闭。这类问题只看代码很难发现,一定要靠电流表实测。
6.2 推理耗时比文档翻倍:编译选项、数据对齐和缓存
另一个常见坑是推理耗时和文档对不上。有一次跑一个音频分类模型,文档写单次推理约30ms,实测60ms。排查下来三个原因:编译优化没开,优化选项太保守;常量表位置没放好,访问效率低;输入数据没有做对齐。
处理办法:编译器开O2或O3优化,把推理热路径经常访问的常量放到适当区域,输入buffer做16字节对齐。调试时建议用GPIO翻转配合示波器或逻辑分析仪测真实推理时间,不要在打印日志里打时间戳,打印本身就会拖慢系统,而且影响功耗测量的准确性。
6.3 随机崩溃大概率是内存问题:边界字与内存保护
随机重启的问题最头疼,因为不一定能复现。我排查过一个案例:设备正常运行几小时后随机复位,最终靠边界填充字定位到arena溢出。做法是在静态内存边界四周填固定pattern,运行后检查pattern是否被破坏,哪个区域被踩就说明哪个buffer越界了。
另外要检查任务栈大小,RTOS任务栈默认值往往不够用,尤其是C++栈帧比较深的时候。有内存保护单元(MPU)的芯片建议给关键区域开保护,崩溃后打印PC和LR寄存器,再对照map文件定位代码位置,效率会高很多。把这些手段固化成一套标准排障流程,后续项目能少走很多弯路。
| 问题现象 | 排查动作 | 典型根因 |
|---|---|---|
| 休眠电流偏高 | 逐个断开外设,检查悬空引脚 | 传感器未睡眠、GPIO悬空漏电 |
| 推理耗时翻倍 | 检查优化选项、数据对齐、常量存储 | 编译器未开优化、访问效率低 |
| 随机复位/崩溃 | 检查arena边界、任务栈、MPU配置 | 内存越界、栈溢出 |
7. 机会不等人:嵌入式工程师的能力拼图与行动路径
7.1 传统硬技能不变,新增的三层能力
如果说机会在前几章是行业趋势,那对个人最直接的问题是:该补什么能力。原有C语言、RTOS、驱动、硬件调试、PCB设计这些能力完全不会过时,它们恰恰是AI落地的地基。更具体地说,新增三层能力就够了:
模型压缩与量化调优,能理解训练后量化、校准集设计、精度验证的完整链路。推理引擎集成与算子适配,能把模型转成端侧格式,处理好内存规划,跑通真实硬件。功耗测量与功耗分析,会用电量计、示波器电流探头,会设计实验对比不同睡眠策略和唤醒频率。
想入门不需要先啃大模型训练框架,很多项目用到的是几十KB到几MB的模型。重点从来不是“把AI训出来”,而是“把AI用起来,并且用得起”。
7.2 怎么识别一个真正的落地岗位
怎么判断一个岗位是真落地还是还在画饼?直接问几个问题:目标设备用哪类内核或单板机,可用内存多少,目标功耗预算是多少,模型量化后的精度怎么保证,现场是否方便换电池。能具体回答这些的,说明项目已经进入收敛阶段;只谈“AI赋能”“端侧智能”却给不出任何约束数字的,往往还在验证期。
就算暂时不做专门的AI岗位,把模型压缩、推理引擎集成、功耗优化这三样放进项目经验里,在团队里也是最容易解决实际问题的人。行动建议很朴素:拿一块手头开发板,接一个真实传感器,跑通一个小模型,然后把电流表串进电源开始测功耗。这一套流程跑通,比看十篇教程都有用。
我个人的体会是,低功耗AI项目里最花时间的从来不是让模型跑起来,而是让设备在供电、时序、成本的限制下稳定地跑一年。但这恰恰是嵌入式工程师的主场。模型再聪明,最后都要在某个板子上、某块电池上、某个现场的角落里长期运转,这些约束条件是纯算法背景的人很难独自搞定的。如果你手里有板子,这周就找个真实的传感器数据试一试,不需要多复杂,先把电流表架起来,你会对“端侧AI到底意味着什么”有完全不一样的理解。