参考文献
https://blog.csdn.net/asialee_bird/article/details/100990483
https://www.jianshu.com/p/7f6b8a290f81
因为服务器网速的原因,无法使用下载tensorflow源码,即通过官网方法
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
下载的tensorflow源码默认是master里面的代码,想要编译tensorflow其他版本的话,需要使用
git checkout branch_name # r1.9, r1.10, etc.
然后想到的就是直接下载固定的tensorflow的版本,然后将其传到服务器中进行编译。其中固定版本tensorflow下载地址,有的tensorflow版本下载完成以后才几兆B,这样子的源文件是编译不了的(缺少文件),下面tensorflow1.13是30多兆,是可以编译成功的。
说下运行环境,
Ubuntu18.04,
python3.7
CUDA 10.0,
cuDNN 7.6.3
查看cuda和cudnn版本
nvcc -V
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
(1)tensorflow-1.13.1源码(tensorflow 1.13.1)
(2)bazel-0.19.2-installer-linux-x86_64.sh(bazel-0.19.2-installer-linux-x86_64.sh)
(4)protobuf-3.6.1.2.tar.gz
将这些文件传到百度云里面
链接:https://pan.baidu.com/s/1wIX9u_mNVgDo8RydT7sNIA
提取码:yt5x
期间也尝试了很多东西,下面是一些下载的文件
链接:https://pan.baidu.com/s/1hOiY_ClmPAnT1s1totjg8Q
提取码:ozc1
bazel编译器和tensorflow版本必须匹配,不然无法编译,可以去参考官网给的资料
bazel编译器我直接安装到我自己用户目录下(如:/home/zyt5/)了,没有安装在根目录下
chmod +x bazel-0.19.2-installer-linux-x86_64.sh
./bazel-0.19.2-installer-linux-x86_64.sh --user
安装完成之后,还需要在bashrc里面添加环境变量
vim ~/.bashrc
然后键入
export PATH="$PATH:$HOME/bin"
保存后使其生效,输入指令
source ~/.bashrc
可以查看bazel版本
bazel version
安装Protobuf有一点很重要,要与所编译的tensorflow版本相对应,这个可以参考官网
解压文件
tar zxvf protobuf-3.6.1.2.tar.gz
然后新建一个编译完成的文件夹
mkdir protobuf_bin
下载好后进入protobuf-3.6.1.2目录输入以下命令安装
cd protobuf-3.6.1.2/
./autogen.sh
如果出现
./autogen.sh: 32: ./autogen.sh: autoreconf: not found
请管理员执行
sudo apt-get install autoconf automake libtool
在protobuf-3.6.1.2目录下执行
./configure --prefix=$HOME/protobuf_bin (自己新建的目录)
make -j4
make install
编译好后添加环境变量(根据自己的安装路径来)
vim ~/.bashrc
export PATH=$PATH:$HOME/tools/protobuf_bin/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/tools/protobuf_bin/lib
export CPLUS_INCLUDE_PATH="/home/zhouxd/tools/protobuf_bin/include"
source ~/.bashrc
查看版本以验证安装
protoc --version
如果想要卸载protobuf
cd protobuf-3.6.1.2/
make uninstall
tar zxvf tensorflow-1.13.1.tar.gz
cd tensorflow-1.13.1/
./configure
按照下面图片的方式执行,只要CUDA support选择Y,其他基本上都是默认和N,其中默认是10.0,如果不是在后面写上对应的版本,我cudnn是7.6.3,默认是7,直接默认也是OK的。
设置完成之后需要编译了
// 有显卡
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
// 无显卡
bazel build --config=opt //tensorflow:libtensorflow_cc.so
注意:部分博主说没有使用--config=monolithic,会出现opencv无法使用 ,我没有添加但是依旧可以
这个需要一段时间才能安装完成,期间可能会报错,因为在bazel编译tensorflow源码还需要其他依赖项,因为网速的原因无法下载完全故会报错,没什么解决办法,重新编译(即上面的bazel指令),直到成功。(期间试过将这些依赖项下载完成放在需要的位置上,但是还是会下载的,还是需要重新编译)
ERROR: error loading package '': Encountered error while reading extension file 'container/container.bzl': no such package '@io_bazel_rules_docker//container': java.io.IOException: Error downloading [https://github.com/bazelbuild/rules_docker/archive/a9bb1dab84cdf46e34d1b34b53a17bda129b5eba.tar.gz] to /home/zyt5/.cache/bazel/_bazel_zyt5/957c869dd334b8c29712fd21f3584066/external/io_bazel_rules_docker/a9bb1dab84cdf46e34d1b34b53a17bda129b5eba.tar.gz: Tried to reconnect at offset 403,461 but server didn't support it
编译成功后,tensorflow-1.13.1目录下会出现 bazel-xxx 的几个文件,在tensorflow-1.13.1/bazel-bin/tensorflow文件下会出现 libtensorflow_cc.so 和 libtensorflow_framework.so 动态库文件
编译安装其他依赖项
cd ~/tensorflow-1.13.1/tensorflow/contrib/makefile/
./build_all_linux.sh
注意:build_all_linux.sh这个命令是包含./download_dependencies.sh,但是单独执行./download_dependencies.sh这个命令不成功
执行成功后,在tensorflow-1.13.1/tensorflow/contrib/makefile目录下:downloads文件夹下存放第三方依赖的一些头文件和静态库,比如absl cub double_conversion eigen fft2d gemmlowp googletest nsync re2。这些第三方库是可以自己安装的,可以去参考:https://www.jianshu.com/p/7f6b8a290f81
首先打开上一步的downloads文件夹,里面会有个eigen文件夹,进入eigen文件夹打开终端依次输入如下指令:
mkdir build
cd build
cmake ..
make
sudo make install
安装完毕后,在usr/local/include目录下会出现eigen3文件夹。这个先安装在了根目录下了,最好安装自己的用户目录下
说明:Eigen 是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法;Protocol Buffers (简称 Protobuf)是 Google 开源的一款跨语言,跨平台,扩展性好的序列化工具,相比于 XML 和 JSON 等流行的编码格式,这种数据结构化语言需要使用protoc进行编译。
在自己的目录下新建一个cpptest文件夹,文件夹的目录如下:
对于main.cpp文件,里面的内容如下:
#include
#include
#include
using namespace std;
using namespace tensorflow;
int main()
{
Session* session;
Status status = NewSession(SessionOptions(), &session);
if (!status.ok()) {
cout << status.ToString() << "\n";
return 1;
}
cout << "Session successfully created.\n";
}
其中CMakeLists.txt文件如下
#指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.10.2)
#项目名称/工程名
project(cpptest)
#设置c++编译器
set(CMAKE_CXX_STANDARD 14)
#aux_source_directory(./src DIR_SRCS) # 搜索当前目录下的所有.cpp文件
#设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径
set(TENSORFLOW_DIR /home/zyt5/tensorflow-1.13.1)
include_directories(${TENSORFLOW_DIR}
${TENSORFLOW_DIR}/bazel-genfiles
${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/absl
${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/public
/usr/local/include/eigen3
/home/zyt5/protobuf_bin/include)
link_directories(${TENSORFLOW_DIR} /home/zyt5/tensorflow-1.13.1/bazel-bin/tensorflow) #动态链接库目录
#add_executable(cpptest ${DIR_SRCS}) ## 生成可执行文件
add_executable(cpptest main)
#添加可执行文件所需要的库,连接libtensorflow_cc.so和libtensorflow_framework库,链接动态链接库
target_link_libraries(cpptest tensorflow_cc tensorflow_framework)
编译和运行
mkdir build #创建build文件,是为了将编译程序放到build文件中
cd build
cmake .. #使用cmake构建生成make文件
make #使用make编译
./cpptest #运行可执行文件
运行结果如下,说明tensorflow编译结束