fp16_int8_quantization

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

fp16_int8_quantization

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.
将FP16和INT8量化技术应用于身份验证流程的机器学习模型(ArcFace、MiniFASNet、YOLOv8),以降低内存消耗并提升推理速度。方案包含使用KYC领域代表性数据进行校准,可将人脸识别和活体检测的精度维持在可接受阈值范围内。

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.
当你需要优化model_server_agent中ML模型的体积和运行速度时可使用此技能。适用于FP32格式模型占用过多GPU/CPU内存,或推理延迟超过整个验证流程8秒目标的场景。

Instructions

使用说明

  1. Evaluar el modelo original en FP32 como baseline, midiendo FAR, FRR y latencia:
    python
    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")
  2. Aplicar cuantización FP16 para una reducción rápida de tamaño sin calibración:
    python
    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")
  3. Preparar un dataset de calibración representativo para cuantización INT8 (mínimo 100-500 muestras de rostros y documentos reales):
    python
    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)
  4. Ejecutar cuantización INT8 estática con el dataset de calibración:
    python
    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
    )
  5. Comparar métricas del modelo cuantizado contra el baseline FP32:
    python
    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"
  6. Si la degradación es excesiva, aplicar cuantización mixta excluyendo capas sensibles (primeras y últimas capas del modelo facial):
    python
    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"]
    )
  7. 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).
  1. 评估FP32原始模型作为基准,测量FAR、FRR和延迟:
    python
    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")
  2. 应用FP16量化,无需校准即可快速缩减模型体积:
    python
    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")
  3. 准备用于INT8量化的代表性校准数据集(至少包含100-500份真实人脸和证件样本):
    python
    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)
  4. 使用校准数据集执行静态INT8量化:
    python
    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
    )
  5. 对比量化后模型与FP32基准模型的指标:
    python
    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"
  6. 如果精度损失过高,可排除敏感层(人脸识别模型的首末层)应用混合量化:
    python
    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"]
    )
  7. 生成各版本模型(FP32、FP16、INT8、混合量化)的对比报告,包含模型体积、延迟和精度指标。

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%).
  • INT8量化需要使用KYC领域的代表性数据进行校准;使用通用图像可能会大幅降低证件人脸识别的精度。
  • FP16量化对人脸识别模型通常是安全的,精度损失极小(FAR损失<0.5%),而INT8量化需要谨慎验证,尤其是活体检测模型。
  • 请始终保留原始FP32模型作为参考,在未对比FAR/FRR指标与既定阈值(FAR < 0.1%、FRR < 5%)前,切勿部署量化后的模型。