Distribuire su NVIDIA Jetson utilizzando TensorRT e DeepStream SDK
📚 Questa guida spiega come distribuire un modello addestrato sulla piattaforma NVIDIA Jetson ed eseguire l'inferenza utilizzando TensorRT e DeepStream SDK. Qui utilizziamo TensorRT per massimizzare le prestazioni di inferenza sulla piattaforma Jetson.
Verifica dell'hardware
Abbiamo testato e verificato questa guida sui seguenti dispositivi Jetson
- Seeed reComputer J1010 costruito con modulo Jetson Nano
- Seeed reComputer J2021 costruito con il modulo Jetson Xavier NX
Prima di iniziare
Assicurati di aver installato correttamente JetPack SDK con tutti i componenti SDK e DeepStream SDK sul dispositivo Jetson, in quanto questo include CUDA, TensorRT e DeepStream SDK, necessari per questa guida.
JetPack SDK fornisce un ambiente di sviluppo completo per lo sviluppo dell'intelligenza artificiale accelerata dall'hardware. Tutti i moduli e i kit di sviluppo Jetson sono supportati da JetPack SDK.
Esistono due metodi di installazione principali,
- Metodo di immagine della scheda SD
- Metodo NVIDIA SDK Manager
Puoi trovare una guida all'installazione molto dettagliata sul sito ufficiale di NVIDIA. Puoi trovare anche le guide corrispondenti ai già citati reComputer J1010 e reComputer J2021.
Installare i pacchetti necessari
- Passo 1. Accedi al terminale del dispositivo Jetson, installa pip e aggiornalo
- Passo 2. Clona la seguente repo
- Passo 3. Aprire il file requirements.txt
- Passo 5. Modifica le righe seguenti. In questo caso devi premere i per entrare in modalità di modifica. Premi ESC, quindi digita :wq per salvare e uscire.
Nota: torch e torchvision sono esclusi per ora perché verranno installati in seguito.
- Passo 6. installare la seguente dipendenza
- Passo 7. Installare i pacchetti necessari
Installa PyTorch e Torchvision
Non possiamo installare PyTorch e Torchvision da pip perché non sono compatibili con la piattaforma Jetson, basata su architettura ARM aarch64. Pertanto, dobbiamo installare manualmente PyTorch pip wheel e compilare/installare Torchvision dai sorgenti.
Visita questa pagina per accedere a tutti i link di PyTorch e Torchvision.
Ecco alcune delle versioni supportate da JetPack 4.6 e successive.
PyTorch v1.10.0
Supportato da JetPack 4.4 (L4T R32.4.3) / JetPack 4.4.1 (L4T R32.4.4) / JetPack 4.5 (L4T R32.5.0) / JetPack 4.5.1 (L4T R32.5.1) / JetPack 4.6 (L4T R32.6.1) con Python 3.6
- file_name: torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- URL: https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl
PyTorch v1.12.0
Supportato da JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) con Python 3.8
- file_name: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
-
Passo 1. Installa torch in base alla tua versione di JetPack nel seguente formato
Ad esempio, qui stiamo utilizzando JP4.6.1 e quindi scegliamo PyTorch v1 .10.0.
cd ~
sudo apt-get install -y libopenblas-base libopenmpi-dev
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- Passo 2. Installa torchvision in base alla versione di PyTorch che hai installato. Ad esempio, abbiamo scelto PyTorch v1 .10.0, il che significa che dobbiamo scegliere Torchvision v0.11.1.
sudo apt install -y libjpeg-dev zlib1g-dev
git clone --branch v0.11.1 https://github.com/pytorch/vision torchvision
cd torchvision
sudo python3 setup.py install
Ecco un elenco della versione di torchvision corrispondente che devi installare in base alla versione di PyTorch :
- PyTorch v1.10 - torchvision v0.11.1
- PyTorch v1.12 - torchvision v0.13.0
Configurazione di DeepStream per YOLOv5
- Passo 1. Clona la seguente repo
- Passo 2. Copia gen_wts_yoloV5.py da DeepStream-Yolo /utils nella cartella yolov5 nella directory
- Passo 3. All'interno della repo yolov5 , scarica il file pt dalle release YOLOv5 (esempio per YOLOv5s 6.1)
- Passo 4. Generare i file cfg e wts
Nota: per modificare le dimensioni dell'inferenza (default: 640)
- Passo 5. Copia i file cfg e wts generati nella cartella DeepStream-Yolo.
- Passo 6. Apri la cartella DeepStream-Yolo e compila la libreria
cd ~/DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
- Passo 7. Modifica il file config_infer_primary_yoloV5.txt in base al tuo modello
- Passo 8. Modifica il file deepstream_app_config
- Passo 9. Cambia la sorgente video nel file deepstream_app_config. Qui viene caricato un file video predefinito come puoi vedere qui sotto
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
Esegui l'inferenza
Il risultato di cui sopra viene eseguito su Jetson Xavier NX con FP32 e YOLOv5s 640x640. Possiamo notare che l'FPS è di circa 30.
Calibrazione INT8
Se vuoi utilizzare la precisione INT8 per l'inferenza, devi seguire i seguenti passaggi
- Passo 1. Installare OpenCV
- Passo 2. Compilare/ricompilare la libreria nvdsinfer_custom_impl_Yolo con supporto OpenCV
cd ~/DeepStream-Yolo
CUDA_VER=11.4 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.1
CUDA_VER=10.2 OPENCV=1 make -C nvdsinfer_custom_impl_Yolo # for DeepStream 6.0.1 / 6.0
-
Passo 3. Per il set di dati COCO, scarica il file val2017, estrailo e spostalo nella cartella DeepStream-Yolo.
-
Passo 4. Crea una nuova directory per le immagini di calibrazione
- Passo 5. Esegui la seguente procedura per selezionare 1000 immagini casuali dal set di dati COCO per eseguire la calibrazione
Nota: NVIDIA raccomanda almeno 500 immagini per ottenere una buona precisione. In questo esempio, sono state scelte 1000 immagini per ottenere una maggiore precisione (più immagini = maggiore precisione). Valori più alti di INT8_CALIB_BATCH_SIZE si tradurranno in una maggiore precisione e in una maggiore velocità di calibrazione. Impostalo in base alla memoria della tua GPU. Puoi impostarlo da testa a 1000. Ad esempio, per 2000 immagini, imposta -2000. Questo processo può richiedere molto tempo.
- Passo 6. Creare il file calibration.txt con tutte le immagini selezionate
- Passo 7. Imposta le variabili d'ambiente
- Passo 8. Aggiornare il file config_infer_primary_yoloV5.txt
Da
A
- Passo 9. Eseguire l'inferenza
Il risultato sopra riportato viene eseguito su Jetson Xavier NX con INT8 e YOLOv5s 640x640. Possiamo notare che gli FPS sono circa 60.
Risultati del benchmark
La seguente tabella riassume le prestazioni dei diversi modelli su Jetson Xavier NX.
Nome del modello | Precisione | Dimensione dell'inferenza | Tempo di inferenza (ms) | FPS |
---|---|---|---|---|
YOLOv5s | FP32 | 320x320 | 16.66 | 60 |
FP32 | 640x640 | 33.33 | 30 | |
INT8 | 640x640 | 16.66 | 60 | |
YOLOv5n | FP32 | 640x640 | 16.66 | 60 |
Ulteriori
Questo tutorial è stato scritto dai nostri amici di seeed @lakshanthad e da Elaine