AI算法落地基本涵盖六个阶段:模型规约性检查、浮点训练、量化训练、模型打包、模拟引擎执行、固件烧录并芯片运行。其中固件烧录并芯片运行需要在聆思的开发板上来完成,如有需要请与我们联系,这里不做进一步介绍。其它五个阶段的流程示例图如下:
其中模型规约性检查的功能是穿插在量化训练和模型打包中来完成的,具体规则参考模型结构限制
我们先假设模型结构与底层硬件完全适配,介绍流程中各个阶段,再介绍模型规约性检查的具体实现(实际开发过程中规约性检查要在模型结构初步进行,避免后续工作返工)。
我们基于pytorch-cifar100来进行功能展示
首先确保在当前环境下,浮点模型训练基于pytorch能够跑起来。
python train.py -net resnet50 -gpu
建议采用两阶段量化训练,对浮点训练的数据进行范围约束,只需在如下位置添加约束条件
!
为避免冲突,将tesnorboard功能关闭。同样的指令开启训练,运行几个epoch后,在checkpoint/resnet50文件夹中生成了一个**.pth
文件
加载步1中保存的浮点模型**.pth,修改linger量化训练部分代码,即可将浮点算子替换为量化算子。同样的指令开启量化训练,训练几个epoch后,同样在checkpoint/resnet50文件夹中生成了一个**.pth文件。
使用linger的模型转换工具,将模型转换成onnx计算图
使用thinker离线工具tpacker对步2生成的onnx计算图打包,这里我们以裁剪并训练好的resnet18模型为例,进行打包演示
tpacker -g demo/resnet18/resnet18-12-regular.onnx -d True -o demo/resnet18/model.bin
使用调用示例工程test_thinker,指定输入数据、资源文件和输出文件名称即可运行模拟代码。
chmod +x ./bin/test_thinker
./bin/test_thinker demo/resnet18/input.bin demo/resnet18/model.bin demo/resnet18/output.bin 3 32 32 6
这里简化整体处理流程,引擎输入为规整后的3x32x32的图片,输出取max_value对应的id作为分类的结果。输入图片的处理参考图片处理脚本,或者从pytorch-cifar100中取处理后的测试集图片进行测试。
注意:推理执行需要安装thinker源码,并完成编译。
该阶段不关注模型的效果,只关注模型的结构是否和底层硬件相适配,功能实现贯穿了1~4步