TensorFlow 與Odroid XU4 搭建脫坑指南

寫在前面

本期文章基本上在先講一件事本谜,放棄從source code compile吧村生,這時(shí)間上投入根本不值得晴圾。如果只想知道如何完成構(gòu)建柬甥,可以忽略前面的“上集回顧”和“背景介紹”黄绩,直接跳轉(zhuǎn)到后面的指南部分羡洁。

“背景介紹”

TensorFlow

TensorFlow 是什么呢?TensorFlow 是Google 商業(yè)化了的一種用于感知和語言理解人物的機(jī)器學(xué)習(xí)的開源軟件庫爽丹。我們可以通過訪問 https://www.tensorflow.org/ 的官方頁面以及它在GitHub 上的 Repository https://github.com/tensorflow/tensorflow 來獲取筑煮。

TensorFlow

自從2010年以來Google為它旗下的產(chǎn)品線建立了一套專有的名叫DistBelief的機(jī)器學(xué)習(xí)系統(tǒng)辛蚊,以推動(dòng)Google的業(yè)務(wù)發(fā)展。后來于是Google使用它原有的的DistBelief 代碼庫重構(gòu)演進(jìn)成了現(xiàn)在的TensorFlow真仲。首次發(fā)布的TensorFlow 與2016年發(fā)布嚼隘,并且從原始的Linux/Unix 環(huán)境下逐步向IOS、Android袒餐、Windows系統(tǒng)演進(jìn)飞蛹。

Odroid XU4

Odroid 是由一家位于韓國名叫HardKernel 的公司設(shè)計(jì)制造的。該公司目前提供的single-board computers (單片機(jī))和平板中不僅能夠支持 Android 系統(tǒng)灸眼,也能運(yùn)行常規(guī)的Linux 發(fā)行版卧檐。HardKernel 旗下?lián)碛?Odroid-A4、Odroid-X焰宣、Odroid-Q霉囚、Odroid-U、XU3 等一系列的單片機(jī)匕积。值得一提的是XU3盈罐、XU4兩只單片機(jī)擁有Cortex-A15 + A7 的 4 + 4 (雙核?) 2.0GHz + 1.5GHz 的 CPU組闪唆。雖然市場上戲稱“膠水八核”盅粪,但是其強(qiáng)勁的單板工作主頻和較低的功耗 ,甚至支持USB3的體質(zhì)還是不得不讓人側(cè)目悄蕾。與Raspberry Pi 3相比票顾,Odroid
XU4能提供的運(yùn)算能力絕對(duì)值回票價(jià)。

Odroid XU4

“上集回顧”

搞事情

嘗試

由于業(yè)務(wù)原因帆调,當(dāng)目前公司提出的氣象信息收集傳感器已經(jīng)無法承載現(xiàn)有的數(shù)據(jù)更新的時(shí)候奠骄,我們發(fā)現(xiàn)使用Odroid XU4 完成初步運(yùn)算識(shí)別然后再發(fā)回公司主服務(wù)器,不失為一種新的解決方案番刊。
然而Odroid XU4 的市場占有率并不高含鳞,網(wǎng)絡(luò)上有的信息也并不完整。Tom Jacobs 雖然在他的Blog中發(fā)出過如何構(gòu)建TensorFlow芹务,然而他所指明的方向卻是從0開始蝉绷。 對(duì),從source code 開始compile锄禽。
原文連接在此: https://hackernoon.com/running-yolo-on-odroid-yolodroid-5a89481ec141

為了驗(yàn)證他說明的方向是否正確醋粟,我在一個(gè)月中斷斷續(xù)續(xù)的遵循著他的思路從Bazel 開始編譯练链,再到TensorFlow 的構(gòu)建涯冠。然而拣挪,隨著時(shí)間和精力的投入,我發(fā)現(xiàn)這個(gè)思路根本就是行!不垂攘!通维雇!
按照Tom Jacobs 的文章走,一定會(huì)卡在兩個(gè)地方晒他。

  • Bazel 的版本吱型。
    TensorFlow 對(duì)應(yīng)的Bazel Build 的版本是有特別限制的,我們可以在
    https://www.tensorflow.org/install/source 最下面的頁面 中 或者我在這里抄過來的列表中看出陨仅。
