Edge AI
Nvidia
Jetson
System Setup
內含手把手教學
在Video Walkthroughs一節有提供導覽影片
系統環境安裝,需要要先安裝JetPack在Jetson裝置上
在JetPack 安裝完成後(Setting up Jetson with JetPack),依照需求可以選擇
見NVIDIA Container Toolkit 安裝筆記
安裝完NVIDIA Docker後,按官方文件指引,啟用Container
在dusty-nv/jetson-inference已經幫忙把啟用container的複雜設定寫成bash腳本,在執行docker/run.sh
的時候,就會根據你安裝的jetpack版本載入對應的inference server所需的container版本
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ docker/run.sh
docker/run.sh
會根據你當前安裝的JetPack-L4T的版本,自動從DockerHub中提取正確的容器標簽,並掛載適當的數據目錄和設備,以便你可以在容器中使用相機/顯示器/ect。它還會提示你下載DNN模型,如果你還沒有這樣做的話,這些模型會被掛載到容器中去。這個初始設置只做一次。(備註:jetson-inference是以L4T PyTorch為基礎建立的)如果順利建立成功的話,docker/run.sh
會自動幫你把資料路徑掛載到主機
如果要自訂掛載路徑的話
$ docker/run.sh --volume /my/host/path:/my/container/path # these should be absolute paths
手上的Jetson AGX Xavier 只有32G,安裝完NVIDIA container等可用空間剩下6G左右
文件提到JetPack version 必須與L4T version一致(the version of JetPack-L4T that you have installed on your Jetson needs to match the tag )
目前刷機時安裝的是JetPack 5.1版, 必須搭配L4T R35.2.1的container版本,但容量不夠(image拉回來解壓縮後導致系統爆掉進不去才發現,只好又重新刷機一次)
可能解法有三:
由於JetPack 5.1版,搭配的L4T R35.2.1太過肥大,無法安裝在只有32G空間的AGX Xavier,所以我選擇直接在Jetson上編譯安裝環境
跟著官方文件指引,依序輸入下方指令進行編譯
$ sudo apt update
$ sudo apt install git cmake libpython3-dev python3-numpy
$ git clone --recursive https://github.com/dusty-nv/jetson-inference
$ cd jetson-inference
$ git submodule update --init
git submodule update --init
在Git中,子模組是一個獨立的Git倉庫,可以被包含在其他Git倉庫中,用於管理外部的依賴庫或模組。通常情況下,當一個Git倉庫包含子模組時,Git只會記錄子模組的版本號或引用,而不會自動下載或更新子模組的內容。
當使用git submodule update --init
時,Git會到當前目錄中的.gitmodules文件中查找所有已定義的子模組,然後進行以下操作:
初始化子模組:如果子模組尚未被初始化,則會下載子模組的內容並將其嵌套在當前目錄中。
更新子模組:如果子模組已經被初始化,但其版本號或引用已經發生變化,則會根據.gitmodules文件中的版本號或引用更新子模組的內容。
git submodule update --init
命令用於初始化和更新Git子模組,可以確保當前目錄中的子模組與.gitmodules文件中定義的版本號或引用相符。這個命令通常用於當一個Git倉庫中包含多個子模組時,簡化子模組的管理過程。
libpython3-dev
為python3 的開發工具包,以綁定Python C API
$ mkdir build
$ cd build
$ cmake ../
$ make -j$(nproc)
cmake ../
cmake
是一個跨平台的程式碼構建工具,可以自動生成各種平台所需的構建文件,例如Makefile或Visual Studio項目檔案。cmake可以根據CMakeLists.txt文件中的指示,生成可執行文件或庫文件等。
當使用cmake ../
時,cmake會到當前目錄的上一層目錄中尋找CMakeLists.txt文件,然後根據該文件中的指示建立和管理專案。這種方式通常用於在一個單獨的建置目錄中進行構建。這種方式的優點是可以避免在原始碼目錄中產生過多的構建文件和中間文件,而且可以讓多個建置目錄同時共用同一份原始碼。當然,也可以在原始碼目錄中進行構建,這種方式則可以避免在多個建置目錄之間進行文件複製。
make -j$(nproc)
make是一個編譯工具,它可以自動根據Makefile文件中的指示進行編譯和生成可執行文件。make在編譯過程中會根據Makefile文件中的依賴關係自動編譯所需的所有文件,然後生成最終的可執行文件。但是,如果在編譯過程中出現了依賴關係錯誤,或者需要編譯大量的文件,編譯過程就可能需要很長的時間。
為了加速編譯過程,可以使用make -j指令。 -j選項告訴make同時執行多個編譯任務,以便充分利用CPU資源,加快編譯速度。數字參數指定同時執行的任務數量。例如,make -j2表示同時執行2個編譯任務。
$(nproc)
是一個內建的Linux指令,可以顯示CPU的數量。當使用-j選項時,$(nproc)可以告訴make使用多少個CPU核心執行編譯任務,以便最大化利用CPU資源。
總結來說,make -j$(nproc)指令可以讓make同時執行多個編譯任務,以便充分利用CPU資源,加快編譯速度,並且會自動根據系統CPU的數量動態調整執行緒數量,從而最大限度地發揮CPU效能,進而加速編譯過程。
$ make
$ sudo make install
$ sudo ldconfig
make install
在C/C++項目中,源代碼文件需要經過編譯和鏈接才能生成可執行文件或庫文件。make命令可以根據Makefile文件中的指示,自動執行編譯和鏈接操作,生成最終的目標文件。
使用make命令時,通常需要先創建一個Makefile文件,其中包含了程式碼的依賴關係和編譯指令等信息。然後,通過運行make命令,Make工具會自動檢測需要重新編譯的文件,並執行相應的編譯操作。
當使用sudo make install時,make命令會將編譯後生成的目標文件安裝到系統中,通常是安裝到/usr/local目錄或指定的其他目錄中。這樣,使用者就可以在系統中運行該程序或使用該庫文件。
sudo ldconfig
當使用sudo ldconfig時,ldconfig命令會重新加載共享庫緩存,從而讓系統能夠找到新安裝的共享庫文件。這個命令通常用於在安裝新的共享庫文件後更新系統的共享庫緩存。
總結來說,make命令是一個用於編譯和構建C/C++程式碼的命令,可以根據Makefile文件中的指示自動執行編譯和鏈接操作。sudo make install命令用於將編譯後生成的目標文件安裝到系統中,而sudo ldconfig命令則用於重新加載共享庫緩存,從而更新系統的共享庫文件。
順利編譯的話會在jetson-inference/build/aarch64
見到下列目錄結構
|-build
\aarch64
\bin where the sample binaries are built to
\networks where the network models are stored
\images where the test images are stored
\include where the headers reside
\lib where the libraries are build to
如果有需要的話,可以下載Nvidia提供的預訓練模型
$ cd jetson-inference/tools
$ ./download-models.sh
如果上述指令執行有問題
可至Model Download Mirror手動下載後執行以下指令
cd <jetson-inference>/data/networks/
tar -zxvf <model-archive-name>.tar.gz
如果有需要做transfer learning的話,可選擇性安裝
$ cd jetson-inference/build
$ ./install-pytorch.sh
以上程序完成後就可以進入下個導覽頁面Classifying Images with ImageNet