
Comment utiliser l'API Tensorrt C ++ pour une inférence d'apprentissage machine GPU haute performance.
Prend en charge les modèles avec des entrées uniques / multiples et des sorties uniques / multiples avec lots.
Video de l'aperçu du projet. CODE VIDÉO DE LA DIVE DEEP
Ce projet recherche activement les mainteneurs pour aider à guider sa croissance et son amélioration. Si vous êtes passionné par ce projet et que vous souhaitez contribuer, j'aimerais avoir de vos nouvelles!
N'hésitez pas à vous contacter via LinkedIn pour discuter de la façon dont vous pouvez vous impliquer.
J'ai lu tous les documents Nvidia Tensorrt pour que vous n'ayez pas à le faire!
Ce projet montre comment utiliser l'API Tensorrt C ++ pour l'inférence GPU haute performance sur les données d'image. Il couvre comment faire ce qui suit:
Les instructions suivantes supposent que vous utilisez Ubuntu 20.04 ou 22.04. Vous devrez fournir votre propre modèle ONNX pour cet exemple de code ou vous pouvez télécharger l'exemple de modèle (voir la section Vérification Sanity ci-dessous).
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (pour journalisation)build_opencv.sh fourni dans ./scripts/ .CUDNN_INCLUDE_DIR et CUDNN_LIBRARY dans le script.CMakeLists.txt et remplacez le TODO par le chemin d'accès à votre installation Tensorrt.mkdir buildcd buildcmake ..make -j$(nproc)./run_inference_benchmark --onnx_model ../models/yolov8n.onnx./run_inference_benchmark --trt_model ../models/yolov8n.engine.NVIDIAGeForceRTX3080LaptopGPU.fp16.1.1YOLOv8n à partir d'ici.pip3 install ultralytics . from ultralytics import YOLO
model = YOLO ( "./yolov8n.pt" )
model . fuse ()
model . info ( verbose = False ) # Print model information
model . export ( format = "onnx" , opset = 12 ) # Export the model to onnx using opset 12yolov8n.onnx , dans le répertoire ./models/ ../inputs/team.jpg devrait produire le vecteur de fonctionnalité suivant: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
L'activation de la précision INT8 peut plus accélérer l'inférence au coût de la réduction de la précision en raison d'une plage dynamique réduite. Pour INT8 Precision, l'utilisateur doit fournir des données d'étalonnage qui sont représentatives des données réelles que le modèle verra. Il est conseillé d'utiliser des images d'étalonnage 1k +. Pour permettre l'inférence INT8 avec le modèle de vérification de la santé mentale de Yolov8, les étapes suivantes doivent être prises:
options.precision = Precision::FP16; aux options.precision = Precision::INT8; Dans main.cppoptions.calibrationDataDirectoryPath = ""; doit être modifié dans main.cpp pour spécifier les données d'étalonnage contenant le chemin.wget http://images.cocodataset.org/zips/val2017.zipInt8EntropyCalibrator2::getBatch dans engine.cpp (voir TODO ) est correct pour votre modèle..calibration Si vous souhaitez régénérer les données d'étalonnage, vous devez supprimer ce fichier de cache.Options.calibrationBatchSize .Benchmarks fonctionnent sur le GPU d'ordinateur portable RTX 3050 TI, 11th Gen Intel (R) Core (TM) I9-11900H @ 2,50 GHz.
| Modèle | Précision | Taille de lot | Temps d'inférence AVG |
|---|---|---|---|
| yolov8n | Fp32 | 1 | 4,732 ms |
| yolov8n | FP16 | 1 | 2,493 ms |
| yolov8n | Int8 | 1 | 2,009 ms |
| yolov8x | Fp32 | 1 | 76,63 ms |
| yolov8x | FP16 | 1 | 25.08 ms |
| yolov8x | Int8 | 1 | 11,62 ms |
Vous vous demandez comment intégrer cette bibliothèque dans votre projet? Ou peut-être comment lire les sorties du modèle Yolov8 pour extraire des informations significatives? Si c'est le cas, consultez mes deux derniers projets, Yolov8-Tensorrt-CPP et Yolov9-Tensorrt-CPP, qui montrent comment utiliser l'API Tensorrt C ++ pour exécuter l'inférence YOLOV8 / 9 (prend en charge la détection d'objets, la segmentation sémantique et l'estimation de la pose corporelle). Ils utilisent ce projet dans le backend!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine . J'ai écrit beaucoup de commentaires tout au long du code, ce qui devrait faciliter la compréhension de ce qui se passe.include/engine/EngineRunInference.inl .include/engine/EngineBuildLoadNetwork.inl . L'implémentation utilise la bibliothèque spdlog pour la journalisation. Vous pouvez modifier le niveau de journal en définissant la variable d'environnement LOG_LEVEL en l'une des valeurs suivantes: trace , debug , info , warn , error , critical , off .
Si vous avez des problèmes de création du fichier moteur Tensorrt à partir du modèle ONNX, envisagez de définir la variable d'environnement LOG_LEVEL pour trace et ré-cours l'application. Cela devrait vous donner plus d'informations sur l'endroit où le processus de construction échoue.
Si ce projet vous était utile, j'apprécierais que vous puissiez lui donner une étoile. Cela m'encouragera à m'assurer qu'il est à jour et à résoudre rapidement les problèmes. Je fais également du travail de consultation si vous avez besoin d'une aide plus spécifique. Connectez-vous avec moi sur LinkedIn.
Ténel locier | thomaskleiven | Wicyn |
V6.0
V5.0
Engine a été modifiée pour prendre un paramètre de modèle qui spécifie le type de données de sortie des modèles. L'implémentation prend désormais en charge les sorties de type float , __half , int8_t , int32_t , bool et uint8_t .Options ont été définies correctement pour votre modèle (par exemple, si votre modèle a été compilé pour FP32 mais que vous essayez d'exécuter l'inférence FP16, il échouera, potentiellement sans erreur verbeuse).V4.1
V4.0
V3.0
IExecutionContext::enqueueV3() ).driver à run_inference_benchmark et doit maintenant être passé le chemin du modèle ONNX comme argument de ligne de commande.Options.doesSupportDynamicBatchSize . La mise en œuvre de la mise en œuvre automatique prend en charge les tailles de lots.Options.maxWorkspaceSize . L'implémentation ne limite désormais pas la mémoire GPU lors des constructions de modèles, permettant à l'implémentation d'utiliser autant de pool de mémoire que disponibles pour les couches intermédiaires.v2.2
V2.1
V2.0
Options.optBatchSizes a été supprimée, remplacée par Options.optBatchSize .Merci à ces gens merveilleux (clé emoji):
Ce projet suit les spécifications de tous les contributeurs. Contributions de toute nature bienvenue!