之前有一篇介绍到在windows下利用VS2015编译tensorflow的C++接口,接下来这篇就介绍下在Ubuntu下编译tensorflow的C++接口。
先说一下我的电脑配置,首先是Ubuntu16.04,anaconda用的是3.4.2,CUDA用的是9.0的,cudnn用的是7.0.5的。因为已经在anaconda3上安装好了tensorflow1.7的,但是这次要编译C++的接口,所以我还是选择编译tensorflow1.7的源码。
一、准备编译环境
编译这里要用到bazel来编译,所以要安装它,Ubuntu下安装的指令如下:
echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
然后输入以下指令:
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
更新:
sudo apt-get update
安装bazel:
sudo apt-get install bazel
二、下载tensorflow源码
tensorflow的源码是在github上就可以下载的,目前已经更新到1.11,但是我还是下载了1.7的版本,下载之后解压出来。
三、配置编译环境
解压源码之后,进入根目录,输入指令:
./configure
接下来就是配置清单:
这里要说明的是如果有CUDA,那么Do you wish to build Tensorflow with CUDA?一定要选Y,然后其它的我基本都是N
配置好之后就进行编译:
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
这里如果不用cuda的话(前面配置的时候就不要在CUDA那一项那里输入Y),就输入:
bazel build --config=opt //tensorflow:libtensorflow_cc.so
然后是等待,这个过程大概会花费30分钟左右,而且CPU的占用量是达到100%的,所以这个时候最好就不要坐别的事情了。
编译之后我这里会有一个问题:
这个错误并不是因为文件没有而是因为找不到,实际上,这个文件就在tensorflow-r1.7/tensorflow文件夹下,但是需要修改/tensorflow-r1.7/tensorflow/BUILD这个文件才行,打开这个文件之后修改大概在812行,注释掉后,另起一行设置正确的路径:
修改之后重新输入编译的指令编译一次就可以了。编译好之后在文件夹tensorflow-r1.7/bazel-bin/tensorflow下面,会有两个so文件:libtensorflow_cc.so和libtensorflow_framework.so,这两个就是我们需要的。
四、一些错误
下面这几个错误都是在使用的时候发现的,主要是在编译的时候有些依赖文件没有下载到,所以需要自己去下载。
(1)、nsync_cv.h文件缺失:
这个文件一般是会在tensorflow/contrib/makefile/downloads/nsync/public这个文件夹下的,但是我这边是编译tensorflow的时候有些依赖文件没有下载到导致它缺失,解决方法是存在/tensorflow/contrib/makefile/download_dependencies.sh这个文件,执行它来下载相关的文件,相关文件会放在/home/zcx/tensorflow-r1.7/tensorflow/contrib/makefile/downloads这个文件夹下;
(2)、(2)提示Eigen相关的问题
这个问题跟前面的类似,如果下载了相关的依赖文件之后,在/tensorflow-r1.7/tensorflow/contrib/makefile/downloads文件夹下找到eigen文件夹,进入之后执行以下指令进行eigen的编译:
mkdir build
cd build
cmake ..
make
sudo make install
暂时我就遇到这几个问题,之后如果还有遇到其它问题,我会继续更新的。
五、参考