| 撰寫/攝影 | CH.Tseng |
| 部落格 | https://chtseng.wordpress.com/ |
| https://www.facebook.com/chenghsun.tseng |
Nvidia Jetson是Nvidia為Embedded system所量身打造的運算平台,包含了TK1、TX1、TX2、AGX Xavier以及最新也最小的「Nano」開發板。這一系列的Jetson平台皆包含了一顆NVidia為隨身裝置所開發,內含ARM CPU、NVida GPU、RAM、南北橋等,代號為Tegra的SoC處理器。
Jetson家族比較
| TK1 | TX1 | TX2 | AGX Xavier | Nano | |
| GPU cores | 192 Core | 256 Core | 256 Core | 512 Core | 128 Core |
| CPU | 4 core | 4 core | 6 core | 8 core | 4 core |
| Memory | 2GB DDR3 | 4GB DDR4 | 4GB DDR48GB DDR4
二種版本 |
16GB DDR4 | 4GB DDR4 |
| Storage | 16GB eMMC | 16GB eMMC | 32GB eMMC | 32GB eMMC | SD(開發板)16GB eMMC
(二種版本) |
| Video Encode | 1080p@30 | 4K@30 | (3x) 4K@30 | (4x) 4Kp60 / (8x) 4Kp30 | 4K@30 |
| Video Decode | 1080p@60 | 4K@60 | (2x) 4K@60 | (2x) 8Kp30 / (6x) 4Kp60 | 4K@60 |
| WI-FI | O | O | O | O | X |
| Bluetooth | X | O | O | O | X |
| Power | 5W | 10W / 15W | 7.5W / 15W | 10W / 15W / 30W | 10W |
| USB | USB 3.0 | USB 3.0 + USB 2.0 | USB 3.0 + USB 2.0 | USB 3.0 + USB 2.0 | USB 3.0 + USB 2.0 |
Jetson Nano & Raspberry Pi
下圖可見Jetson Nano與樹莓派在尺寸上差異,雖然兩者都面向maker市場,但功能及配備上有著不小的差異。樹莓派雖然在運算效能上遠遠落後,但是內建WIFI、Bluetooh、Audio,更為小巧的體積及電源耗用,在較為嚴苛的環境仍有其優勢。


| Jetson Nano | Raspberry Pi | |
| CPU | 64-bit Quad-core ARM A57 (1.43 GHz) | 1.4 GHz 64-bit quad-core ARM Cortex-A53 |
| GPU | 128-Core Nvidia Maxwell | Broadcom VideoCore IV |
| RAM | 4GB DDR4 | 1GB DDR2 |
| WIFI | X | 802.11ac |
| Bluetooth | X | LE 4.2 |
| Ethernet | Gigbit | Gigbit (300Mbps max) |
| GPIO | 40 pin | 40 pin |
| USB | USB 2.0 x 3USB 3.0 x 1 | USB 2.0 x 4 |
| Audio | X | Audio jack |
| Power | 5~10W | 400 mA (2.0W) |
| Price | $99 | $35 |
| 算力 | 472 Gflops | 24 Gflop |
Jetson Nano的電源供應
目前網路上已經有不少的開箱文及影片了,因此就略過不提。不過,如果您在購買時沒有額外購買電源供應器,僅透過一般PC上的USB port來供電,那麼當Jetson Nano在執行較多的運算或程式時,有極高的機率會直接當機或開不起來。官方建議是Adafruit此款2.5A電源供應器(USD $7.5):https://www.adafruit.com/product/1995
5V 2.5A Switching Power Supply with 20AWG MicroUSB Cable

我在露天找到此款便宜又大碗的4A電源僅TWD $240(接頭為5.5 x 2.1-2.5mm),目前用起來還沒有什麼問題:


Jetson Nano的Power jack可支援到5V 4A的輸入,因此改用Power jack而不使用Micro-USB,在電源供應上會比較穩定,也讓你的Jetson Nano執行起來比較讓人放心,不過記得J48要插上jumper後才會轉為由Power jack來供電(如下圖紅圈)。