Version Python version Compiler Build tools
tensorflow-1.11.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

這簡直是無理無情津滞,還在無理取鬧。在編譯Bazel 中還有另外一個(gè)智障問題灼伤,那就是 locale 問題触徐。在對(duì)Bazel 0.5.4 編譯時(shí)會(huì)出現(xiàn)JAVA無法調(diào)取locale 的問題,然后就真的是“編狐赡!不撞鹉!下!去颖侄!了鸟雏!”。雖然后續(xù)版本已經(jīng)解決览祖,但是這也導(dǎo)致與其對(duì)應(yīng)TensorFlow 1.4版本是不可能完成的任務(wù)了

  • TensorFlow 的編譯錯(cuò)誤孝鹊。
    在TensorFlow 的編譯中我們還能遇到二個(gè)智障問題,那就是Bazel在編譯TensorFlow 的過程中占用太多內(nèi)存穴墅,導(dǎo)致GCC停止編譯惶室。另外一個(gè)問題就是 編譯時(shí)必須加入--conlyopt=-std=gnu99 讓GCC得以明白應(yīng)該是使用C99 代碼式來編譯C。
    認(rèn)真的玄货?

于是在經(jīng)歷了痛苦的折磨以后,一道靈光劃過悼泌。真相可能不止一個(gè)松捉。


靈光一閃

既然Odroid用的是ARMV7的CPU,那么它就應(yīng)該就是個(gè)大號(hào)馆里、加量隘世、大碗版本的Raspberry Pi! 那么TensorFlow其實(shí)已經(jīng)有人趟過RaspberryPi 和 TensorFlow 兼容地雷了鸠踪,為什么我們還要繼續(xù)走雷區(qū)丙者?另外,雖然 Odroid XU4 4 CPU 已經(jīng)很強(qiáng)悍了营密。但是和家用電腦比起來械媒,依然是鶸。每一次的調(diào)試編譯都會(huì)以半小時(shí)起步,而且上不封頂纷捞。這樣的花還不如直接使用x86/amd64 架構(gòu)的主機(jī)CPU來給Respberry Pi 編譯封包呢痢虹。這部分已經(jīng)實(shí)驗(yàn)成功,想看的同學(xué)主儡,我會(huì)在以后得文章里寫出奖唯。

于是,感謝 Leonardo lontra 在他的項(xiàng)目 https://github.com/lhelontra/tensorflow-on-arm/releases 中創(chuàng)造了寶貴的財(cái)產(chǎn)---> 已經(jīng)編譯過糜值,并且適用于ARM CPU 使用的 TensorFlow7峤荨!

正牌的操作指南

好了寂汇,看到這里我想有的同學(xué)應(yīng)該是要打退堂鼓了病往。 也有另外的同學(xué)知道我想做什么了。沒關(guān)系健无,本文已經(jīng)把潛在地雷已經(jīng)排除荣恐。安心跟我上路吧。

  1. 準(zhǔn)備好Ubuntu 16.04 的鏡像累贤,并刷入SD卡叠穆。我們所需要的鏡像可以在官方給出的WIKI中找到。
    https://wiki.odroid.com/odroid-xu4/os_images/linux/ubuntu_4.14/ubuntu_4.14
  2. 環(huán)境構(gòu)建, TensorFlow 我們需要大量的庫文件和Python來推動(dòng)它的正常運(yùn)作臼膏。因此硼被,請(qǐng)準(zhǔn)備以下代碼 來安裝必要的組件和庫文件
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get install -y pkg-config zip g++ zlib1g-dev unzip wget curl -y
sudo apt-get install -y gcc-4.8 g++-4.8 -y
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
apt-get install -y libstdc++6
sudo apt-get install -y libhdf5-serial-dev hdf5-tools

  1. 安裝Python, Python 現(xiàn)在有2.7和3.5 兩個(gè)不同的版本請(qǐng)根據(jù)自己的需要酌情安裝
    (當(dāng)然你也可以“我全都要”)

