Cuantización
La cuantización es el proceso de convertir los pesos de un LLM de números de coma flotante de alta precisión (normalmente bfloat o float de 16 bits) a enteros o flotantes de menor precisión (8 bits, 4 bits, a veces 2 bits), reduciendo la huella de memoria y acelerando la inferencia con solo un pequeño impacto en la calidad. El despliegue moderno de código abierto (llama.cpp, Ollama, vLLM, GPTQ, AWQ) se ejecuta casi por completo sobre modelos cuantizados.
La cuantización es el proceso de convertir los pesos de un LLM de números de coma flotante de alta precisión (normalmente bfloat o float de 16 bits) a enteros o flotantes de menor precisión (8 bits, 4 bits, a veces 2 bits), reduciendo la huella de memoria y acelerando la inferencia con solo un pequeño impacto en la calidad. El despliegue moderno de código abierto (llama.cpp, Ollama, vLLM, GPTQ, AWQ) se ejecuta casi por completo sobre modelos cuantizados.
Por qué es importante
Un modelo de 70.000 millones de parámetros en formato nativo de 16 bits necesita unos 140 GB de memoria de GPU, fuera del alcance de una sola tarjeta de consumo. El mismo modelo con cuantización de 4 bits ocupa unos 35 GB y cabe en dos GPU de consumo, o en una sola tarjeta de estación de trabajo, o incluso en un Mac Studio. La cuantización es lo que hizo prácticos los LLM locales: Llama 3 70B, Mixtral 8×22B y DeepSeek-V3 se ejecutan en hardware de 3.000 dólares gracias a la cuantización. Para quienes construyen sistemas, es la diferencia entre "no podemos permitirnos el autoalojamiento" y "podemos servir nuestros propios modelos".
Cómo funciona
Niveles de precisión:
- FP32 (float de 32 bits): el valor por defecto del entrenamiento. 4 bytes por peso. Rara vez se usa para la inferencia.
- FP16 / BF16 (16 bits): el valor por defecto de la inferencia. 2 bytes por peso.
- INT8 (entero de 8 bits): la mitad de la memoria, calidad casi idéntica.
- INT4 / FP4 (4 bits): un cuarto de la memoria, pequeño impacto en la calidad (normalmente del 1% al 3% en las pruebas).
- INT2 (2 bits): un octavo de la memoria, pérdida de calidad notable en la mayoría de las tareas.
Proceso de cuantización:
- Calibración: el modelo se ejecuta sobre un pequeño conjunto de datos para observar los rangos de activación.
- Cálculo de la escala y el punto cero: para cada tensor de pesos, se calculan factores de escala que mapean el rango original al rango entero.
- Conversión de pesos: cada peso se cuantiza y se almacena como un entero más factores de escala por grupo o por canal.
- Descuantización en la inferencia: en el momento del cómputo, los pesos se expanden de nuevo a coma flotante justo antes de la multiplicación de matrices.
Métodos de cuantización
RTN (redondeo al más cercano): el método más simple. Solo redondea los pesos al valor cuantizado más cercano. Rápido, de baja calidad.
GPTQ: cuantización posterior al entrenamiento por grupos que minimiza el error de reconstrucción. El estándar de código abierto para 4 bits.
AWQ (cuantización de pesos consciente de la activación): preserva los pesos que manejan grandes activaciones; cuantiza el resto de forma más agresiva. Muy popular para los LLM de 4 bits.
GGUF (Q4_K_M, Q5_K_M, etc.): la familia de formatos de cuantización por bloques de llama.cpp. Las variantes K_M equilibran tamaño y precisión. Q4_K_M es el formato por defecto de la inferencia local.
SmoothQuant: traslada los valores atípicos de activación a los pesos para que ambos puedan cuantizarse de forma limpia. Permite INT8 sin mucha pérdida de precisión en modelos grandes.
QAT (entrenamiento consciente de la cuantización): entrena el modelo con la cuantización incorporada al bucle. La mejor calidad, pero requiere reentrenar.
FP8: un formato de float de 8 bits nativo del hardware, compatible con las GPU H100/H200. Más rápido que INT8 para el entrenamiento y la inferencia.
Compensaciones
Calidad frente a compresión: cuanto menor es la precisión, más se degrada el modelo. 8 bits es casi gratis; 4 bits es un buen valor por defecto; 2 bits perjudica de forma visible.
Sensibilidad de la tarea: las matemáticas, el código y el razonamiento largo se ven más afectados por la cuantización que el chat o el resumen.
Velocidad frente a memoria: la cuantización ahorra memoria pero no siempre acelera la inferencia en GPU con mucha capacidad de cómputo. En hardware limitado por la memoria (GPU de consumo, Apple Silicon), supone una enorme aceleración.
Calidad de los datos de calibración: una mala calibración puede arruinar en silencio los modelos cuantizados. Usa prompts representativos.
Cuál usar y cuándo
Ejecutar en una GPU de consumo (8-24 GB): GGUF de 4 bits (Q4_K_M) o AWQ.
Ejecutar en H100/H200: FP8 o INT8 con SmoothQuant.
Edge / móvil: GGUF agresivo de 4 bits o 2 bits; asume la pérdida de calidad.
Investigación de evaluación comparativa: mantén FP16/BF16 como referencia; cuantiza solo para la comparación de despliegue.
Producción de alto riesgo: 8 bits o 16 bits. El coste marginal vale la garantía de calidad.
Errores comunes
Comparar pruebas entre precisiones sin indicarlo: la puntuación MMLU de un modelo cuantizado no es directamente comparable con la puntuación FP16 del mismo modelo.
Ignorar la deriva de la perplejidad: aunque las pruebas se vean bien, la cuantización puede degradar habilidades específicas (las matemáticas en especial). Pruébalo en tu carga de trabajo real.
Demasiado agresivo demasiado rápido: saltar de FP16 directamente a INT2 sin probar los pasos intermedios oculta dónde se rompió la calidad.
Usar datos de calibración obsoletos: un modelo calibrado solo en inglés perderá calidad en los prompts en coreano.
No medir la latencia de extremo a extremo: la cuantización afecta tanto a la carga de memoria como al cómputo. A veces el rendimiento no mejora porque el cuello de botella estaba en otro lugar.
Sources: