tensorrt
Skill para compilar y optimizar los modelos ML del pipeline de verificación KYC usando NVIDIA TensorRT como compilador de deep learning. TensorRT transforma modelos entrenados en engines optimizados con fusión de capas, cuantización, selección de kernels y calibración, logrando latencias mínimas en GPUs NVIDIA. Esta skill se centra exclusivamente en TensorRT como herramienta de compilación, separada de onnx_runtime_standalone (runtime alternativo) y triton_inference_server (servidor de modelos).
When to use
Usar esta skill cuando el model_server_agent necesite compilar modelos a formato TensorRT engine (.plan) para producción, optimizar la latencia de inferencia de modelos faciales o de liveness, o configurar cuantización INT8/FP16 para los modelos del pipeline KYC. Aplica al preparar modelos para despliegue en Triton o como engines standalone.
Instructions
Convertir el modelo ArcFace de PyTorch a ONNX como paso intermedio hacia TensorRT:
import torch
model = load_arcface_model("arcface_r100.pth")
model.eval()
dummy_input = torch.randn(1, 3, 112, 112).cuda()
torch.onnx.export(
model, dummy_input, "arcface.onnx",
input_names=["input"],
output_names=["embedding"],
dynamic_axes={"input": {0: "batch_size"}, "embedding": {0: "batch_size"}},
opset_version=17
)
Compilar el modelo ONNX a TensorRT engine usando trtexec con perfiles de optimización:
trtexec \
--onnx=arcface.onnx \
--saveEngine=arcface_fp16.plan \
--fp16 \
--minShapes=input:1x3x112x112 \
--optShapes=input:8x3x112x112 \
--maxShapes=input:32x3x112x112 \
--workspace=4096 \
--verbose
Compilar con cuantización INT8 para máximo throughput usando calibración:
import tensorrt as trt
calibrator = trt.IInt8EntropyCalibrator2(
calibration_data_loader, # Dataset representativo de rostros
cache_file="arcface_int8_calib.cache"
)
config.set_flag(trt.BuilderFlag.INT8)
config.int8_calibrator = calibrator
Generar el dataset de calibración INT8 con imágenes representativas del pipeline KYC:
# Usar distribución real de imágenes: selfies variadas en iluminación,
# etnias, edades y fotos de documentos
CALIBRATION_IMAGES = 1000 # Mínimo recomendado
calibration_set = load_representative_faces(
selfies=500,
document_photos=500,
diverse_demographics=True
)
Validar la precisión del engine compilado contra el modelo original:
import numpy as np
# Comparar embeddings entre modelo original y TensorRT
original_embedding = original_model(test_face)
trt_embedding = trt_engine(test_face)
cosine_sim = np.dot(original_embedding, trt_embedding) / (
np.linalg.norm(original_embedding) * np.linalg.norm(trt_embedding)
)
assert cosine_sim > 0.999, f"Degradación inaceptable: {cosine_sim}"
Compilar todos los modelos del pipeline con configuraciones optimizadas por modelo:
# Liveness model - latencia crítica, FP16
trtexec --onnx=liveness.onnx --saveEngine=liveness_fp16.plan --fp16 \
--minShapes=input:1x3x224x224 --optShapes=input:4x3x224x224 --maxShapes=input:8x3x224x224
# OCR detection - puede tolerar INT8
trtexec --onnx=ocr_det.onnx --saveEngine=ocr_det_int8.plan --int8 --fp16 \
--calib=ocr_calib.cache \
--minShapes=input:1x3x640x640 --optShapes=input:1x3x640x640 --maxShapes=input:4x3x640x640
Benchmark del engine compilado para verificar que cumple SLA de latencia:
trtexec --loadEngine=arcface_fp16.plan \
--shapes=input:1x3x112x112 \
--iterations=1000 \
--warmUp=500 \
--duration=10
# Verificar: P99 latency < 300ms para face_match
Notes
- Los engines TensorRT (.plan) son especificos de la arquitectura GPU en la que se compilan (e.g., un engine compilado en A100 no funciona en T4). Compilar engines para cada tipo de GPU del cluster y versionar junto con la GPU target.
- La cuantización INT8 puede degradar ligeramente la precisión del face_match; siempre validar que el cosine similarity entre embeddings original y cuantizado sea > 0.999 y que FAR/FRR se mantengan dentro de los objetivos del sistema.
- Usar dynamic shapes (min/opt/max) en lugar de shapes fijas para soportar el dynamic batching de Triton. El optShapes debe coincidir con el preferred_batch_size configurado en Triton.
1---2name: tensorrt3description: Compilación y optimización de modelos con TensorRT para máximo rendimiento en GPU NVIDIA4---56# tensorrt78Skill para compilar y optimizar los modelos ML del pipeline de verificación KYC usando NVIDIA TensorRT como compilador de deep learning. TensorRT transforma modelos entrenados en engines optimizados con fusión de capas, cuantización, selección de kernels y calibración, logrando latencias mínimas en GPUs NVIDIA. Esta skill se centra exclusivamente en TensorRT como herramienta de compilación, separada de onnx_runtime_standalone (runtime alternativo) y triton_inference_server (servidor de modelos).910## When to use1112Usar esta skill cuando el **model_server_agent** necesite compilar modelos a formato TensorRT engine (.plan) para producción, optimizar la latencia de inferencia de modelos faciales o de liveness, o configurar cuantización INT8/FP16 para los modelos del pipeline KYC. Aplica al preparar modelos para despliegue en Triton o como engines standalone.1314## Instructions15161. Convertir el modelo ArcFace de PyTorch a ONNX como paso intermedio hacia TensorRT:17 ```python18 import torch1920 model = load_arcface_model("arcface_r100.pth")21 model.eval()2223 dummy_input = torch.randn(1, 3, 112, 112).cuda()24 torch.onnx.export(25 model, dummy_input, "arcface.onnx",26 input_names=["input"],27 output_names=["embedding"],28 dynamic_axes={"input": {0: "batch_size"}, "embedding": {0: "batch_size"}},29 opset_version=1730 )31 ```32332. Compilar el modelo ONNX a TensorRT engine usando trtexec con perfiles de optimización:34 ```bash35 trtexec \36 --onnx=arcface.onnx \37 --saveEngine=arcface_fp16.plan \38 --fp16 \39 --minShapes=input:1x3x112x112 \40 --optShapes=input:8x3x112x112 \41 --maxShapes=input:32x3x112x112 \42 --workspace=4096 \43 --verbose44 ```45463. Compilar con cuantización INT8 para máximo throughput usando calibración:47 ```python48 import tensorrt as trt4950 calibrator = trt.IInt8EntropyCalibrator2(51 calibration_data_loader, # Dataset representativo de rostros52 cache_file="arcface_int8_calib.cache"53 )5455 config.set_flag(trt.BuilderFlag.INT8)56 config.int8_calibrator = calibrator57 ```58594. Generar el dataset de calibración INT8 con imágenes representativas del pipeline KYC:60 ```python61 # Usar distribución real de imágenes: selfies variadas en iluminación,62 # etnias, edades y fotos de documentos63 CALIBRATION_IMAGES = 1000 # Mínimo recomendado64 calibration_set = load_representative_faces(65 selfies=500,66 document_photos=500,67 diverse_demographics=True68 )69 ```70715. Validar la precisión del engine compilado contra el modelo original:72 ```python73 import numpy as np7475 # Comparar embeddings entre modelo original y TensorRT76 original_embedding = original_model(test_face)77 trt_embedding = trt_engine(test_face)7879 cosine_sim = np.dot(original_embedding, trt_embedding) / (80 np.linalg.norm(original_embedding) * np.linalg.norm(trt_embedding)81 )82 assert cosine_sim > 0.999, f"Degradación inaceptable: {cosine_sim}"83 ```84856. Compilar todos los modelos del pipeline con configuraciones optimizadas por modelo:86 ```bash87 # Liveness model - latencia crítica, FP1688 trtexec --onnx=liveness.onnx --saveEngine=liveness_fp16.plan --fp16 \89 --minShapes=input:1x3x224x224 --optShapes=input:4x3x224x224 --maxShapes=input:8x3x224x2249091 # OCR detection - puede tolerar INT892 trtexec --onnx=ocr_det.onnx --saveEngine=ocr_det_int8.plan --int8 --fp16 \93 --calib=ocr_calib.cache \94 --minShapes=input:1x3x640x640 --optShapes=input:1x3x640x640 --maxShapes=input:4x3x640x64095 ```96977. Benchmark del engine compilado para verificar que cumple SLA de latencia:98 ```bash99 trtexec --loadEngine=arcface_fp16.plan \100 --shapes=input:1x3x112x112 \101 --iterations=1000 \102 --warmUp=500 \103 --duration=10104 # Verificar: P99 latency < 300ms para face_match105 ```106107## Notes108109- Los engines TensorRT (.plan) son especificos de la arquitectura GPU en la que se compilan (e.g., un engine compilado en A100 no funciona en T4). Compilar engines para cada tipo de GPU del cluster y versionar junto con la GPU target.110- La cuantización INT8 puede degradar ligeramente la precisión del face_match; siempre validar que el cosine similarity entre embeddings original y cuantizado sea > 0.999 y que FAR/FRR se mantengan dentro de los objetivos del sistema.111- Usar dynamic shapes (min/opt/max) en lugar de shapes fijas para soportar el dynamic batching de Triton. El optShapes debe coincidir con el preferred_batch_size configurado en Triton.