Преобразование ONNX-моделей лиц в TensorRT и OpenVINO
Практическое руководство для продакшена: конвертация ONNX-моделей в стиле InsightFace в TensorRT engine и OpenVINO IR с проверкой, выбором точности, benchmark и release-контролем.
Что вы настроите
Большинство внедрений 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.
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 numpysource .venv/bin/activate
python -m pip install openvino
ovc --help
benchmark_app --help# 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 --versionsource .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 --version2. Проверить исходный ONNX-граф
Перед конвертацией проверьте модель, а не предполагаемые имя входа или форму. Вход моделей распознавания лиц обычно имеет форму 1x3x112x112 в NCHW layout (batch, channels, height, width); детекторы и swappers могут иметь большие динамические формы.
Точно зафиксируйте preprocessing: порядок RGB/BGR, mean/std, layout каналов, alignment, размер crop и post-processing. Runtime-конвертация не исправляет mismatch в preprocessing.
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)
PY3. Упростить и зафиксировать формы, где это уместно
TensorRT и OpenVINO лучше оптимизируют граф с ясными формами. Для fixed-size backbone распознавания можно зафиксировать вход; для детекторов оставьте динамические размеры и позже задайте реалистичные optimization profiles.
Используйте упрощение только после проверки, что simplified model дает численно близкие выходы. Проверка cosine similarity между исходным и simplified ONNX должна быть частью CI для коммерческих моделей.
python -m onnxsim models/insightface.onnx models/insightface.simplified.onnx --overwrite-input-shape input:1,3,112,1124. Собрать 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.
trtexec --onnx=models/insightface.simplified.onnx --saveEngine=engines/insightface_fp16.plan --minShapes=input:1x3x112x112 --optShapes=input:16x3x112x112 --maxShapes=input:32x3x112x112 --fp16 --workspace=4096 --verbosetrtexec --onnx=models/insightface.simplified.onnx --saveEngine=engines/insightface_int8.plan --minShapes=input:1x3x112x112 --optShapes=input:16x3x112x112 --maxShapes=input:32x3x112x112 --int8 --calib=calibration.cache5. Конвертировать 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.
ovc models/insightface.simplified.onnx --output_model openvino/insightface.xml --input "input[1,3,112,112]" --compress_to_fp16=Truebenchmark_app -m openvino/insightface.xml -d CPU -shape "input[16,3,112,112]" -hint throughput6. Запустить inference через OpenVINO
Загрузите compiled OpenVINO model один раз при старте сервиса и переиспользуйте между запросами. Выберите CPU, GPU, AUTO или HETERO согласно production hardware policy.
Для face recognition нормализуйте output embeddings точно как в ONNX baseline перед расчетом cosine similarity или matching thresholds.
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.
Связаться