Экспорт в TensorRT для моделей YOLO26

Развертывание моделей computer vision в высокопроизводительных средах может потребовать формата, обеспечивающего максимальную скорость и эффективность. Это особенно актуально при развертывании модели на GPU NVIDIA.

Используя формат экспорта TensorRT, ты можешь оптимизировать свои модели Ultralytics YOLO26 для быстрой и эффективной инференции на оборудовании NVIDIA. Это руководство предоставит тебе простые пошаговые инструкции по процессу конвертации и поможет максимально эффективно использовать передовые технологии NVIDIA в твоих проектах deep learning.

TensorRT

NVIDIA TensorRT optimization workflow

TensorRT, разработанный NVIDIA, — это передовой набор инструментов для разработчиков (SDK), созданный для высокоскоростной инференции глубокого обучения. Он отлично подходит для задач реального времени, таких как object detection.

Этот инструментарий оптимизирует модели глубокого обучения для GPU NVIDIA, обеспечивая более быстрые и эффективные операции. Модели TensorRT проходят оптимизацию, которая включает в себя такие методы, как слияние слоев, калибровка точности (INT8 и FP16), динамическое управление памятью тензоров и автонастройка ядер. Конвертация моделей глубокого обучения в формат TensorRT позволяет разработчикам в полной мере реализовать потенциал GPU NVIDIA.

TensorRT известен своей совместимостью с различными форматами моделей, включая TensorFlow, PyTorch и ONNX, предоставляя разработчикам гибкое решение для интеграции и оптимизации моделей из разных фреймворков. Эта универсальность обеспечивает эффективное model deployment в разнообразных аппаратных и программных средах.

Ключевые особенности моделей TensorRT

Модели TensorRT предлагают ряд ключевых функций, которые способствуют их эффективности и результативности при высокоскоростной инференции глубокого обучения:

  • Precision Calibration: TensorRT поддерживает калибровку точности, позволяя тонко настраивать модели под специфические требования к точности. Это включает поддержку форматов с пониженной точностью, таких как INT8 и FP16, что может дополнительно повысить скорость инференции при сохранении приемлемого уровня точности.

  • Layer Fusion: Процесс оптимизации TensorRT включает слияние слоев (layer fusion), при котором несколько слоев neural network объединяются в одну операцию. Это снижает вычислительные затраты и улучшает скорость инференции за счет минимизации доступа к памяти и вычислений.

TensorRT neural network layer fusion optimization

  • Dynamic Tensor Memory Management: TensorRT эффективно управляет использованием памяти тензоров во время инференции, сокращая накладные расходы и оптимизируя распределение памяти. Это приводит к более эффективному использованию памяти GPU.

  • Automatic Kernel Tuning: TensorRT применяет автоматическую настройку ядер для выбора наиболее оптимизированного ядра GPU для каждого слоя модели. Этот адаптивный подход гарантирует, что модель в полной мере использует вычислительную мощность GPU.

Варианты развертывания в TensorRT

Прежде чем мы рассмотрим код для экспорта моделей YOLO26 в формат TensorRT, давай разберемся, где обычно используются модели TensorRT.

TensorRT предлагает несколько вариантов развертывания, и каждый из них по-своему балансирует между простотой интеграции, оптимизацией производительности и гибкостью:

  • Развертывание в TensorFlow: Этот метод интегрирует TensorRT в TensorFlow, позволяя запускать оптимизированные модели в привычной среде TensorFlow. Это полезно для моделей с сочетанием поддерживаемых и неподдерживаемых слоев, так как TF-TRT может эффективно обрабатывать их.

NVIDIA TensorRT optimization workflow

  • Standalone TensorRT Runtime API: Предлагает детальный контроль, идеально подходит для критически важных по производительности приложений. Это более сложный вариант, но он позволяет реализовать нестандартные операторы.

  • NVIDIA Triton Inference Server: Вариант, поддерживающий модели из различных фреймворков. Особенно подходит для облачной или периферийной инференции, предоставляя такие функции, как параллельное выполнение моделей и анализ моделей.

