• 正文
  • 相关推荐
申请入驻 产业图谱

把模型塞进MCU / SoC的工程实践

11小时前
198
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

这个领域是过去三年嵌入式工程师的新增技能要求。以前你只要会写驱动,现在客户问"能不能在我这块板子上跑个 YOLO"。会回答这个问题、并真的把它做出来的人,议价能力翻倍。

一、嵌入式 AI 部署的难点全景图

1. 平台多样性

平台 算力 内存 典型场景
Cortex-M4/M7(无加速) 50-300 MOPS 64-512KB RAM 关键词唤醒 / 简单时序分析
Cortex-M55 + Helium 1-5 GOPS 256KB-2MB 简单 CV / 多通道传感器融合
Cortex-M85 + Ethos-U55 250 GOPS 1-2MB 实时小图像分类
Cortex-A53 + 软件 NN 5-20 GOPS 256MB+ 中等模型推理(不实时)
Cortex-A + NPU(i.MX 8M+ / RK3588 / RZ/V2L) 1-6 TOPS 1GB+ 实时检测 / 分割
Jetson 系列 20-275 TOPS 4-64GB 多模型并发 / 大模型

每种平台的工具链、量化方案、部署框架都不一样。

2. 模型 → 硬件适配

PyTorch / TF 训练的模型要经过:

PyTorch / TF
  ↓ export
ONNX
  ↓ convert
TFLite / ONNX Runtime / 厂商专用格式(NPU)
  ↓ optimize
Quantize(INT8 / INT4)
  ↓ compile
平台 binary
  ↓ deploy
板子

每一步都可能掉精度、掉性能、出 bug。

3. 量化是黑科技

INT8 量化精度可能掉 0.5%,也可能掉 30%——取决于模型结构 / 校准数据 / 量化策略。没有"按一个按钮就行"的方案

4. 实时性 vs 精度 trade-off

跑一帧 100ms 还是 30ms?精度差 5% 还是 1%?这些不是技术问题,是产品决策——但它决定了所有技术选择。

5. 工具链不友好

ST 的 X-Cube-AI、NXP 的 eIQ、瑞萨的 DRP-AI、瑞芯微的 RKNN——每家工具都自成一派,文档质量参差。

AI 在每一步都帮得上忙,但角色不同。下面分阶段讲。


二、阶段 1:选平台 + 选模型

让 AI 做平台 / 模型可行性评估

新需求来了,第一个问题是"这个能不能做"。

Prompt

需求:在边缘设备上做实时人体检测
- 输入:1080p @ 30fps 摄像头
- 输出:人体 bbox + 置信度
- 延迟要求:< 50ms / frame
- 功耗预算:板子总功耗 < 5W
- 场景:户外,室外光照强烈
- 量产成本:BOM 主控 < $30

我考虑这几个平台,请评估各自可行性:
1. STM32H747 + Himax HM01B0
2. i.MX 8M Plus(Cortex-A53 + 2.3 TOPS NPU)
3. RK3566(A55 + 0.8 TOPS NPU)
4. 瑞萨 RZ/V2L(A55 + DRP-AI 1 TOPS)

每个平台给:
- 是否可行
- 推荐模型(YOLOv5n / YOLOv8n / NanoDet / PicoDet 等)
- 预期延迟 / mAP / 功耗
- 主要风险

AI 输出大致:

STM32H747 + HM01B0:不可行。Cortex-M7 算力远不够 1080p 实时处理。即使降到 96x96 跑 PicoDet,延迟也 200ms+。

i.MX 8M Plus:可行。推荐 YOLOv5n(INT8 量化),1080p resize 到 640x640 后预期 35-45ms / frame,mAP@50 约 0.55。功耗 NPU 满载约 2.5W + SoC 1W = 3.5W,达标。风险:NXP eIQ 对 YOLOv5 的支持成熟度 OK 但要小心后处理(NMS)耗时。

RK3566:可行但紧。0.8 TOPS NPU 跑 YOLOv5n 预期 60-80ms。可降到 320x320 输入或换 NanoDet-Plus 才能达 50ms。

