TensorFlow 與Odroid XU4 搭建脫坑指南

寫(xiě)在前面

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

“背景介紹”

TensorFlow

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

TensorFlow

自從2010年以來(lái)Google為它旗下的產(chǎn)品線(xiàn)建立了一套專(zhuān)有的名叫DistBelief的機(jī)器學(xué)習(xí)系統(tǒng),以推動(dòng)Google的業(yè)務(wù)發(fā)展。后來(lái)于是Google使用它原有的的DistBelief 代碼庫(kù)重構(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 是由一家位于韓國(guó)名叫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組。雖然市場(chǎng)上戲稱(chēng)“膠水八核”,但是其強(qiáng)勁的單板工作主頻和較低的功耗 ,甚至支持USB3的體質(zhì)還是不得不讓人側(cè)目。與Raspberry Pi 3相比,Odroid
XU4能提供的運(yùn)算能力絕對(duì)值回票價(jià)。

Odroid XU4

“上集回顧”

搞事情

嘗試

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

為了驗(yàn)證他說(shuō)明的方向是否正確,我在一個(gè)月中斷斷續(xù)續(xù)的遵循著他的思路從Bazel 開(kāi)始編譯,再到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 最下面的頁(yè)面 中 或者我在這里抄過(guò)來(lái)的列表中看出。
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

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

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

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


靈光一閃

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

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

正牌的操作指南

好了,看到這里我想有的同學(xué)應(yīng)該是要打退堂鼓了。 也有另外的同學(xué)知道我想做什么了。沒(méi)關(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 我們需要大量的庫(kù)文件和Python來(lái)推動(dòng)它的正常運(yùn)作。因此,請(qǐng)準(zhǔn)備以下代碼 來(lái)安裝必要的組件和庫(kù)文件
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 到最新,否則是無(wú)法安裝的。
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的庫(kù)文件
    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. 等待。。。。。。。。。。漫長(zhǎng)的等待

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

  1. 在經(jīng)過(guò)漫長(zhǎng)的等待以后,我們可以使用命令來(lái)驗(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 的安裝??梢杂淇斓拈_(kāi)始搞事情啦

安裝成功

共享資源

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

常見(jiàn)錯(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è)問(wèn)題是由于沒(méi)有安裝對(duì)應(yīng)h5py的庫(kù)文件造成的
使用 sudo apt-get install libhdf5-serial-dev hdf5-tools 安裝確實(shí)的庫(kù)文件后再次安裝即可

  1. TensorFlow 已經(jīng)安裝完畢,但是無(wú)法調(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è)就是明顯沒(méi)仔細(xì)看我一開(kāi)始要求安裝的庫(kù)文件咯~
使用下列命令可破

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容