onnx_model_export
Convierte los modelos PyTorch del sistema de verificación de identidad (ArcFace para reconocimiento facial, MiniFASNet para liveness detection, YOLOv8 para detección de documentos) al formato ONNX. Esto permite desacoplar la inferencia del framework de entrenamiento, habilitando optimizaciones posteriores como cuantización y ejecución en ONNX Runtime o TensorRT.
When to use
Usa esta skill cuando necesites convertir modelos PyTorch a ONNX dentro del model_server_agent. Aplica cuando se tenga un modelo entrenado o fine-tuned y se requiera exportarlo para su despliegue en producción con runtimes optimizados, o cuando se necesite portabilidad entre diferentes plataformas de inferencia.
Instructions
Cargar el modelo PyTorch con sus pesos entrenados:
import torch
from models.arcface import ArcFaceModel
model = ArcFaceModel()
model.load_state_dict(torch.load("weights/arcface_r100.pth", map_location="cpu"))
model.eval()
Crear un tensor dummy con las dimensiones de entrada correctas para cada modelo:
# ArcFace: batch x 3 x 112 x 112
dummy_input = torch.randn(1, 3, 112, 112)
# MiniFASNet (liveness): batch x 3 x 80 x 80
# YOLOv8 (documentos): batch x 3 x 640 x 640
Exportar el modelo a ONNX con nombres de entrada/salida descriptivos y ejes dinámicos para batching:
torch.onnx.export(
model,
dummy_input,
"models/arcface.onnx",
input_names=["face_image"],
output_names=["embedding"],
dynamic_axes={
"face_image": {0: "batch_size"},
"embedding": {0: "batch_size"}
},
opset_version=17,
do_constant_folding=True
)
Verificar la validez del modelo ONNX exportado:
import onnx
model_onnx = onnx.load("models/arcface.onnx")
onnx.checker.check_model(model_onnx)
print("Modelo ONNX válido")
Simplificar el grafo ONNX para eliminar nodos redundantes:
import onnxsim
model_simplified, check = onnxsim.simplify(model_onnx)
assert check, "La simplificación falló"
onnx.save(model_simplified, "models/arcface_simplified.onnx")
Validar numéricamente que las salidas del modelo ONNX coincidan con las del modelo PyTorch original:
import onnxruntime as ort
import numpy as np
session = ort.InferenceSession("models/arcface.onnx") {"face_image": dummy_input.numpy()})[0]
with torch.no_grad():
torch_output = model(dummy_input).numpy()
np.testing.assert_allclose(torch_output, onnx_output, rtol=1e-3, atol=1e-5)
print("Validación numérica exitosa")
Documentar los metadatos del modelo exportado (versión, dimensiones, opset, fecha) en el registro de modelos del sistema.
Notes
- Usar
opset_version=17 o superior para asegurar compatibilidad con las operaciones utilizadas por ArcFace y YOLOv8; versiones anteriores pueden no soportar ciertos operadores.
- Los ejes dinámicos en la dimensión batch son esenciales para permitir batching dinámico en producción; sin ellos, el modelo solo aceptaría el tamaño de batch fijo usado en la exportación.
- Siempre ejecutar la validación numérica (paso 6) antes de desplegar un modelo exportado, ya que diferencias en la implementación de operadores entre PyTorch y ONNX pueden causar discrepancias en los embeddings faciales.
1---2name: onnx-model-export3description: Exportar modelos PyTorch del pipeline KYC a formato ONNX para portabilidad y optimización4---56# onnx_model_export78Convierte los modelos PyTorch del sistema de verificación de identidad (ArcFace para reconocimiento facial, MiniFASNet para liveness detection, YOLOv8 para detección de documentos) al formato ONNX. Esto permite desacoplar la inferencia del framework de entrenamiento, habilitando optimizaciones posteriores como cuantización y ejecución en ONNX Runtime o TensorRT.910## When to use1112Usa esta skill cuando necesites convertir modelos PyTorch a ONNX dentro del **model_server_agent**. Aplica cuando se tenga un modelo entrenado o fine-tuned y se requiera exportarlo para su despliegue en producción con runtimes optimizados, o cuando se necesite portabilidad entre diferentes plataformas de inferencia.1314## Instructions15161. Cargar el modelo PyTorch con sus pesos entrenados:17 ```python18 import torch19 from models.arcface import ArcFaceModel2021 model = ArcFaceModel()22 model.load_state_dict(torch.load("weights/arcface_r100.pth", map_location="cpu"))23 model.eval()24 ```25262. Crear un tensor dummy con las dimensiones de entrada correctas para cada modelo:27 ```python28 # ArcFace: batch x 3 x 112 x 11229 dummy_input = torch.randn(1, 3, 112, 112)3031 # MiniFASNet (liveness): batch x 3 x 80 x 8032 # YOLOv8 (documentos): batch x 3 x 640 x 64033 ```34353. Exportar el modelo a ONNX con nombres de entrada/salida descriptivos y ejes dinámicos para batching:36 ```python37 torch.onnx.export(38 model,39 dummy_input,40 "models/arcface.onnx",41 input_names=["face_image"],42 output_names=["embedding"],43 dynamic_axes={44 "face_image": {0: "batch_size"},45 "embedding": {0: "batch_size"}46 },47 opset_version=17,48 do_constant_folding=True49 )50 ```51524. Verificar la validez del modelo ONNX exportado:53 ```python54 import onnx55 model_onnx = onnx.load("models/arcface.onnx")56 onnx.checker.check_model(model_onnx)57 print("Modelo ONNX válido")58 ```59605. Simplificar el grafo ONNX para eliminar nodos redundantes:61 ```python62 import onnxsim63 model_simplified, check = onnxsim.simplify(model_onnx)64 assert check, "La simplificación falló"65 onnx.save(model_simplified, "models/arcface_simplified.onnx")66 ```67686. Validar numéricamente que las salidas del modelo ONNX coincidan con las del modelo PyTorch original:69 ```python70 import onnxruntime as ort71 import numpy as np7273 session = ort.InferenceSession("models/arcface.onnx")74 onnx_output = session.run(None, {"face_image": dummy_input.numpy()})[0]7576 with torch.no_grad():77 torch_output = model(dummy_input).numpy()7879 np.testing.assert_allclose(torch_output, onnx_output, rtol=1e-3, atol=1e-5)80 print("Validación numérica exitosa")81 ```82837. Documentar los metadatos del modelo exportado (versión, dimensiones, opset, fecha) en el registro de modelos del sistema.8485## Notes8687- Usar `opset_version=17` o superior para asegurar compatibilidad con las operaciones utilizadas por ArcFace y YOLOv8; versiones anteriores pueden no soportar ciertos operadores.88- Los ejes dinámicos en la dimensión batch son esenciales para permitir batching dinámico en producción; sin ellos, el modelo solo aceptaría el tamaño de batch fijo usado en la exportación.89- Siempre ejecutar la validación numérica (paso 6) antes de desplegar un modelo exportado, ya que diferencias en la implementación de operadores entre PyTorch y ONNX pueden causar discrepancias en los embeddings faciales.