
Cómo usar la API Tensorrt C ++ para una inferencia de aprendizaje automático GPU de alto rendimiento.
Admite modelos con entradas simples / múltiples y salidas simples / múltiples con lotes.
Video de descripción general del proyecto. Código de video de inmersión profunda
Este proyecto está buscando activamente mantenedores para ayudar a guiar su crecimiento y mejora. Si te apasiona este proyecto e interesado en contribuir, ¡me encantaría saber de ti!
No dude en comunicarse con LinkedIn para discutir cómo puede involucrarse.
¡Leí todos los documentos Nvidia Tensorrt para que no tengas que hacerlo!
Este proyecto demuestra cómo usar la API Tensorrt C ++ para la inferencia de GPU de alto rendimiento en los datos de la imagen. Cubre cómo hacer lo siguiente:
Las siguientes instrucciones suponen que está utilizando Ubuntu 20.04 o 22.04. Deberá suministrar su propio modelo ONNX para este código de muestra o puede descargar el modelo de muestra (consulte la sección Verificación de cordura a continuación).
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (para registro)build_opencv.sh proporcionado en ./scripts/ .CUDNN_INCLUDE_DIR y CUDNN_LIBRARY en el script.CMakeLists.txt y reemplace el TODO con la ruta a su instalación de 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 desde aquí.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 , en el directorio ./models/ ../inputs/team.jpg debería producir el siguiente vector de características: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
Habilitar la precisión INT8 puede acelerar aún más la inferencia a costa de la reducción de la precisión debido al rango dinámico reducido. Para la precisión int8, el usuario debe suministrar datos de calibración que sean representativos de los datos reales que el modelo verá. Se recomienda usar imágenes de calibración 1K+. Para habilitar la inferencia INT8 con el modelo de verificación de cordura Yolov8, se deben tomar los siguientes pasos:
options.precision = Precision::FP16; a options.precision = Precision::INT8; en main.cppoptions.calibrationDataDirectoryPath = ""; debe cambiarse en main.cpp para especificar la ruta que contiene datos de calibración.wget http://images.cocodataset.org/zips/val2017.zipInt8EntropyCalibrator2::getBatch en engine.cpp (ver TODO ) sea correcto para su modelo..calibration ) de modo que en las optimizaciones posteriores del modelo se pueda reutilizar. Si desea regenerar los datos de calibración, debe eliminar este archivo de caché.Options.calibrationBatchSize para que todo el lote pueda caber en la memoria de su GPU.Los puntos de referencia se ejecutan en RTX 3050 Ti Laptop GPU, 11th Gen Intel (R) Core (TM) I9-11900H @ 2.50 GHz.
| Modelo | Precisión | Tamaño por lotes | Tiempo de inferencia 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 |
¿Se pregunta cómo integrar esta biblioteca en su proyecto? ¿O tal vez cómo leer las salidas del modelo Yolov8 para extraer información significativa? Si es así, consulte mis dos últimos proyectos, YOLOV8-TENSORRT-CPP y YOLOV9-TENSORRT-CPP, que demuestran cómo usar la API Tensorrt C ++ para ejecutar la inferencia Yolov8/9 (admite la detección de objetos, la segmentación semántica y la estimación de pose del cuerpo). ¡Hacen uso de este proyecto en el backend!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine . He escrito muchos comentarios durante todo el código que debería facilitar la comprensión de lo que está sucediendo.include/engine/EngineRunInference.inl .include/engine/EngineBuildLoadNetwork.inl . La implementación utiliza la biblioteca spdlog para registrar. Puede cambiar el nivel de registro estableciendo la variable de entorno LOG_LEVEL a uno de los siguientes valores: trace , debug , info , warn , error , critical , off .
Si tiene problemas para crear el archivo de motor Tensorrt desde el modelo ONNX, considere configurar la variable de entorno LOG_LEVEL para trace y volver a ejecutar la aplicación. Esto debería darle más información sobre dónde está fallando exactamente el proceso de compilación.
Si este proyecto fuera útil para usted, agradecería si pudiera darle una estrella. Eso me animará a asegurarme de que esté actualizado y resolver problemas rápidamente. También hago trabajo de consultoría si necesita ayuda más específica. Conéctese conmigo en LinkedIn.
Tétrel de loico | Thomaskleiven | Wicyn |
V6.0
V5.0
Engine se ha modificado para tomar un parámetro de plantilla que especifica el tipo de datos de salida de los modelos. La implementación ahora admite salidas de tipo float , __half , int8_t , int32_t , bool y uint8_t .Options se han configurado correctamente para su modelo (por ejemplo, si su modelo se ha compilado para FP32 pero intenta ejecutar una inferencia FP16, fallará, potencialmente sin un error verboso).V4.1
V4.0
V3.0
IExecutionContext::enqueueV3() ).driver a run_inference_benchmark y ahora debe pasar la ruta al modelo ONNX como argumento de línea de comandos.Options.doesSupportDynamicBatchSize eliminadas. Implementación ahora Auto detects tamaños de lotes admitidos.Options.maxWorkspaceSize eliminadas. MaxworkSpacesize. La implementación ahora no limita la memoria de GPU durante las construcciones del modelo, lo que permite que la implementación use la mayor parte del grupo de memoria como esté disponible para capas intermedias.v2.2
V2.1
V2.0
Options.optBatchSizes se ha eliminado, reemplazado por Options.optBatchSize .Gracias a estas maravillosas personas (Key Emoji):
Este proyecto sigue la especificación de todos los contribuyentes. ¡Contribuciones de cualquier tipo bienvenido!