Экспорт моделей YOLO26 в TensorRT

Ты можешь повысить эффективность выполнения и оптимизировать производительность, конвертировав модели YOLO26 в формат TensorRT.

Установка

Чтобы установить необходимый пакет, выполни:

Установка
# Install the required package for YOLO26
pip install ultralytics

Для получения подробных инструкций и рекомендаций по процессу установки ознакомься с нашим Руководством по установке YOLO26. Если при установке необходимых пакетов для YOLO26 у тебя возникнут трудности, обратись к нашему Руководству по распространенным проблемам за решениями и советами.

Использование

Прежде чем переходить к инструкциям по использованию, обязательно ознакомься с ассортиментом моделей YOLO26, предлагаемых Ultralytics. Это поможет тебе выбрать наиболее подходящую модель для требований твоего проекта.

Использование
from ultralytics import YOLO

# Load the YOLO26 model
model = YOLO("yolo26n.pt")

# Export the model to TensorRT format
model.export(format="engine")  # creates 'yolo26n.engine'

# Load the exported TensorRT model
tensorrt_model = YOLO("yolo26n.engine")

# Run inference
results = tensorrt_model("https://ultralytics.com/images/bus.jpg")

Аргументы экспорта

АргументТипПо умолчаниюОписание
formatstr'engine'Целевой формат для экспортируемой модели, определяющий совместимость с различными средами развертывания.
imgszint или tuple640Желаемый размер изображения для входных данных модели. Может быть целым числом для квадратных изображений или кортежем (height, width) для указания конкретных размеров.
halfboolFalseВключает квантование FP16 (половинной точности), уменьшая размер модели и потенциально ускоряя логический вывод на поддерживаемом оборудовании.
int8boolFalseАктивирует квантование INT8, дополнительно сжимая модель и ускоряя логический вывод с минимальной потерей точности, в основном для периферийных устройств.
dynamicboolFalseПозволяет использовать динамические размеры входных данных, что повышает гибкость при обработке изображений разных размеров.
simplifyboolTrueУпрощает граф модели с помощью onnxslim, потенциально улучшая производительность и совместимость.
workspacefloat или NoneNoneУстанавливает максимальный размер рабочего пространства в ГиБ для оптимизаций TensorRT, балансируя использование памяти и производительность; используй None для автоматического распределения памяти TensorRT до максимума устройства.
nmsboolFalseДобавляет подавление немаксимумов (NMS), необходимое для точной и эффективной постобработки обнаружений.
batchint1Указывает размер пакетного инференса для экспортированной модели или максимальное количество изображений, которые модель будет обрабатывать одновременно в режиме predict.
datastr'coco8.yaml'Путь к файлу конфигурации dataset (по умолчанию: coco8.yaml), необходимому для квантования.
fractionfloat1.0Задает долю набора данных для использования при калибровке квантования INT8. Позволяет выполнять калибровку на подмножестве полного набора данных, что полезно для экспериментов или при ограниченных ресурсах. Если не указано при включенном INT8, будет использован полный набор данных.
devicestrNoneУказывает устройство для экспорта: GPU (device=0), DLA для NVIDIA Jetson (device=dla:0 или device=dla:1).
Совет

Пожалуйста, убедись, что при экспорте в TensorRT ты используешь GPU с поддержкой CUDA.

Для получения более подробной информации о процессе экспорта посети страницу документации Ultralytics по экспорту.

Экспорт TensorRT с квантованием INT8

Экспорт моделей Ultralytics YOLO с использованием TensorRT и precision INT8 выполняет пост-тренировочное квантование (PTQ). TensorRT использует калибровку для PTQ, которая измеряет распределение активаций внутри каждого тензора активации, когда модель YOLO выполняет инференцию на репрезентативных входных данных, а затем использует это распределение для оценки масштабирующих значений для каждого тензора. Каждый тензор активации, являющийся кандидатом на квантование, имеет связанный с ним масштаб, выведенный в процессе калибровки.

