Nvidia Jetson nano 2G + yolov5 踩雷之旅 1
規格
Architecture: aarch64
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0–3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Vendor ID: ARM
Model: 1
Model name: Cortex-A57
Stepping: r1p1
CPU max MHz: 1479.0000
CPU min MHz: 102.0000
BogoMIPS: 38.40
L1d cache: 32K
L1i cache: 48K
L2 cache: 2048K
Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32
Overview of the Developer Kit : https://developer.nvidia.com/embedded/learn/jetson-nano-2gb-devkit-user-guide
安裝OS
首先,要先知道2G與4G有不同的映像檔。
剛開始我安裝4G版本的映像檔,結果發生卡在開機畫面的窘境,後來找到Jetson Nano 2GB Developer Kit 官方說明連結才找到映像檔安裝完成,請按照官方安裝說明就可以順利完成。
安裝完成開機後,第一次會進入讓你設定帳號密碼/時區/Swap等基本設定的畫面,如果沒有,那可能就是映像檔版本問題,一開始我裝了jp461的版本,卻沒有要我設定基本設置而是跳出輸入帳密視窗,一陣混亂之後找到這篇文章,這篇文章的發問者遇到一樣的問題,所以我決定降版jp451解決此問題,也因此順利解決。
Jetpack是什麼東東?
一開始我下載映像擋(如上圖)並沒有想到他跟Jetpack有什麼關聯,而且看到(如下圖)畫面時還以為要另外安裝這個工具才有辦法使用其功能。
後來終於搞懂每個版本都會發行一個映像擋,在你利用映像檔安裝完os時,Jetpack裡面的套件都幫你裝好了,而Nvidia SDK manager是讓你可以在x86系統的Linux上與你的Jetson 版子連線並管理Jetpack的工具版本。這篇文章有精彩詳細的說明,在此就不贅述。
每個版本都有相對應的內容涵蓋說明(如下圖),可以針對你的需求去安裝特定版本,如需要過往版本連結請點此。
SSH連線
由於這類版子ram很小,多開個視窗很容易沒多久機器就開始卡頓,許多文章建議使用vnc連線,個人認為vscode+上面這個remote套件是最優的組合,而理由有幾個:
- 可以一定程度替代 filezilla等傳輸軟體,直接使用拖拉就可以檔案互相上傳下載,另外也替代了Putty等連線軟體,等於是你不用再安裝那麼多個工具。
- 在開發視覺辨識類的模型經常會產生圖片,如果server(或是選擇關掉GUI)要看圖片結果就很麻煩,利用vscode 可以直接看到整個系統檔案結構,點選圖片也可以直接呈現在畫面上,整個使用體驗上加分不少。
- 對比簡易的nano等編輯器,vscode 有代碼高亮與編輯快捷鍵,也整合git版控與前後版本文件對比(按鍵按一下就完成)等實用功能,要強調的是這都是一個工具就可以完成的事情。
Cuda 你在哪裡?
# 在 .bashrc中加入下面三行export CUDA_HOME=/usr/local/cuda-10.2
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64:$LD_LIBRARY_PATH
export PATH=${CUDA_HOME}/bin:$PATH# 儲存之後,如果有出現版本號就是成功
source ~/.bashrc
nvcc -v# 利用 python3.7 venv 安裝 pytorch
torch==1.9.0
torchaudio==0.9.0
torchvision==0.10.0
numpy==1.21.6可以利用cpu成功執行yolov5程式碼,但是無法偵測到cuda
import torch
torch.cuda.is_avaliable()
#Fasle# 後來發現nvidia有幫你編譯好 torch with gpu for python 3.6版本
# 回到home目錄
cd ~
python3 -m venv py36
source py36/bin/activate
wget -O "torch-1.9.0-cp36-cp36m-linux_aarch64.whl" https://nvidia.box.com/shared/static/h1z9sw4bb1ybi0rm3tu8qdj8hs05ljbm.whlhttps://developer.nvidia.com/nvidia-tensorrt-download
# 從這邊選你要的版本: https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048pip install torch-1.9.0-cp36-cp36m-linux_aarch64.whl# 安裝opencv-python,ModuleNotFoundError: No module named 'skbuild'
pip3 install --upgrade pip
# 安裝matplotlib時,產生錯誤:python setup.py egg_info Check..
pip install --upgrade setuptools
# 系統預設的套件都有點太舊了#pip install torchvision 會無法正常使用,需要自行編譯才可以進行,這邊參考此篇文章做法:https://developer.aliyun.com/article/879285,gcc/g++版本需要注意不要太舊,這邊使用7.5.0
# 目前裝了pytorch 1.10.0 與用此方法編譯的對應版本torchvision都有成功執行。sudo apt-get install ninja-build
wget https://github.com/pytorch/vision/archive/refs/tags/v0.10.0.tar.gz
# 請來此找尋需要的版本 https://github.com/pytorch/vision/tags gzip -d v0.10.0.tar.gz
tar -xvf v0.10.0.tar
cd vision-0.10.0/
export BUILD_VERSION=0.10.0
python setup.py install
ln -s /usr/lib/python3.6/dist-packages/tensorrt ~/py36/lib/python3.6/site-packages/
# tensorrt 已經在系統安裝完時也一起安裝了,直接在虛擬環境site-package中建立連結就可以用
# 編譯過程中有遇到Attempted to use ninja as the BuildExtension backend but we could not find ninja /"aarch64-linux-gnu-g++" failed with exit status 1 /acollect2: error: ld returned 1 exit status。本來想用pip install ninja 解決,但是因為pip是在虛擬環境下安裝ninja,所以會導致編譯時在全域環境下產生ninja --vision :command not found的問題。索性用了apt install ninja-build來解決。cd yolov5
python detect.py --weights yolov5l.pt --device 0 --imgsz 640 --source ./data/images/ --nosave
torch 與對應支持的torchvision: https://github.com/pytorch/vision
如果你是其他板子 (arm64)也需要 torch aarch64,
Export model
如果你想要使用tensorRT來預測模型,在window安裝起來煞費苦心,所以決定使用Jetson nano 直接轉換(已經幫你裝好tensorrt相關套件)。需要先轉成onnx模型再轉乘engine格式,所以記得pip install onnx一下。
python export.py --weights yolov5s.pt --include 'engine'
但是會產生Cuda Error in allocate: 2 (out of memory)的錯誤,看到這篇YoloX轉換出錯的文章才知道需要調整一下workspace的size,yolov5的調整位置請看原始碼,目前我是隨意調整小一點(如下程式碼)就可以解決記憶體不足的問題,之後再來最佳化。
config.max_workspace_size = workspace * 1 << 20
有興趣深入可以參考下面兩篇討論:
控制資源指令
小板子資源非常有限,所以圖形化介面是必關的。
參考文章:
https://www.cyberciti.biz/faq/switch-boot-target-to-text-gui-in-systemd-linux/
Run完指令記得Reboot,就可以關閉 GUI:
sudo systemctl set-default multi-user.target
Run完指令記得Reboot,就可以啟用 GUI:
sudo systemctl set-default graphical.target
預設只有2G的記憶體用起來會十分吃力,Swap必開且至少加開額外的4G(還是依照個人使用情境,在我的使用經驗,單純跑模型的inference有時實體ram 2 GB 吃完了,另外的swap還會用到2~3 GB左右)。
我是參考這篇文章:
fallocate -l 8G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
#依照你設定的swapfile來開啟swap功能
swapoff
#關閉swap
以上設定完應該就可以開始操作yolov5辨識流程了,歡迎給個掌聲(按著鼓掌鍵不放最多可以50下),感謝收看。