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