1. 背景
TensorFlow是一个从离线到在线一条龙实现的机器学习库。 一般来说,离线算法一般采用Python进行开发,并进行训练,以及得到模型结果, 而在线部分,采用的则是C++来实现,主要考虑到在线预测要一定的性能要求。这里可以采用TensorFlow serving来实现。但是一般来说,为了更好地和内部rpc框架融合,需要将TensorFlow的库,植入到内部的rpc的框架里面。
本文主要将TensorFlow的C++版本的API的so编译过程记录下来,方便后续用到可以快速回溯。
编译环境:centos8
2. TensorFlow编译过程
2.1 下载源码
git clone https://github.com/tensorflow/tensorflow.git
2.1 安装依赖
- 安装java jdk
dnf install java -y
- 安装 Bazel(这里安装0.29的版本)
wget https://link.jianshu.com/?t=https%3A%2F%2Fgithub.com%2Fbazelbuild%2Fbazel%2Freleases%2Fdownload%2F0.29.0%2Fbazel-0.29.0-installer-linux-x86_64.sh
bazel的版本不能太高也不能太低,否则编译不通过。
chmod +x bazel-<version>-installer-linux-x86_64.sh
./bazel-<version>-installer-linux-x86_64.sh --user
- 安装Eigen3
在目录tensorflow/tensorflow/workspace.bzl, 找到下载链接,然后下载下来,在对应的目录进行解压,最后配上/etc/profile的环境参数:
export CPLUS_INCLUDE_PATH="$HOME/tools/include/:$CPLUS_INCLUDE_PATH"
export CPLUS_INCLUDE_PATH="$HOME/tools/include/eigen3/:$CPLUS_INCLUDE_PATH"
- Protobuf
同理,在tensorflow/tensorflow/workspace.bzl 找到对应的版本。
./autogen.sh
./configure --prefix=$HOME/tools/bin
make
make install
- 安装nsync
同理, 和eigen3解压到对应的目录即可。
export CPLUS_INCLUDE_PATH="$HOME/tools/include/nsync/public:$CPLUS_INCLUDE_PATH"
2.2 编译实现
./configure
bazel build //tensorflow:libtensorflow_cc.so
由于只是在虚拟机上面编译,没有GPU设备,因此在configure过程中,全部选择N。在bazel-bin/tensorflow下就会看到libtensorflow_cc.so和libtensorflow_framework.so两个动态库;之后需要把这两个库复制到$HOME/tools/lib中,这样就可以连接来编译我们的模型了,之后的任务就是写Tensorflow的C++ API接口啦。
2.3 简单的测试用例
- 创建回话
#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";
return 0;
}
- 查看TensorFlow版本
#include <iostream>
#include <tensorflow/c/c_api.h>
int main() {
std:: cout << "Hello from TensorFlow C library version" << TF_Version();
return 0;
}
// Hello from TensorFlow C library version1.11.0-rc1