TensorFlow C++動態(tài)庫編譯

在CentOS 7.2上編譯TensorFlow 1.4版本的C++動態(tài)庫魔熏,以及整理相應(yīng)的頭文件靶草。完成后,只需要庫文件以及頭文件即可用C++ API調(diào)用TensorFlow. 這樣的好處是自己的工程可以自由選擇編譯工具夕春,而不需要依賴谷歌的構(gòu)建工具Bazel.



基本依賴

  • 安裝Java
$ java -version
java version "1.8.0_144"

TensorFlow要用Bazel來進行構(gòu)建惶我,所以要先安裝Bazel,后面我們編譯好動態(tài)庫后冠骄,就可以擺脫Bazel這個依賴了伪煤。Bazel的編譯安裝很簡單,最終得到的是self-contained Bazel binary凛辣,按照官網(wǎng)教程即可抱既。

$ bazel version
Build label: 0.7.0- (@non-git)
  • 安裝其他依賴

TensorFlow官網(wǎng),源碼編譯安裝的教程中扁誓,提到要安裝一些Python依賴蝙砌。這里建議用virtualenv或者其他的Python運行環(huán)境管理工具來做隔離阳堕,專門為這個動態(tài)庫的編譯建一個新的Python運行環(huán)境,否則會把機器的Python環(huán)境搞得比較亂择克。

sudo yum install python-devel   # ubuntu是python-dev
pip install six
pip install numpy
pip instal wheel

編譯libtensorflow_cc.so

git clone獲取TensorFlow的源碼恬总。當(dāng)然,也可以直接去TensorFlow Release的頁面上找相應(yīng)版本的源碼:

git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r1.4

編譯之前肚邢,要進行一系列的配置壹堰,包括Python路徑等等:

./configure

編譯C++ API所需的庫,期間Bazel需要聯(lián)網(wǎng)下載許多依賴骡湖,時間有點長:

bazel build --config=opt //tensorflow:libtensorflow_cc.so

編譯正常完成后贱纠,會在bazel-bin/tensorflow/文件夾下生產(chǎn)libtensorflow_cc.solibtensorflow_framework.so這兩個動態(tài)庫文件。


編譯Protobuf和Eigen

# protobuf
mkdir /tmp/proto
./tensorflow/contrib/makefile/download_dependencies.sh
cd tensorflow/contrib/makefile/downloads/protobuf/
./autogen.sh
./configure --prefix=/tmp/proto/
make
make install

# eigen
mkdir /tmp/eigen
cd ../eigen
mkdir build_dir
cd build_dir
cmake -DCMAKE_INSTALL_PREFIX=/tmp/eigen/ ../
make install
cd ../../../../../..

整理庫文件和頭文件

把編譯得到的庫文件以及分散在各個地方的頭文件整理集中起來响蕴。

  • 庫文件
mkdir -p ../tf_test/lib
cp bazel-bin/tensorflow/libtensorflow_cc.so ../tf_test/lib/
cp bazel-bin/tensorflow/libtensorflow_framework.so ../tf_test/lib/  # 之前編譯r0.12和r1.3版本的庫谆焊,只需要libtensorflow_cc.so,1.4版本的似乎分成了兩個so文件浦夷,即還需要libtensorflow_framework.so
cp /tmp/proto/lib/libprotobuf.a ../tf_test/lib/
  • 頭文件
