Ubuntu16.04編譯tensorflow的C++接口

之前有一篇介紹到在windows下利用VS2015編譯tensorflow的C++接口,接下來這篇就介紹下在Ubuntu下編譯tensorflow的C++接口阎毅。
先說一下我的電腦配置焚刚,首先是Ubuntu16.04,anaconda用的是3.4.2扇调,CUDA用的是9.0的矿咕,cudnn用的是7.0.5的。因為已經(jīng)在anaconda3上安裝好了tensorflow1.7的,但是這次要編譯C++的接口碳柱,所以我還是選擇編譯tensorflow1.7的源碼捡絮。最近重新編譯的時候改用了tensorflow1.12。

一莲镣、準備編譯環(huán)境

編譯這里要用到bazel來編譯福稳,所以要安裝它,Ubuntu下安裝的指令如下:

echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list

然后輸入以下指令:

curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -

更新:

sudo apt-get update

安裝bazel:

sudo apt-get install bazel

這里不要這么做了瑞侮,因為這么做會把bazel更新到最新的版本的圆,但是編譯tensorflow的時候,不同tensorflow要與bazel的版本是對應(yīng)的半火,如果這么做的話越妈,后面的操作就會出錯,而且也不知道怎么解決钮糖。正確的做法應(yīng)該是下載對應(yīng)的版本來安裝bazel梅掠,tensorflow與bazel的版本應(yīng)該在tensorflow的官網(wǎng)查找:https://tensorflow.google.cn/install/source

linux下tensorflow與python、GCC店归、Bazel的版本關(guān)系阎抒,GCC倒是沒有問題,應(yīng)該支持C++11就可以消痛,但bazel就真的還是要對應(yīng)好版本且叁,不然一大堆問題,折騰肄满。

| Version | Python version | Compiler | Build tools |
| tensorflow-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 |
| tensorflow-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 |
| tensorflow-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
| tensorflow-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
| tensorflow-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
| tensorflow-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
| tensorflow-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
| tensorflow-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
| tensorflow-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
| tensorflow-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
| tensorflow-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
| tensorflow-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
| tensorflow-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |

| Version | Python version | Compiler | Build tools | cuDNN | CUDA |
| tensorflow_gpu-1.14.0 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.24.1 | 7.4 | 10.0 |
| tensorflow_gpu-1.13.1 | 2.7, 3.3-3.7 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
| tensorflow_gpu-1.12.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.11.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.10.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
| tensorflow_gpu-1.9.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
| tensorflow_gpu-1.8.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
| tensorflow_gpu-1.7.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
| tensorflow_gpu-1.6.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
| tensorflow_gpu-1.5.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
| tensorflow_gpu-1.4.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
| tensorflow_gpu-1.3.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
| tensorflow_gpu-1.2.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
| tensorflow_gpu-1.1.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
| tensorflow_gpu-1.0.0 | 2.7, 3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |

其他的應(yīng)該就沒啥谴古,就是這個bazel把我給折騰的啊

這里tensorflow1.12對應(yīng)的bazel版本是0.15.0质涛,所以去github搜bazel下載http://bazel-0.15.0-installer-linux-x86_64.sh稠歉,然后安裝。

二汇陆、下載tensorflow源碼

tensorflow的源碼是在github上就可以下載的怒炸,目前已經(jīng)更新到1.11,但是我還是下載了1.7的版本毡代,我下載的是版本1.12的阅羹。下載之后解壓出來。

三教寂、配置編譯環(huán)境

解壓源碼之后捏鱼,進入根目錄,輸入指令:

./configure

接下來就是配置清單:


image.png

image.png

這里要說明的是如果有CUDA酪耕,那么Do you wish to build Tensorflow with CUDA?一定要選Y导梆,然后其它的我基本都是N
配置好之后就進行編譯:

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

這里如果不用cuda的話(前面配置的時候就不要在CUDA那一項那里輸入Y),就輸入:

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

然后是等待,這個過程大概會花費30分鐘左右看尼,而且CPU的占用量是達到100%的递鹉,所以這個時候最好就不要坐別的事情了。
編譯之后我這里會有一個問題(這個問題我在編譯tensorflow1.12的時候沒有遇到藏斩,所以看不同版本吧):

image.png