RZ/V2L:可行。DRP-AI 是瑞萨私有架构,要用瑞萨 translator 转模型。文档中文资料少,开发周期会长。

推荐:i.MX 8M Plus。生态最成熟、风险最低。

这种分析以前要找 vendor FAE 三家比较——光开会就好几天。AI 5 分钟给完

注意:AI 给的延迟数字要验证

AI 给的"预期 35-45ms"是基于训练数据的统计估计,实际跑出来可能差 30%-50%。一定要拿样品板真测一遍再下决定。

我有过一次教训:AI 说某 NPU 跑 YOLOv5n "约 25ms",结果实测 70ms——因为它的量化工具不支持某个 layer,那个 layer 自动 fallback 到 CPU。fallback 一发生延迟就爆。


三、阶段 2:模型训练 / 微调

这一步 AI 帮助有限——主要是让 AI 帮你做"嵌入式友好的模型设计 / 选型"。

Prompt

我要训一个语音关键词唤醒模型:
- 唤醒词:"你好小明"
- 部署到 STM32U585(Cortex-M33,128KB RAM,MVE 加速)
- 总模型 size < 30KB
- 推理延迟 < 50ms
- false accept rate < 1次/24小时

请给出:
1. 推荐的网络结构(DS-CNN / TC-ResNet / Conformer-tiny)
2. 输入 feature 推荐(MFCC vs MelSpec,多少帧、多少 mel bin)
3. 训练数据建议(多少正样本 / 负样本、噪声覆盖)
4. 量化前 / 量化后预期 size
5. 关键的训练 trick(focal loss / hard negative mining / data aug)

AI 在 KWS 这种成熟领域给的建议很专业——它读过 ARM 的 ML Zoo + Google 的 KWS 论文,知道哪些 trick work。

我用 AI 推荐的 DS-CNN-S(Depthwise Separable CNN small)+ MFCC 40 dim × 49 帧 + INT8 量化,模型 23KB,FAR 0.3 次 / 24h,FRR 4%。比自己摸索快了 2-3 周

数据增强代码生成

给我一个音频数据增强 pipeline:
- 输入:干净的关键词录音
- 增强:加高斯噪声、白噪声、背景音(餐厅 / 街道 / 办公室)、reverb、speed perturbation、pitch shift
- 每个原始样本生成 20 个增强样本
- 输出 wav 文件
- 用 librosa + numpy

AI 一次给完 200 行代码可用。


四、阶段 3:模型转换(PyTorch → ONNX → 平台格式)

这一步最容易踩坑。

Pre-conversion sanity check

Prompt

我有一个 PyTorch YOLOv5n 模型要导出 ONNX 部署到 NPU。
模型 forward 关键代码:
<贴 model.py 关键部分>

请检查:
1. 哪些 op / layer 可能在 ONNX export 时出问题
2. 哪些 op 可能不被典型 NPU 支持
3. 哪些动态 shape 操作要改静态
4. 推荐的 export 参数(opset / dynamic_axes / do_constant_folding)
5. export 后用 onnxruntime 验证的 sanity check 代码

AI 输出:

风险点:

Detect layer 的 grid 计算:YOLOv5 在 forward 里动态生成 grid,ONNX 导出时会变成一堆 op。NPU 通常不支持。建议:导出时用 model.model[-1].export = True 把后处理拆出去,CPU 上做。

SiLU 激活:早期 NPU 不支持 SiLU,会 fallback 到 CPU。确认:你的目标 NPU 支持吗?不支持的话考虑换 ReLU6 重新训练。

Focus 层(Slice + Concat):NPU 通常会 fallback。建议:换成 6x6 conv with stride=2(数学等效,NPU 友好)。

NMS:NPU 不做。后处理 CPU。

Export 参数:

torch.onnx.export(model, dummy, "yolov5n.onnx",
    opset_version=12,        # NPU 工具链兼容性最好
    do_constant_folding=True,
    dynamic_axes=None,        # 必须静态 shape
    input_names=["images"], output_names=["output"])

