HiSi 3516CV500 NNIE(Neural Network Inference Engine) 摸鱼记录(2) --- 模型生成及模型仿真(实例分析)


PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  无

背景


  本文建立在上文环境配置的基础上继续。(上文链接:https://blog.csdn.net/u011728480/article/details/91125581)

  本文将会以一个实例来进行分析。同时本文的教程都是建立在《HiSVP 开发指南.pdf》基础上的。





NNIE 模型生成




NNIE 新建工程

  File 新建NNIE工程,选择MinGW GCC 空工程即可。

rep_img


NNIE Mapper 配置文件建立

  File 新建nnie mapper配置文件,如下图:

rep_img

  双击这个mapper文件,你可以进入配置页面,如下图,其相关的参数和选项要按照《HiSVP 开发指南.pdf》的NNIE mapper配置文件参数详解。

rep_img

  这里有几个地方要注意一下:

  • is_simulation 是生成功能仿真或者指令仿真模型。指令仿真模型就是最终到板子上的模型。

  • batch_num 对于forward来说,一般都是一张图像,这里选1就行了。

  • sparse_rate 先0不影响正常输出。

  • data_type 这里你一定要去看文档说明,弄清楚你的网络需要输入的是什么数据类型,有些在网络里面做了归一化,这里选U8,如果网络前面做归一化,这里就要选S32,其他类型,看文档。



NNIE 模型生成

  在把NNIE Mapper配置配好了后,点击如下图的按钮即可生成对应的wk文件。

rep_img

  我这里就根据is_simulation生成了两种模型,功能仿真模型输出内容多。指令仿真模型输出基本保持和板子上是一致的。

rep_img


NNIE 模型仿真工程搭建

  这里,我们就不要做重复造轮子的工作,直接导入官方sample_simulator,然后在其基础上魔改就行了。

rep_img


魔改切入点

  在src目录,打开main.cpp,简单分析一波,根据我的网络特点,直接选择分类网络例子(svpsampleclassification.cpp),复制为我的cpp和hpp。

rep_img

  其核心调用在仿真里面就两个函数:

  • HI_MPI_SVP_NNIE_Forward 网络forward

  • HI_MPI_SVP_NNIE_Query forward状态查询

  其余的都是在准备数据和查看数据。这里你可以参考svpsampleclassification.cpp进行简化魔改即可。

  需要注意的是:HI_MPI_SVP_NNIE_Forward 的api参考文档中,有关于输入和输出数据的规格说明,别弄错了。

  魔改好了,直接打印出最后一层的输出。



每一层的数据保存

  这种方法适用于后续的向量对比,用于查看你生成的模型对不对。在sim_out的目录下有一个nnie_sim.ini配置文件,里面可以设置一些不错的参数。

rep_img

  双击后,可以界面设置:

rep_img

  这里必须勾上第一个,第二个建议勾上,这样跑的快点。第一个勾上后,会输出每一层的输出。

  然后运行你魔改的程序,在sim_out下会出现如下图的内容(我这里我两种模型的仿真都做过了,所以有两种每一层网络的输出):

rep_img




网络标准输出


  点这个,配置参数,然后输出你的caffe模型的每一层数据,用作后续的向量分析。

rep_img
rep_img

  这里没什么注意的,自己配置好相关的内容即可。

  这里执行后会在output dir 输出每一层caffe模型的forward输出

  如下图:

rep_img




向量对比


  向量对比有什么作用,相比经常接触这方面的人会有感受,就是指你的模型输出对不对。比如:caffe 的输出,nnie的输出到底能否对上,hisi提供了这样的一个工具。

rep_img

  一个选择caffe输出,一个选择仿真输出。对比即可。双击可以查看每一层的所有输出数据,这里我就直接看最后一层。

rep_img
rep_img

  从最后一层的数据对比来看,基本偏差不大,因为后续还要继续对数据进行处理。这样的话,就证明了我的nnie模型至少现在看来没什么问题了。





后记


  注意事项

  如果你的输出和标准caffe输出差的非常远,有70%的可能性是你输入数据不一致导致的,你要和算法他们详细沟通,并打印输入数据,经过实际对比,看看哪里有什么问题。

  不一致的原因很多,一般来说就是图像通道对不上,预处理不一致等等。

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。


文章作者: Sky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sky !
  目录