Vai al contenuto

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

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,

  1. Metodo di immagine della scheda SD
  2. 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
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Passo 2. Clona la seguente repo
git clone https://github.com/ultralytics/yolov5
  • Passo 3. Aprire il file requirements.txt
cd yolov5
vi 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.
# torch>=1.8.0
# torchvision>=0.9.0

Nota: torch e torchvision sono esclusi per ora perché verranno installati in seguito.

  • Passo 6. installare la seguente dipendenza
sudo apt install -y libfreetype6-dev
  • Passo 7. Installare i pacchetti necessari
pip3 install -r requirements.txt

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

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

wget <URL> -O <file_name>
pip3 install <file_name>

Ad esempio, qui stiamo eseguendo 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
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Passo 2. Copia gen_wts_yoloV5.py da DeepStream-Yolo /utils nella cartella yolov5 nella directory
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • Passo 3. All'interno della repo yolov5 , scarica il file pt dalle release YOLOv5 (esempio per YOLOv5s 6.1)
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • Passo 4. Generare i file cfg e wts
python3 gen_wts_yoloV5.py -w yolov5s.pt

Nota: per modificare le dimensioni dell'inferenza (default: 640)

-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH

Example for 1280:

-s 1280
or
-s 1280 1280
  • Passo 5. Copia i file cfg e wts generati nella cartella DeepStream-Yolo.
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/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
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • Passo 8. Modifica il file deepstream_app_config
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • 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

deepstream-app -c deepstream_app_config.txt
YOLOv5 con deepstream FP32

Il risultato di cui sopra viene eseguito su Jetson Xavier NX con FP32 e YOLOv5s 640x640. Possiamo notare che gli FPS si aggirano intorno a 30.

Calibrazione INT8

Se vuoi utilizzare la precisione INT8 per l'inferenza, devi seguire i seguenti passaggi

  • Passo 1. Installare OpenCV
sudo apt-get install libopencv-dev
  • 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

mkdir calibration
  • Passo 5. Esegui la seguente procedura per selezionare 1000 immagini casuali dal set di dati COCO per eseguire la calibrazione
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

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. Crea il file calibration.txt con tutte le immagini selezionate
realpath calibration/*jpg > calibration.txt
  • Passo 7. Imposta le variabili d'ambiente
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Passo 8. Aggiornare il file config_infer_primary_yoloV5.txt

Da

...
model-engine-file=model_b1_gpu0_fp32.engine
#int8-calib-file=calib.table
...
network-mode=0
...

A

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • Passo 9. Eseguire l'inferenza
deepstream-app -c deepstream_app_config.txt
YOLOv5 con deepstream INT8

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



Creato 2023-11-12, Aggiornato 2024-01-07
Autori: glenn-jocher (5)

Commenti