Skip to content

DĂ©ploiement sur NVIDIA Jetson Ă  l'aide de TensorRT et DeepStream SDK

📚 Ce guide explique comment déployer un modèle entraîné dans la plateforme NVIDIA Jetson et effectuer l'inférence à l'aide de TensorRT et de DeepStream SDK. Nous utilisons ici TensorRT pour maximiser les performances de l'inférence sur la plateforme Jetson.

Vérification du matériel

Nous avons testé et vérifié ce guide sur les appareils Jetson suivants .

Avant de commencer

Assure-toi d'avoir correctement installé JetPack SDK avec tous les composants SDK et DeepStream SDK sur l'appareil Jetson car cela inclut CUDA, TensorRT et DeepStream SDK qui sont nécessaires pour ce guide.

JetPack SDK fournit un environnement de développement complet pour le développement de l'IA à la pointe accélérée par le matériel. Tous les modules et kits de développement Jetson sont pris en charge par JetPack SDK.

Il existe deux grandes méthodes d'installation, notamment ,

  1. MĂ©thode d'image de la carte SD
  2. MĂ©thode de gestion du SDK NVIDIA

Tu peux trouver un guide d'installation très détaillé sur le site officiel de NVIDIA. Tu peux également trouver les guides correspondant au reComputer J1010 et au reComputer J2021 mentionnés ci-dessus.

Installer les paquets nécessaires

  • Étape 1. Accède au terminal de l'appareil Jetson, installe pip et mets-le Ă  niveau.
sudo apt update
sudo apt install -y python3-pip
pip3 install --upgrade pip
  • Étape 2. Clone le rĂ©pertoire suivant
git clone https://github.com/ultralytics/yolov5
  • Étape 3. Ouvre le fichier requirements.txt
cd yolov5
vi requirements.txt
  • Étape 5. Modifie les lignes suivantes. Ici, tu dois d'abord appuyer sur i pour entrer en mode Ă©dition. Appuie sur ESC, puis tape :wq pour sauvegarder et quitter.
# torch>=1.8.0
# torchvision>=0.9.0

Note : torch et torchvision sont exclus pour l'instant car ils seront installés plus tard.

  • Étape 6 : installe les dĂ©pendances ci-dessous
sudo apt install -y libfreetype6-dev
  • Étape 7. Installe les paquets nĂ©cessaires
pip3 install -r requirements.txt

Installe PyTorch et Torchvision

Nous ne pouvons pas installer PyTorch et Torchvision à partir de pip car ils ne sont pas compatibles pour fonctionner sur la plateforme Jetson qui est basée sur l'architecture ARM aarch64. Par conséquent, nous devons installer manuellement PyTorch pip wheel et compiler/installer Torchvision à partir des sources.

Visite cette page pour accéder à tous les liens PyTorch et Torchvision.

Voici quelques-unes des versions prises en charge par JetPack 4.6 et plus.

PyTorch v1.10.0

Supporté par 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) avec Python 3.6

PyTorch v1.12.0

Supporté par JetPack 5.0 (L4T R34.1.0) / JetPack 5.0.1 (L4T R34.1.1) / JetPack 5.0.2 (L4T R35.1.0) avec Python 3.8

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

Par exemple, ici nous utilisons JP4.6.1, et nous choisissons donc 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
  • Étape 2. Installe torchvision en fonction de la version de PyTorch que tu as installĂ©e. Par exemple, nous avons choisi PyTorch v1 .10.0, ce qui signifie que nous devons choisir 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

Voici une liste des versions correspondantes de torchvision que tu dois installer en fonction de la version PyTorch :

  • PyTorch v1.10 - torchvision v0.11.1
  • PyTorch v1.12 - torchvision v0.13.0

Configuration de DeepStream pour YOLOv5

  • Étape 1. Clone le repo suivant
cd ~
git clone https://github.com/marcoslucianops/DeepStream-Yolo
  • Étape 2. Copie gen_wts_yoloV5.py de DeepStream-Yolo /utils dans le rĂ©pertoire yolov5 rĂ©pertoire
cp DeepStream-Yolo/utils/gen_wts_yoloV5.py yolov5
  • Étape 3. Dans le repo yolov5 , tĂ©lĂ©charge le fichier pt des versions YOLOv5 (exemple pour YOLOv5s 6.1).
cd yolov5
wget https://github.com/ultralytics/yolov5/releases/download/v6.1/yolov5s.pt
  • Étape 4. GĂ©nère les fichiers cfg et wts
python3 gen_wts_yoloV5.py -w yolov5s.pt

