LNN工具链详解:在CSK6上运行你自己的AI算法

时间:2020-12-22 01:22:27

工具链简介

LNN(ListenAI Neural Network) 是聆思科技专为聆思 AIOT 芯片(目前支持 CSK6 系芯片)定制开发的AI生态工具链,它包含linger和thinker两个部分,其中linger是量化训练组件,thinker是轻量级推理引擎组件,两个套件相互配合实现了训练推理一体化。 LNN工具链已支撑聆思芯片在计算机视觉、语音唤醒、语音识别、离线翻译 等10多个 AI 应用场景中的产品落地。


工具链安装

linger/thinker都支持以下三种安装方式

  • 源码安装 (推荐)
  • pip包安装
  • docker镜像安装

注意:linger和thinker的环境配置有区别,不能使用同一个环境,需要分别安装配置 {.is-warning}

linger环境配置及安装

1.创建虚拟环境

conda create -n linger-env python==3.7.0 
conda activate linger-env

2.源码安装 (推荐)

git clone https://github.com/LISTENAI/linger.git 
cd linger && sh install.sh

3.根据requirements.txt文件安装所有依赖项

pip install -U pip 
cat requirements.txt | xargs -n 1 pip install

4.安装验证 启动python,输入 import linger 没有报错即为通过验证

LNN工具链详解:在CSK6上运行你自己的AI算法


thinker环境配置及安装

1.创建虚拟环境

conda create -n thinker-env python==3.8.5 
conda activate thinker-env

2.源码安装 (推荐)

git clone https://github.com/LISTENAI/thinker.git

3.编译 gcc版本为5.4.0及以上,修改script/x86_linux.sh和test/auto_test.sh脚本中的CMAKE的路径, 版本建议为3.0及以上。执行脚本

cd thinker 
sh ./scripts/x86_linux.sh

4.根据requirements.txt文件安装所有依赖项

pip install -U pip 
cat requirements.txt | xargs -n 1 pip install

5.安装验证 启动python,输入 import thinker 没有报错即为通过验证

LNN工具链详解:在CSK6上运行你自己的AI算法


工程简介

数据集介绍

PyTorch CIFAR100数据集是一个公共数据集,由10个超类别和100个子类别组成,每个子类别包含600个图像。它是CIFAR-10数据集的扩展版本,具有更多的类别和更大的规模。

  • 数据集大小:PyTorch CIFAR100数据集包含50,000个训练图像和10,000个测试图像。每个图像大小为32x32像素,并以RGB颜色模式表示。
  • 图片类型:每个图像属于100个子类别中的一个,每个子类别包含600个图像。子类别可以分为10个超类别。这些子类别包括不同类型的动物、植物、交通工具、家具和电子设备等。
  • 任务类型:任务是分类(100分类)。该任务是将每个图像分配到其正确的子类别中,其中每个子类别都属于一个超类别。因此,该任务涉及对具有较大类别数量的多类别分类问题的处理。

数据集下载地址: https://github.com/weiaicunzai/pytorch-cifar100.git

流程简介

下图为深度学习算法在芯片上落地的整个流程,LNN工具链贯穿整个流程,linger作为pytorch的一个量化训练组件,thinker包括离线分析打包模块和引擎执行器两个部分。为了确保计算图与芯片能够完美契合,避免在模型后期因为芯片硬件不支持而返工,LNN工具链会有一个模型规约性检查的步骤,如下图灰色剪头所示。

LNN工具链详解:在CSK6上运行你自己的AI算法


合规性进行检查

单个算子限制

1.conv/deconv/pool相关算子共有限制

kernel_size = {1,2,3,4,5},支持kernel_h ≠ kernel_w 
stride_size = {1,2,4},支持stride_h ≠ stride_w 
pad_size = {0,1,2,3},支持四个方向pad独立设置 
in_w >= weight_w,同时in_h >= weight_h 
weight_w >= stride_w,同时weight_h >= stride_h 
pad_h_up >= weight_h,同时pad_h_down >= weight_h 
pad_w_right >= weight_w, 同时pad_w_left >= weight_w

2.deconv的限制

- stride_h(stride_w) = 2时,kernel_h(kernel_w) = {2,3,4,5} 
- stirde_h(stride_w) = 4时,kernel_h(kernel_w) = {4,5}