При обработке неявно квантованных сетей TensorRT использует INT8 по мере возможности для оптимизации времени выполнения слоев. Если слой работает быстрее в INT8 и имеет назначенные шкалы квантования на своих входных и выходных данных, то для этого слоя назначается ядро с точностью INT8, в противном случае TensorRT выбирает точность FP32 или FP16 для ядра в зависимости от того, что дает более быстрое время выполнения для этого слоя.

Совет

Крайне важно убедиться, что для экспорта с точностью INT8 используется то же устройство, на котором будут использоваться веса модели TensorRT для развертывания, так как результаты калибровки могут варьироваться в зависимости от устройства.

Настройка экспорта INT8

Аргументы, предоставленные при использовании export для модели Ultralytics YOLO, значительно повлияют на производительность экспортированной модели. Их также необходимо выбирать в зависимости от доступных ресурсов устройства, однако аргументы по умолчанию должны работать для большинства дискретных GPU NVIDIA Ampere (или более новых). Используемый алгоритм калибровки — "MINMAX_CALIBRATION", подробнее о доступных вариантах можно прочитать в руководстве разработчика TensorRT. Тесты Ultralytics показали, что "MINMAX_CALIBRATION" является лучшим выбором, и экспорт фиксирован на использовании этого алгоритма.

  • workspace : Управляет размером (в ГиБ) выделяемой памяти устройства во время конвертации весов модели.

    • Настрой значение workspace в соответствии с твоими потребностями в калибровке и доступностью ресурсов. Хотя больший workspace может увеличить время калибровки, он позволяет TensorRT исследовать более широкий спектр тактик оптимизации, потенциально повышая производительность модели и accuracy. И наоборот, меньший workspace может сократить время калибровки, но ограничить стратегии оптимизации, влияя на качество квантованной модели.

    • По умолчанию workspace=None, что позволит TensorRT автоматически распределять память. При ручной настройке это значение, возможно, потребуется увеличить, если калибровка завершается аварийно (выходит без предупреждения).

    • TensorRT сообщит об UNSUPPORTED_STATE во время экспорта, если значение workspace превышает память, доступную устройству, что означает, что значение workspace следует уменьшить или установить в None.

    • Если workspace установлено на максимальное значение, а калибровка не удается/завершается аварийно, рассмотри использование None для автораспределения или уменьшение значений imgsz и batch для снижения требований к памяти.

    • Помни, что калибровка для INT8 специфична для каждого устройства: использование «высокопроизводительного» GPU для калибровки может привести к плохой производительности при запуске инференции на другом устройстве.

  • batch : Максимальный размер пакета, который будет использоваться для инференции. Во время инференции можно использовать меньшие пакеты, но инференция не примет пакеты больше, чем указано.

Примечание

Использование малых пакетов может привести к неточному масштабированию во время калибровки INT8. Это связано с тем, что процесс настраивается на основе данных, которые он видит. Малые пакеты могут не охватить весь диапазон значений, что приведет к проблемам с итоговой калибровкой. Использование большего batch size помогает обеспечить более репрезентативные результаты калибровки.

Эксперименты NVIDIA привели их к рекомендации использовать не менее 500 изображений калибровки, репрезентативных для данных твоей модели, при калибровке квантования INT8. Это рекомендация, а не жесткое требование, и тебе нужно будет поэкспериментировать, чтобы понять, что необходимо для хорошей работы на твоем наборе данных. Поскольку данные калибровки требуются для калибровки INT8 с TensorRT, убедись, что ты используешь аргумент data, когда int8=True для TensorRT, и используй data="my_dataset.yaml", который будет использовать изображения из validation для калибровки. Если для экспорта в TensorRT с квантованием INT8 значение для data не передается, по умолчанию будет использоваться один из "малых" примеров наборов данных на основе задачи модели, вместо выдачи ошибки.

