当前位置:   article > 正文

AI集成产品中海量数据处理的嵌入式解决方案(二)_gap nntool

gap nntool

接讲上文
本章及后文将讲到如何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.

会使用GVSOC之后,正式开始介绍,如何使用sdk中提供的工具链,如何得到一个可以在GAP8上运行的神经网络

首先看一下整体流程:
在这里插入图片描述
图中绿色方块的就表示我们在这个任务中所需要用到的工具,蓝色的表示不同工具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:

  • 首先进入visual_wake这个项目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可以执行训练后量化步骤,为网络提供一组校准数据,可以在该数据上收集激活的最小/最大范围统计信息:

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/388831
推荐阅读
相关标签
  

闽ICP备14008679号