Cómo funciona la cuantización de LLMs

Resumen

La cuantización es la técnica que permite ejecutar modelos de lenguaje grandes en GPUs de consumo al reducir la cantidad de bits necesarios para almacenar sus parámetros. Si entrenas o despliegas un LLM y te preocupa que un modelo como Llama 3.1 de 8 billones de parámetros pese cerca de 16 GB en precisión de 16 bits, esta guía te muestra cómo bajar ese costo sin sacrificar el rendimiento del modelo.

¿Qué es la cuantización en machine learning?

La cuantización convierte números de coma flotante a números enteros para que un modelo ocupe menos memoria y se ejecute más rápido. En lugar de guardar cada peso con 32 o 16 bits, lo representas con 8 bits o menos.

¿Qué es la cuantización? Es el proceso de reducir la precisión numérica de un modelo, pasando sus pesos de coma flotante a enteros para que ocupen menos memoria y la inferencia sea más rápida.

Para entender por qué funciona, necesitas saber cómo las computadoras representan los números. Con n bits puedes representar 2ⁿ valores distintos. Por eso existen tipos como byte (8 bits), short (16), int (32) y long (64), todos múltiplos de ocho porque la unidad mínima de información en una máquina son 8 bits [02:18].

¿Cómo se representan los números de coma flotante?

Las máquinas usan el estándar IEEE 754, que separa cada número en tres partes: un bit de signo, un exponente y la mantisa o fracción [04:32]. En 32 bits tienes 1 bit de signo, 8 de exponente y 23 de mantisa. Cuando una GPU baja a 16 u 8 bits, normalmente recorta la mantisa, lo que reduce precisión pero ahorra memoria.

La decisión depende del problema. Si mandas un cohete a la Luna, querrás 64 o 128 bits. Si corres un LLM en tu laptop, 8 bits puede ser suficiente.

¿Qué se cuantiza dentro de una red neuronal?

Volvamos a la fórmula base del multilayer perceptron: Y = X·W + B. Aquí W es la matriz de pesos, B es el bias y X es la entrada. Los tres son matrices y los tres son candidatos a cuantizar, junto con la salida Y [07:35].

El truco es que al convertir de float a entero y de vuelta a float, introduces un error. Ese error es inevitable, pero existen métodos para minimizarlo.

¿Cuál es la diferencia entre cuantización asimétrica y simétrica?

Las dos familias principales se diferencian en cómo distribuyen el rango de enteros disponibles.

  • Asimétrica: el rango va de 0 a 2ⁿ−1. Para 8 bits, eso son valores entre 0 y 255.
  • Simétrica: pone el cero en el centro y el rango va de −127 a 127.
  • Ambas requieren calcular un factor de escala S y, en el caso asimétrico, un punto cero Z.

En la cuantización asimétrica defines alfa como el número más grande de la lista y beta como el más pequeño. Luego aplicas la fórmula Xq = clamp(round(Xf/S) + Z, 0, 2ⁿ−1), donde clamp trunca el valor si se sale del rango [10:48].

¿Qué hace la función clamp? Recibe tres parámetros: el valor calculado, un límite inferior y uno superior. Si el valor se sale del rango, lo trunca al límite más cercano.

En la cuantización simétrica solo necesitas un alfa, que es el valor absoluto más grande de la lista. La fórmula se simplifica porque ya no sumas Z, y el cero queda implícito en la simetría del rango [13:50].

¿Cómo se elige el alfa y el beta sin perder precisión?

Usar el mínimo y el máximo es la forma más simple, pero es muy sensible a outliers. Un solo dato extremo puede arrastrar todo el rango y hacer que el resto de valores se cuantice con error alto.

Existen alternativas más robustas:

  • Percentiles: ignoras los extremos y dejas que solo los outliers paguen el costo del error.
  • MSE (mean square error): pruebas múltiples valores con grid search y eliges el alfa y beta que minimizan el error cuadrático.
  • Cross entropy con Softmax: especialmente útil para LLM, porque lo que importa no es el valor exacto del token sino que la distribución mantenga el orden correcto.

La cross entropy es el método que más vas a ver referenciado en papers de cuantización para LLM, porque optimiza para que el token ganador siga siendo el ganador después de cuantizar [17:55].

¿Qué hago con valores que cambian en tiempo de inferencia?

Los pesos W y el bias B son estáticos: los conoces antes de desplegar el modelo y los puedes cuantizar una sola vez. Pero la entrada X cambia con cada prompt del usuario. Para eso se usa online quantization, un proceso rápido porque el vector de entrada es mucho más pequeño que la matriz de pesos.

La salida Y es más complicada porque no conoces sus alfa y beta de antemano. Ahí entran las técnicas avanzadas como QAT.

¿Qué es Quantization Aware Training y por qué importa?

Google DeepMind lanzó Gemma 3 QAT, donde QAT significa quantization aware training. La idea es simular la cuantización durante el entrenamiento, de modo que la función de pérdida detecte esos errores mínimos y ajuste los pesos para compensarlos [20:22].

El resultado: cuando cuantizas el modelo entrenado, la precisión casi no se degrada.

¿Por qué QAT mejora la precisión? Porque guía al modelo hacia un punto intermedio de la función de pérdida que la cuantización puede manejar bien, en vez de un mínimo global muy estrecho que se rompe al perder precisión.

Hay un detalle técnico interesante: las funciones de cuantización no son derivables, lo que parece incompatible con el backpropagation. La solución es el Straight Through Estimator (STE), un algoritmo que aproxima la derivada llevando los valores fuera del rango a uno y los demás a cero [21:48]. Así puedes entrenar con cuantización simulada sin romper el descenso del gradiente.

¿Por qué un mínimo intermedio es mejor que un mínimo global?

Imagina dos valles en la curva de pérdida, uno más profundo que el otro. Sin QAT llegarías al valle más profundo, lo que da máxima precisión en float. Pero al cuantizar, el error empuja la pérdida hacia arriba y ese mínimo se vuelve inestable.

QAT te lleva a un valle más ancho y menos profundo, donde la cuantización no te saca del óptimo. La investigación actual se enfoca precisamente en cómo llegar al mínimo global sin pagar este costo.

Ahora te toca. Implementa en Python un script sencillo de cuantización asimétrica o simétrica que reciba una lista de números y la cuantice. Déjalo en los comentarios y te dejaré feedback directo sobre tu código.