
Как использовать API Tensorrt C ++ для высокопроизводительного вывода машинного обучения GPU.
Поддерживает модели с отдельными / множеством входов и одиночными / несколькими выходами с пакетом.
Обзор проекта. Код глубоко удваивает видео
Этот проект активно ищет сопровождающих, чтобы помочь руководству его ростом и улучшением. Если вы увлечены этим проектом и заинтересованы в содействии, я бы хотел услышать от вас!
Пожалуйста, не стесняйтесь обратиться через LinkedIn, чтобы обсудить, как вы можете принять участие.
Я читаю все документы Nvidia Tensorrt, чтобы вам не придется!
Этот проект демонстрирует, как использовать API Tensorrt C ++ для высокопроизводительного вывода GPU для данных изображения. Он охватывает, как сделать следующее:
Следующие инструкции предполагают, что вы используете Ubuntu 20.04 или 22.04. Вам нужно будет предоставить свою собственную модель ONNX для этого примера кода, или вы можете загрузить пример модель (см. Раздел проверки здравомыслия ниже).
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev (для регистрации)build_opencv.sh предоставленный в ./scripts/ .CUDNN_INCLUDE_DIR и CUDNN_LIBRARY в скрипте.CMakeLists.txt и замените TODO на путь к установке 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 отсюда.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 , в каталоге ./models/ ../inputs/team.jpg , должен создать следующий вектор функций: 3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
Включение точности Int8 может еще больше ускорить вывод за счет снижения точности из -за снижения динамического диапазона. Для точности int8 пользователь должен предоставлять данные калибровки, которые являются репрезентативными для реальных данных, которые будет увидеть модель. Рекомендуется использовать калибровочные изображения 1K+. Чтобы включить вывод INT8 с моделью проверки здравомыслия Yolov8, необходимо предпринять следующие шаги:
options.precision = Precision::FP16; to options.precision = Precision::INT8; в main.cppoptions.calibrationDataDirectoryPath = ""; Должен быть изменен в main.cpp , чтобы указать путь, содержащий данные калибровки.wget http://images.cocodataset.org/zips/val2017.zipInt8EntropyCalibrator2::getBatch в engine.cpp (см. TODO ) является правильным для вашей модели..calibration ), чтобы при последующих оптимизации модели его можно было повторно использовать. Если вы хотите восстановить данные калибровки, вы должны удалить этот файл кэша.Options.calibrationBatchSize .Цитрицы, работающие на графическом процессоре для ноутбука RTX 3050 TI, Core 11th Gen (R) Core (TM) I9-11900H @ 2,50 ГГц.
| Модель | Точность | Размер партии | AVG Время вывода |
|---|---|---|---|
| Yolov8n | FP32 | 1 | 4,732 мс |
| Yolov8n | FP16 | 1 | 2,493 мс |
| Yolov8n | Int8 | 1 | 2,009 мс |
| Yolov8x | FP32 | 1 | 76,63 мс |
| Yolov8x | FP16 | 1 | 25,08 мс |
| Yolov8x | Int8 | 1 | 11,62 мс |
Хотите знать, как интегрировать эту библиотеку в свой проект? Или, может быть, как прочитать выходы модели Yolov8 для извлечения значимой информации? Если это так, ознакомьтесь с моими двумя последними проектами, Yolov8-Tensorrt-CPP и Yolov9-Tensorrt-CPP, которые демонстрируют, как использовать API Tensorrt C ++ для выполнения вывода Yolov8/9 (поддерживает обнаружение объекта, семантическую сегментацию и оценку позы тела). Они используют этот проект в бэкэнде!
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.mdinclude/engine . Я написал много комментариев на протяжении всего кода, которые должны облегчить понимание того, что происходит.include/engine/EngineRunInference.inl .include/engine/EngineBuildLoadNetwork.inl . Реализация использует библиотеку spdlog для регистрации. Вы можете изменить уровень журнала, установив переменную среды LOG_LEVEL на одно из следующих значений: trace , debug , info , warn , error , critical , off .
Если у вас есть проблемы, создающие файл двигателя Tensorrt из модели ONNX, рассмотрите возможность установки переменной среды LOG_LEVEL для trace и повторного использования приложения. Это должно дать вам больше информации о том, где именно процесс сборки проходит.
Если бы этот проект был полезен для вас, я был бы признателен, если бы вы могли дать ему звезду. Это побудит меня убедиться, что он актуально и быстро решает проблемы. Я также делаю консалтинговую работу, если вам нужна более конкретная помощь. Связаться со мной на LinkedIn.
Loic Tetrel | Thomaskleiven | Висин |
V6.0
V5.0
Engine был изменен, чтобы принять параметр шаблона, который указывает тип выходных данных моделей. Реализация теперь поддерживает выходы типа float , __half , int8_t , int32_t , bool и uint8_t .Options были правильно установлены для вашей модели (например, если ваша модель была скомпилирована для FP32, но вы пытаетесь выполнить вывод FP16, она не удастся, потенциально без погрешности словесной).V4.1
V4.0
V3.0
IExecutionContext::enqueueV3() ).driver до run_inference_benchmark и теперь должен пройти путь к модели ONNX в качестве аргумента командной строки.Options.doesSupportDynamicBatchSize . Реализация теперь автоматически определяет размеры партий.Options.maxWorkspaceSize . Реализация теперь не ограничивает память графических процессоров во время конструкций модели, позволяя реализации использовать столько пула памяти, сколько доступно для промежуточных слоев.v2.2
V2.1
V2.0
Options.optBatchSizes был удален, заменен Options.optBatchSize .Спасибо этим замечательным людям (ключ эмодзи):
Этот проект следует за спецификацией всех контролей. Взносы любого вида приветствуются!