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 .
- Seeed reComputer J1010 construit avec le module Jetson Nano
- Seeed reComputer J2021 construit avec le module Jetson Xavier NX
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 ,
- MĂ©thode d'image de la carte SD
- 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.
- Étape 2. Clone le répertoire suivant
- Étape 3. Ouvre le fichier 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.
Note : torch et torchvision sont exclus pour l'instant car ils seront installés plus tard.
- Étape 6 : installe les dépendances ci-dessous
- Étape 7. Installe les paquets nécessaires
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
- file_name: torch-1.10.0-cp36-cp36m-linux_aarch64.whl
- URL : https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl
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
- file_name: torch-1.12.0a0+2c916ef.nv22.3-cp38-cp38-linux_aarch64.whl
-
Étape 1. Installe torch en fonction de ta version de JetPack au format suivant.
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
- Étape 2. Copie gen_wts_yoloV5.py de DeepStream-Yolo /utils dans le répertoire yolov5 répertoire
- Étape 3. Dans le repo yolov5 , télécharge le fichier pt des versions YOLOv5 (exemple pour YOLOv5s 6.1).
- Étape 4. Génère les fichiers cfg et wts
Note: Pour changer la taille de l'inférence (par défaut : 640)
- Étape 5. Copie les fichiers cfg et wts générés dans le dossier 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.
- Étape 8. Modifie le fichier deepstream_app_config
- É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
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
- É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
- É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.
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.
- Étape 7. Définir les variables d'environnement
- Étape 8. Mets à jour le fichier config_infer_primary_yoloV5.txt.
De
Pour
- Étape 9. Exécute l'inférence
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.