Edge AI
Deployment
Nvidia
Jetson
YOLOv7
AGX Xavier
官方文件建議的部屬編譯環境選擇Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation
根據官網NVIDIA L4T TensorRT介紹,NVIDIA TensorRT 是一個 C++ 的library,可以在 NVIDIA GPU 上實現高性能的推理。TensorRT 可以對訓練好的網絡進行優化,並產生一個運行時引擎。並支持 C++ 和 Python API,可以用來定義或導入網絡模型。TensorRT 還會利用各種優化技術和高效的核函數,找到最快的模型實現方式。
export.py
)操作範例見Quick Start Guide/ 6.1.2. Exporting to ONNX from PyTorch、Using PyTorch with TensorRT through ONNX,可以完全在python環境下操控TensorRT,將模型轉為.trt格式的TensorRT engine,達到易用(python API)與高效(C++ Runtime)的平衡。讓模型的前後處理可以完全在python環境中運行
ps: 可搭配YOLOv7官網的範例YOLOv7TRT.ipynb/理解,已經寫成class BaseEngine()
可以整包拿去用
待補…
參考了網路上幾個方案,大多是直接git clone YOLOv7的倉儲後,直接在python環境以.pth檔執行,這大概是最快最簡單可運作的方式,不過就沒有用到TensorRT加速的優勢,也可惜了Jetpack已經安裝的一堆相關加速套件(超級肥大呀)
雖然說是最簡單可行,但環境設定過程還是一堆雷區,而且每個套件安裝都相當複雜,最簡單的方式是跟著Hello AI World直接建立可以運作的推論環境,包含pytorch_arm64的安裝。或直接使用Nvidia已建立好的docker環境(見Running the Docker Container文件說明,可以快速建立相對簡單的JETSON推論環境)
pytroch_arm64環境編譯流程示意(最右邊)
檢視python環境目前並沒有安裝tensorrt
pycuda
這兩個python api所需模組,實際並未用到TensorRT而是完全單純使用Pytorch_arm
前置環境設定完全參照Hello AI World
依照欲執行的編譯環境與硬體設備,環境準備分為以下幾部分考量
前兩項在Jetpack安裝時已經一併完成,只有最後兩項要額外處理
(install Pytorch)
Prepare Environment for YOLOv7
這裡安裝的是Nvidia為了ARM aarch64架構再製過的版本,檔案結尾是是linux_aarch64.whl
cd jetson-inference/build
./install-pytorch.sh
install-pytorch.sh
會根據系統環境配置選擇適合的pytorch版本,會自動選擇pytorch v1.12 for python 3
安裝完成後可以python -c "import torch; print(torch.__version__)"
檢查版本,我這邊看到的是
torch 1.12.0a0+2c916ef.nv22.3
torchvision 0.12.0a0+9b5a3fe
如果想手動安裝pytorch可見Installing PyTorch for Jetson Platform
建議使用預先建立的l4t-pytorch 和l4t-ml 容器鏡像和Dockerfiles
yolov7
內yolo
資料夾mkdir yolo
cd yolo
git clone https://github.com/WongKinYiu/yolov7
cd yolov7
requirements.txt
nano requirements.txt
opencv-python已經在Building the Project from Source過程中安裝
opencv-python 4.7.0.72
dpkg -l | grep libopencv
檢視Pytorch 與 Torchvision則在上一部自行安裝 Nvidia的ARM aarch64版本
# opencv-python>=4.1.1
.
# torch>=1.7.0,!=1.12.0
# torchvision>=0.8.1,!=0.13.0
.
# thop # FLOPs computation # --> LOCATED ON THE BOTTOM OF requirements.txt
修改完requirements.txt
後執行
pip3 install -r requirements.txt
2022.12。Deploy YOLOv7 to Jetson Nano for Object Detection提到:
Because OpenCV has to be installed system-wide (it comes preinstalled with Nvidia developer pack Ubuntu 18.04), we have to create a symbolic link from global to our virtual environment. Otherwise, we won't be able to access it from our virtual environment.
因此做了symbolic link從虛擬環境連結到全域環境,由於目前設定沒有建立虛擬環境,因此跳過這部
在執行過程會導至import pandas時出現 importError 問題,其實在安裝過程就會跳出pandas版本與python-dateutil(需要2.8.1版以上,但安裝版本為2.7.x版)不相容的提示
解決方法: 執行 pip3 install --upgrade python-dateutil
升級到2.8.2版
# Download tiny weights
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
# Download regular weights
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt
0
即可yolov7-tiny.pt
測試,每張圖片推論時間大約在20-25 mspython3 detect.py --weights yolov7-tiny.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
終於成功 可喜可賀!!!
YOLOv7不同版本比對
不同硬體
detect_pose.py
python detect_pose.py --weights yolov7-w6-pose.pt --conf 0.05 --iou-thres 0.45 --img-size 1280 --source inference/images/ --no-trace
detect.py
# Inference
t1 = time_synchronized()
with torch.no_grad(): # Calculating gradients would cause a GPU memory leak
pred = model(img, augment=opt.augment)[0]
t2 = time_synchronized()
# Apply NMS
pred = non_max_suppression(pred, opt.conf_thres, opt.iou_thres, classes=opt.classes, agnostic=opt.agnostic_nms)
t3 = time_synchronized()
# Print time (inference + NMS)
time_process = f'{s}Done. ({(1E3 * (t2 - t1)):.1f}ms) Inference, ({(1E3 * (t3 - t2)):.1f}ms) NMS'
time_process += f' | FPS : { 1/(t3-t1): .1f} , Latency : {1E3 * (t3-t1):.1f}ms'
print(time_process)
環境:沿用"測試一"的硬體與環境
詳見Convert PyTorch model to TensorRT for 3-6x speedup
將PyTorch模型轉換為TensorRT,實現3-6倍加速
Pytorch > ONNX > TensorRT(include NMS)
model | size | NMS | .pt | .trt(fp16) | speedup |
---|---|---|---|---|---|
yolov7-tiny | 640 | v | 24.0 | 145.5 | 6.1x |
yolov7 | 640 | v | 14.8 | 40.2 | 2.7x |
yolov7 | 1280 | v | 7.1 | 11.5 | 1.6x |
物件偵測模型相當耗時的後處理-NMS計算,已有人已經寫好外掛,可納入TRT推理引擎中C++環境執行
如果佈署環境需要同時串接多台攝影機,那麼就有必要使用DeepStream針對多媒體串流處理部分加速,透過調用CUDA與共享記憶體等方式,加速資料輸入與輸出端的處理
下表為YOLOv7透過DeepStream加速批次處理串流資料的數據
(source:NVIDIA-AI-IOT/yolo_deepstream)
直接使用.pt。未使用TensorRT加速
時間點較早,需要較多手動安裝。應該可以找到相關套件都包裝好的container
使用"virtualenv and virtualenvwrapper"進行環境管理,還需要額外設定OPENCV的路徑
I've tested YOLOv7 algorithm with PyTorch 1.8 and 1.9 and both worked fine
作業系統可能是Jetpack4.6.x(L4T: R32.x),才有辦法安裝pytorch arm64 1.8.0版
直接使用.pt。未使用TensorRT加速
不推薦使用虛擬環境做隔離,因為虛擬環境隔離性不夠易出錯,應直接使用docker
至于未来要再配合 TensorRT 加速引擎的使用,也推荐使用 l4t-ml:r34.x.y-py3 镜像,为个别项目创建独立的容器
- “pip3 install” 安裝 Python 版OpenCV之後,發現這種安裝方式在 x86 平台是可行,但是在 Jetson 平台不能被正常調用。
- 由於 l4t-ml 鏡像內已經好 OpenCV 環境,因此我們必須先把 3 個開源項目的 requirements.txt 里的 “opencv-python” 用 “#” 號進行關閉,否則會造成調用失敗的問題。