2017年7月25日 星期二

NVIDIA TX1/TX2 學習筆記 - JetPack3.0 刷機

簡介
NVIDIA® Jetson™ TX2 是一台超高性能、低功耗的超級電腦模組,為機器人、無人機到企業協作終端裝置和智慧攝影機等裝置提供極快速與精準的人工智慧推論機制。

與功能強大的前身 Jetson TX1 相比,Jetson TX2 具備兩倍的運算效能卻只有一半的功耗。接近信用卡尺寸、約 7.5 瓦功耗的模組中,Jetson TX2 可為智慧城市、智慧工廠、機器人以及製造原型等裝置應用提供了絕佳的性能和準確性。

為了讓開發者快速上手,Jetson TX2 預先搭載了 JetPack 3.0 - 人工智慧運算和複雜多緒處理嵌入式應用開發最全面的 SDK。開發者可以在雲端、資料中心或是個人電腦上使用最新的 NVIDIA DIGITS™ 5.0 介面訓練深度學習模型,然後運用 JetPack 最新版本搭載的高性能推理引擎 TensorRT™ 1.0 將訓練完成的模型部署到 Jetson TX2。



TX2內部結構如下:



Jetson TX1/TX2 JetPack3.0刷機過程

於TX2上進行刷機的過程與TX1上大致相同,可參考以下連結操作。
Jetson TX1开发笔记(一):开机设置与刷机

在這邊我使用的是NVIDIA TX2,並搭配第三方(Connect Tech)的Carrier Board (Orbitty),如下圖。

TX2出廠時,已經自帶了Ubuntu 16.04,可以直接啟動。但一般我們還是會重新刷機,目的是更新到最新的JetPack L4T,並自動安裝最新的驅動、CUDA Toolkit、cuDNN、TensorRT。

刷機前須注意以下幾點:

1. Host也需要安裝Ubuntu,且至少預留 15 GB 硬碟空間。
2. 不要用 root 執行JetPack-${VERSION}.run,我使用的是JetPack-L4T-3.1-linux-x64.run
3. TX2需要進入Recovery Mode,進入方式參考說明書步驟
4. 刷機時間大概需要 1~2 小時,會格式化eMMC,並安裝部分必要元件

另外在刷機的過程中,有再遇到幾個問題,花了些在尋找答案...


1. 虛擬機器USB Port問題

由於Host端需要在Linux環境下才能進行刷機,若是使用虛擬機器 (VirtualBox)的話,
則需要注意連接到TX2 Micro USB的USB Port,必須要與TX2一致為USB 2.0。



2. TX2刷機失敗 (Boot Rom communication failed)

一開始照著上述的TX1刷機的方式執行,
這次在TX2上卻會顯示Boot ROM Communication Failed的錯誤訊息。

最後在網上搜尋了一番之後,並沒有找到在VirtualBox上的解決方法。
卻看到有人使用VMware成功了,就決定來試試看。不然就只能放棄虛擬機器,去搞台Linux電腦來刷機了。

還好最後VMware刷機成功了!
使用虛擬機器的好處就是,可以透過簡單的匯出匯入功能,將原本的系統直接轉為OVA格式就可以互通。

附上中間測試時找到的,手動執行刷機命令的連結,有興趣的人可以看一下。
Jetson TX2 not recognized installation inside docker error 8 Error


3. Connect Tech - Orbitty Carrier Package

但在刷機完成並開機進入系統之後才發現,USB2.0 / USB3.0 port竟然都不會動!!
並且整個USB Port也沒有供電,推測可能與hardware pin腳設定有關。

後來到Carrier Board的官網上查詢,發現這是Carrier Board設定的問題。
按照TX2原本的刷機過程,應該只有支援NVIDIA提供的開發版;若是使用第三方的開發版,則需要再去確認是否相容。

因此在參考廠商提供的操作步驟下,安裝support package,並選擇該開發版的設定檔手動進行刷機即可。
Orbitty Carrier Board Support Package Installation

