寫在前面
本期文章基本上在先講一件事本谜,放棄從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
來獲取筑煮。
自從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à)。
“上集回顧”
搞事情
嘗試
由于業(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。
于是在經(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)排除荣恐。安心跟我上路吧。
- 準(zhǔn)備好Ubuntu 16.04 的鏡像累贤,并刷入SD卡叠穆。我們所需要的鏡像可以在官方給出的WIKI中找到。
https://wiki.odroid.com/odroid-xu4/os_images/linux/ubuntu_4.14/ubuntu_4.14
- 環(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
- 安裝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
- 當(dāng)升級(jí)完成以后我們還必須安裝Python的庫文件
Python2.7
pip2 install h5py six numpy wheel mock
Python3.5
pip3 install h5py six numpy wheel mock
- 下載并安裝 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 是不能互用的嚷硫。
- 等待。始鱼。仔掸。。医清。起暮。。会烙。负懦。。漫長的等待
等待永遠(yuǎn)是漫長的柏腻,看不到時(shí)間纸厉,看不清即將到來,在等著五嫂,等到焦灼颗品。甚至有時(shí)自己都會(huì)恍惚,是在等即將到來,還是等到來時(shí)的那一刻欣喜抛猫,這份欣喜里藏著那不言而喻的激動(dòng)與渴望蟆盹。 等待是不可思議的藝術(shù)。
- 在經(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ò)誤
- 在使用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í)的庫文件后再次安裝即可
- 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