本系列为华为海思海思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,如下红框所示。
在mapper里面有两个版本,分别为cpu和gpu版本。注意一下,for 3519av100, 其nnie mapper版本为1.2。
另外一个需要注意的地方就是,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库。
下载opencv3.4.x版本的代码,去掉opencv_world勾项,重新编译即可生成包括上面红框所示的库,然后将这三个库拷到/usr/lib/下面即可。
2)第二个问题则比较麻烦。如上图所示,该可执行文件还需要libprotobuf.so,所以按照开发指南,先下载对应版本的protobuf源代码,然后进行编译。
解压缩后,在其根目录下创建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下面。
重点来了,这时遇到另外一个错误:
通过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芯片(Hi3519A/3559A)方案学习(二十一)extern "C"和C/C++混合编程
- 海思AI芯片(Hi3519A/3559A)方案学习(二十)opencv静态库和动态库的区别
- 海思AI芯片(Hi3519A/3559A)方案学习(十九)如何在推理动态链接库中引入opencv库
更多海思AI芯片方案学习笔记欢迎关注海思AI芯片方案学习。