刷機步驟為:
1. 先按照JetPack步驟安裝,但不要執行最後刷機的動作
2. 下載Orbitty Carrier Board Support Package,並解壓縮安裝
   $ <install_dir>/64_TX1/Linux_for_Tegra_tx1/
   $ cd <install_dir>/64_TX1/Linux_for_Tegra_tx1/
   $ tar -xzf CTI-L4T-V0XX.tgz
   $ sudo ./install.sh
   $ cd ..

3. 單獨執行刷機指令,刷機成功後即可成功進入TX2系統
   $ ./flash.sh orbitty mmcblk0p1

4. 執行JetPack package安裝,並將Target端Linux系統取消勾選,避免重複刷機。


4. TX2 Example Test (OceanFFT)

刷機成功之後當然要來測試一下是否成功啦!
參考其他大神們說明,這邊使用範例OceanFFT來進行測試。

直接在TX2中進入到範例程式下執行:
$ cd ~/NVIDIA_CUDA-8.0_Samples/5_Simulations/oceanFFT/ 
$ ./oceanFFT


若是看到漂亮的海浪模擬畫面,則代表Cuda安裝成功。



5. TX2 Example Cross Compiling Test (OceanFFT)

Cuda安裝成功之後,接著就要來測試開發工具了。

如果我們在主機中安裝了JetPack工具包之後,JetPack會自動將開發環境Nsight Eclipse Edition安裝在我們的主機(host)中。

一般來說,針對嵌入式平台的開發有兩種編譯模式:原生編譯和交叉編譯。
原生編譯就是直接在嵌入式平台上編譯程式並運行,而交叉編譯就是在個人電腦等主機端平台上編譯程式,然後再載入到嵌入式平台上運行。

在此,我們參考以下博主的方法,使用交叉編譯的方式來開發Jetson TX2。
Jetson TX1开发笔记(三):开发利器-Nsight Eclipse Edition


6. OceanFFT Cross Compiling Error

透過以上的方式,在TX1上能夠順利地執行。但在TX2上編譯時卻會顯示以下的錯誤訊息。
"error: reference to glClientActiveTexture is ambiguous"


在網路上爬文了一下之後找到,原來是要修改Cuda的Library程式 (helper_gl.h中,第105行)。
JetPack - Compiling oceanFFT on TX2

in     /usr/local/cuda-8.0/samples/common/inc/helper_gl.h
line105: --- #if !defined(GLX_EXTENSION_NAME) || defined(__arm__) || defined(__aarch64__)
line105: +++ #if !defined(GLX_EXTENSION_NAME) || !defined(GL_VERSION_1_3)



並且要注意的是,由於是使用交叉編譯(Cross Compiling)。
在Device端 (Jetson TX2)上的helper_gl.h也需要進行修改,不然一樣會遇到錯誤。

修改完成之後,終於算是在NVIDIA TX2開發上跨出第一步了!


參考資料:
ROS学习1_nvidia Jetson TX2 配置与安装 ROS
車輛辨識範例 /tegra_multimedia_api/sample/backend
Jetson TX1開發筆記(四):使用Caffe對攝影機視頻流中的目標進行辨識
Jetson TX2深度學習Inference初體驗
github - letson-inference 行人偵測
Jetson TX2 初体验


ps.補充一下:
目前在使用此Orbitty Carrier Board上,有遇到以下幾項狀況。
如果有要使用這片載板的話,可以參考一下。但畢竟體積小很多,整體來說還算好用。

1. 僅具備一組USB Port,在測試時可能會遇到一些麻煩。但若使用USB hub,又可能會遇到供電或傳輸不穩定的狀況。

2. 接收WIFI訊號能力較弱,有時候無法偵測到環境中的WIFI訊號或無法連線。




apt-get update異常處理

1. 問題描述 系統環境:Ubuntu 18.04.3 LTS 執行apt-get update更新時遇到如下狀況 錯誤訊息: Err:1 http://security.ubuntu.com/ubuntu bionic-security InRe...