← Назад к руководствам
ONNXTensorRTOpenVINOРазвертывание

Преобразование ONNX-моделей лиц в TensorRT и OpenVINO

Практическое руководство для продакшена: конвертация ONNX-моделей в стиле InsightFace в TensorRT engine и OpenVINO IR с проверкой, выбором точности, benchmark и release-контролем.

12 мин чтения

Что вы настроите

Большинство внедрений InsightFace начинается с ONNX, потому что формат переносим между исследовательским кодом, Python-сервисами и edge-пакетами. В продакшене обычно нужен оптимизированный runtime: TensorRT для NVIDIA GPU и OpenVINO для Intel CPU, iGPU и edge-ускорителей.

Руководство описывает безопасный поток: проверить ONNX-граф, упростить статические формы, собрать TensorRT engine, экспортировать OpenVINO IR, измерить оба runtime и сравнить embeddings или результаты детекции с исходным ONNX перед релизом.

Перед началом

  • Проверенная ONNX-модель с известным именем входа, layout и правилами нормализации.
  • Linux x86_64 сервер, желательно Ubuntu 22.04 LTS или 24.04 LTS, с sudo access.
  • NVIDIA driver и CUDA toolkit, совпадающие с TensorRT package, если целевая платформа — NVIDIA GPU.
  • Небольшой validation set, отражающий реальные размеры изображений, демографию, свет и качество камер.

1. Установить инструменты конвертации на Linux-сервере

Начните с чистого Linux x86_64 сервера. Ubuntu 22.04 LTS или 24.04 LTS — практичный выбор, потому что Python wheels, OpenVINO, NVIDIA drivers, CUDA и TensorRT tools хорошо поддерживаются.

Установите ONNX-утилиты в virtual environment, OpenVINO из PyPI для CPU и Intel devices, а TensorRT — из NVIDIA package, совпадающего с driver и CUDA на сервере. Сохраняйте версии вместе с artifacts, чтобы production engines были воспроизводимыми.

  • Собирайте TensorRT engines с той же CUDA, TensorRT и driver family, что и production.
  • Изолируйте Python tools в virtual environment, чтобы conversion dependencies не влияли на serving stack.
  • Запускайте verification commands перед конвертацией customer или production models.
Install Python ONNX tools
sudo apt-get update
sudo apt-get install -y python3 python3-venv python3-pip build-essential
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install onnx onnxsim onnxruntime numpy
Install OpenVINO CLI tools
source .venv/bin/activate
python -m pip install openvino
ovc --help
benchmark_app --help
Install TensorRT CLI tools
# Install an NVIDIA driver and CUDA version supported by your TensorRT package first.
# Then download the matching TensorRT tar package from NVIDIA Developer.
tar -xzf TensorRT-10.*.Linux.x86_64-gnu.cuda-12.*.tar.gz
export TENSORRT_HOME=$PWD/TensorRT-10.*
export PATH=$TENSORRT_HOME/bin:$PATH
export LD_LIBRARY_PATH=$TENSORRT_HOME/lib:$LD_LIBRARY_PATH
trtexec --version
Verify the conversion toolchain
source .venv/bin/activate
python - <<'PY'
import onnx
import onnxruntime
import openvino
print("onnx", onnx.__version__)
print("onnxruntime", onnxruntime.__version__)
print("openvino", openvino.__version__)
PY
trtexec --version

2. Проверить исходный ONNX-граф

Перед конвертацией проверьте модель, а не предполагаемые имя входа или форму. Вход моделей распознавания лиц обычно имеет форму 1x3x112x112 в NCHW layout (batch, channels, height, width); детекторы и swappers могут иметь большие динамические формы.

Точно зафиксируйте preprocessing: порядок RGB/BGR, mean/std, layout каналов, alignment, размер crop и post-processing. Runtime-конвертация не исправляет mismatch в preprocessing.

Inspect inputs and outputs
python - <<'PY'
import onnx
from onnx import checker

model_path = "models/insightface.onnx"
model = onnx.load(model_path)
checker.check_model(model)
print("IR version:", model.ir_version)
print("Inputs:")
for item in model.graph.input:
    shape = [dim.dim_value or dim.dim_param for dim in item.type.tensor_type.shape.dim]
    print(" ", item.name, shape)
print("Outputs:")
for item in model.graph.output:
    shape = [dim.dim_value or dim.dim_param for dim in item.type.tensor_type.shape.dim]
    print(" ", item.name, shape)
