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.
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.
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. 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.
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. 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.
python -m onnxsim models/insightface.onnx models/insightface.simplified.onnx --overwrite-input-shape input:1,3,112,1124. 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.
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. 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.
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. 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.
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