這個錯誤并不是因為文件沒有而是因為找不到躏结,實際上,這個文件就在tensorflow-r1.7/tensorflow文件夾下狰域,但是需要修改/tensorflow-r1.7/tensorflow/BUILD這個文件才行媳拴,打開這個文件之后修改大概在812行,注釋掉后北专,另起一行設(shè)置正確的路徑:


image.png

修改之后重新輸入編譯的指令編譯一次就可以了禀挫。編譯好之后在文件夾tensorflow-r1.7/bazel-bin/tensorflow下面,會有兩個so文件:libtensorflow_cc.so和libtensorflow_framework.so拓颓,這兩個就是我們需要的语婴。

四、一些錯誤

下面這幾個錯誤都是在使用的時候發(fā)現(xiàn)的驶睦,主要是在編譯的時候有些依賴文件沒有下載到砰左,所以需要自己去下載。
(1)场航、nsync_cv.h文件缺失:
這個文件一般是會在tensorflow/contrib/makefile/downloads/nsync/public這個文件夾下的缠导,但是我這邊是編譯tensorflow的時候有些依賴文件沒有下載到導(dǎo)致它缺失,解決方法是存在/tensorflow/contrib/makefile/download_dependencies.sh這個文件溉痢,執(zhí)行它來下載相關(guān)的文件僻造,相關(guān)文件會放在/tensorflow根目錄/tensorflow/contrib/makefile/downloads這個文件夾下;
(2)、提示Eigen相關(guān)的問題
這個問題跟前面的類似孩饼,如果下載了相關(guān)的依賴文件之后髓削,在/tensorflow-r1.7/tensorflow/contrib/makefile/downloads文件夾下找到eigen文件夾,進入之后執(zhí)行以下指令進行eigen的編譯:

mkdir build
cd build
cmake ..
make
sudo make install

(3)镀娶、提示關(guān)于protobuf版本的問題
問題如下:

image

這個主要是protobuf版本的問題立膛,所以要查看bazel-genfiles/tensorflow/core/framework/types.pb.h這個文件夾中關(guān)于protobuf的版本要求,然后下載相應(yīng)的版本來更新即可梯码,這里tensorflow1.12要求是protobuf要大于等于3.6
image

所以就去github上下載對應(yīng)的protobuf版本宝泵。要下載源碼,然后編譯安裝即可轩娶。
暫時我就遇到這幾個問題儿奶,之后如果還有遇到其它問題,我會繼續(xù)更新的鳄抒。

五闯捎、參考

1搅窿、https://blog.csdn.net/zwx1995zwx/article/details/79064064


陽光
在天上一閃
又被烏云埋掩
暴雨沖洗著
我靈魂的底片

-- 顧城

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隙券,隨后出現(xiàn)的幾起案子男应,更是在濱河造成了極大的恐慌,老刑警劉巖娱仔,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沐飘,死亡現(xiàn)場離奇詭異,居然都是意外死亡牲迫,警方通過查閱死者的電腦和手機耐朴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盹憎,“玉大人筛峭,你說我怎么就攤上這事∨忝浚” “怎么了影晓?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長檩禾。 經(jīng)常有香客問我挂签,道長,這世上最難降的妖魔是什么盼产? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任饵婆,我火速辦了婚禮,結(jié)果婚禮上戏售,老公的妹妹穿的比我還像新娘侨核。我一直安慰自己,他們只是感情好灌灾,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布搓译。 她就那樣靜靜地躺著,像睡著了一般紧卒。 火紅的嫁衣襯著肌膚如雪侥衬。 梳的紋絲不亂的頭發(fā)上诗祸,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天跑芳,我揣著相機與錄音,去河邊找鬼直颅。 笑死博个,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的功偿。 我是一名探鬼主播盆佣,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼往堡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了共耍?” 一聲冷哼從身側(cè)響起虑灰,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痹兜,沒想到半個月后穆咐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡字旭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年对湃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遗淳。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拍柒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屈暗,到底是詐尸還是另有隱情拆讯,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布养叛,位于F島的核電站往果,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏一铅。R本人自食惡果不足惜陕贮,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潘飘。 院中可真熱鬧肮之,春花似錦、人聲如沸卜录。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽艰毒。三九已至筐高,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丑瞧,已是汗流浹背柑土。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绊汹,地道東北人稽屏。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像西乖,于是被迫代替她去往敵國和親狐榔。 傳聞我的和親對象是個殘疾皇子坛增,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容