Sanity check:

[代码省略]

我以前 export 一次踩三个坑,每个坑修一天。有 AI 提前 review 一次省两周

Convert 后的精度对比

转换后要对比 PyTorch / ONNX / 平台格式的输出是否一致:

给我一个脚本:
- 输入:100 张验证图
- 跑 PyTorch 原模型 → 输出 A
- 跑 ONNX 模型(onnxruntime) → 输出 B
- 跑 RKNN 模型(rknn-toolkit2) → 输出 C
- 计算 A vs B 的 max diff、mean diff
- 计算 B vs C 的 max diff、mean diff
- 如果 diff 超过阈值,dump 对应图片 + 输出

AI 给的脚本拿来就能用。这种"流水线脚本"AI 写得贼快。


五、阶段 4:量化(最难的一步)

INT8 量化是嵌入式 AI 的核心 + 最大坑。

选量化策略

Prompt

我要把 YOLOv5n(PyTorch)量化到 INT8 部署在 RK3588。
训练数据:COCO + 我们自定义 5000 张工业图片。
要求:mAP@50 量化后下降 < 2%。

请:
1. 推荐量化策略(PTQ vs QAT)
2. PTQ 校准数据集应该选什么、多少张
3. 哪些 layer 应该保留 FP(quantization-friendly check)
4. 推荐的量化工具(rknn-toolkit2 / ONNX QAT / Brevitas)
5. 量化失败时 debug 流程

AI 输出会包含:

推荐:先试 PTQ(Post-Training Quantization),如果掉点 > 2% 再上 QAT(Quantization-Aware Training)。

校准数据:100-500 张,必须覆盖部署场景——COCO 和工业图片混着选,不要只用 COCO(domain mismatch)。

保留 FP 的 layer:通常 detection head 最后一层 + sigmoid 之前的 layer。RKNN 可以用 hybrid_quantization 指定。

Debug 流程

    跑全量 INT8 → 测 mAP,如果掉太多继续:找出 quantization error 最大的 layer(layer-wise 对比 FP vs INT8 输出)把这些 layer 设为 FP16 或 FP32重新评估还不行 → 上 QAT

按这个流程走,我做的工业检测项目 mAP 从量化前 0.78 → INT8 PTQ 0.71(掉 7% 太多)→ 找出 backbone 末尾 + neck 首层 hybrid 之后 0.76(掉 2% 可接受)。

Layer-wise quantization analysis

让 AI 写脚本:

# 比较每个 layer 的 FP32 vs INT8 输出,找误差大的 layer
for layer_name in layers:
    fp_out = run_fp32(model, input, layer_name)
    int_out = run_int8(model, input, layer_name)
    diff = np.abs(fp_out - int_out).mean()
    print(f"{layer_name}: diff={diff:.6f}, range={fp_out.min():.3f}~{fp_out.max():.3f}")

跑出来排序,diff 最大的 top 5 layer 就是"量化敏感层"——hybrid quantization 重点保护对象。


六、阶段 5:平台部署 + 性能优化

让 AI 写部署脚手架

平台:i.MX 8M Plus + NXP eIQ TIM-VX backend
要部署:YOLOv5n INT8 + 后处理(NMS 在 CPU)

需要:
1. C++ 推理框架代码(加载模型 / 输入预处理 / 调用 NPU / 后处理)
2. 输入:V4L2 抓的 YUV422 1920x1080
3. 输出:bbox 列表 + 类别 + 置信度
4. 性能 profiling:每帧耗时 breakdown(capture / preprocess / NPU infer / postprocess / draw)
5. 用 GStreamer 显示结果

约束:
- 单线程版本先做
- 用 OpenCV 4.5 做 preprocess + draw
- C++17

AI 给的 800 行代码大约 80% 直接能用。剩 20% 是平台特定的小问题:

    TIM-VX 的初始化顺序DMA buffer 的映射GStreamer pipeline 的 caps 协商

