做嵌入式这几年,大家应该都感受到了,边缘AI从“可选”变成了“必选”。我最近在评估几款面向工业视觉和智能终端的芯片,发现一个很明显的趋势:低功耗MPU开始把AI加速器直接做进SoC里,而且宣传口径惊人地一致——都是“Power Efficient MPUs Embed AI Accelerator”。这话听起来像营销话术,但实际接触下来,这确实是继MCU+外部NPU之后最值得关注的一条技术路线。
工业质检、智能门禁、便携医疗、车载感知这些场景,对功耗和体积越来越敏感。单纯用MCU跑不动像样的神经网络,上大算力SoC又扛不住成本和散热,于是“低功耗MPU里内嵌AI加速器”就成了折中里的最优解。这篇文章我会结合自己选型、开发、调优的实操经验,把这类芯片的架构思路、核心参数、工具链配置,以及开发中真正让人头疼的坑都过一遍。如果你手里正好有带NPU的MPU项目,或者正在纠结要不要从MCU方案迁移过来,这篇可以当个参考。
1. 低功耗MPU内嵌AI加速器的设计思路与方案选型
1.1 为什么非要往MPU里塞AI加速器
先把概念理清楚。MPU(Microprocessor Unit)在嵌入式语境里一般指的是带MMU、能跑Linux/RTOS的应用处理器,比如瑞萨RZ系列、NXP i.MX系列、TI Sitara系列。以前这类芯片的定位是“能跑系统的处理器”,AI计算要么用CPU硬算,要么挂个外置NPU或GPU。
但实际项目里这么干有麻烦。CPU跑神经网络效率太低,一个YOLO类的检测模型在四核A53上跑,算力被吃光不说,内存带宽也顶不住。外置NPU方案倒是算力强,可一来成本抬上去,二来PCB面积和走线复杂度增加,三来两颗芯片之间的数据搬运本身就耗电、费时间。对量产产品来说,功耗、BOM成本、体积都是要命的指标。
所以芯片厂商的思路很直接:与其让你外面挂一颗,不如我直接把NPU、DSP这类AI加速单元集成进SoC,和CPU共享DDR和中断控制器。这样一来,数据不用再通过PCIe或USB在芯片间倒腾,系统功耗天然更低;二来软件栈统一,一套SDK搞定AI和业务逻辑;三来对板级设计更友好,四层板都能把核心电路画完。
我自己评估过几个项目,最直观的感受是:集成AI加速器的MPU在中等算力区间(1-5 TOPS)几乎是无敌的存在。低于这个区间你用MCU+轻量模型更划算,高于这个区间就要考虑独立NPU或者GPU方案。目前很多低功耗MPU宣传的能效比都在2-5 TOPS/W之间,这个数对边缘设备来说非常能打。
1.2 三类主流AI计算方案的取舍
在选型的时候,把市面上常见的方案分成三类来看会清晰很多:
| 方案 | 算力区间 | 典型能效 | 适合场景 | 主要劣势 |
|---|---|---|---|---|
| MCU + DSP指令扩展 | 0.1-0.5 TOPS | 高,但绝对算力低 | 唤醒词、异常检测、简单分类 | 跑不了复杂CNN/Transformer |
| 低功耗MPU + 内置NPU/DRP | 1-5 TOPS | 2-5 TOPS/W | 工业视觉、边缘盒子、医疗终端 | 算力上限摆在那,大模型跑不动 |
| MPU + 外置NPU/GPU | 5-100 TOPS | 相对较低 | 自动驾驶、服务器推理 | 成本高、功耗高、板级复杂 |
我接触过的项目里,有一个是工业产线上的瑕疵检测,原来用树莓派加摄像头跑Tiny-YOLOv4,整板功耗7W左右,还得外接散热风扇。后来换成内置NPU的低功耗MPU,同样的模型量化到INT8,功耗降到3W以内,风扇直接去掉,被动散热搞定。这就是典型的内嵌AI加速器带来的工程红利。
当然,方案选型不能只看算力。你要考虑工具链的成熟度、开源模型能不能顺利转换、驱动和OS怎么集成、量产供货周期多长。我见过不少项目在样机阶段发现“算力够但工具链不行”,模型死活转换不过去,最后又倒退回外置方案。所以下一节说的工具链问题,很多时候比芯片本身参数更重要。
2. 核心硬件细节解析:算力、能效比与工具链兼容性
2.1 不要被TOPS数字忽悠,能效比才是关键
选带AI加速器的MPU时,厂商最喜欢宣传“XX TOPS AI算力”。TOPS通常指整数运算的每秒万亿次操作,听起来很猛,但实际能发挥多少要看几个隐性指标。
首先是能效比,单位是TOPS/W。低功耗MPU的优势恰恰在这里。比如瑞萨RZ/V2L那类方案,集成的DRP-AI能效比做得很好,整机功耗控制在几瓦以内还能跑1 TOPS级别的推理。而一颗几十瓦的独立GPU,跑几十TOPS,能效比反而被MPU甩开。对电池供电的设备来说,能效比的意义远大于峰值算力。
其次是有效算力。TOPS是理论极限,实际要看你跑的模型结构、数据精度、内存带宽能不能喂饱NPU。我做过一个对比测试,同样标称2 TOPS的两款芯片,跑同一个YOLOv5s量化模型,帧率能差出40%。差距主要出在DDR带宽上——NPU要不断搬权重和中间结果,如果内存带宽不够,计算单元就是在空转。
这里有个经验公式可以参考:对大多数CNN推理任务,模型参数量(MB)乘以单帧计算量(FLOPs),除以DDR有效带宽,基本决定了理论帧率下限。选型时别光看TOPS,把DDR带宽也列进对比表里,能少踩不少坑。
2.2 比对几款典型芯片的AI加速单元
不同厂商的实现思路差异挺大,我整理了几款主流低功耗MPU的AI加速方案,方便大家选型时参考:
| 芯片平台 | 核心CPU | AI加速单元 | 标称算力 | 开发工具链 |
|---|---|---|---|---|
| 瑞萨RZ/V2L | 双核A55 + M33 | DRP-AI动态可重构处理器 | 1.1 TOPS(INT8) | DRP-AI Support Package、e2 studio |
| NXP i.MX 8M Plus | 四核A53 | 内置NPU | 2.3 TOPS | eIQ Toolkit、ONNX/TFLite转换器 |
| TI AM62A | 四核A53 | DLA深度学习加速器 | 2 TOPS | Edge AI Studio、TIDL |
DRP-AI和普通NPU不一样,它属于动态可重构处理器,可以把模型映射成硬件流水线,在低功耗下跑出不错的能效。NXP的NPU则是典型的DSA思路,配合eIQ工具链,对TensorFlow Lite模型的兼容性做得比较好。TI的DLA走的是“极简”路线,吃掉了TIDL的模型转换流程,和自家处理器绑定很深,上车容易下车上也容易。
我的建议是,选型时重点看三样东西:模型转换工具链是否支持你的主力框架(PyTorch/ONNX/TFLite)、有没有现成的参考模型和benchmark、NPU驱动对Linux主线的适配是否及时。这些决定了你的算法团队和嵌入式团队能不能顺畅配合。
2.3 小模型也要注意数据精度和内存布局
很多低功耗MPU的AI加速器只支持INT8,甚至有些严格的还要求对称量化。这就倒逼你在部署前做量化感知训练,或者至少做精度校准。实测下来,分类模型量化到INT8基本不掉点,但检测模型偶尔会掉1-2个mAP左右,这时候就得靠混合量化或者对敏感层做回退处理。
同时,内存布局很关键。NPU通常希望模型权重是连续且对齐的内存块,最好在系统启动时就固定在预留的连续物理内存里。Linux下通常会预留CMA区域给NPU用,这会影响整个系统的内存分配。我见过团队因为CMA配置太小,NPU驱动加载失败,推理任务直接崩溃,排查了一天才找到原因。
3. 实操过程:从环境搭建到模型部署的全流程
3.1 开发环境与工具链准备
带AI加速器的MPU开发,和传统嵌入式开发最大区别就是多了“AI工具链”这一层。以Linux系统为例,典型的环境包括三部分:交叉编译工具链、Yocto/Buildroot镜像、NPU推理运行时。
先说交叉编译。低功耗MPU基本是ARM架构,用arm-none-linux-gnueabihf或aarch64-linux-gnu交叉编译工具链都行。重点提醒一下,NPU驱动和运行时库最好直接用厂商SDK里自带的版本,别自己从主线编译,否则驱动接口不一致,后面推理会莫名失败。
然后是OS镜像。我一般推荐直接用厂商BSP(Board Support Package)构建的Linux镜像,比如Yocto的SDK、Buildroot的defconfig。原因是AI推理涉及DDR带宽、CMA内存、GPU/VPU共享相关内核配置,厂商的配置模板都是调过的。自己从头裁剪内核,很容易因为某个DMA配置不对导致NPU和相机争抢带宽,推理延迟直接翻倍。
最后是推理运行时。目前主流的低功耗MPU都支持ONNX Runtime或者TFLite的适配后端,通过厂商提供的外部算子实现NPU加速。举个实际例子,我在i.MX 8M Plus上用ONNX Runtime + eIQ执行YOLOv5s,只需要把模型导出为ONNX,再调用eIQ的转换脚本生成NPU可执行的格式,整个流程跑得还是很顺的。
3.2 配置OS与MPU软件包:以AUTOSAR场景为例
在车载和车规级项目里,这类低功耗MPU经常要跑AUTOSAR平台,OS配置就不是简单的Linux启动了,而是要基于AUTOSAR工具链来做复杂软件集成。这里就得提到Davinci Configurator这类工具。
Davinci Configurator是Vector家的AUTOSAR配置工具,在传统MCU的BSW配置上用得很多。这两年随着MPU上车,它也支持了MPU相关的OS配置和软件包集成。大概流程是:
- 新建AUTOSAR工程,导入MPU的芯片支持包(SIP包),里面会定义好内核、中断、内存映射这些基础信息。
- 配置多核OS。这类MPU往往是AOT(A Architecture)的,比如双核A55加M33,就要在工具里把不同核跑的任务分配清楚:A55上跑高负载的AI推理或感知融合,M33跑安全相关的控制逻辑。
- 配置调度表。AI推理任务通常有周期性,比如每33ms一帧,这个周期和AUTOSAR的OS调度表要匹配好。如果调度表优先级设得不对,安全任务会被推理任务阻塞。
- 集成NPU驱动。厂商一般会提供AUTOSAR组件形式的NPU驱动,通过Davinci把驱动模块的端口、数据接口、内存区域配置进去,生成RTE代码后再和用户程序一起编译。
这套流程对传统MCU工程师来说有一定学习成本,因为MPU侧的内存保护、缓存一致性、中断路由比MCU复杂得多。我有一次就是因为没有正确配置MPU的内存访问权限,NPU驱动在访问输入图像缓存时触发了总线错误,系统直接panic。
3.3 模型转换、量化与部署的关键步骤
模型部署流程是这类项目最容易卡壳的地方。我按自己习惯的流程整理一下:
- 训练和导出:在PC上用PyTorch或TensorFlow训练模型,导出为ONNX。注意保持输入尺寸固定,动态shape在NPU上支持很差。
- 转换前归一化:不要等转换工具帮你归一化,把图像的归一化(减均值除方差)放到模型里的第一层,这样NPU单次推理更快。
- 量化校准:用几百张代表性的图像做INT8量化校准,校准集的分布尽量贴近真实场景。校准集选不好,量化后精度波动非常明显。
- 转换成厂商的NN格式:这一步根据厂商工具链不同叫法不一样,NXP叫NPU的eIQ转换,瑞萨叫DRP-AI转换脚本,TI叫TIDL导入。基本上是读取ONNX,输出一个NPU专用的二进制模型和依赖文件。
- 交叉编译部署程序:在主程序里把输入图像从摄像头或文件读进来,做必要的颜色空间转换和缩放,放到NPU驱动指定的输入内存区,调用推理接口,再把输出解析出来。
看起来只有五步,但每一步都有不少细节。比如第一步里,如果模型里有Loop、Squeeze这类NPU不支持的算子,转换工具报的错非常难懂,我建议先能在PC上转成ONNX,再用onnxsim做一遍简化。再比如第四步,转换成功后通常会生成一个运行时配置,里面有个模型加载缓冲区和执行缓冲区的大小,这些要映射到CMAC或DDR物理地址上,别随手改。
4. 功耗优化策略与实测数据经验
4.1 从DVFS到低级时钟门控的功耗优化链路
低功耗MPU的功耗优化,不能只依赖NPU的硬件效率,软件侧也要做配合。首先要用好DVFS(Dynamic Voltage and Frequency Scaling),根据当前负载动态调整CPU和NPU频率。这块我踩过坑:系统默认的调频器是performance模式,NPU跑了个小模型也经常满频率运行,整机功耗比预期高了将近1W。后来改成ondemand或schedutil,配合NPU驱动里的时钟管理,功耗明显下来了。
接着是电源域管理。很多MPU会把NPU、VPU、ISP等模块放在独立的电源域里,不使用时可以完全断电。我建议主程序做一个“空闲检测”,比如连续10秒没有推理任务,就把NPU电源域关掉,同时让CPU进入WFI(Wait For Interrupt)或suspend状态。这一招在电池设备上很有效,待机功耗能差出两个数量级。
还有IO和外设功耗。低功耗MPU往往有多个UART、USB、Ethernet控制器,如果开发时没注意,Linux内核会把没用的外设也通电并保持时钟开启。排查方法是看/sys/kernel/debug/clk/clk_summary,把没用到的模块关掉或者通过设备树禁掉,每项都能省几十毫瓦。
4.2 实测数据:同一模型在不同功耗配置下的表现
我之前做过一组实验,硬件平台是一个内置1 TOPS NPU的四核A55 MPU,跑INT8的YOLOv5s,输入尺寸416x416。分别在三种配置下测整板功耗和推理延迟:
| 配置 | CPU频率 | NPU频率 | 整板功耗 | 单帧延迟 |
|---|---|---|---|---|
| 性能优先 | 1.8GHz固定 | 满频 | 5.8W | 28ms |
| 均衡模式 | 动态调频 | 自动降频 | 3.6W | 36ms |
| 低功耗模式 | 1.0GHz限制 | 低频运行 | 2.4W | 52ms |
这个实验说明,在低功耗MPU上,性能和功耗确实是可以做取舍的。关键要想清楚应用场景的硬性要求:如果只是一个周期性的状态上报,2.4W的低功耗模式完全够用;如果是实时工业检测,那就得用前两种模式并配合更大的散热设计。
4.3 异步推理是降低峰值功耗的利器
经常被忽视的优化手段是异步推理。很多AI推理框架的接口是同步阻塞的,比如你调用NPU推理,CPU就死等结果,期间CPU空闲,NPU满载。这个阶段的瞬时功耗其实很高,而且CPU没有做任何有价值的事。
改成异步后,你可以把视频帧采集、NPU推理、结果后处理三个环节做成流水线。NPU在推理第N+1帧的时候,CPU同时在解析第N帧的结果并且采集第N+2帧的输入。这样CPU的负载被填满,NPU不会空闲等待,整体的调度更均衡,峰值功耗也能被平均掉。实测下来,同样的处理任务,同步方案和异步方案的平均功耗能差10%-15%。
5. 常见问题与排查技巧实录
5.1 模型跑不动或推理延迟飙高
这是最多人问的问题。如果你发现NPU的标称算力很高,但模型跑起来帧率很低,先别急着骂芯片。第一步是看有没有用到NPU加速,程序日志里如果显示的是CPU fallback执行,那就是模型没转换成功,或者算子没跑在NPU上。第二步是查DDR带宽,可以跑一个内存带宽测试工具,比如mbw,看看现在系统和DMA的带宽占用。如果已经把DDR带宽占满了,NPU性能掉一半都不奇怪。
第三步是看模型的算子融合情况。有些工具链对卷积+BN+ReLU的结构能自动融合成一个算子,有些不能。转换前检查一下模型结构,尽量手动把BN层折叠进卷积,这样不仅NPU算得快,内存访问也少很多。
5.2 实测功耗比芯片手册高了太多
功耗超标通常有几个原因:供电电压设置太高、外设没关闭、电源管理配置错误。先检查PMIC的电压配置,有些MPU的VDD_GPU或VDD_NPU在出厂默认配置是最高电压等级,实际性能完全用不到那么高。再检查内核态有没有一直被唤醒的timer,/proc/interrupts里如果某个中断疯狂触发,CPU没办法进入低功耗状态。
还有一个容易被忽略的点是调试接口,比如JTAG和串口如果一直连着,芯片无法进入深度睡眠。量产板子这些调试接口要默认断电或者改成普通GPIO,能省不少功耗。
5.3 OS配置与NPU驱动的内存分配冲突
在Linux或AUTOSAR里,NPU驱动分配连续物理内存的位置很敏感。Linux下如果CMA区域太小,或者被相机模块占用过多,NPU推理时就会申请内存失败。我的建议是一切刚开始做的时候,就通过内核cmdline预留一块专用的物理内存,比如memmap=512M@0x50000000,让NPU驱动永远在这个区域工作,避免跟其他子系统竞争。
AUTOSAR场景下更要注意:OS的任务栈和内存保护单元(MPU)的配置边界,经常会把NPU驱动需要的共享内存排除在外。我用Davinci Configurator配置时就碰到过,数据都传不到NPU里。最后是把NPU相关内存区单独添加进OS的内存映射配置,还要额外配置MPU保护区,确保S模式和应用模式都能访问。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查思路 | 解决建议 |
|---|---|---|---|
| 模型转换报“Unsupported Operator” | 算子不在NPU支持列表 | 检查算子列表,找出不支持节点 | 算子替换或函数建模,切成等价运算 |
| 推理速度比CPU还快不了多少 | 模型没真正跑到NPU上 | 看日志确认有没有NPU加载 | 重新转换模型,检查驱动加载状态 |
| NPU推理结果全为0或随机的数 | 输入数据格式不对或内存地址错 | 检查输入图像尺寸、通道顺序 | 确认缩放到模型的输入要求,对齐到内存 |
| 系统挂起后无法唤醒 | 唤醒源没配置对 | 查中断唤醒能力,查电源域配置 | 在设备树中配置正确的唤醒GPIO或timer |
| 整板功耗异常高 | 外设或电压没优化 | 检查clk_summary和PMIC寄存器 | 关掉无用外设,调低电压等级 |
遇到问题的时候别一个个硬扛,厂商的SDK包通常都带参考例程,比如摄像头采集加NPU推理再加LCD显示的标准演示。如果你的程序跑不起来,先把参考例程跑通,再逐个模块替换成自己的代码,能省下很多排查时间。
写在最后的一点个人体会
做了几个带NPU的低功耗MPU项目之后,我的最大感受是:这一类芯片把AI落地的门槛拉低了很多,但并不是说拿到手就能轻松跑起来。硬件上的能效比再漂亮,软件工具链、OS配置、功耗管理这些环节总有地方会卡你一下。我自己的习惯是,新项目上马后,先花两三天跑通厂商的参考例程,把数据通路完整走一遍,再开始调自己的模型和应用。这个前期投入很值得,后面踩坑的概率会小很多。
另外,选型时多看看同系列芯片的roadmap也很重要。很多低功耗MPU同一个引脚兼容好几款芯片,低算力和高算力版本可替换。这意味着你的板子和软件栈设计成同一套,未来算力不够时可以直接换Pin-to-Pin兼容的型号,不用重新画板。这个设计思路在量产项目里非常有价值,产品生命周期被拉长了好几年。