PY

3. Упростить и зафиксировать формы, где это уместно

TensorRT и OpenVINO лучше оптимизируют граф с ясными формами. Для fixed-size backbone распознавания можно зафиксировать вход; для детекторов оставьте динамические размеры и позже задайте реалистичные optimization profiles.

Используйте упрощение только после проверки, что simplified model дает численно близкие выходы. Проверка cosine similarity между исходным и simplified ONNX должна быть частью CI для коммерческих моделей.

Simplify a fixed-size recognition model
python -m onnxsim models/insightface.onnx models/insightface.simplified.onnx   --overwrite-input-shape input:1,3,112,112

4. Собрать TensorRT engine

TensorRT engines зависят от hardware и версии TensorRT. Собирайте их на том же классе GPU и driver stack, что и production, и сохраняйте source ONNX, версию TensorRT, CUDA, precision и optimization profile вместе с artifact.

FP16 — стандартный production-выбор для большинства face embedding и face swapping workloads на современных NVIDIA GPU. INT8 полезен для high-throughput detection, но требует calibration data и более строгих accuracy gates.

  • min/opt/max shapes должны соответствовать реальным batch sizes, а не крайним теоретическим лимитам.
  • Держите отдельный engine для каждой крупной input family, если формы detector или swapper сильно различаются.
  • Отклоняйте engine, если cosine similarity или detection metrics выходят за release threshold.
Build an FP16 TensorRT engine
trtexec   --onnx=models/insightface.simplified.onnx   --saveEngine=engines/insightface_fp16.plan   --minShapes=input:1x3x112x112   --optShapes=input:16x3x112x112   --maxShapes=input:32x3x112x112   --fp16   --workspace=4096   --verbose
Optional INT8 engine with calibration cache
trtexec   --onnx=models/insightface.simplified.onnx   --saveEngine=engines/insightface_int8.plan   --minShapes=input:1x3x112x112   --optShapes=input:16x3x112x112   --maxShapes=input:32x3x112x112   --int8   --calib=calibration.cache

5. Конвертировать ONNX в OpenVINO IR

OpenVINO IR состоит из XML и BIN файлов и разворачивается через OpenVINO runtime. Это хороший выбор для CPU-heavy сервисов, Intel GPU inference и edge-систем, где важна операционная простота.

Для recognition models FP16 compression обычно снижает память и повышает throughput с минимальным embedding drift. Для compliance-sensitive verification храните FP32 artifacts для audit comparison, даже если production использует FP16.

Convert to OpenVINO IR
ovc models/insightface.simplified.onnx   --output_model openvino/insightface.xml   --input "input[1,3,112,112]"   --compress_to_fp16=True
Benchmark OpenVINO throughput
benchmark_app   -m openvino/insightface.xml   -d CPU   -shape "input[16,3,112,112]"   -hint throughput

6. Запустить inference через OpenVINO

Загрузите compiled OpenVINO model один раз при старте сервиса и переиспользуйте между запросами. Выберите CPU, GPU, AUTO или HETERO согласно production hardware policy.

Для face recognition нормализуйте output embeddings точно как в ONNX baseline перед расчетом cosine similarity или matching thresholds.

Minimal OpenVINO Python inference
from openvino import Core
import numpy as np

core = Core()
compiled = core.compile_model("openvino/insightface.xml", "CPU")
input_layer = compiled.input(0)
output_layer = compiled.output(0)

batch = np.random.rand(16, 3, 112, 112).astype("float32")
embeddings = compiled([batch])[output_layer]
print(embeddings.shape)

7. Проверить accuracy и безопасно выпустить

Конвертация не закончена, когда engine просто запускается. Сравните ONNX, TensorRT и OpenVINO на representative validation set. Для embeddings отслеживайте cosine similarity, norm distribution и threshold impact; для detectors — recall, false positives, landmarks и NMS.

Повышайте artifact только если latency, throughput, memory и accuracy соответствуют production target. Включите artifact metadata и rollback instructions в release package.

  • Используйте fixed random seeds и стабильный preprocessing для воспроизводимых сравнений.
  • Benchmark cold start отдельно от steady-state latency.
  • Мониторьте production drift, потому что camera quality и face pose могут отличаться от validation set.

Нужна помощь с production-развертыванием?

Свяжитесь с InsightFace по вопросам лицензирования моделей, оптимизации runtime и поддержки целевого hardware.

Связаться