4、STM32CubeAI 模型分析器:看懂算力与内存报告
模型训练完了,量化也做了,烧到板子上跑一跑——结果发现帧率上不去,内存还爆了。这种场景,我遇到过太多次了。
其实很多时候,问题出在「没看报告」。STM32CubeAI 生成的模型分析报告,就像体检单。你不看,就不知道哪里虚。今天我就带你把这报告彻底看懂。
4.1 报告里到底写了什么?
你运行完 stm32ai 命令行或者 CubeMX 的 AI 工具链后,会生成一个 report.html。打开它,你会看到几个核心板块。
我个人习惯,先看三个数字:RAM 占用、Flash 占用、单次推理周期数。这三个数字决定了你的模型能不能跑、跑多快。
| 指标 | 含义 | 我的关注点 |
|---|---|---|
| RAM (Activations) | 推理时中间特征图占用的内存 | 不能超过芯片 SRAM 的 80% |
| Flash (Weights) | 模型权重和代码占用的存储 | 不能超过芯片 Flash 的 90% |
| Cycles | 完成一次推理所需的 CPU 时钟周期 | 除以主频就是推理时间 |
4.2 算力分析:瓶颈到底在哪?
报告里会列出每一层的算力消耗。你想想看,一个模型几十层,不可能每层都慢。真正拖后腿的,往往就那么两三层。
我一般直接看 Top 5 耗时层。如果卷积层占了 80% 以上的时间,那优化方向就很明确了。
// 报告中的典型输出(伪代码)
Layer 1: Conv2D (3x3, 32ch) -> 1.2M cycles (12%)
Layer 5: Conv2D (3x3, 64ch) -> 3.8M cycles (38%) ← 瓶颈!
Layer 8: Conv2D (3x3, 128ch) -> 2.1M cycles (21%)
Layer 10: Dense (256) -> 1.5M cycles (15%)
其他层合计 -> 1.4M cycles (14%)
看到第 5 层占了 38% 的算力,你该怎么做?
- 减通道数:64 通道降到 48 或 32,算力直接砍半
- 换小卷积核:3x3 换成 1x1,虽然精度可能掉一点,但速度翻倍
- 用深度可分离卷积:MobileNet 那种结构,算力能降到原来的 1/8 到 1/9
4.3 内存分析:别让中间结果撑爆了
内存报告里有个关键概念叫 Activations Buffer。说白了,就是神经网络每一层算完后,中间结果要找个地方存着。这个缓冲区是复用的,但峰值大小决定了你的 RAM 需求。
举个例子。一个输入是 32x32x3 的图像,经过第一层卷积后变成 32x32x16,中间结果就是 32x32x16 = 16384 个 float32 数,也就是 64KB。如果后面再接一个更大的层,峰值可能冲到 128KB 甚至更高。
我建议你重点关注两个地方:
- 第一层卷积之后:输入图像往往很大,第一层输出通道数如果设得高,内存直接起飞
- 全连接层之前:特征图展平时,如果前面是 8x8x256,展平就是 16384 个神经元,内存占用巨大
| 层类型 | 典型内存占用 | 优化手段 |
|---|---|---|
| Conv2D (输入大) | 高 | 缩小输入尺寸、减少输出通道 |
| Dense (全连接) | 极高 | 换成 Global Average Pooling |
| Depthwise Conv | 低 | 优先选用 |
4.4 实战:如何根据报告做决策?
拿到报告后,我一般按这个顺序做决策:
- 第一步:看总 Cycles。如果超过预期,去 Top 5 耗时层找原因
- 第二步:看 RAM 峰值。如果超过芯片 SRAM 的 80%,找最胖的那一层
- 第三步:看 Flash 占用。如果超了,考虑量化到 int8 或者剪枝
- 第四步:看每层的类型。如果全是标准卷积,考虑换成深度可分离卷积
嗯,这里要注意。报告里给出的 Cycles 是理论值,实际跑起来因为缓存命中率、DMA 传输等因素,可能会有 10%-20% 的偏差。但作为选型和优化的依据,完全够用了。
4.5 总结一下
模型分析器不是摆设。它告诉你哪里该动刀,哪里可以留着。说白了,就是让你少走弯路。
下次你跑完模型,别急着烧录。先打开报告,花 5 分钟看看算力和内存。你会发现,很多问题在烧录前就能解决。
下一章,我会讲怎么用 CubeAI 的「自动调优」功能,让工具帮你找到最优的推理配置。到时候见。