下載Image檔及開機
請準備一片16GB以上的SD卡,接著從此網頁下載原廠的image檔(目前 release 2019/07/16),下載後使用Win32 Disk Imager寫入SD卡,插入Jetson Nano後開機便可直接使用了。
SD卡從下圖方向插入,跟樹莓派的前代一樣有彈簧卡榫,但不會有不小心按到彈出的缺點。

開機後的一些設定畫面,由於網路上教學已經很多,因此在此先略過不提。




目前NVidia Jetson系列所使用的Linux OS稱為Linux4Tegra,源碼是修改自Ubuntu 18.04版並針對Nvidia硬體作優化,預裝好了JetPack、cuda、cudnn、openc等軟體,不需要另行安裝。
Virtualenv安裝及設定
[pastacode lang=”markup” manual=”sudo%20apt-get%20install%20virtualenv%20-y%0A%0Amkdir%20envs%3B%20cd%20envs%0A%0Avirtualenv%20%E2%80%93p%20python3%20AI%0A%0Asource%20~%2Fenvs%2FAI%2Fbin%2Factivate%0A%0Aecho%20’%20source%20~%2Fenvs%2FAI%2Fbin%2Factivate%20’%20%3E%3E%20~%2F.bashrc” message=”” highlight=”” provider=”manual”/]設定OpenCV
已內建安裝了OpenCV,因此並不需要重新安裝,但是需要在python virtual environment中link到site-packages。
[pastacode lang=”markup” manual=”sudo%20find%20%2F%20-name%20%22cv2*%22%0A%0A%5Bsudo%5D%20password%20for%20pi%3A%0A%0Afind%3A%20%E2%80%98%2Frun%2Fuser%2F1000%2Fgvfs%E2%80%99%3A%20Permission%20denied%0A%0A%2Fusr%2Flib%2Fpython2.7%2Fdist-packages%2Fcv2.so%0A%0A%2Fusr%2Flib%2Fpython3.6%2Fdist-packages%2Fcv2.cpython-36m-aarch64-linux-gnu.so%0A%0Acd%20~%2Fenvs%2FAI%2Flib%2Fpython3.6%2Fsite-packages%2F%0A%0Aln%20-s%20%2Fusr%2Flib%2Fpython3.6%2Fdist-packages%2Fcv2.cpython-36m-aarch64-linux-gnu.so” message=”” highlight=”” provider=”manual”/]測試看看:

看來OpenCV預裝的3.3.1版本不太新,且該版本未支援Deep Neural Networks的DNN模組,不過由於NVidia GPU也尚未支援OpenCV DNN,因此影響不大。
安裝常用的模組
[pastacode lang=”markup” manual=”sudo%20apt-get%20update%0A%0Asudo%20apt-get%20upgrade%0A%0Asudo%20apt-get%20install%20libfreetype6-dev%20pkg-config%20-y%0A%0Asudo%20apt-get%20install%20zlib1g-dev%20zip%20libjpeg8-dev%20libhdf5-dev%20-y%0A%0Asudo%20apt-get%20install%20libssl-dev%20libffi-dev%20python3-dev%20-y%0A%0Asudo%20apt-get%20install%20libhdf5-serial-dev%20hdf5-tools%20-y%0A%0Asudo%20apt-get%20install%20libblas-dev%20liblapack-dev%0Asudo%20apt-get%20install%20%20libatlas-base-dev%20-y%0A%0Asudo%20apt-get%20install%20build-essential%20cmake%20libgtk-3-dev%20libboost-all-dev%20-y%0A%0Asudo%20apt-get%20install%20nano%20-y%0A%0Apip%20install%20matplotlib%0A%0Apip%20install%20scikit-build%0A%0Apip%20install%20imutils%0A%0Apip%20install%20pillow” message=”” highlight=”” provider=”manual”/]安裝Scipy, Scikit-learn, Keras, Jupyter notebook
想到能夠在GPU上執行這些常用的AI軟體就非常興奮,雖然只是在小小的Jetson Nano上。
[pastacode lang=”markup” manual=”pip%20install%20scipy%0A%0Apip%20install%20keras%0A%0Apip%20install%20scikit-learn%0A%0Apip%20install%20jupyter%20notebook” message=”” highlight=”” provider=”manual”/]安裝Tensorflow
查看目前支援的Tensorflow版本:https://developer.nvidia.com/embedded/downloads#?search=TensorFlow

