工具链简介
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 没有报错即为通过验证
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 没有报错即为通过验证
工程简介
数据集介绍
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工具链会有一个模型规约性检查的步骤,如下图灰色剪头所示。
合规性进行检查
单个算子限制
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
5.目前支持量化的op如下,更多限制请查看linger手册 linger/linger/docs/tutorial
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(宽度)
(在终端显示输出output shape(1, 100)表明模型已计算完成,工程实例顺利跑通)
开源地址
linger和thinker也分别在github上开源,地址分别为:
https://github.com/LISTENAI/linger
https://github.com/LISTENAI/thinker
更多学习资源
如果需要获取相关的学习资源、代码,
或者了解更多与嵌入式开发、AI芯片相关的其他课程,可以点击查看 目录导航。