Note: Pour changer la taille de l'inférence (par défaut : 640)

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

Example for 1280:

-s 1280
or
-s 1280 1280
  • Étape 5. Copie les fichiers cfg et wts gĂ©nĂ©rĂ©s dans le dossier DeepStream-Yolo.
cp yolov5s.cfg ~/DeepStream-Yolo
cp yolov5s.wts ~/DeepStream-Yolo
  • Étape 6. Ouvre le dossier DeepStream-Yolo et compile la bibliothèque.
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
  • Étape 7. Modifie le fichier config_infer_primary_yoloV5.txt en fonction de ton modèle.
[property]
...
custom-network-config=yolov5s.cfg
model-file=yolov5s.wts
...
  • Étape 8. Modifie le fichier deepstream_app_config
...
[primary-gie]
...
config-file=config_infer_primary_yoloV5.txt
  • Étape 9. Change la source vidĂ©o dans le fichier deepstream_app_config. Ici, un fichier vidĂ©o par dĂ©faut est chargĂ© comme tu peux le voir ci-dessous.
...
[source0]
...
uri=file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4

Exécute l'inférence

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

Le résultat ci-dessus est exécuté sur la Jetson Xavier NX avec FP32 et YOLOv5s 640x640. Nous pouvons voir que le taux de rafraîchissement est d'environ 30.

Calibrage INT8

Si tu veux utiliser la précision INT8 pour l'inférence, tu dois suivre les étapes suivantes

  • Étape 1. Installer OpenCV
sudo apt-get install libopencv-dev
  • Étape 2. Compiler/recompiler la bibliothèque nvdsinfer_custom_impl_Yolo avec la prise en charge d'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
  • Étape 3. Pour le jeu de donnĂ©es COCO, tĂ©lĂ©charge le fichier val2017, extrais-le et dĂ©place-le dans le dossier DeepStream-Yolo.

  • Étape 4. CrĂ©e un nouveau rĂ©pertoire pour les images d'Ă©talonnage

mkdir calibration
  • Étape 5. ExĂ©cute la procĂ©dure suivante pour sĂ©lectionner 1000 images alĂ©atoires de l'ensemble de donnĂ©es COCO afin de procĂ©der Ă  l'Ă©talonnage.
for jpg in $(ls -1 val2017/*.jpg | sort -R | head -1000); do \
    cp ${jpg} calibration/; \
done

Note : NVIDIA recommande au moins 500 images pour obtenir une bonne précision. Dans cet exemple, 1000 images ont été choisies pour obtenir une meilleure précision (plus d'images = plus de précision). Des valeurs plus élevées de INT8_CALIB_BATCH_SIZE se traduiront par une plus grande précision et une vitesse d'étalonnage plus rapide. Règle-la en fonction de la mémoire de ton GPU. Tu peux la régler de tête à 1000. Par exemple, pour 2000 images, tu peux choisir -2000. Ce processus peut prendre beaucoup de temps.

  • Étape 6. CrĂ©e le fichier calibration.txt avec toutes les images sĂ©lectionnĂ©es.
realpath calibration/*jpg > calibration.txt
  • Étape 7. DĂ©finir les variables d'environnement
export INT8_CALIB_IMG_PATH=calibration.txt
export INT8_CALIB_BATCH_SIZE=1
  • Étape 8. Mets Ă  jour le fichier config_infer_primary_yoloV5.txt.

De

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

Pour

...
model-engine-file=model_b1_gpu0_int8.engine
int8-calib-file=calib.table
...
network-mode=1
...
  • Étape 9. ExĂ©cute l'infĂ©rence
deepstream-app -c deepstream_app_config.txt
YOLOv5 avec deepstream INT8

Le résultat ci-dessus est obtenu sur la Jetson Xavier NX avec INT8 et YOLOv5s 640x640. Nous pouvons voir que le taux de rafraîchissement est d'environ 60.

RĂ©sultats du benchmarking

Le tableau suivant résume les performances des différents modèles sur la Jetson Xavier NX.

Nom du modèle Précision Taille de l'inférence Temps d'inférence (ms) FPS
YOLOv5s FP32 320x320 16.66 60
FP32 640x640 33.33 30
INT8 640x640 16.66 60
YOLOv5n FP32 640x640 16.66 60

Supplémentaire

Ce tutoriel est rédigé par nos amis de seeed @lakshanthad et Elaine.



Créé le 2023-11-12, Mis à jour le 2024-01-07
Auteurs : glenn-jocher (5)

Commentaires