Production CV
~30 мин

Оптимизация инференса

TensorRT, ONNX Runtime, quantization (INT8/FP16), pruning, knowledge distillation — ускорение моделей.

Оптимизация инференса — от модели к production

Обучить модель — полдела. В production важна скорость, стоимость и ресурсы. ViT-Large дает 87% accuracy, но 300ms на GPU. Заказчику нужно < 50ms. Оптимизация инференса — это мост между research и production. На собеседовании CV-инженера обязательно спросят: "как ускорить модель в 5 раз?".

Quantization — меньше бит, быстрее инференс

Квантизация — уменьшение точности весов и активаций: FP32 → FP16 → INT8 → INT4.

  • FP16 (half precision) — самый простой шаг. В PyTorch: model.half() или torch.autocast. Ускорение ~2x на GPU, минимальная потеря качества.
  • INT8 quantization — веса и активации в 8-bit integer. Ускорение ~2-4x. Два подхода:
  • Post-training quantization (PTQ) — квантизуем готовую модель. Быстро, но может терять 1-2% accuracy.
  • Quantization-aware training (QAT) — обучение с "симуляцией" квантизации. Точнее, но дольше.
  • INT4 / GPTQ / AWQ — агрессивная квантизация для LLM и больших ViT. 4-bit веса + FP16 активации. Потери 0.5-1% accuracy.
  • Dynamic vs Static — dynamic: диапазоны активаций определяются в runtime. Static: калибруются на representative dataset.

ONNX Runtime — универсальный оптимизатор

  • ONNX формат — Open Neural Network Exchange. Граф вычислений, не привязанный к фреймворку. PyTorch/TF → ONNX → любой runtime.
  • torch.onnx.export() — экспорт модели из PyTorch. Tracing-based: нужен пример входа.
  • ONNX Runtime — оптимизированный движок инференса: graph optimization (fusion, constant folding), kernel selection, memory planning.
  • Execution Providers — CPU (OpenMP), CUDA, TensorRT, OpenVINO, DirectML. Один ONNX — много платформ.
  • Типичное ускорение — 1.5-3x vs чистый PyTorch без квантизации. С INT8: 3-6x.

TensorRT — максимум из NVIDIA GPU

  • TensorRT — SDK от NVIDIA для оптимизации инференса на их GPU. Layer fusion, kernel auto-tuning, INT8/FP16 calibration.
  • Процесс — PyTorch → ONNX → TensorRT engine (platform-specific). Engine оптимизирован под конкретный GPU.
  • Ускорение — 2-10x vs PyTorch. Для YOLO: PyTorch ~15ms → TensorRT ~3ms на RTX 4090.
  • Ограничения — engine не переносим между GPU поколениями. Не все операции поддержаны (custom plugins).
  • Triton Inference Server — серверная обёртка от NVIDIA. Batching, model versioning, multi-model. Поддерживает TensorRT, ONNX, PyTorch.

Другие техники оптимизации

  • Pruning — удаление малозначимых весов/нейронов. Structured pruning (целые каналы) → реальное ускорение. Unstructured → только compression.
  • Knowledge Distillation — обучение маленькой модели (student) на soft targets большой (teacher). ViT-L → ViT-S с минимальной потерей.
  • Model architecture — MobileNet, EfficientNet-Lite, FastViT. Специально спроектированы для скорости.
  • Torch.compile — JIT-компиляция PyTorch 2.0. model = torch.compile(model). Fusion + codegen. 1.5-3x ускорение "бесплатно".
  • Batching — больший batch size → лучшая утилизация GPU. Dynamic batching в Triton Server.
  • Precision per layer — mixed precision: критичные слои в FP16, остальные в INT8. Fine-grained контроль.

Типичный пайплайн оптимизации

1) FP16 (бесплатно, ~2x) → 2) torch.compile (бесплатно, ~1.5x) → 3) ONNX Runtime (немного работы, ~2x) → 4) TensorRT (больше работы, ~3x) → 5) INT8 quantization (калибровка, ~2x) → 6) Pruning/Distillation (обучение, ~2x). Общее ускорение может быть 10-50x.

🎯 На собеседовании

Частые вопросы

Как ускорить модель в 5x без переобучения? FP16 (~2x) + ONNX/TensorRT (~2-3x) + dynamic batching. Итого 4-6x без потери качества. • Чем PTQ отличается от QAT? PTQ — квантизуем готовую модель (быстро, но потери). QAT — обучаем с fake quantization (точнее, но дольше). • Что такое ONNX? Open Neural Network Exchange — формат графа вычислений. Экспорт из PyTorch/TF, запуск в ONNX Runtime, TensorRT, OpenVINO. • Когда использовать TensorRT vs ONNX Runtime? TensorRT — максимум производительности на NVIDIA GPU, но engine не переносим. ONNX Runtime — кроссплатформенный, проще в использовании.