mkdir -p ../tf_test/include/tensorflow
cp -r bazel-genfiles/* ../tf_test/include/
cp -r tensorflow/cc ../tf_test/include/tensorflow
cp -r tensorflow/core ../tf_test/include/tensorflow
cp -r third_party ../tf_test/include
cp -r /tmp/proto/include/* ../tf_test/include
cp -r /tmp/eigen/include/eigen3/* ../tf_test/include

上面是從1.3版本的這個教程里提到的目錄辖试,但是對于1.4以后的版本,似乎還缺少nsync的頭文件劈狐,這點在這個教程里有提到:

cp -r tensorflow/contrib/makefile/downloads/nsync/public ../tf_test/include/external/nsync/public

不需要的.cc文件可以刪掉:

cd ../tf_test/
find . -name "*.cc" -type f -delete

測試示例

準(zhǔn)備好庫文件和相應(yīng)的頭文件后罐孝,可以編譯測試示例:

示例代碼tf_test/test.cc:

#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

int main() {
  using namespace tensorflow;
  using namespace tensorflow::ops;
  Scope root = Scope::NewRootScope();
  // Matrix A = [3 2; -1 0]
  auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f}});
  // Vector b = [3 5]
  auto b = Const(root, { {3.f, 5.f}});
  // v = Ab^T
  auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
  std::vector<Tensor> outputs;
  ClientSession session(root);
  // Run and fetch v
  TF_CHECK_OK(session.Run({v}, &outputs));
  // Expect outputs[0] == [19; -3]
  LOG(INFO) << outputs[0].matrix<float>();
  return 0;
}
$ pwd
/some/where/tf_test
$ ls
include lib test.cc
$ g++ -std=c++11 -I./include -I./include/external/nsync/public -L./lib test.cc -ltensorflow_cc -ltensorflow_framework -o test
$ ./test

正確的情況下,應(yīng)該會輸出19 -3肥缔,還會輸出類似Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA的信息莲兢,這涉及到CPU指令優(yōu)化的問題,可以在編譯動態(tài)庫的時候進行指令優(yōu)化续膳,具體可以看TensorFlow官網(wǎng)的教程改艇,這里就不展開了。


后記

TensorFlow的版本升級迭代比較頻繁坟岔,網(wǎng)上各個版本的C++動態(tài)庫編譯及涉及到的頭文件位置都不太一樣谒兄。本人還看過一個教程,先基于源碼編譯TensorFlow的pip包炮车,用pip安裝TensorFlow之后,再去安裝目錄(/usr/lib/python2.7/site-packages/tensorflow/include)下找頭文件酣溃∈菽拢總之,遇到編譯的問題赊豌,可以google問題的解法扛或,比較各人的環(huán)境配置總會存在差異的地方。


References

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碘饼,一起剝皮案震驚了整個濱河市熙兔,隨后出現(xiàn)的幾起案子悲伶,更是在濱河造成了極大的恐慌,老刑警劉巖住涉,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麸锉,死亡現(xiàn)場離奇詭異,居然都是意外死亡舆声,警方通過查閱死者的電腦和手機花沉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媳握,“玉大人碱屁,你說我怎么就攤上這事《暾遥” “怎么了娩脾?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長打毛。 經(jīng)常有香客問我柿赊,道長,這世上最難降的妖魔是什么隘冲? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任闹瞧,我火速辦了婚禮,結(jié)果婚禮上展辞,老公的妹妹穿的比我還像新娘奥邮。我一直安慰自己,他們只是感情好罗珍,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布洽腺。 她就那樣靜靜地躺著,像睡著了一般覆旱。 火紅的嫁衣襯著肌膚如雪蘸朋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天扣唱,我揣著相機與錄音藕坯,去河邊找鬼。 笑死噪沙,一個胖子當(dāng)著我的面吹牛炼彪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播正歼,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼辐马,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了局义?” 一聲冷哼從身側(cè)響起喜爷,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冗疮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后檩帐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體术幔,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年轿塔,在試婚紗的時候發(fā)現(xiàn)自己被綠了特愿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡勾缭,死狀恐怖揍障,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俩由,我是刑警寧澤毒嫡,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站幻梯,受9級特大地震影響兜畸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碘梢,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一咬摇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煞躬,春花似錦肛鹏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雷客,卻和暖如春芒珠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搅裙。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工皱卓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人部逮。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓娜汁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甥啄。 傳聞我的和親對象是個殘疾皇子存炮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359