你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

实战经验 | 如何在STM32N6上验证AI模型

[复制链接]
攻城狮Melo 发布时间:2025-12-11 16:06

0 1

简介

STM32N6带有一颗600GOPS的NPU,不少客户工程师对如何在STM32N6上验证模型的准确率或者评估模型非常感兴趣。本文介绍ST官方提供的一种评估验证方法,对客户而言开发工作量较少,参考该方案的实现,可以非常方便地集成到自己的项目中。

0 2

环境准备

在开始介绍实验之前,需要准备好相应的开发环境,开发环境如下:

1.Python 3.9+

2.最新的STM32CubeProgrammer

3.推荐使用STM32CubeIDE>=1.15.1或IAR>=9.40.1,需要安装STM32N6补丁,建议使用V9.40。

4.STM32N6的补丁在官方软件包SDK内,和其他STM32补丁包安装类似,本文未介绍安装方法,客户可自行参考相应文档。

5.开发板:推荐使用官方STM32N6-DK板,STM32N6-Nucleo板也可以,但由于没有外部RAM,测试会受限。

6.ST Edge AI Core 工具

a. 安装完后,将stedgeai.exe的路径加入系统path环境变量。

b. 打开cmd shell,执行stedgeai--version,如果能看到下图信息则表示安装成功。

image.png

03

部署和测试模型 image.png

▲ 图1. 测试流程

测试流程如上图1所示:

  1. 根据模型文件,生成模型权重文件和模型代码文件。
  2. 使用python脚本,编译工程和下载。
  3. 使用数据集进行模型验证,并通过串口上传结果,python脚本分析生成报告。

3.1. 生成模型权重和代码

模型文件需要自己准备,也可以点击这里下载一个模型文件进行测试。

本文使用的模型文件来自:

https://github.com/STMicroelectronics/stm32aimodelzoo/blob/main/image_classification/mobilenetv2/ST_pretrainedmodel_public_dat aset/flowers/mobilenet_v2_0.35_224_fft/mobilenet_v2_0.35_224_fft_int8.tflite

使用Windows命令行工具,进入模型所在目录,并调用:

stedgeai generate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --st-neural-art

运行成功后,在模型所在目录中会生成模型相关的内容,包括模型文件,权重文件,模型报告等。 image.png

▲ 图2. 模型文件夹中的生成内容

报告文件包含的信息比较丰富,主要包括以下几个部分:

image.png

▲ 图3. 报告总结

如上图3,报告总结中主要包含了输入输出的类型格式,flash和ram的占用信息。

image.png

▲ 图4. 内存占用情况

如上图4,主要列出了编译使用的选项,内存占用情况,本例中,主要使用了cpuRAM2,npuRAM5和外部flash。需要注意的是,npuRAM比cpuRAM对NPU而言访问速度更快。

内存的分配主要取决于一个文件,stm32n6.mpool,从上图可以看到它位于默认的安装目录,用户可以根据自己的需求和内存的实际情况对文件进行更改。

stedgeai generate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --stneural-art

这条指令会用到两个默认的配置文件:

1.$STEDGEAI_CORE_DIR/Utilities/windows/targets/stm32/resources/neural_art.json.

2.$STEDGEAI_CORE_DIR/Utilities/windows/targets/stm32/resources/mpools/stm32n6.mpool.

Note:$STEDGEAI_CORE_DIR表示默认的STEdgeAI安装目录,本文中后续还会使用该定义,均表示相同的目录,将不再提示。neural_art.json里面是一些编译选项,stm32n6.mpool里面是内存分配情况,分别表示编译器如何处理模型文件以及如何分配内存,后续还会详细介绍。

image.png

▲ 图5. Epoch情况part1

image.png

▲ 图6. Epoch情况Part2

图5、图6所示为Epoch情况,这里Epoch的概念是STM32N6编译器使用的概念,不是神经网络训练的epoch,每个epoch可以理解为NPU执行的一个最小的片段,神经网络会被切割为多个epoch,根据不同的神经网络,某些epoch可以被NPU执行,被称为HW epoch,某些无法被NPU执行,只能由Cortex-m55内核执行,这部分epoch被称为SW epoch。从上图可以看到只有2个epoch由软件实现,其余都由硬件实现,所以该模型的性能在STM32N6上是比较好的,如果有大量的epoch是软件epoch,则可能存在某些算子或结构无法被STM32N6的NPU实现,需要参考官方文档对算子进行修改。

3.2. 编译和下载

在调用脚本进行编译和下载之前需要确保以下内容是正确的:

1.$STEDGEAI_CORE_DIR/scripts/N6_scripts/config.json被正确配置:

image.png

▲ 图7. 配置文件

修改该脚本,确保上面用到的工具都能找到正确的路径。

  1. arm-none-eabi-objcopy.exe的路径加入系统path环境变量。

a. 如下图8,运行命令,检测是否OK。

image.png

▲ 图8.检测objcopy工具

  1. 确保STM32N6-DK处于dev开发者模式下,可以正常下载和调试代码。

执行下面脚本(需要替换为STEdgeAI的安装目录):

python C:\ST\STEdgeAI\2.0\scripts\N6_scripts\n6_loader.py

脚本执行过程可能会遇到问题,例如下图9中所示权限不够情况:

image.png

▲ 图9. 执行失败

解决方法:

