← Volver a las guías
ONNXTensorRTOpenVINODespliegue

Convertir modelos faciales ONNX a TensorRT y OpenVINO

Guía orientada a producción para convertir modelos ONNX de estilo InsightFace en motores TensorRT y OpenVINO IR, con validación, precisión, benchmarks y controles de despliegue.

12 min de lectura

Qué vas a construir

La mayoría de despliegues de InsightFace comienzan con ONNX porque es portable entre investigación, servicios Python y empaquetado edge. En producción suele hacer falta un runtime optimizado: TensorRT para GPU NVIDIA y OpenVINO para CPU, iGPU y aceleradores Intel.

Esta guía cubre un flujo seguro: validar el grafo ONNX, simplificar formas estáticas, crear un motor TensorRT, exportar OpenVINO IR, medir ambos runtimes y comparar embeddings o salidas de detección contra el ONNX original antes de publicar.

Antes de empezar

  • Un modelo ONNX probado con nombre de entrada, layout y normalización conocidos.
  • Un servidor Linux x86_64, preferiblemente Ubuntu 22.04 LTS o 24.04 LTS, con acceso sudo.
  • Un driver NVIDIA y CUDA toolkit que coincidan con el paquete TensorRT al usar GPUs NVIDIA.
  • Un conjunto de validación pequeño que represente tamaños, demografía, iluminación y calidad de cámara reales.

1. Instalar herramientas de conversión en un servidor Linux

Empieza con un servidor Linux x86_64 limpio. Ubuntu 22.04 LTS o 24.04 LTS es una opción práctica porque los wheels de Python, OpenVINO, los drivers NVIDIA, CUDA y TensorRT tienen buen soporte.

Instala las utilidades ONNX en un entorno virtual, OpenVINO desde PyPI para CPU y dispositivos Intel, y TensorRT desde el paquete NVIDIA que coincida con el driver y CUDA del servidor. Guarda estas versiones junto con los artefactos convertidos para reproducibilidad.

  • Construye engines TensorRT con la misma familia de CUDA, TensorRT y driver que producción.
  • Aísla las herramientas Python en un entorno virtual para que las dependencias de conversión no afecten al serving stack.
  • Ejecuta los comandos de verificación antes de convertir modelos de clientes o producción.
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. Validar el grafo ONNX de origen

Antes de convertir, inspecciona el modelo en vez de asumir el nombre o la forma de entrada. La entrada de los modelos de reconocimiento facial suele ser 1x3x112x112 en layout NCHW (batch, channels, height, width); detectores y swappers pueden usar formas dinámicas mayores.

Registra exactamente el preprocesamiento: orden RGB/BGR, media y desviación estándar, layout de canales, alineación, tamaño de recorte y postprocesamiento. La conversión de runtime no corrige una discrepancia de preprocesamiento.

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. Simplificar y fijar formas cuando corresponda

TensorRT y OpenVINO rinden mejor cuando el grafo tiene formas claras. Para backbones de reconocimiento de tamaño fijo, congela la forma de entrada. Para detectores, conserva dimensiones dinámicas y define perfiles realistas más adelante.

Usa simplificación solo después de validar que el modelo simplificado produce salidas numéricamente cercanas. Una prueba de cosine similarity entre ONNX original y simplificado debería formar parte del CI para modelos comerciales.

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. Crear un motor TensorRT

Los motores TensorRT dependen del hardware y de la versión de TensorRT. Créalo en la misma clase de GPU y stack de drivers que producción, y guarda ONNX fuente, versión TensorRT, CUDA, precisión y perfil de optimización con el artefacto.

FP16 es la opción de producción por defecto para la mayoría de workloads de embeddings faciales y face swapping en GPUs NVIDIA modernas. INT8 puede servir para detección de alto throughput, pero requiere datos de calibración y umbrales de calidad más estrictos.

  • Usa min/opt/max shapes que reflejen batch sizes reales, no límites extremos.
  • Mantén un motor por familia principal de entrada si las formas de detectores o swappers varían mucho.
  • Rechaza cualquier motor cuyo cosine similarity o métricas de detección deriven más allá del umbral de release.
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. Convertir ONNX a OpenVINO IR

OpenVINO IR consta de archivos XML y BIN que se despliegan con OpenVINO runtime. Es adecuado para servicios centrados en CPU, inferencia con Intel GPU y cajas edge donde importa la simplicidad operativa.

En modelos de reconocimiento, la compresión FP16 suele reducir memoria y mejorar throughput con poca deriva del embedding. En sistemas sensibles a cumplimiento, conserva artefactos FP32 para auditoría aunque producción use 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. Ejecutar inferencia con OpenVINO

Carga el modelo OpenVINO compilado una vez al arrancar el servicio y reutilízalo entre requests. Selecciona CPU, GPU, AUTO o HETERO según la política de hardware de producción.

Para reconocimiento facial, normaliza los embeddings exactamente como en el baseline ONNX antes de calcular cosine similarity o umbrales de matching.

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. Validar precisión y publicar con seguridad

La conversión no termina cuando el motor ejecuta. Compara la salida de ONNX, TensorRT y OpenVINO en un conjunto representativo. Para embeddings mide cosine similarity, distribución de norma e impacto de umbral; para detectores mide recall, falsos positivos, landmarks y NMS.

Promueve el artefacto solo cuando latencia, throughput, memoria y precisión cumplen el objetivo de producción. Incluye metadata del artefacto e instrucciones de rollback en el paquete de release.

  • Usa semillas fijas y preprocesamiento estable para comparaciones reproducibles.
  • Mide cold start separado de la latencia estable.
  • Monitorea drift en producción porque cámara y pose pueden diferir del conjunto de validación.

¿Necesitas ayuda con el despliegue en producción?

Contacta con InsightFace para licencias de modelos, optimización de runtime y soporte de despliegue en tu hardware objetivo.

Contactar