Quantization Quality Lab
Estudio real de cuantización de MiniLM en CPU que separa tamaño de pesos, memoria del proceso, calidad de recuperación y latencia, conservando regresiones y diferencias numéricas.
Repositorio · Resumen recalculable de las mediciones · Release v1.0.0
Problema y utilidad para agentes
Los pesos cuantizados más pequeños no necesariamente reducen la memoria del proceso ni mejoran todos los percentiles de latencia. Las métricas agregadas de calidad también pueden ocultar cambios en el orden de recuperación.
Un modelo, un corpus y un protocolo fijos permiten comparar la inferencia de referencia y la cuantización dinámica int8 en el mismo equipo, sin convertir el tamaño de archivo en una garantía de memoria o calidad.
Arquitectura
- Fijar el modelo y el método. El codificador paraphrase-MiniLM-L3-v2, con licencia Apache-2.0, se fija en la revisión 4ca70771034acceecb2e72475f72050fcdde4ddc. La cuantización dinámica qint8 de PyTorch transforma sus 19 módulos Linear con fbgemm; los embeddings permanecen en float32.
- Ejecutar procesos separados. Tres procesos nuevos por modo alternan FP32 e int8 bajo el bloqueo compartido de benchmarks. Cada uno carga el artefacto elegido y registra por separado la memoria residente después de cargar y el máximo del proceso.
- Conservar y reproducir observaciones. Los embeddings, órdenes de recuperación, conteos de tokens y tiempos originales permiten recalcular los resultados sin conexión. Los manifiestos vinculan evidencia, código, artefactos del modelo y casos congelados sin redistribuir los pesos.
Qué demuestra
- Inferencia real a 32, 64 y 128 tokens dentro del límite de configuración del modelo, con conteos explícitos de textos truncados.
- Reducción del 23,50% en bytes de pesos serializados junto con mayor memoria residente observada, tanto después de cargar como en el máximo del proceso, para esta forma de carga.
- Treinta y una pruebas de regresión y verificación de evidencia sin dependencias, que incluyen pérdidas de posición, peores latencias altas y valores atípicos conservados.
Resultados publicados
El experimento se ejecutó en un Intel Xeon W-3223, 48 GiB de RAM y macOS 26.7.1, con dos hilos internos por operación y uno entre operaciones. Usó 12 documentos, cuatro consultas de desarrollo y 24 consultas reservadas para evaluación.
El protocolo congelado usa 45 llamadas medidas por modo y longitud, agrupadas entre tres procesos después de tres llamadas de calentamiento en cada uno. El tiempo de inferencia incluye agregación y normalización, pero excluye tokenización y carga. La recuperación usa los mismos textos, etiquetas y límites en ambos modos; este método dinámico no requiere calibración. MRR es el promedio del inverso de la posición del documento relevante.
Almacenamiento y memoria del proceso
| Medición | FP32 | Int8 dinámico |
|---|---|---|
| Bytes de pesos serializados | 69,576,640 | 53,223,452 |
| Mediana de memoria residente después de cargar, MiB | 355.22 | 404.26 |
| Mediana del máximo de memoria residente del proceso, MiB | 429.11 | 468.55 |
Latencia de inferencia después del calentamiento
| Cantidad de tokens | Mediana / p95 de FP32, ms | Mediana / p95 de int8, ms |
|---|---|---|
| 32 | 8.495 / 12.692 | 5.536 / 8.277 |
| 64 | 7.674 / 9.367 | 7.343 / 10.498 |
| 128 | 12.549 / 13.716 | 11.188 / 15.176 |
Calidad de recuperación en la evaluación reservada
| Límite de tokens | Primera posición correcta, ambos modos | MRR de FP32 | MRR de int8 |
|---|---|---|---|
| 32 | 19 / 24 | 0.850116 | 0.849124 |
| 64 | 19 / 24 | 0.849124 | 0.849124 |
| 128 | 21 / 24 | 0.930556 | 0.930556 |
La mediana de inferencia mejoró entre 1,05 y 1,53 veces, mientras el p95 de int8 empeoró a 64 y 128 tokens. La memoria residente después de cargar y el máximo del proceso son observaciones distintas; ninguna mide únicamente los pesos. La forma de carga medida demuestra una reducción de almacenamiento, no un ahorro de memoria de despliegue.
La cuantización no cambió las predicciones en primera posición. La consulta long4 cayó del puesto 6 al 8 a 32 tokens y del 7 al 8 a 64 tokens, mientras long6 mejoró del 8 al 7. A 128 tokens no hubo cambios de posición, aunque los embeddings siguieron mostrando diferencias numéricas. Resultados medidos y consecuencias negativas.
Cuatro textos largos se truncaron a 32 y 64 tokens, en ocasiones eliminando la pregunta real. Los 40 textos entraron completos a 128 tokens. Las cuatro consultas de desarrollo alcanzaron exactitud en primera posición y MRR de 1,0 en ambos modos para todos los límites.
Solo la llamada inicial de 32 tokens de cada proceso partió de un proceso sin inferencia previa. Se conservan la primera llamada FP32 de 3,14 segundos y la primera llamada int8 de 64 tokens de 107,60 ms. Las longitudes posteriores se ejecutaron con el proceso ya calentado y no se vaciaron las cachés de disco.
Reproducir
Usá uv 0.8.23 y Python 3.11.13. El comando de preparación crea un entorno dentro del repositorio; uv debe poder encontrar el intérprete indicado. Instalá primero esa versión de Python si no está disponible en el catálogo de descargas de uv. La preparación inicial y las dependencias de pruebas pueden necesitar acceso a Internet. La reproducción solo usa la biblioteca estándar y no carga pesos del modelo. El bloque separado de pruebas instala las dependencias de desarrollo fijadas y wheel 0.45.1. La inferencia completa necesita el entorno de benchmarks más grande documentado en el repositorio.
Después de preparar el entorno, el comando de reproducción recalcula los resultados guardados sin conexión, sin cargar un modelo, y escribe replay.json. Un informe exitoso indica status consistent y authenticity_verified false. El segundo bloque instala las herramientas de pruebas fijadas y el paquete pequeño, y ejecuta las pruebas de regresión. Las mediciones completas del modelo están documentadas en el README y requieren la infraestructura original de bloqueo compartido; no omitas esa comprobación.
Verificar la evidencia guardada
git clone https://github.com/lucioduran/quantization-quality-lab.git
cd quantization-quality-lab
git checkout b122cfbf3d81ae4b01810dc57dc9fb526f89c05b
UV_CACHE_DIR="$PWD/.tools/uv-cache" UV_PYTHON_INSTALL_DIR="$PWD/.tools/python" uv venv --python 3.11.13 .venv
PYTHONPATH=src .venv/bin/python -m quantization_quality_lab.cli verify > replay.jsonEjecutar las pruebas de regresión
UV_CACHE_DIR="$PWD/.tools/uv-cache" uv pip install --python .venv/bin/python -r requirements-dev.txt wheel==0.45.1
UV_CACHE_DIR="$PWD/.tools/uv-cache" uv pip install --python .venv/bin/python --no-build-isolation .
.venv/bin/python -m pytest -qAlcance y límites
- Un codificador, un equipo y un corpus sintético pequeño no demuestran preservación general de calidad, rendimiento en producción ni comportamiento de otros métodos de cuantización.
- Solo se cuantizan los módulos Linear. Los embeddings en coma flotante, la construcción temporal, la memoria retenida por el asignador, los pesos empaquetados y las bibliotecas del entorno contribuyen a la memoria observada.
- El orden fijo de longitudes, las cachés sin vaciar y otras actividades del equipo siguen siendo factores de confusión. Los embeddings por segundo calculados como el recíproco de la mediana corresponden a lotes de uno, no a capacidad concurrente medida.
- El ejecutor completo recopila datos del equipo con herramientas de macOS y depende de una ruta de bloqueo propia de ese equipo. No se probaron otras plataformas para el benchmark, aunque la verificación sin conexión se ejecuta en la integración continua de Linux.
- La versión antigua fijada de PyTorch no es una recomendación de despliegue. No se midieron generación, perplejidad, GPU, energía ni costo monetario de operación. La reproducción comprueba consistencia, no autenticidad.
Fuentes y revisión
El código medido corresponde al commit 93eaf528dd32dfb5b4abf59a2e5c7d1c9b8f67ba. La ejecución comenzó a las 2026-11-09T20:28:41.396081+00:00 y terminó a las 2026-11-09T20:30:17.590156+00:00. La release se publicó después, en la fecha separada indicada abajo, y agrega documentación y pruebas de regresión sin cambiar el código medido. Se conservan los hashes del modelo, los artefactos, los casos y el código.
- Revisión consultada:
b122cfbf3d81ae4b01810dc57dc9fb526f89c05b - Revisión registrada por el experimento:
93eaf528dd32dfb5b4abf59a2e5c7d1c9b8f67ba - Fecha del informe (UTC):
- Release publicada: v1.0.0 ·
- Resumen recalculable de las mediciones SHA-256:
8cd6da46740ed8e8783513158f6f321e3705dba080212b9294ee4baf4b9d6870 - Entorno y fechas de ejecución SHA-256:
10b145e1ffad3e95a7166e91ebfc38e9527c4d0d62c08f881fe43c3a9314e890 - Modelo fijado y hashes de artefactos SHA-256:
e6390cfcecc950909ac74c7ed3fb993420fefa4253cf1c0a21827548ac8ab5ef - Documentos y particiones de consultas congelados SHA-256:
35fb5acba663653900b6a77d3d032477a59d3d39630239bda35fdca16dbcccfe
- README y reproducción completa
- Resumen recalculable de las mediciones
- Entorno y fechas de ejecución
- Modelo fijado y hashes de artefactos
- Resultados medidos y consecuencias negativas
- Licencia MIT
- Licencia del modelo de terceros
- Diseño y procedencia
- Protocolo de medición congelado
- Documentos y particiones de consultas congelados
- Salidas y advertencias de los subprocesos
- Manifiesto de hashes de la evidencia
- Observaciones del primer proceso FP32
- Observaciones del primer proceso int8
- Alcance de la validación de la release