我手改了几个小时跑通。从零写至少一周。

性能 profiling + 优化建议

跑通后做 profiling:

当前性能(每帧):
- V4L2 capture: 33ms(1 frame 时间,正常)
- YUV → RGB resize 640: 18ms (CPU 单线程)
- NPU inference: 27ms
- NMS: 8ms
- Draw + display: 5ms

总延迟(capture 到显示):~90ms

请给优化建议,按 ROI 排序。
目标:< 50ms(不算 capture)

AI 输出:

YUV → RGB resize:18ms 太长。i.MX 8M Plus 有硬件 PXP(Pixel Pipeline)做 colorspace + scale,5ms 内能搞定。集成 PXP API 替换 OpenCV。预期省 13ms。

NPU + CPU pipeline:NPU 推理时 CPU 闲着、CPU 后处理时 NPU 闲着。改成双 buffer:

      • Frame N 的 NPU 推理 + Frame N-1 的 NMS 并行预期总延迟降 20%

NMS:用平台 SIMD(NEON)优化,预期从 8ms → 3ms。

Display:GStreamer 已经异步,没优化空间。

综合:预计能做到 35-40ms。

我按 1 + 2 实现,做到 42ms。3 没做(够用了)。优化时间从一周缩到 2 天


七、阶段 6:上线监控

部署到产线后还要监控模型表现。

让 AI 设计 monitoring

模型已部署到 100 台工业相机。
我想监控:
- 每台设备的推理延迟分布
- 每台设备的检测结果(数量 / 类别分布)
- 模型置信度分布的偏移(domain shift 早期信号)
- 异常情况:延迟突增 / 检测数突变 / 置信度集体下降

请设计:
1. 设备端要采集什么 metric
2. 上报频率 / 协议(要节省带宽)
3. 服务端怎么聚合、报警阈值怎么定
4. 怎么发现"模型该 retrain 了"的信号

AI 给的方案我大致照搬。最有用的是"模型 retrain 信号"那部分——

信号 1:相邻一周的置信度 P50 偏移 > 0.05 → domain shift

信号 2:某类别检测数从历史均值偏离 3σ → 真实分布变了 or 模型衰退

信号 3:某固定场景(同位置同时段)的检测稳定性下降 → 模型本身退化(可能是温度 / 老化导致 NPU 性能漂移)

这种"系统性 monitoring 思维"以前要靠老 MLOps 工程师,现在 AI 给的方案 80 分起步。


八、几个真实案例

案例 1:STM32 上跑 KWS(关键词唤醒)

平台:STM32U585,128KB RAM,160MHz。 模型:DS-CNN small,INT8 量化后 23KB。 框架:X-Cube-AI 7.3。

工作流:

    AI 帮选模型结构 + 推荐数据集 + 训练 trick → 1 天 spec out我自己训模型(4 天,主要是收集中文 wakeword 数据)AI 帮做 ONNX export + sanity check → 0.5 天AI 帮 X-Cube-AI 配置 + 生成 C 代码 → 0.5 天AI 帮写 ring buffer + MFCC 实时计算 + ISR 集成 → 1 天真机调试 + 调阈值 → 1 天

总耗时 8 天。同事不用 AI 做类似项目花了 3 周。

案例 2:i.MX 8M Plus 上跑 YOLOv8n(人脸检测)

平台:i.MX 8M Plus,2.3 TOPS NPU。 模型:YOLOv8n 量化 INT8。 框架:NXP eIQ + TIM-VX。

工作流:

    AI 帮做平台可行性评估 + 模型选型 → 0.5 天我们 ML team 训模型 → 2 周(不算我的时间)AI 帮做 Pytorch → ONNX → eIQ 转换 + 量化诊断 → 2 天(折腾 SiLU fallback)AI 帮写 C++ 部署框架 + GStreamer 集成 → 3 天AI 帮做性能优化(PXP + double buffer)→ 2 天量产前测试 + bug 修复 → 1 周

我自己的工时约 3 周。如果不用 AI 估计 6-8 周。