1.使用管理员权限重新打开 cmd shell后,重新执行。

2.将STEdgeAI安装到用户目录后,重新执行。

image.png

▲ 图10. 找不到文件

上图10“找不到文件”问题的解决方法:

  1. 重新检查config.json,确保arm-none-eabi-objcopy.exe能被正常找到。

image.png

▲ 图11. Loading memories failed

由于IAR版本不兼容导致的,9.60.3版本中没有了armbat.dll。

解决办法:

1.在STEdgeAI \ 2.0 \ Projects \ STM32N6570-DK \ Applications \ NPU_Validation \ EWARM \ settings目录下打开Project.N6-DK.general.xcl文件。

2.将armbat.dll替换为armLibsupportUniversal.dll,并保存。

3.重新执行。

image.png

▲ 图12. 执行成功界面

Note:执行成功后,开发板不要断电,由于代码是运行在RAM中,断电会导致代码丢失,需要重新执行上面的步骤。

3.3. 评估基本性能

运行下面的脚本完成简单评估(路径自行替换):

set PYTHONPATH=C:\Users\ST\STEdgeAI\2.0\scripts\ai_runner python C:\Users\ST\STEdgeAI\2.0\scripts\ai_runner\examples\checker.py -d serial:921600 --perf-only -b 10

image.png

▲ 图13. 网络基本信息

上图是网络运行的基本信息,包括输入输出的格式,运行AI的环境,上图13中显示了ST Neural ART(即STM32N6的NPU),MCU的频率,NPU的频率,Cache打开的情况等。

image.png

▲ 图14. 神经网络运行情况

上图14显示了神经网络的运行情况,运行了10次,运行次数由参数-b决定,推理时间平均为8.453ms。CPU Cycles这一簇有三列,第一列代表NPU的预配置花费的cycles,第二列代表NPU推理用的cycles,第三列代表NPU后处理用的cycles。其中第一和第三列是MCU参与的过程,所以可以理解为NPU在推理过程中占用了71.1%的负载。

3.4. 评估准确率

运行以下脚本,使用伪随机数据进行模型验证:

stedgeai validate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --mode target -d serial:921600

Note:这里默认使用的是伪随机数据。

image.png

▲ 图15. 使用伪随机数据进行验证,生成报告

运行以下脚本,使用真实数据进行模型验证:

stedgeai validate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --mode target -d serial:921600 -vi input_20_images.npy

Note:-vi表示真实的数据集,input_20_images.npy的shape为(20, 224, 224, 3),代表20张224x224x3的图片。

image.png

▲ 图16. 真实数据的验证报告

0 4

其他

4.1. 优化

在3.1节中,提到了两个默认的配置文件:neural_art.json和stm32n6.mpool,我们将其拷贝到当前的工作目录,并打开neural_art.json进行编辑,添加下面一项内容:

"allmems--O3-ec":{   "memory_pool":./stm32n6.mpool",   "options":"--native-float--mvei--cache-maintenance--Ocache-opt --enablevirtual-mem-pools --Os --optimization 3 --enable-epoch-controller" }

image.png

▲ 图17. neural_art.json

然后使用下面指令重新生成文件:

stedgeai generate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --st-neural-art [email]allmems--O3-ec@neural_art.json[/email]

完成以后参考3.2,3.3小节的内容重新编译下载,并评估性能,该配置将提升性能。如下图18所示:

image.png

▲ 图18. 性能提升

在3.3小节中,单次推理平均时间为8.453ms,这里提升到了6.277ms,CPU cycles栏可以看到NPU的处理负载达到了99.8%,说明神经网络的推理几乎不需要MCU参与了。其主要优化选项为--enable-epoch-controller,意思是使能专门的硬件自动处理每个epoch之间NPU的预配置和后处理的工作,从图中可以看到epoch的数量明显减少了,这也是该选项的主要作用。目前ST官方发布的AI参考软件包,一般都使能了这个优化选项,如果没有使能,请使能后重新检查推理时间。

4.2. IO格式

在4.1节中,可以看到模型的输出为float32类型的数据,如下图19所示。

image.png

▲ 图19. 输出格式为float32

在应用层,有时候可能需要使用int8,ST的编译器支持直接输出int8,而不需要重新修改模型文件,只需要添加--output-data-type int8选项即可,如下:

stedgeai generate -m mobilenet_v2_0.35_224_fft_int8.tflite --target stm32n6 --st-neural-art [email]allmems--O3-ec@neural_art.json[/email] --outputdata-type int8

image.png

▲ 图20. IO格式改变后

改变后从上图20可以看到,输出格式变为了int8,并且最后一个用于int8到float32转换的epoch被移除了。

另外,如果是Pytorch输出的ONNX格式的模型,通常是channel first格式,但嵌入式图像处理的Pipeline通常是channel last格式,我们只需要使用--inputs-ch-position chlast参数,ST的编译器会自动添加格式转化的layer到神经网络中,而不需要重新编译和生成channel last格式的模型。

0 5

总结

本文介绍了ST的AI编译器的基本使用,神经网络在STM32N6上的性能评估方法,以及相关的优化方法,ST的官方包通常会将这些选项和配置做默认选项,但用户也需要了解这些基本配置过程,以方便在实际使用过程中进行修改和调优。

收藏 评论0 发布时间:2025-12-11 16:06

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版