Python2.7

sudo apt-get install python-pip python-numpy swig python-dev

Python3.5

sudo apt-get install python3-pip python3-numpy swig python3-dev     

并且升級(jí)PIP 到最新,否則是無法安裝的渗磅。
Python 2.7

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py

Python 3

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
  1. 當(dāng)升級(jí)完成以后我們還必須安裝Python的庫文件
    Python2.7
pip2 install h5py six numpy wheel mock

Python3.5

pip3 install h5py six numpy wheel mock
  1. 下載并安裝 TensorFlow
    https://github.com/lhelontra/tensorflow-on-arm/releases

Python2.7

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.11.0/tensorflow-1.11.0-cp27-none-linux_armv7l.whl
pip2 install ./tensorflow-1.11.0-cp27-none-linux_armv7l.whl

Python3.5

wget https://github.com/lhelontra/tensorflow-on-arm/releases/download/v1.11.0/tensorflow-1.11.0-cp35-none-linux_armv7l.whl
pip3 install ./tensorflow-1.11.0-cp35-none-linux_armv7l.whl

注意Python2.7 和3.5 版本的TensorFlow 是不能互用的嚷硫。

  1. 等待。始鱼。仔掸。。医清。起暮。。会烙。负懦。。漫長的等待

等待永遠(yuǎn)是漫長的柏腻,看不到時(shí)間纸厉,看不清即將到來,在等著五嫂,等到焦灼颗品。甚至有時(shí)自己都會(huì)恍惚,是在等即將到來,還是等到來時(shí)的那一刻欣喜抛猫,這份欣喜里藏著那不言而喻的激動(dòng)與渴望蟆盹。 等待是不可思議的藝術(shù)。

  1. 在經(jīng)過漫長的等待以后闺金,我們可以使用命令來驗(yàn)證TensorFlow 是否正確安裝逾滥,并且能被調(diào)用

Python 2
python -c 'import tensorflow as tf; print(tf.__version__)'

Python 3
python3 -c 'import tensorflow as tf; print(tf.__version__)'

如果能正常顯示版本號(hào),比如這個(gè)版本的是1.11.0. 那么恭喜你已經(jīng)完成了TensorFlow 的安裝败匹≌迹可以愉快的開始搞事情啦

安裝成功

共享資源

當(dāng)然你要是嫌棄自己操作不來,那么我還有我自己已經(jīng)構(gòu)建好的Docker image 掀亩。參考https://docs.docker.com/install/后安裝Docker舔哪,然后就可以從我的Docker庫拉下來并且直接使用。
Enjoy槽棍!
Docker File:https://github.com/infinitysky/Odroid_Tensorflow_Docker/tree/Dev
(還在驗(yàn)證和開發(fā)中)
Docker hub :https://hub.docker.com/r/infinitysky/odroidtensorflow/

常見錯(cuò)誤

  1. 在使用PIP安裝 h5py 是出現(xiàn)下列錯(cuò)誤
In file included from /usr/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarraytypes.h:1777:0,
                   from /usr/lib/python2.7/dist-packages/numpy/core/include/numpy/ndarrayobject.h:18,
                   from /usr/lib/python2.7/dist-packages/numpy/core/include/numpy/arrayobject.h:4,
                   from /tmp/pip-install-U0QZSk/h5py/h5py/api_compat.h:26,
                   from /tmp/pip-install-U0QZSk/h5py/h5py/defs.c:654:
  /usr/lib/python2.7/dist-packages/numpy/core/include/numpy/npy_1_7_deprecated_api.h:15:2: warning: #warning "Using deprecated NumPy API, disable it by " "#defining NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION" [-Wcpp]
   #warning "Using deprecated NumPy API, disable it by " \
    ^
  In file included from /tmp/pip-install-U0QZSk/h5py/h5py/defs.c:654:0:
  /tmp/pip-install-U0QZSk/h5py/h5py/api_compat.h:27:18: fatal error: hdf5.h: No such file or directory
  compilation terminated.
  error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
  Failed building wheel for h5py
  Running setup.py clean for h5py

