赞
踩
接讲上文
本章及后文将讲到如何generate一个可以部署到GAP上的神经网络模型
如果没有硬件板的话,这里先举例介绍一下如何使用用于分析GAP程序的完整系统模拟器GVSOC。
首先进入gap_sdk下的目录
cd ~/gap_sdk/examples/pmsis/features/cluster/cluster_fork
完成以后make all run platform=gvsoc runner_args="--vcd"
运行以后可以看到这个:
复制下来粘贴到运行,就会弹出来这个窗口:
这样我们就可以看到chip里面发生了什么,这里的option选项runner_args='--vcd'
就是告诉gvsoc使用Gtkwave来查看execution traces.
首先看一下整体流程:
图中绿色方块的就表示我们在这个任务中所需要用到的工具,蓝色的表示不同工具generate出的不同文件,只有橘色的是使用者需要提供的部分。
这个流程图中最重要的就是AutoTiler,它需要一个模型描述“AutoTiler",这个.c文件,包含了对神经网络拓扑结构的描述,并且包括了对NN参数的量化策略。
这里多嘴一句什么叫模型量化。所谓量化就是对一个连续信号进行采样得到多个离散值,从float tensor到quant tensor意味着它是通过牺牲精度而压缩了信息。我们通常使用的神经网络模型通常参数多,计算量大,内存占用多。有很多模型量化的算法,这里我们将使用的是能部署到GAP上的模型量化方法。
因此NNTool就可以简化”AutoTile模型“的生产,它从交互式命令行界面从TFLite获取描述,并将所有层和参数转换为AT模型描述。它可以与已经量化的TFLite模型配合使用,并将量化信息转换为AutoTiler“语言”,或者与未量化的浮动图和一些样本输入数据一起使用,可以计算量化校准。 借助AutoTiler内核的内部python实现,NNTool还可以提供一种在移植到平台之前测试模型的简便方法。
接下来开始走一遍使用流程:
我们使用sdk/examples/nntool/visual_wake这个例子来说明如何使用这些工具
相关githubl链接 Visual Wake Words with TensorFlow Lite Micro
这个项目中的model_quantized.tflite这个文件是我们需要用到的,先使用git clone
下载到工作目录。
要明白.filte这个格式是干什么的,首先看一下Tensorflow官方文档
TFLite是一个为了将深度学习模型部署在移动端和嵌入式设备的工具包,使用的整体流程如下:
要转换成.lifilte这个格式,只需要一个常规的Tensorflow模型,你可以用pre-trained
model或者一个你自己训练的模型。如何训练模型不在此文讨论范围之内。需要注意的是,TensorFlow
Lite并非支持所有模型的转换,请注意它的兼容性。有一些pre-trained
model可以在这里找到
当然在这里我们只需要关注Convert这一步就可以了,它负责将TensorFlow训练好的模型转化并输出为我们这里需要的.tflite文件。在转化的时候同时完成了对网络的优化,如quantization。如果使用的是自定义模型,请使用TensorFlow
Lite转换器和几行Python将其转换为TensorFlow
Lite格式。如何Convert在这里
得到.tflite这个文件后,就可以开始了
一. nntool:
cd ~/VWW
这个目录下已经准备好了一个.tflite文件
开始使用工具nntool
,就可以进入命令行, 如果失败了的话重新配置一下sdk.
open model_quantized.tfliteb -q
进行模型导入如果目标模型已经在tflite转换过程中进行了量化(即inference_type = QUANTIZED_UINT8),则需要-q,告诉框架也加载存储在flatbuffer中的量化信息。如果还未进行量化参考下一节Quantization。
TFLite执行内核将HxWxC顺序用于激活,将CoutxHxWxCin顺序用于过滤器。 另一方面,Autotiler以及因此的GAP执行内核使用CxHxW激活和CoutxCinxHxW过滤器。 此外,为了提高内核的效率,Autotiler使用融合层(例如,卷积后跟池化,并且ReLU可以由单个AT层ConvPoolRelu执行)。 由于这些原因,要生成兼容的AT模型,nntool必须应用图形转换并匹配Autotiler功能:
接着adjust
导入模型后,我们需要开始转换为与AutoTiler兼容的对象的过程。 首先要做的是调整张量尺寸:Autotiler处理CxHxW激活张量和CoutxCinxHxW权重,而导入的TFlite张量按HxWxC和CoutxHxWxCin顺序排列
fusions这个命令有两个选项 fusions [--scale8] [--pow2]
接下来的事情是在图中找到可以由Autotiler使用优化内核实现的子结构
重要信息:融合类型(scale8 vs pow2)必须与将要执行的量化方案相匹配(参阅下一节Quantization)。 如果出于任何原因要更改方案,则需要重新打开原始graph并再次执行融合步骤。 注2:仅当输入图尚未量化时,才支持16位量化方案。
现在网络已经准备就绪,除了图层参数的常量张量文件之外,还可以生成AT模型文件:gen ATModel.c -t -T ~/VWW
最后在退出shell之前保存nntool的状态文件save_state /path/to/write/to/
查看网络结构以及每一层的参数/操作数量,以及应用于它们的量化方案:show
或者qshow
现在所有模型的信息都可以通过 open file.json
来查看,或者直接在linux shell 中查看nntool file.json
此时,可以将nntool图转换为Autotiler模型格式:
nntool -g path/to/nntool_model_state.json -M /path/to/model/dir -m Autotiler_model_file.c -T path/to/tensors/dir
Quantization:
要在GAP平台上运行,必须使用Autotiler支持的方案之一对模型进行量化:
8位量化:类似于tensorflow精简量化,但针对对称计算内核(Autotiler)。如果输入的tflite图已经被量化,则将自动应用此方案:只需将量化规范转换为与对称内核匹配的格式即可。
16位量化:此方案针对PowerOf2量化,即每个张量被解释为带符号的16位Qm.n定点矢量,其中m个整数位和n个十进制位。这种方法可以带来更好的精度结果,但是需要付出2倍的内存占用和将近2倍的延迟增加。
如果导入的tflite图以浮点执行为目标,则nntool可以执行训练后量化步骤,为网络提供一组校准数据,可以在该数据上收集激活的最小/最大范围统计信息:
未完待续
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。