Linux下tensorflow1.13.1 C++ API的编译和使用

参考文献

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、软件下载

(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

2、Bazel编译器的安装

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

3、安装protobuf

安装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

4、tensorflow源码编译

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

Eigen3需要进行编译才能使用

首先打开上一步的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进行编译。

5、测试tensorflow C++API 

在自己的目录下新建一个cpptest文件夹,文件夹的目录如下:

对于main.cpp文件,里面的内容如下:

#include <tensorflow/core/platform/env.h>
#include <tensorflow/core/public/session.h>
#include <iostream>
 
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编译结束

发布了102 篇原创文章 · 获赞 117 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/pursuit_zhangyu/article/details/104473245