Пример
from ultralytics import YOLO

model = YOLO("yolo26n.pt")
model.export(
    format="engine",
    dynamic=True,  # (1)!
    batch=8,  # (2)!
    workspace=4,  # (3)!
    int8=True,
    data="coco.yaml",  # (4)!
)

# Load the exported TensorRT INT8 model
model = YOLO("yolo26n.engine", task="detect")

# Run inference
result = model.predict("https://ultralytics.com/images/bus.jpg")
  1. Экспортирует с динамическими осями; это будет включено по умолчанию при экспорте с int8=True, даже если явно не задано. См. аргументы экспорта для получения дополнительной информации.
  2. Устанавливает максимальный размер пакета 8 для экспортируемой модели и калибровки INT8.
  3. Выделяет 4 ГиБ памяти вместо выделения всего устройства для процесса конвертации.
  4. Использует COCO dataset для калибровки, в частности изображения, используемые для validation (всего 5 000).
Кэш калибровки

TensorRT создаст .cache калибровки, который можно повторно использовать для ускорения экспорта будущих весов модели с использованием тех же данных, но это может привести к плохой калибровке, если данные сильно отличаются или если значение batch сильно изменено. В этих обстоятельствах существующий .cache следует переименовать и переместить в другой каталог или полностью удалить.

Преимущества использования YOLO с TensorRT INT8

  • Уменьшенный размер модели: Квантование из FP32 в INT8 может уменьшить размер модели в 4 раза (на диске или в памяти), что приводит к более быстрой загрузке, меньшим требованиям к хранилищу и уменьшенному объему памяти при развертывании модели.

  • Сниженное энергопотребление: Операции с пониженной точностью для моделей YOLO, экспортированных в INT8, могут потреблять меньше энергии по сравнению с моделями FP32, особенно для устройств с питанием от аккумулятора.

  • Улучшенная скорость инференции: TensorRT оптимизирует модель для целевого оборудования, потенциально повышая скорость инференции на GPU, встроенных устройствах и ускорителях.

Примечание о скорости инференции

Первые несколько вызовов инференции с моделью, экспортированной в TensorRT INT8, могут иметь более длительное, чем обычно, время препроцессинга, инференции и/или постпроцессинга. Это также может происходить при изменении imgsz во время инференции, особенно если imgsz не совпадает с тем, что было указано при экспорте (экспорт imgsz устанавливается как "оптимальный" профиль TensorRT).

Недостатки использования YOLO с TensorRT INT8

  • Снижение метрик оценки: Использование более низкой точности означает, что mAP, Precision, Recall или любая другая метрика, используемая для оценки производительности модели, скорее всего, будут несколько хуже. См. раздел результатов производительности для сравнения различий в mAP50 и mAP50-95 при экспорте с INT8 на небольшом наборе различных устройств.

  • Увеличенное время разработки: Поиск "оптимальных" настроек калибровки INT8 для набора данных и устройства может потребовать значительного количества тестирования.

  • Зависимость от оборудования: Калибровка и прирост производительности могут сильно зависеть от оборудования, а веса моделей менее переносимы.

Производительность экспорта Ultralytics YOLO в TensorRT

NVIDIA A100

Производительность

Протестировано с Ubuntu 22.04.3 LTS, python 3.10.12, ultralytics==8.2.4, tensorrt==8.6.1.post1

Смотри документацию по детекции для примеров использования этих моделей, обученных на COCO, которые включают 80 предобученных классов.

Примечание

Время инференции указано для mean, min (самое быстрое) и max (самое медленное) для каждого теста с использованием предобученных весов yolov8n.engine

PrecisionТест оценкисреднее
(мс)
мин | макс
(мс)
mAPval
50(B)
mAPval
50-95(B)
batchразмер
(пиксели)
FP32Прогнозирование0.520.51 | 0.568640
FP32COCOval0.520.520.371640
FP16Прогнозирование0.340.34 | 0.418640
FP16COCOval0.330.520.371640
INT8Прогнозирование0.280.27 | 0.318640
INT8COCOval0.290.470.331640

