11

AI老铁 · 2020年07月30日

海思AI芯片方案学习(二十二)如何在ubuntu18.0.4上跑通nnie mapper

本系列为华为海思海思AI芯片(Hi3519A/3559A)方案学习系列之二十二,系列文章请关注海思AI芯片方案学习
作者:ltshan139

前言

一晃8月就要过去了,发现自己竟然连一篇海思AI的博文都没有写。赶紧把这两天的研究心得写一下,即如何在ubuntu18.0.4上运行nnie mapper。

分析

nnie mapper工具是用来将caffe模型量化成nnie硬件支持的、后缀名为wk的压缩模型文件。原始权值都是用float32来表示的,而8bit量化的权值则是用int8类型来存储,所以一般地,wk压缩模型文件大小(字节数)只有原始caffe模型的四分之一。

windows上Ruyistudio工具中已经集成了nnie mapper这个功能,在海思AI芯片(Hi3519A/3559A)方案学习(九)wk格式的模型生成以及PC仿真已经有详细介绍。

本博文则是讲解如何在linux环境中来运行nnie mapper。在海思sdk里面已经提供了nnie mapper的可执行文件,其父目录为mapper,如下红框所示。

20190831225535648.png

在mapper里面有两个版本,分别为cpu和gpu版本。注意一下,for 3519av100, 其nnie mapper版本为1.2。

20190831225716390.png

另外一个需要注意的地方就是,nnie mapper的源代码不开放,只有可执行文件。而根据<Hisvp开发指南>,它们是在ubuntu14, protobuf3.5.1,opencv3.4.0以及gcc4.8.5上编译出来的。所以直接来运行nnie mapper可执行文件,肯定会遇到一些问题。我们这里只考虑cpu版本,因为gpu版本依赖库更多,更复杂。

问题

下面就我遇到的问题进行逐一分析。

1)找不到opencv相关库。 先运行命令: readelf -d nnie_mapper_12 看看该可执行文件都依赖什么opencv库。

20190831230859597.png

下载opencv3.4.x版本的代码,去掉opencv_world勾项,重新编译即可生成包括上面红框所示的库,然后将这三个库拷到/usr/lib/下面即可。

2)第二个问题则比较麻烦。如上图所示,该可执行文件还需要libprotobuf.so,所以按照开发指南,先下载对应版本的protobuf源代码,然后进行编译。

20190831231453486.png

解压缩后,在其根目录下创建build子目录,然后进入build,输入下面命令:

sudo cmake -Dprotobuf_BUILD_TESTS=OFF -Dprotobuf_BUILD_SHARED_LIBS=ON DCMAKE_INSTALL_PREFIX=/home/test/protobuflib/protobuf-3.5.1 ../cmake

最后输入命令进行编译:sudo make -j8。 编译完后,将build目录中生成的libprotobuf.so拷贝到/usr/lib下面。

重点来了,这时遇到另外一个错误:

20190831231954997.png

通过nm -s libprotobuf.so | grep google8protobuf8internal26fixed_address_empty 可以发现实际上libprotobuf.so里面是有下面这个符号的:_ZN6google8protobuf8internal26fixed_address_empty_stringEB5cxx11,即多了字符串:B5cxx11。后来查明是和gcc版本有关系。需要使用gcc4.8.5来编译protobuf源代码重新生成libprotobuf.so才能解决这个问题。

安装gcc-4.8.5,并切换gcc version到4.8.5的命令如下:

sudo apt-get install gcc-4.8
 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100

这时输入命令: gcc --version 发现打印出来的gcc版本号变成4.8了。 但是重新编译protobuf代码,却发现问题依旧在。

后来才知道, 因为protobuf里面有cpp文件,所以g++也要切换成4.8

sudo apt-get install g++-4.8
 
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/g++-4.8 100

将生成的新libprotobuf.so拷贝到/usr/lib/,重新输入如下类似的命令,就能够运行成功。当然要保证参数xxxfunc.cfg里面的路径是正确的。

nnie_mapper_12 ./data/classification/alexnet/alexnet_no_group_func.cfg 



海思AI芯片系列文章



更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习

推荐阅读
关注数
867
内容数
40
海思AI芯片(Hi3519A/3559A)方案学习系列笔记,欢迎关注。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息