這個(gè)問題是由于沒有安裝對(duì)應(yīng)h5py的庫文件造成的
使用 sudo apt-get install libhdf5-serial-dev hdf5-tools 安裝確實(shí)的庫文件后再次安裝即可

  1. TensorFlow 已經(jīng)安裝完畢捉蚤,但是無法調(diào)用或者調(diào)用出錯(cuò)怎么辦?

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/tensorflow/init.py", line 22, in <module>
from tensorflow.python import pywrap_tensorflow # pylint: disable=unused-import
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/init.py", line 49, in <module>
from tensorflow.python import pywrap_tensorflow
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow.py", line 74, in <module>
raise ImportError(msg)
ImportError: Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 28, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/pywrap_tensorflow_internal.py", line 24, in swig_import_helper
_mod = imp.load_module('_pywrap_tensorflow_internal', fp, pathname, description)
ImportError: /usr/lib/arm-linux-gnueabihf/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow_internal.so)

這個(gè)就是明顯沒仔細(xì)看我一開始要求安裝的庫文件咯~
使用下列命令可破

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get -y upgrade
apt-get install -y libstdc++6
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末炼七,一起剝皮案震驚了整個(gè)濱河市缆巧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豌拙,老刑警劉巖陕悬,帶你破解...
    沈念sama閱讀 212,029評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異按傅,居然都是意外死亡捉超,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門唯绍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拼岳,“玉大人,你說我怎么就攤上這事况芒×盐剩” “怎么了?”我有些...
    開封第一講書人閱讀 157,570評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵牛柒,是天一觀的道長。 經(jīng)常有香客問我痊乾,道長皮壁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評(píng)論 1 284
  • 正文 為了忘掉前任哪审,我火速辦了婚禮蛾魄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己滴须,他們只是感情好舌狗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扔水,像睡著了一般痛侍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上魔市,一...
    開封第一講書人閱讀 49,850評(píng)論 1 290
  • 那天主届,我揣著相機(jī)與錄音,去河邊找鬼待德。 笑死君丁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的将宪。 我是一名探鬼主播绘闷,決...
    沈念sama閱讀 39,006評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼较坛!你這毒婦竟也來了印蔗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,747評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤燎潮,失蹤者是張志新(化名)和其女友劉穎喻鳄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體确封,經(jīng)...
    沈念sama閱讀 44,207評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡除呵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了爪喘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颜曾。...
    茶點(diǎn)故事閱讀 38,683評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秉剑,靈堂內(nèi)的尸體忽然破棺而出泛豪,到底是詐尸還是另有隱情,我是刑警寧澤侦鹏,帶...
    沈念sama閱讀 34,342評(píng)論 4 330
  • 正文 年R本政府宣布诡曙,位于F島的核電站,受9級(jí)特大地震影響略水,放射性物質(zhì)發(fā)生泄漏价卤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評(píng)論 3 315
  • 文/蒙蒙 一渊涝、第九天 我趴在偏房一處隱蔽的房頂上張望慎璧。 院中可真熱鬧床嫌,春花似錦、人聲如沸胸私。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岁疼。三九已至阔涉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間五续,已是汗流浹背洒敏。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疙驾,地道東北人凶伙。 一個(gè)月前我還...
    沈念sama閱讀 46,401評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像它碎,于是被迫代替她去往敵國和親函荣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評(píng)論 2 349

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