案例 3:把 LLM 塞进 RK3588(小尝试)

试着把 Qwen-1.8B-Chat 量化部署到 RK3588。

工作流:

    AI 评估可行性:4-bit 量化后约 1GB weight,prefill ~5 tok/s,decode ~10 tok/s。可行但很慢。用 RKLLM-Toolkit 转换(vendor 工具)AI 帮调推理 schedule(batch size / max_new_tokens)

最终跑通,但 decode 7 token/s,不实用。结论:当前 NPU 跑 1B 级 LLM 还不实用——但等 2026 年新一代 NPU(10+ TOPS)会改善。

这个案例的价值是:让我对"边缘 LLM"有 hands-on 认知。客户问"能不能在板子上跑 GPT"我能给出有数据支撑的答案。


九、几个经验

1. 不要先写代码,先做平台 PoC

新平台 / 新模型组合,先用 vendor demo + 你的模型跑通最小可用版本。看实测延迟、精度、功耗——这些数据决定项目可行性

代码漂亮但平台跑不动 = 0 价值。

2. 量化不是越激进越好

PTQ INT8 → INT4 → 二值化——精度衰减是非线性的。INT8 是大多数项目的甜点。INT4 只在特殊场景(边缘 LLM)才值得。

3. NPU 不是万能

NPU 强项:conv / matmul / 激活。

NPU 弱项:动态 shape / 复杂控制流 / 后处理(NMS)/ 前处理(resize)。

完整 pipeline 要 NPU + CPU + 硬件 ISP / PXP 配合。把所有东西塞进 NPU 不现实。

4. 训练框架版本影响巨大

PyTorch 1.13 export 的 ONNX 跟 2.1 export 的不一样。eIQ 5.x 跟 7.x 接受的 ONNX op set 不一样。部署成功的 toolchain 版本要锁死——任何升级都要回归测试。

5. AI 给的"经典模型推荐"经常过时

AI 推荐 YOLOv5——但现在 YOLOv8 / YOLO-NAS / RT-DETR 在某些场景更好。AI 的训练数据可能是 2023 年以前的——前沿模型选型要自己查 papers / leaderboard。

6. 客户要"AI 功能",但客户其实要"业务效果"

不要被"客户要 AI"绑架。很多场景传统 CV(OpenCV + 阈值)就够用——比 NN 更快、更稳、更省。

有个客户要"AI 检测螺栓松动"——分析后发现就是检查"螺栓位置和初始位置的偏移",模板匹配 5ms 搞定。客户开心,我也轻松。AI 不是必须的。


十、ROI 排序

高 ROI

平台 / 模型可行性评估

    1. (AI 5 分钟搞定,省一周开会)

PyTorch → ONNX export sanity check

    1. (避免 export 后才发现 NPU 不支持)

量化 layer-wise 分析脚本

    1. (找量化敏感 layer)

C++ 部署框架脚手架

    (V4L2 + NN + GStreamer)

中 ROI

训练数据增强代码monitoring 设计建议性能 profiling 优化建议

低 ROI

AI 帮你训模型

    1. (作用有限,主要还是 data + 算力)

AI 直接生成 NPU 驱动代码

    1. (vendor SDK 已经包了,再写无意义)

追前沿 LLM-on-edge

    (生态不成熟,2025 年大概率投入产出比低)

十一、什么场景不该上 NN

传统算法可解决

    •  → 用 OpenCV / 信号处理

训练数据 < 1000 张

    •  → 数据不够,效果不会好

场景每月变化

    •  → NN 跟不上,规则系统更稳

必须可解释(医疗 / 法律)

    •  → 黑盒不行,用决策树 / SVM

超低功耗(uA 级)

     → 任何 NN 都耗,先找非 NN 方案

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

研究生在读,熟悉硬件、STM32单片机、嵌入式Linux。已收获小米、联发科、浙江大华、上能电气、英威腾、汇川技术、格力、富士康等大厂offer。在这里分享求职经验、嵌入式学习规划、考研、嵌入式Linux技术文章等。