Потребительские GPU

Производительность детектирования (COCO)

Протестировано на Windows 10.0.19045, python 3.10.9, ultralytics==8.2.4, tensorrt==10.0.0b6

Примечание

Время инференции указано для mean, min (самое быстрое) и max (самое медленное) для каждого теста с использованием предобученных весов yolov8n.engine

PrecisionТест оценкисреднее
(мс)
мин | макс
(мс)
mAPval
50(B)
mAPval
50-95(B)
batchразмер
(пиксели)
FP32Прогнозирование1.060.75 | 1.888640
FP32COCOval1.370.520.371640
FP16Прогнозирование0.620.75 | 1.138640
FP16COCOval0.850.520.371640
INT8Прогнозирование0.520.38 | 1.008640
INT8COCOval0.740.470.331640

Встраиваемые устройства

Производительность детектирования (COCO)

Протестировано с JetPack 6.0 (L4T 36.3) Ubuntu 22.04.4 LTS, python 3.10.12, ultralytics==8.2.16, tensorrt==10.0.1

Примечание

Время инференции указано для mean, min (самое быстрое) и max (самое медленное) для каждого теста с использованием предобученных весов yolov8n.engine

PrecisionТест оценкисреднее
(мс)
мин | макс
(мс)
mAPval
50(B)
mAPval
50-95(B)
batchразмер
(пиксели)
FP32Прогнозирование6.116.10 | 6.298640
FP32COCOval6.170.520.371640
FP16Прогнозирование3.183.18 | 3.208640
FP16COCOval3.190.520.371640
INT8Прогнозирование2.302.29 | 2.358640
INT8COCOval2.320.460.321640
Информация

Ознакомься с нашим руководством по быстрому старту на NVIDIA Jetson с Ultralytics YOLO, чтобы узнать больше о настройке и конфигурации.

Информация

Ознакомься с нашим руководством по быстрому старту на NVIDIA DGX Spark с Ultralytics YOLO, чтобы узнать больше о настройке и конфигурации.

Методы оценки

Разверни разделы ниже для получения информации о том, как эти модели были экспортированы и протестированы.

Конфигурации экспорта

См. режим экспорта для получения подробной информации об аргументах конфигурации экспорта.

from ultralytics import YOLO

model = YOLO("yolo26n.pt")

# TensorRT FP32
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2)

# TensorRT FP16
out = model.export(format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, half=True)

# TensorRT INT8 with calibration `data` (i.e. COCO, ImageNet, or DOTAv1 for appropriate model task)
out = model.export(
    format="engine", imgsz=640, dynamic=True, verbose=False, batch=8, workspace=2, int8=True, data="coco8.yaml"
)
Цикл предсказания

См. режим предсказания для получения дополнительной информации.

import cv2

from ultralytics import YOLO

model = YOLO("yolo26n.engine")
img = cv2.imread("path/to/image.jpg")

for _ in range(100):
    result = model.predict(
        [img] * 8,  # batch=8 of the same image
        verbose=False,
        device="cuda",
    )
Конфигурация валидации

См. val режим, чтобы узнать больше об аргументах конфигурации валидации.

from ultralytics import YOLO

model = YOLO("yolo26n.engine")
results = model.val(
    data="data.yaml",  # COCO, ImageNet, or DOTAv1 for appropriate model task
    batch=1,
    imgsz=640,
    verbose=False,
    device="cuda",
)

Развертывание экспортированных моделей YOLO26 TensorRT

Успешно экспортировав свои модели Ultralytics YOLO26 в формат TensorRT, ты готов к их развертыванию. Для получения подробных инструкций по развертыванию моделей TensorRT в различных средах, ознакомься со следующими ресурсами:

Резюме

