课程导论与AI部署全景:为什么需要模型优化?
各位同学好,我是你们这门课的主讲。在嵌入式AI领域摸爬滚打了十几年,踩过的坑比走过的路还多。今天咱们开篇第一讲,不急着敲代码,先聊聊一个根本问题:为什么我们辛辛苦苦训练出来的模型,到了单片机上就跑不动了?
说白了,这就是AI部署的「最后一公里」问题。你在PC上用GPU训出来的ResNet-50,可能几百兆大小,推理一次几十毫秒。但放到STM32上,Flash只有2MB,RAM只有256KB,主频才200MHz。你想想看,这能跑得动吗?
核心矛盾:深度学习模型的「大、重、慢」与嵌入式设备的「小、轻、快」之间的鸿沟。
1.1 为什么需要模型优化?——从一次惨痛经历说起
我记得2018年,我接手一个工业视觉检测项目。客户要求在STM32F7上跑一个缺陷检测模型。当时团队花了两周训了一个YOLOv2-tiny,精度不错,mAP有85%。结果一部署,直接傻眼——模型大小32MB,Flash装不下;单帧推理时间12秒,客户要求是200毫秒。
这就是典型的「实验室精度陷阱」。模型在服务器上跑得再好,部署不到目标硬件上,一切都是零。从那以后,我养成了一个习惯:在选模型架构之前,先看目标芯片的算力预算。
模型优化要解决三个核心问题:
| 优化维度 | 典型问题 | 优化目标 |
|---|---|---|
| 模型大小 | Flash/RAM装不下 | 压缩至芯片存储上限以内 |
| 推理速度 | 无法满足实时性要求 | 达到应用所需的FPS或延迟 |
| 功耗 | 电池供电设备续航不足 | 降低MACs和内存访问次数 |
我曾经犯过的错:在STM32L4上部署一个8位量化的MobileNetV2,以为量化后肯定没问题。结果没注意激活值范围,导致精度从92%掉到67%。后来才发现,量化校准数据集的选择比量化方法本身更重要。这个坑,后面章节我会带你们一步步避开。
1.2 STM32Cube.AI的定位与价值
STM32Cube.AI是什么?简单说,它是意法半导体官方出的一套工具链,专门把训练好的神经网络模型「翻译」成能在STM32上高效运行的C代码。
它的核心价值在于三点:
- 一键式部署:从TensorFlow/PyTorch/Keras模型直接生成STM32工程,省去手写推理代码的麻烦。
- 硬件感知优化:自动利用STM32的硬件加速器(如M4的DSP指令、M7的FPU、NPU等),把算力压榨到极致。
- 内存管理自动化:自动规划激活缓冲区、权重存储位置,避免手动管理内存的噩梦。
我个人习惯把STM32Cube.AI看作一个「AI编译器」。它不像TensorFlow Lite Micro那样需要你手动配置算子,也不像ONNX Runtime那样依赖操作系统。它生成的代码是裸机可跑的,非常适合资源受限的MCU场景。
小提示:STM32Cube.AI目前支持STM32全系列,但不同系列的优化深度不同。比如STM32N6系列有内置NPU,Cube.AI可以自动将卷积层映射到NPU上执行,性能提升可达10倍以上。选型时一定要确认芯片的AI加速能力。
1.3 课程目标与学习路径
这门课的目标很明确:让你掌握从「任意训练框架」到「STM32高效部署」的完整技能树。不是只教你怎么点鼠标用Cube.AI,而是让你理解背后的优化原理,遇到问题能自己调优。
整个课程分为四个阶段:
- 基础篇(第1-5章):模型优化理论 + Cube.AI工具链入门。学完你能把一个小模型跑通在开发板上。
- 进阶篇(第6-15章):量化、剪枝、蒸馏、架构搜索等核心技术实战。每个技术我都会用真实项目案例讲解。
- 实战篇(第16-25章):三个完整项目:关键词唤醒、视觉缺陷检测、传感器融合。从数据准备到部署调优全流程。
- 高阶篇(第26-30章):多模型流水线、自定义算子、NPU编程、性能剖析与调优。
下面这张图展示了整个课程的知识体系:
1.4 学习这门课你需要什么基础?
说实话,这门课有一定门槛。我建议你具备以下基础:
- 嵌入式C语言基础:能看懂STM32的HAL库代码,知道GPIO、定时器、中断怎么用。
- Python与深度学习基础:会用Keras或PyTorch训练一个简单的分类模型。
- 一块STM32开发板:推荐NUCLEO-H743ZI2或NUCLEO-F767ZI,性价比高,资源够用。
如果你现在只会Python,嵌入式基础薄弱,也别慌。我在每章都会提供完整的工程代码,你跟着做一遍,慢慢就上手了。
我的建议:准备一个笔记本,把每章遇到的报错和解决方法记下来。AI部署的坑千奇百怪,记下来就是你的经验库。我自己到现在还保留着2016年第一个部署项目的调试笔记,翻出来看都觉得好笑。
1.5 课程配套资源说明
这门课的所有代码和模型都放在GitHub仓库里,每章对应一个文件夹。你拿到后直接导入CubeMX就能用。我会在每章开头说明本章需要哪些前置资源。