測試看看,版本為1.13.1:

開啟SWAP
預設並沒有設定SWAP,所以Jetson Nano一run超過記憶體就立即當機了。
先輸入下方的指令看看,顯示沒有設定任何的SWAP:
[pastacode lang=”markup” manual=”sudo%20swapon%20%E2%80%93show” message=”” highlight=”” provider=”manual”/]一般idle情況下就只有2.6G可用。

SD卡空間目前剩下約17G可用。

理想的SWAP size應是RAM的二倍,但由於SD空間不是很充裕,先設定4G SWAP。
[pastacode lang=”markup” manual=”sudo%20fallocate%20-l%204G%20%2Fswapfile%0A%0Asudo%20chmod%20600%20%2Fswapfile%0A%0Als%20-lh%20%2Fswapfile” message=”” highlight=”” provider=”manual”/]![]()
建立並啟用SWAP。
[pastacode lang=”markup” manual=”sudo%20mkswap%20%2Fswapfile%0A%0Asudo%20swapon%20%2Fswapfile%0A%0Asudo%20swapon%20%E2%80%93show” message=”” highlight=”” provider=”manual”/]
輸入free -h確認已經有4G SWAP空間了。
[pastacode lang=”markup” manual=”free%20%E2%80%93h” message=”” highlight=”” provider=”manual”/]由於重開機後SWAP設定便會跑掉,因此,把SWAP加到fstab設定檔中。
[pastacode lang=”markup” manual=”sudo%20cp%20%2Fetc%2Ffstab%20%2Fetc%2Ffstab.bak%0A%0Aecho%20’%2Fswapfile%20none%20swap%20sw%200%200’%20%7C%20sudo%20tee%20-a%20%2Fetc%2Ffstab” message=”” highlight=”” provider=”manual”/]安裝DLIB
讓我們也能在Jetson GPU上使用Dlib的機器學習、計算機視覺、圖像處理等函式庫。
您可採用下列的方式從source安裝,亦可簡單的透過 php install dlib來安裝,但注意使用pip此法安裝無法使用到GPU。
[pastacode lang=”markup” manual=”mkdir%20temp%3B%20cd%20temp%0A%0Agit%20clone%20https%3A%2F%2Fgithub.com%2Fdavisking%2Fdlib.git%0A%0Acd%20dlib%0A%0Amkdir%20build%3B%20cd%20build%0A%0Acmake%20..%20-DDLIB_USE_CUDA%3D1%20-DUSE_AVX_INSTRUCTIONS%3D1%0A%0Acmake%20–build%20.%0A%0Acd..%0A%0Apython%20setup.py%20install%0A%0Asudo%20ldconfig” message=”” highlight=”” provider=”manual”/]安裝過程中,DLIB會自動偵測已安裝的CUDA版本(Nnao為10.0)。
如果過程中有碰到如下的error:
fatal error: Python.h: No such file or directory 的error message
請找到Python.h的path後,再設定CPLUS_INCLUDE_PATH環境變數,重新安裝即可。
sudo find / -name “Python.h”
/usr/include/python3.6m/Python.h
/usr/include/python2.7/Python.h
export CPLUS_INCLUDE_PATH=/usr/include/python3.6m
安裝Darknet
Darknet framework,讓Jetson Nano可訓練或透過Darknet推論YOLO model。
將下列兩行加到 ~/.bashrc後方
[pastacode lang=”markup” manual=”export%20PATH%3D%24%7BPATH%7D%3A%2Fusr%2Flocal%2Fcuda%2Fbin%0A%0Aexport%20LD_LIBRARY_PATH%3D%24%7BLD_LIBRARY_PATH%7D%3A%2Fusr%2Flocal%2Fcuda%2Flib64%0A%0Agit%20clone%20https%3A%2F%2Fgithub.com%2Fpjreddie%2Fdarknet%0A%0Acd%20darknet%2F%0A%0Anano%20Makefile” message=”” highlight=”” provider=”manual”/]將Makefile中的下列參數內容更改為1
[pastacode lang=”markup” manual=”GPU%3D1%0A%0ACUDNN%3D1%0A%0AOPENCV%3D1″ message=”” highlight=”” provider=”manual”/]更改後存檔,執行 make 即完成。
安裝YOLO3-4-Py
讓Jetson Nano可透過Python在GPU推論YOLO model。
[pastacode lang=”markup” manual=”export%20GPU%3D1%0A%0Apip%20install%20yolo34py-gpu” message=”” highlight=”” provider=”manual”/]安裝Jetson.GPIO
讓我們能透過Python操控Jetson Nano上的40組GPIO接腳。
[pastacode lang=”markup” manual=”pip%20install%20Jetson.GPIO%0A%0Asudo%20groupadd%20-f%20-r%20gpio%0A%0A%23%E8%AB%8B%E5%B0%87%E4%B8%8B%E6%96%B9%E7%9A%84pi%E6%94%B9%E7%82%BA%E4%BD%A0%E8%87%AA%E5%B7%B1%E7%9A%84account%0A%0Acd%20practicesudo%20usermod%20-a%20-G%20gpio%20pi%0A%0Asudo%20cp%20%2Fopt%2Fnvidia%2Fjetson-gpio%2Fetc%2F99-gpio.rules%20%2Fetc%2Fudev%2Frules.d%2F” message=”” highlight=”” provider=”manual”/]最後,請重開機或執行
[pastacode lang=”markup” manual=”sudo%20udevadm%20control%20–reload-rules%20%26%26%20sudo%20udevadm%20trigger” message=”” highlight=”” provider=”manual”/]安裝Jetson stats
這是一套非常好用、針對NVIDIA Jetson系列所開發的資源監控工具。
[pastacode lang=”markup” manual=”git%20clone%20https%3A%2F%2Fgithub.com%2Frbonghi%2Fjetson_stats.git%0A%0Acd%20jetson_stats%2F%0A” message=”” highlight=”” provider=”manual”/]執行ntop,可看到CPU、GPU、memory、Disk的耗用情況、以及電量、溫度等資訊。

