本帖最后由 不爱胡萝卜的仓鼠 于 2024-10-16 00:10 编辑
这几天在学习ST AI方向的知识,发现一个很有意思的网站。链接如下:https://stedgeai-dc.st.com/home。
在日常开发中,我们会需要训练模型,到开发板上实际跑一下,测算其性能,然后再修改模型或调整参数,再跑。比较繁琐并且需要有一个开发板和工程。如果我们什么都没有,只有模型就没办法了,于是这个网站就解决了这个问题,我们可以把模型放上去,并调参数优化,然后可以运行模型测算性能(这个不是软件模拟的,在云端ST是真有对应的实体开发板的,在开发板上运行你的模型),最终你还可以下载源码或者固件等。
接下来我就展示一下这个网站如何使用
一.登录
进入网站首先是一个欢迎页面,下方的图片,三个流程很好的说明了这个网站的功能。我们点击“START NOW”(之后会要求你登录ST账号)
二.选择模型
第一步要上传一个模型,可以选择上传自己的模型,也可以从ST的模型库(ST Model Zoo)中选择一个
我这边因为还没有模型,因此我从ST模型库中选择一个。模型删选条件有3个,分别是目标板卡类型、用途、神经网络
我这边就选择这个使用VL53L5CX这个多点TOF芯片的手势识别模型,点击“import”就选择使用这个模型了
点击“start”即可开始使用模型了
接下来网站会对这个模型进行分析,大概十来秒左右,还是别较快的
三.选择平台
在这里我们要选择CUBE AI的版本和芯片平台,CUBE AI我选择最新的9.0.0(同时我CUBE MX中安装的CUBE AI也是这个版本,虽然我写文章时已经是9.1.0了)。之后可以选择芯片平台了,由于我选了9.0.0,芯片平台就只能选STM32了,不过我们现在就是用STM32,别的平台不能选那也没啥关系了
四.量化模型
这个步骤是可选的,量化模型可以减少神经网络的体积减少内存
通过量化后,模型的体积明显变小了很多(当然精度也会丢失,这个就要后期不停的调参,对体积和性能做平衡了)
如果不使用量化功能,直接点击“Go next”即可下一步。如果量化模型了,并且想使用量化后的模型,要点击“Select”
五、优化模型
这里可以对模型进行优化,选择平衡、节约内存、提高推理速度三选一,非常的简洁明了。右边的输入输出buffer默认是选上的
点击“Optimize”就可以开始优化,同样的,这个速度也是很快的,几秒钟就好了
下面会这展示出优化后的各中性能参数,我选择平衡模式,可以看到flash和RAM都有一定的下降,虽然不多,但也是有用处的。
模型优化后即可开始跑分了,点击“Go to benchmark”
六、跑分
选择一款开发板即可开始跑分,这个过程不是软件模拟的,在云端是真的有一块实体开发板,云端服务器生成代码并编译下载到开发板上,实际在开发板上运行后才得到结果的。所以他花的时间是比较久的,大概要几分钟
刚好我运行时还遇到了排队的情况,一共有2个人,我是第二个。没想到这个平台还是满火热的嘛
可能是网站有点问题,我等了好久一直没动,那这个页面就暂时略过
七、结果
在结果页面会详细展示运算后的结果,历史的结果也会在这里
八、生成工程
这里可以生成C代码、CUBEMX工程、cubeIDE工程、ELF固件。我们下载下来后可以在我们自己手上的开发板上运行刚才云端运行的代码,进行复测
首先选择开发板,然后选择自己需要的就好(我这边选择cubeIDE工程),等待一会儿即可下载
九、本地开发板运行测试代码
下载后代码在一个压缩包内,需要解压缩
双击“.project”即可打开cubeide,编译Boot,下载、编译APP,下载。即可运行测试代码了
结果会从ST-Link的虚拟串口上输出,输出结果如下
[00:04:33.279]收←◆
#
# AI system performance 7.1
#
Compiled with GCC 12.3.1
STM32 device configuration...
Device : DevID:0x0485 (STM32H7[R,]Sxx) RevID:0x1003
Core Arch. : M7 - FPU used
HAL version : 0x01000000
SYSCLK clock : 600 MHz
HCLK clock : 300 MHz
FLASH conf. : ACR=0x00000036 - latency=6
CACHE conf. : $I/$D=(True,True)
[00:04:33.410]收←◆ Timestamp : SysTick + DWT (delay(1)=1.000 ms)
AI platform (API 1.1.0 - RUNTIME 9.0.0)
Discovering the network(s)...
Found network "network"
Creating the network "network"..
Initializing the network
Network informations...
model name : network
model signature : 0x1e108c42827f4c62598744246d259703
model datetime : Tue Oct 15 15:57:19 2024
compile datetime : Oct 16 2024 00:03:47
tools version : 9.0.0
complexity : 8520 MACC
c-nodes : 5
map_activations : 1
[0] @0x20000000/1024
map_weights : 6
[0] @0x70010680/576
[1] @0x70010660/32
[2] @0x7000E260/9216
[3] @0x7000E1E0/128
[4] @0x7000DDE0/1024
[5] @0x7000DDC0/32
n_inputs/n_outputs : 1/1
I[0] (1,8,8,2)128/float32 @0x20000200/512
O[0] (1,1,1,8)8/float32 @0x20000180/32
Running PerfTest on "network" with random inputs (16 iterations)...
................
Results for "network", 16 inferences @600MHz/300MHz (complexity: 8520 MACC)
duration : 0.143 ms (average)
CPU cycles : 86088 (average)
CPU Workload : 0% (duty cycle = 1s)
cycles/MACC : 10.10 (average for all layers)
used stack : 984 bytes
used heap : 0:0 0:0 (req:allocated,req:released) max=0 cur=0 (cfg=3)
observer res : 104 bytes used from the heap (5 c-nodes)
Inference time by c-node
kernel : 0.140ms (time passed in the c-kernel fcts)
user : 0.000ms (time passed in the user cb)
c_id type id time (ms)
---------------------------------------------------
0 OPTIMIZED_CONV2D 3 0.113 81.15 %
1 DENSE 6 0.020 14.35 %
2 NL 6 0.000 0.53 %
3 DENSE 7 0.002 2.00 %
4 NL 7 0.002 1.97 %
-------------------------------------------------
0.140 ms
可以看到这个模型以上述参数在这款开发板上运行一次只需要0.140ms,不愧是H7,主频高就是厉害,嘎嘎快