Какой опыт у вас есть с использованием TensorRT или ONNX для ускорения моделей?
Использование TensorRT и ONNX для ускорения инференса моделей глубокого обучения, особенно в задачах компьютерного зрения (CV), стало критически важным компонентом пайплайнов в индустрии, где требуется минимальная задержка и высокая производительность. Ниже описан подробный опыт, методы, типичные сценарии и технические детали применения TensorRT и ONNX.
1. ONNX: Open Neural Network Exchange
Назначение:
ONNX — это открытый формат для представления нейросетевых моделей, разработанный Microsoft и Facebook, позволяющий переносить модели между фреймворками (PyTorch, TensorFlow, Keras и др.) и запускать их на универсальных оптимизированных инференс-движках (ONNX Runtime, TensorRT, OpenVINO).
Поддерживаемые задачи:
-
Классификация
-
Детекция (YOLO, SSD, Faster R-CNN)
-
Сегментация (U-Net, DeepLab)
-
OCR (CRNN, TrOCR)
-
Pose Estimation
Примеры конвертации:
import torch
model = MyModel()
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "model.onnx", opset_version=11, input_names=\["input"\], output_names=\["output"\])
Основные возможности:
-
Кросс-фреймворковая совместимость
-
Оптимизация графа (fuse, prune, quantize)
-
Работа на CPU, GPU, TPU, FPGA через ONNX Runtime
ONNX Runtime:
-
Поддержка Execution Providers: CUDA, TensorRT, OpenVINO, DML, NPU
-
Возможность Dynamic Quantization, Int8 calibration, Sparse attention
-
Используется как backend в HuggingFace, Microsoft Azure AI
2. TensorRT: NVIDIA TensorRT Inference Engine
Назначение:
TensorRT — фреймворк от NVIDIA для высокоэффективного инференса на GPU с поддержкой квантизации, фьюзинга, оптимизации графа, reordering и dynamic batching. Поддерживает работу напрямую с .onnx, .engine, .plan файлами.
Поддерживаемые задачи:
-
CV: YOLOv5/v8, SSD, UNet, CenterNet
-
NLP: BERT, GPT, T5 (через FasterTransformer)
-
Multimodal: CLIP, SAM (в упрощенной форме)
-
Custom DNN: свои модели (через плагины)
Поддерживаемые типы данных:
-
FP32 (обычный float)
-
FP16 (вдвое быстрее, меньше памяти)
-
INT8 (квантизация, требует калибровки)
-
Sparsity-aware (структурное разреживание)
3. Пайплайн ONNX → TensorRT
-
Обучение модели в PyTorch / TensorFlow
-
Экспорт в ONNX (torch.onnx.export, tf2onnx)
-
Проверка модели через onnxruntime (в том числе onnxsim, onnxchecker)
-
Оптимизация ONNX (onnxoptimizer, onnx-simplifier)
-
Конвертация в TensorRT Engine:
trtexec --onnx=model.onnx --saveEngine=model_fp16.engine --fp16
- Использование модели:
import tensorrt as trt
\# Инициализация, загрузка, обработка входов
4. Опыт оптимизации конкретных моделей
YOLOv5 / YOLOv8:
-
Экспорт модели в ONNX (с opset_version ≥ 12)
-
ONNX simplification + кастомная обработка для Grid/Concat/Sigmoid
-
Использование trtexec или Python API (tensorrt.Builder)
-
Достижение ускорения до 3–4× при INT8 inference на Jetson Xavier и A100
UNet / DeepLabV3+:
-
Проблемы с динамической размерностью маски — решаются через статическое pad/crop
-
Часто требуется ручная вставка Resize и Cast-операций
-
Сильно выигрывает от FP16 (в 2× быстрее без падения точности)
BERT-like модели:
-
Использование TensorRT-plugins через NVIDIA FasterTransformer
-
Поддержка batch_size=1 и динамического input length
-
Высокая чувствительность к precision (иногда INT8 вызывает degradation)
OCR (CRNN, TrOCR):
-
Обработка seq2seq моделей требует упрощения декодера или beam-search как постобработки на CPU
-
Часто split на encoder → decoder для частичной оптимизации
5. Сравнение скорости (опытные значения)
Модель | ONNX Runtime | TensorRT FP16 | TensorRT INT8 |
---|---|---|---|
YOLOv5s | 15 FPS | 55 FPS | 70 FPS |
--- | --- | --- | --- |
UNet 512×512 | 8 FPS | 24 FPS | 30 FPS |
--- | --- | --- | --- |
BERT-base | 10 qps | 32 qps | 45 qps |
--- | --- | --- | --- |
CRNN (OCR) | 40 FPS | 80 FPS | 100 FPS |
--- | --- | --- | --- |
Оценки на NVIDIA RTX 3080, INT8 требует calibration dataset.
6. Квантизация (INT8)
Пост-тренировочная квантизация (PTQ):
-
Использование calibration data (100–1000 изображений)
-
ONNX: quantize_dynamic, quantize_static (onnxruntime-tools)
-
TensorRT: INT8 calibrator class
QAT (Quantization Aware Training):
-
Обучение с имитацией квантизации
-
Требует PyTorch QAT-aware модели
-
Лучшие результаты по точности
7. Проблемы и обходные пути
Проблема | Решение |
---|---|
Не поддерживаются нестандартные операторы | Добавление кастомных плагинов (PluginFactory) |
--- | --- |
Сбои при динамическом batch size | Жестко задать min/opt/max через Builder |
--- | --- |
Падение точности при INT8 | QAT или вручную исключить чувствительные слои |
--- | --- |
ONNX-модель слишком большая | Использовать pruning, fuse + квантизация |
--- | --- |
Несовместимость версии opset | Downgrade с помощью onnx.convert_version |
--- | --- |
8. Edge-инференс с TensorRT
Jetson Nano / Xavier:
-
Использование JetPack SDK (включает TensorRT)
-
Прямая конвертация YOLOv5 в .engine
-
Использование cv2.dnn или pycuda + tensorrt
Coral, Raspberry Pi (альтернатива):
-
Использование TFLite с INT8 квантизацией
-
Поддержка ONNX ограничена, TensorRT не работает напрямую
9. Интеграция в продакшен
-
Использование Triton Inference Server (поддержка ONNX и TensorRT)
-
REST/gRPC интерфейс
-
Адаптивный batching, multi-model deployment
-
Мониторинг latency / throughput / memory
10. Профилирование и отладка
-
trtexec --loadEngine=model.engine --dumpProfile
-
nsight-systems, nvprof — профилировка по слоям
-
onnxruntime.InferenceSession(..., providers=["TensorrtExecutionProvider"])
Использование ONNX и TensorRT позволяет сократить latency, увеличить throughput и уменьшить энергопотребление модели, что особенно важно в edge-приложениях, мобильных и серверных системах реального времени. Успешное применение требует глубокой интеграции в ML-пайплайн, учёта особенностей каждой архитектуры и внимательного профилирования.