執行jetson_release可顯示本環境中所安裝的NVIDIA Jetson各項版本資訊。

使用Keras+Jupyter notebook訓練 CIFAR 10
訓練時Jetson Nano的GPU使用率約在60~80%之間,每個epoch執行時間約30秒,訓練過程及結果請參考:https://github.com/ch-tseng/jetson_nano_test/blob/master/CIFAR10-Training-on-a-Jetson_Nano.ipynb 。
CIFAR10 訓練時的資源秏用:

坦白說,這速度並不很讓人滿意,使用i7 7600K每個epoch的速度約8秒,仍遠勝Jetson Nano的128 GPU Cores,看來將Nano用來作為training用途是不太實際的想法。
執行Tensorflow models
TensorRT是NVidia推出專用於模型推理的一種神經網路推理加速器,可透過優化模型來加速推論時的速度,尤其應用於Jetsosn系列,速度可提昇至8~15倍以上。不過,為了實際感受Jetson Nano 128 Core GPU的速度,在下方的範例我都沒有使用TensorRT而是直接使用TF Frozen Graph,因此FPS的數字看來並不是想像中那麼美好,不過以$99美元的開發板來說,這速度和樹莓派比較起來已經相當超質了。(請注意Nano全速運轉時,上面那一大塊散熱板可作為烤肉盤使用)
自己訓練的指尖/手掌偵測模型(SSD-MobileNet V2)
透過OpenCV+Python call Tensorflow-gpu 執行。
速度:7.5 FPS
YOLOV3-Tiny + COCO Dataset
使用darknet程式直接執行,未透過python。
速度:9-11 FPS
YOLOV3-Tiny + 自己訓練的行車道路缺陷偵測模型
使用darknet程式直接執行,未透過python。
速度:5~6 FPS
想了解更多CH.Tseng,可以點此連結 瀏覽更多文章喔~





