其他分享
首页 > 其他分享> > 【嵌入式AI开发&Maxim问题篇】美信Maxim78000Evaluation Kit AI实战开发问题BUG 汇总

【嵌入式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有三个主要变化(如下):

  1. 额外的“融合”操作,用于模型中的池化和激活层;

  2. 与硬件匹配的舍入和裁剪;

  3. 支持量化操作(使用-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