3.linearInt/BmmInt的限制 左边输入矩阵(M*N)对齐后大小不超过64KB 不同数据类型下对齐方式:

	数据类型为8bit时,M按4字节对齐,N按8字节对齐; 
	数据类型为16bit时,M按4字节对齐,N按2字节对齐; 
	数据类型为32bit时,M按2字节对齐,N按2字节对齐;

4.transpose的限制

输入只支持2维/3维,且3维输入数据大小有限制。假设输入维度为NCHW,数据位宽为data_bytes,限制条件如下: 更多信息查看:tutorial at main · LISTENAI/thinker · GitHub

LNN工具链详解:在CSK6上运行你自己的AI算法

5.目前支持量化的op如下,更多限制请查看linger手册 linger/linger/docs/tutorial

LNN工具链详解:在CSK6上运行你自己的AI算法


ONNX不支持的算子的示例
  • 动态形状(Dynamic Shape):ONNX不支持动态形状的模型,即输入和输出的形状不能动态改变。
  • 数据输入输出(IO):ONNX不支持数据输入输出操作,如文件读写和网络通信。
  • 动态图(Dynamic Graph):ONNX不支持动态图的模型,即不能动态改变计算图。
  • 部分算法的操作符:ONNX不支持某些算法的特定操作符,如TensorFlow的”tf.data"操作符等。
  • 自定义算子:ONNX不支持自定义算子,只支持ONNX标准规范中的算子。

注意:不同版本的ONNX可能会支持不同的算子,因此在使用时需要查看相应版本的文档。 {.is-warning}

模型大小限制
  • 运行内存share-mem不超过640KB
  • 单个模型大小整体不超过8M:PSRAM整体可用空间为8MB,内置FLASH可用空 间为8MB。


工程示例

1、浮点训练(约束训练)

我们基于pytorch-cifar100来进行功能展示 首先确保在当前环境下,浮点模型训练基于pytorch能够跑起来。

python train.py -net resnet50 -gpu

建议采用两阶段量化训练,对浮点训练的数据进行范围约束,只需添加少量代码. 为避免冲突,将tensorboard功能关闭。同样的指令开启训练,运行几个epoch后,在checkpoint/resnet50文件夹中生成了一个**.pth文件

2、量化训练
  • 加载步1中保存的浮点模型**.pth,修改约束代码,即可将浮点算子替换为量化算子。
  • 同样的指令开启量化训练,训练几个epoch后,同样在checkpoint/resnet50文件夹中
  • 生成了一个**.pth文件。
  • 使用linger的模型转换工具,将模型转换成onnx计算图。
3、导图打包

使用thinker离线工具tpacker对步2生成的onnx计算图打包 tpacker -g xx.onnx -d True -o model.bin 模型分析打包指令:

tpacker -g xx.onnx [-p venus] [-d True] [-m memory] [-o model.bin] 
-g :输入ONNX模型的路径,必须配置,目前仅支持从linger导出的计算图 
-p : 目标平台,目前只支持venus,选填项,默认为venus 
-d : 中间计算图导出开关,选填项,默认为False 
-m : 模型参数在venus上存放的位置,选填项,默认为psram,可选项有flash、psram 
-o : 输出的二进制模型资源路径,选填项,默认为./model.pkg

打包工具会对计算图进行图优化、模拟引擎执行以规划内存占用并将分析结果序列化到资源文件中


4、推理执行

使用调用示例工程test_thinker,指定输入数据、资源文件和输出文件名称即可运行模拟代码。

chmod +x ./bin/test_thinker ./bin/test_thinker input.bin model.bin output.bin 3 32 32
  • input.bin:输入的模型二进制数据
  • model.bin:打包生成优化后的模型二进制数据
  • output.bin:thinker引擎最终生成的二进制结果数据
  • 3 32 32 :c(通道),h(高度),w(宽度)

LNN工具链详解:在CSK6上运行你自己的AI算法

(在终端显示输出output shape(1, 100)表明模型已计算完成,工程实例顺利跑通)


开源地址

linger和thinker也分别在github上开源,地址分别为:

https://github.com/LISTENAI/linger 
https://github.com/LISTENAI/thinker

更多学习资源

如果需要获取相关的学习资源、代码,

或者了解更多与嵌入式开发、AI芯片相关的其他课程,可以点击查看  目录导航