Tensorflow C++ 从训练到部署(1):环境搭建

很多人使用 Tensorflow 作为自己深度学习的实验工具,然而它只能用 Python 来训练和预测,对于实际生产而言,我们更多地会用 C++ 来放入自己工程中。例如一个典型的流程如下:
tf-process
1)在训练环节,我们仍然希望使用 Python 接口
2)在预测环节,我们使用 C++ 接口获取结果
这几篇博客我们就尝试按照上面的方式,完成从环境搭建、训练到部署的一整套流程。

0、系统环境
Ubuntu 16.04
Tensorflow 1.10.1
ProtoBuf 3.6.1

1、安装依赖
1)安装 JDK 8
下载地址:
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

或者到我的网盘下载:
[Ubuntu] https://pan.baidu.com/s/1B2wpEVVqtP6JwBfEvEQsnw
[Mac] https://pan.baidu.com/s/15zxVi7uJDmnJk6gQfov1Cw

2)安装依赖库:
使用如下命令:

3)安装 Bazel:
在 github 上下载 bazel--installer-linux-x86_64.sh:
https://github.com/bazelbuild/bazel/releases

使用如下命令安装:

参考提示可以添加可执行文件目录(通常不需要):
screen-shot-2018-09-18-at-11-40-53

4)安装 protobuf
使用如下命令安装(我这里安装版本为 3.6.1,你可以根据自己需要修改,其实对于 1.10.1 来说,安装 3.6.0 会省去后面的一些步骤):

5)安装 Eigen (可选,你也可以在后面实际工程中再指定)
使用如下命令安装,我们这里使用的版本是 Eigen 3.3.5:

2、编译 tensorflow
在 C++ 工程中我们需要引用 libtensorflow_cc.so 库,这个库在安装 tensorflow 时是没有安装到系统的,只能通过编译源码进行安装。

0)下载 tensorflow 1.10.1源码
地址:https://github.com/tensorflow/tensorflow/archive/v1.10.1.zip
或者到我的网盘下载:
https://pan.baidu.com/s/1kmsDM4YLbAEZDIjPvNuaAQ
下载并解压缩。

1)修改 tensorflow 里面的 protobuf 和 eigen 版本配置(当然如果你安装的 protobuf 就是 3.6.0 就不需要这些步骤了):
在刚才的步骤中,我们已经安装了自己的一个 protobuf 版本,然而比较坑的是 tensorflow 自己也会下载一个版本,同时内部也有自己定义的版本号,这些版本很可能都不是统一的。最后会造成版本冲突。因此我们这里建议预先修改 tensorflow 源码将内部的版本统一成我们系统的版本。

打开 tensorflow/workspace.bzl
搜索:

修改成:

打开 tensorflow/contrib/cmake/external/protobuf.cmake
搜索:

修改成:

打开 tensorflow/tools/ci_build/install/install_proto3.sh
搜索:

修改成:

打开 tensorflow/tools/ci_build/protobuf/protobuf_optimized_pip.sh
搜索:

修改成:

Tensorflow C++ 版本编译时需要 Eigen 3.3 以上版本,在之前的步骤中我们已经安装了 Eigen 3.3.5 版本,这里我们同样做出修改(这一步可选,因为 Eigen 仅是一个头文件,你可以在后续工程中指定使用你自己的 Eigen 库,这样就不用 tensorflow 的 eigen 了):
搜索:

修改成:

2)安装所需要的库

3)Bazel编译源码
进入 tensorflow 目录,运行:

然后使用如下命令编译:

或者使用如下命令编译 CPU 指令集加速版本(需要根据你的 CPU 类型修改参数):

如果出现以下显示则编译成功:
2018-08-27-10-16-27

同时编译 libtensorflow_framework.so:

如果出现以下显示则编译成功:
2018-08-27-10-16-27

4)使用以下脚本一键安装:

3、拷贝到系统目录下(建议)
为了后续方便使用,逐行执行以下命令,拷贝头文件和库文件到系统目录下:

PS:如果想要卸载请运行如下命令:

至此,我们完成了从编译 Tensorflow C++ 库到安装到系统目录下的流程。

常见错误:
1)错误:tensorflow/tensorflow/core/public/session.h:22:60: fatal error: tensorflow/core/framework/device_attributes.pb.h: No such file or directory
缺少其他文件往往是由于没有完整编译tensorflow所导致,比如之前某次bazel构建没有清空。建议运行 bazel clean 后重新编译试试。

2)错误:fatal error: google/protobuf/arena.h: No such file or directory
没有正确安装 protobuf,请参照步骤1中的4)进行安装。并且按照步骤2中1)正确修改 tensorflow 中的版本配置和你系统中一致。

3)错误:error: #error This file was generated by an older version of protoc
因为 tensorflow 本身在安装时也会下载一个 protobuf 到自己目录下,如果跟系统版本不匹配则会出现问题。
修改
tensorflow/tensorflow/contrib/makefile/download_dependencies.sh 文件:
有这样一行:

修改为和你相同的版本:

检查系统 protobuf 版本:

输出为:

查找有几个 protobuf 安装在系统里:

你也可以单独运行每个 protoc 看看版本是不是一致。

删除 Bazel 缓存:

然后重新进行步骤 2 中的 2)之后的操作。

4)错误:fatal error: tensorflow/core/framework/tensor.pb.h: No such file or directory
出现这一错误很可能是没有自动编译 libtensorflow_framework.so,建议重新运行步骤2中的3)和4)再试。

5)错误:cannot execute binary file: Exec format error
如果在执行 bazel 安装脚本:

时遇到上面的问题,可以尝试在执行脚本之前加上 sudo 权限:

6)错误:fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
如果在编译包含 tensorflow c++ 的项目时遇到如下错误:

这是因为 tensorflow 安装的 eigen 版本较旧,最好使用 eigen 3.3 或以上版本编译。

参考文献:
[1] http://mathmach.com/2017/10/09/tensorflow_c++_api_prediction_first/
[2] https://github.com/formath/tensorflow-predictor-cpp/
[3] https://github.com/tensorflow/tensorflow/issues/1890
[4] https://github.com/PatWie/tensorflow-cmake
[5] https://zhuanlan.zhihu.com/p/31283000

Tensorflow C++ 从训练到部署系列文章目录

Tensorflow C++ 从训练到部署(3):使用 Keras 训练和部署 CNN
Tensorflow C++ 从训练到部署(2):简单图的保存、读取与 CMake 编译
Tensorflow C++ 从训练到部署(1):环境搭建
4 Comments

Add a Comment

您的邮箱地址不会被公开。 必填项已用 * 标注