fp16_int8_quantization
Aplica técnicas de cuantización FP16 e INT8 a los modelos de machine learning del pipeline de verificación de identidad (ArcFace, MiniFASNet, YOLOv8) para reducir el consumo de memoria y acelerar la inferencia. Incluye calibración con datos representativos del dominio KYC para mantener la precisión de reconocimiento facial y detección de vida dentro de los umbrales aceptables.
When to use
Usa esta skill cuando necesites optimizar el tamaño y velocidad de los modelos ML dentro del model_server_agent. Aplica cuando los modelos en FP32 consumen demasiada memoria GPU/CPU o cuando la latencia de inferencia excede el objetivo de 8 segundos del pipeline completo de verificación.
Instructions
Evaluar el modelo original en FP32 como baseline, midiendo FAR, FRR y latencia:
from modules.face_match.evaluator import evaluate_model
baseline_metrics = evaluate_model("models/arcface_fp32.onnx", test_dataset)
print(f"FAR: {baseline_metrics['far']}, FRR: {baseline_metrics['frr']}, Latency: {baseline_metrics['latency_ms']}ms")
Aplicar cuantización FP16 para una reducción rápida de tamaño sin calibración:
from onnxruntime.transformers import float16
import onnx
model = onnx.load("models/arcface_fp32.onnx")
model_fp16 = float16.convert_float_to_float16(model, keep_io_types=True)
onnx.save(model_fp16, "models/arcface_fp16.onnx")
Preparar un dataset de calibración representativo para cuantización INT8 (mínimo 100-500 muestras de rostros y documentos reales):
class KYCCalibrationDataReader(CalibrationDataReader):
def __init__(self, calibration_images_dir: str):
self.data = self._load_and_preprocess(calibration_images_dir)
self.iter = iter(self.data)
def get_next(self):
return next(self.iter, None)
Ejecutar cuantización INT8 estática con el dataset de calibración:
from onnxruntime.quantization import quantize_static, QuantType
quantize_static(
model_input="models/arcface_fp32.onnx",
model_output="models/arcface_int8.onnx",
calibration_data_reader=KYCCalibrationDataReader("data/calibration/faces/"),
quant_format=QuantFormat.QDQ,
weight_type=QuantType.QInt8,
activation_type=QuantType.QInt8
)
Comparar métricas del modelo cuantizado contra el baseline FP32:
quantized_metrics = evaluate_model("models/arcface_int8.onnx", test_dataset)
degradation = baseline_metrics['far'] - quantized_metrics['far']
assert degradation < 0.01, "Degradación de FAR inaceptable tras cuantización"
Si la degradación es excesiva, aplicar cuantización mixta excluyendo capas sensibles (primeras y últimas capas del modelo facial):
quantize_static(
model_input="models/arcface_fp32.onnx",
model_output="models/arcface_mixed.onnx",
calibration_data_reader=calibration_reader,
nodes_to_exclude=["first_conv", "final_fc", "bn_final"]
)
Generar un informe de comparación con tamaño del modelo, latencia y métricas de precisión para cada variante (FP32, FP16, INT8, mixta).
Notes
- La cuantización INT8 requiere calibración con datos representativos del dominio KYC; usar imágenes genéricas puede degradar significativamente la precisión en rostros de documentos de identidad.
- FP16 es generalmente seguro para modelos faciales con degradación mínima (<0.5% en FAR), mientras que INT8 requiere validación cuidadosa especialmente en el modelo de liveness detection.
- Siempre mantener el modelo FP32 original como referencia y nunca desplegar un modelo cuantizado sin comparar métricas de FAR/FRR contra los umbrales definidos (FAR < 0.1%, FRR < 5%).
1---2name: fp16-int8-quantization3description: Cuantización de modelos ML a FP16/INT8 para reducir memoria y acelerar inferencia en el pipeline KYC4---56# fp16_int8_quantization78Aplica técnicas de cuantización FP16 e INT8 a los modelos de machine learning del pipeline de verificación de identidad (ArcFace, MiniFASNet, YOLOv8) para reducir el consumo de memoria y acelerar la inferencia. Incluye calibración con datos representativos del dominio KYC para mantener la precisión de reconocimiento facial y detección de vida dentro de los umbrales aceptables.910## When to use1112Usa esta skill cuando necesites optimizar el tamaño y velocidad de los modelos ML dentro del **model_server_agent**. Aplica cuando los modelos en FP32 consumen demasiada memoria GPU/CPU o cuando la latencia de inferencia excede el objetivo de 8 segundos del pipeline completo de verificación.1314## Instructions15161. Evaluar el modelo original en FP32 como baseline, midiendo FAR, FRR y latencia:17 ```python18 from modules.face_match.evaluator import evaluate_model19 baseline_metrics = evaluate_model("models/arcface_fp32.onnx", test_dataset)20 print(f"FAR: {baseline_metrics['far']}, FRR: {baseline_metrics['frr']}, Latency: {baseline_metrics['latency_ms']}ms")21 ```22232. Aplicar cuantización FP16 para una reducción rápida de tamaño sin calibración:24 ```python25 from onnxruntime.transformers import float1626 import onnx2728 model = onnx.load("models/arcface_fp32.onnx")29 model_fp16 = float16.convert_float_to_float16(model, keep_io_types=True)30 onnx.save(model_fp16, "models/arcface_fp16.onnx")31 ```32333. Preparar un dataset de calibración representativo para cuantización INT8 (mínimo 100-500 muestras de rostros y documentos reales):34 ```python35 class KYCCalibrationDataReader(CalibrationDataReader):36 def __init__(self, calibration_images_dir: str):37 self.data = self._load_and_preprocess(calibration_images_dir)38 self.iter = iter(self.data)3940 def get_next(self):41 return next(self.iter, None)42 ```43444. Ejecutar cuantización INT8 estática con el dataset de calibración:45 ```python46 from onnxruntime.quantization import quantize_static, QuantType4748 quantize_static(49 model_input="models/arcface_fp32.onnx",50 model_output="models/arcface_int8.onnx",51 calibration_data_reader=KYCCalibrationDataReader("data/calibration/faces/"),52 quant_format=QuantFormat.QDQ,53 weight_type=QuantType.QInt8,54 activation_type=QuantType.QInt855 )56 ```57585. Comparar métricas del modelo cuantizado contra el baseline FP32:59 ```python60 quantized_metrics = evaluate_model("models/arcface_int8.onnx", test_dataset)61 degradation = baseline_metrics['far'] - quantized_metrics['far']62 assert degradation < 0.01, "Degradación de FAR inaceptable tras cuantización"63 ```64656. Si la degradación es excesiva, aplicar cuantización mixta excluyendo capas sensibles (primeras y últimas capas del modelo facial):66 ```python67 quantize_static(68 model_input="models/arcface_fp32.onnx",69 model_output="models/arcface_mixed.onnx",70 calibration_data_reader=calibration_reader,71 nodes_to_exclude=["first_conv", "final_fc", "bn_final"]72 )73 ```74757. Generar un informe de comparación con tamaño del modelo, latencia y métricas de precisión para cada variante (FP32, FP16, INT8, mixta).7677## Notes7879- La cuantización INT8 requiere calibración con datos representativos del dominio KYC; usar imágenes genéricas puede degradar significativamente la precisión en rostros de documentos de identidad.80- FP16 es generalmente seguro para modelos faciales con degradación mínima (<0.5% en FAR), mientras que INT8 requiere validación cuidadosa especialmente en el modelo de liveness detection.81- Siempre mantener el modelo FP32 original como referencia y nunca desplegar un modelo cuantizado sin comparar métricas de FAR/FRR contra los umbrales definidos (FAR < 0.1%, FRR < 5%).