【嵌入式AI开发&Maxim问题篇】美信Maxim78000Evaluation Kit AI实战开发问题BUG 汇总
作者:互联网
上篇:【嵌入式AI开发&Maxim篇四】美信Maxim78000Evaluation Kit AI实战开发二介绍了使用 Maxim78000Evaluation Kit进行开发实战的全过程。
本篇基于开发实战中遇到的问题以及重难点进行一下小总结,具体一些解决方法上面也有介绍。主要包括五方面:
1. 环境方面
推荐环境配置:
然而,美信的模型量化工具好像并不支持cuda11,当训练到达量化的start_epoch时,训练精度急速下降。因此使用GPUA加速时,推荐使用cuda10 。
2. 训练问题
2.1 模型问题
虽然美信也是基于pytorch进行模型开发部署,但使用的CNN模板库都已经重写过了,添加了支持量化和max78000部署的设计。因此,开发自己的AI模型首先需要根据美信自定义的 PyTorch 类重写AI模型。任何设计为在 MAX78000 上运行的模型都应该使用这些类。ai8x.py与
默认类torch.nn.Module有三个主要变化(如下):
-
额外的“融合”操作,用于模型中的池化和激活层;
-
与硬件匹配的舍入和裁剪;
-
支持量化操作(使用
-8
命令行参数时)。
因为这些特别设计,使得模型似乎在全连接层之前不支持全局池化,且最后一层卷积的特征图不能过小。会造成无法收敛问题。
2.2 优化器问题
由于感知量化训练的存在,是的模型的训练更加困难,因此,对于越复杂的任务,推荐使用Adam优化器,并以较小的学习率训练。(SGD调参不好无法收敛)
2.3 训练问题
除此之外,模型在多GPU训练时会出bug,造成评估时测试精度低的问题,具体解决参考【嵌入式AI开发&美信问题篇一】Maxim78000 AI实战开发-训练与测试评估精度差距大,推荐第一种。
3. 量化问题
量化有两种主要方法——量化感知训练(推荐,默认启用)和训练后量化。
量化感知训练是性能更好的方法。它默认启用。QAT 在训练期间学习有助于量化的其他参数。需要quantize.py.的输入 checkpoint,要么是qat_best.pth.tar,最好的 QAT 时期的 checkpoint,要么是qat_checkpoint.pth.tar,最终的 QAT 时期的 checkpoint。
目前只有ai8x.py库搭建的模型支持量化,且只有经过量化才能正确评估和部署。nn.module库不支持是因为工具有bug,可自行修复或使用外部工具量化
https://github.com/pytorch/glow/blob/master/docs/Quantization.md、
https://github.com/ARM-software/ML-examples/tree/master/cmsisnn-cifar10、
https://github.com/ARM-software/ML-KWS-for-MCU/blob/master/Deployment/Quant_guide.md或
Distiller 的方法(美信其实就是调distiller的包)
4. 转换问题
将模型转换成c代码,最关键以及最容易出错的一步其实是网络的内存与处理器配置.yaml文件。
可参考教程:
https://github.com/MaximIntegratedAI/MaximAI_Documentation/blob/master/Guides/YAML%20Quickstart.md
我在上篇也介绍得比较详细:【嵌入式AI开发&Maxim篇四】美信Maxim78000Evaluation Kit AI实战开发二
# Model:
# def forward(self, x):
# x = self.conv1(x)
# x_res = self.conv2(x)
# x = self.conv3(x_res)
# x = self.add1(x, x_res)
# x = self.conv4(x)
# ...
# Layer 0: self.conv1 = ai8x.FusedConv2dReLU(num_channels, 16, 3, stride=1, padding=1, bias=bias, **kwargs)
- out_offset: 0x2000
processors: 0x7000000000000000
operation: conv2d
kernel_size: 3x3
pad: 1
activate: ReLU
data_format: HWC
# Layer 1: self.conv2 = ai8x.FusedConv2dReLU(16, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
- out_offset: 0x0000
processors: 0x0ffff00000000000
operation: conv2d
kernel_size: 3x3
pad: 1
activate: ReLU
# Layer 2 - re-form layer 1 data with gap
- out_offset: 0x2000
processors: 0x00000000000fffff
output_processors: 0x00000000000fffff
operation: passthrough
write_gap: 1 # output is interleaved with 1 word gaps, i.e. 0x2000, 0x2008, ...
# Layer 3: self.conv3 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
- in_offset: 0x0000 # output of conv2, layer 1
out_offset: 0x2004 # start output from 0x2004
processors: 0x00000000000fffff
operation: conv2d
kernel_size: 3x3
pad: 1
activate: ReLU
write_gap: 1 # output is interleaved with 1 word gap, i.e. 0x2004, 0x200C, ...
# Layer 4: self.add1 = ai8x.Add()
# self.conv4 = ai8x.FusedConv2dReLU(20, 20, 3, stride=1, padding=1, bias=bias, **kwargs)
- in_sequences: [2, 3] # get input from layer 2 and 3
in_offset: 0x2000 # Layer 2 and 3 outputs are interleaved starting from 0x2000
out_offset: 0x0000
processors: 0x00000000000fffff
eltwise: add # element-wise add from output of layer 2 and 3 executed in the same layer as conv4
operation: conv2d
kernel_size: 3x3
pad: 1
activate: ReLU
5. 部署问题
部署主要用到两个工具GDB 与 OpenOCD,GDB是一个服务器,OpenOCD是代码烧录和调试工具,使用GDB指导OpenOCD进行部署。
注意的是,linux下生成的makefile文件只能在linux下make,因此若想在windows上make,然后部署,需要拿其他示例的makefile文件过了替代即可。因为处理CNN相关的几个文件,其他都是一样的。
6. 更多精彩内容
嵌入式AI开发系列教程推荐:
【嵌入式AI部署&基础网络篇】轻量化神经网络精述--MobileNet V1-3、ShuffleNet V1-2、NasNet
【嵌入式AI开发】篇六|实战篇二:深度学习模型的压缩、量化和优化方法
stm32篇:
【嵌入式AI开发】篇五|实战篇一:STM32cubeIDE上部署神经网络之pytorch搭建指纹识别模型.onnx
【嵌入式AI开发】篇四|部署篇:STM32cubeIDE上部署神经网络之模型部署
平头哥篇:
【嵌入式AI开发&平头哥篇二】玄铁开发板AI部署流程初探(使用yoctools实现cifar10的迁移部署)
美信篇:
【嵌入式AI开发&美信问题篇一】Maxim78000 AI实战开发-训练与测试评估精度差距大
【嵌入式AI开发&Maxim篇二】美信Maxim78000Evaluation Kit AI开发环境
【嵌入式AI开发&Maxim篇四】美信Maxim78000Evaluation Kit AI实战开发二
标签:AI,美信,self,Maxim,嵌入式,开发,量化 来源: https://blog.csdn.net/qq_39383591/article/details/121662519