Ubuntu16.04下C++编译tensorflow

博客主要参考:

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-configzipg++zlib1g-devunzip,和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,重新编译后又遇到新的问题

Ubuntu16.04下C++编译tensorflow_第1张图片

这里参考了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++的接口已经搞定!

 

你可能感兴趣的:(Linux,软件安装or环境配置)