博客主要参考:
https://blog.csdn.net/qq_29462849/article/details/84986592
https://blog.csdn.net/zwx1995zwx/article/details/79064064
https://blog.csdn.net/neil3611244/article/details/84104755(版本参考)
介绍
最近课题需要,将deeplab训练的模型部署到C++环境下,tensorflow提供了C++的API,但是需要编译,网上应该有比较多就教程,基本都是大同小异,本博客记录一下自己编译的过程及遇到的问题。
环境配置:GTX1080Ti,ubuntu16.04
(1)tensorflow-gpu-1.6,python2.7
(2)cuda9.0+cuDNN7.0.5
(3)opencv 3.4
编译安装tensorflow的C++版本
1、Protobuf
参照第一篇博客链接,版本也是一样的,安装过程基本没问题。
先从以下网址下载protobuf-cpp-3.5.0.tar.gz
https://github.com/google/protobuf/releases
再解压出来,获得一个protobuf-3.5.0的文件夹
cd prtobuf-3.5.0
./configure
sudo make -j8
make check -j8
sudo make install
sudo ldconfig
以上步骤可以完成Protubuf的源码的编译和安装
如果遇到什么问题,建议去看Protobuf的官方的编译安装指南:
https://github.com/google/protobuf/blob/master/src/README.md
2、Eigen
参照第一篇博客链接,版本一致,安装过程没遇到问题。
先下载eigen的压缩包
wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
下载之后解压,重新命名为eigen3,放到某个路径下,安装就好
mkdir build
cd build
cmake ..
make
sudo make install
3、下载安装bazel
注意:这里版本一定要对应,参考博客:https://blog.csdn.net/neil3611244/article/details/84104755
下载地址:https://github.com/bazelbuild/bazel/releases,这里我下载的是bazel-0.9.0-installer-linux-x86_64.sh
然后执行安装
参考博客:https://www.jianshu.com/p/d92913173d5b
(1)首先,安装先决条件:pkg-config
,zip
,g++
,zlib1g-dev
,unzip
,和python
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
(2)运行Bazel安装程序,如下所示
chmod +x bazel--installer-linux-x86_64.sh
./bazel--installer-linux-x86_64.sh --user
(3)设置环境
export PATH="$PATH:$HOME/bin"
将这条命令添加到~/.bashrc中
后来由于重装系统没备份,又重新按照自己教程编译,在这一步# 执行sudo ./configure提示Cannot find bazel. Please install bazel.所以这一步又折腾了一段时间
主要参考了这篇博客:https://blog.csdn.net/qq_41204464/article/details/95333396
使用第二种方法:使用Bazel的APT存储库,除了最后一句更新bazel不要执行,其他都执行,然后再把~/.bashrc中的环境变量注释掉,就可以正常执行./configure了,好像加了sudo不行?(不太记得了)
4、下载tensorflow源码
# 先下载tensorflow源码
git clone https://github.com/tensorflow/tensorflow.git
# 进入tensorflow文件夹
cd tensorflow
# 切换到1.6版本:
git checkout r1.6
# 执行configure
sudo ./configure
这一步需要你指定python路径,需要有各种y/N的选择
建议如下:
python路径用anaconda的路径:/home/oliver/anaconda3/bin/python
其他的第一个y/N选择y,后面的都是N
cuda要选择y,然后会自动搜索cudnn版本
nccl选择默认的1.3,
后面的不是选择N就是默认
5、编译tensorflow(注意是以下整条命令执行包括//后面的)
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so // 有显卡
这一步遇到以下问题;
这里应该是cuda版本的问题,我刚开始用的是cuda9.0,切换到cuda8.0之后完美解决,并且需要重新执行./configure,重新编译后又遇到新的问题
这里参考了https://blog.csdn.net/haithink/article/details/87078001这篇博客
对 tensorflow/core/platform/macros.h 进行编辑
#if TF_HAS_BUILTIN(__builtin_expect) || (defined(__GNUC__) && __GNUC__ >= 3)
改成
#if (!defined(__NVCC__)) && (TF_HAS_BUILTIN(__builtin_expect) || (defined(__GNUC__) && __GNUC__ >= 3))
重新编译后得到下图结果表示成功
然后回到tensorflow目录下执行:
./tensorflow/contrib/makefile/download_dependencies.sh
#完成后会有一个download文件夹在makefile文件夹中。
然后:
在tensorflow/contrib/makefile下,执行build_all_linux.sh文件,成功后会出现一个gen文件夹。
这一步执行了很久,一直在跑,大概有一二十分钟的样子.
操作完成后需要把"tensorflow/bazel-genfiles/tensorflow/"中的cc和core文件夹中的内容copy到"tensorflow/tensorflow/"中,然后完成覆盖即可,这一步是为了复制.pb.h和.cc文件,这里我是直接将整个文件夹复制合并过去。
完成这一步之后:
# 再把必要.h头文件以及编译出来.so的动态链接库文件复制到指定的一些路径下:
sudo mkdir /usr/local/include/tf
sudo cp -r bazel-genfiles/ /usr/local/include/tf/
sudo cp -r tensorflow /usr/local/include/tf/
sudo cp -r third_party /usr/local/include/tf/
sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
sudo cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib
OK到此为止,tensorflow C++的接口已经搞定!