В этом руководстве мы сосредоточились на преобразовании моделей Ultralytics YOLO26 в формат моделей NVIDIA TensorRT. Этот шаг преобразования важен для повышения эффективности и скорости работы моделей YOLO26, делая их более результативными и подходящими для различных сред развертывания.

Для получения дополнительной информации о деталях использования, загляни в официальную документацию TensorRT.

Если тебе интересны другие интеграции Ultralytics YOLO26, на нашей странице руководств по интеграциям представлен широкий выбор информативных ресурсов и идей.

Часто задаваемые вопросы (FAQ)

Как преобразовать модели YOLO26 в формат TensorRT?

Чтобы преобразовать свои модели Ultralytics YOLO26 в формат TensorRT для оптимизированного вывода на GPU NVIDIA, выполни следующие действия:

  1. Установи необходимый пакет:

    pip install ultralytics
  2. Экспортируй свою модель YOLO26:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="engine")  # creates 'yolo26n.engine'
    
    # Run inference
    model = YOLO("yolo26n.engine")
    results = model("https://ultralytics.com/images/bus.jpg")

Для получения более подробной информации посети руководство по установке YOLO26 и документацию по экспорту.

В чем преимущества использования TensorRT для моделей YOLO26?

Использование TensorRT для оптимизации моделей YOLO26 дает несколько преимуществ:

  • Более высокая скорость вывода: TensorRT оптимизирует слои модели и использует калибровку точности (INT8 и FP16) для ускорения вывода без существенной потери точности.
  • Эффективность памяти: TensorRT управляет памятью тензоров динамически, снижая накладные расходы и улучшая использование видеопамяти GPU.
  • Объединение слоев (Layer Fusion): Объединяет несколько слоев в одну операцию, снижая вычислительную сложность.
  • Автоматическая настройка ядер: Автоматически выбирает оптимизированные ядра GPU для каждого слоя модели, обеспечивая максимальную производительность.

Чтобы узнать больше, изучи официальную документацию TensorRT от NVIDIA и наш подробный обзор TensorRT.

Могу ли я использовать INT8-квантование с TensorRT для моделей YOLO26?

Да, ты можешь экспортировать модели YOLO26 с использованием TensorRT с INT8-квантованием. Этот процесс включает квантование после обучения (PTQ) и калибровку:

  1. Экспорт с INT8:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.pt")
    model.export(format="engine", batch=8, workspace=4, int8=True, data="coco.yaml")
  2. Запуск вывода:

    from ultralytics import YOLO
    
    model = YOLO("yolo26n.engine", task="detect")
    result = model.predict("https://ultralytics.com/images/bus.jpg")

Для получения более подробной информации обратись к разделу экспорт TensorRT с INT8-квантованием.

Как мне развернуть модели YOLO26 TensorRT на сервере NVIDIA Triton Inference?

Развертывание моделей YOLO26 TensorRT на сервере NVIDIA Triton Inference можно выполнить, используя следующие ресурсы:

Эти руководства помогут тебе эффективно интегрировать модели YOLO26 в различные среды развертывания.

Какие улучшения производительности наблюдаются при использовании моделей YOLO26, экспортированных в TensorRT?

Улучшения производительности при использовании TensorRT могут варьироваться в зависимости от используемого оборудования. Вот несколько типичных бенчмарков:

  • NVIDIA A100:

    • Вывод FP32: ~0.52 мс / изображение
    • Вывод FP16: ~0.34 мс / изображение
    • Вывод INT8: ~0.28 мс / изображение
    • Небольшое снижение mAP при точности INT8, но значительное увеличение скорости.
  • Потребительские GPU (например, RTX 3080):

    • Вывод FP32: ~1.06 мс / изображение
    • Вывод FP16: ~0.62 мс / изображение
    • Вывод INT8: ~0.52 мс / изображение

Подробные бенчмарки производительности для различных конфигураций оборудования можно найти в разделе производительности.

Для получения более полных сведений о производительности TensorRT обратись к документации Ultralytics и нашим отчетам об анализе производительности.

Комментарии