Skip to content

English · Español

Lab 02 — La curva Pareto de cuantización

Objetivo: barrer {FP32, FP16, INT8 por-tensor, INT8 por-canal, INT4 por-grupo=64, INT4 por-grupo=128} y dibujar la curva Pareto de perplejidad vs bytes para MiniGPT.

Tiempo estimado: 3–4 horas (la mayor parte esperando a la calibración; codear es ligero).

Prerrequisito: labs 00 y 01 commiteados; MiniGPT cargable.


Lo que produces

Un directorio experiments/26-quant-curve/ que contiene:

  • sweep.py — script driver.
  • results.json — mediciones por esquema.
  • pareto.png — gráfico log-log, bytes en el eje x, PPL en el eje y, un punto por esquema.
  • verb_tense_accuracy.png — gráfico de barras, accuracy de clasificación de tiempo verbal por esquema (la métrica de la tarea según §A13).
  • roofline_overlay.png — re-plot del roofline de Fase 1 con puntos de inferencia de MiniGPT a FP32, INT8, INT4 superpuestos.
  • manifest.json.
  • README.md — interpretación.

El sweep

Esquema Implementación De dónde
FP32 Sin cuantización; baseline. MiniGPT
FP16 model.half(). PyTorch
INT8 por-tensor src/miniquant/quantize.py. Lab 00
INT8 por-canal src/miniquant/quantize.py. Lab 00
INT4 por-grupo=64 src/miniquant/quantize.py (Borja extiende desde INT8 — escribe el wrapper INT4). Lab 00 extendido
INT4 por-grupo=128 Igual que arriba con group_size=128. Igual
INT4 por-grupo=64 + GPTQ src/miniquant/gptq.py aplicado por capa. Lab 01 extendido

Fíjate en que la última fila introduce un GPTQ por lotes sobre todos los Linears de MiniGPT — esta es la integración del GPTQ por-capa del lab 01 en el modelo completo. No es un algoritmo separado; es el lab 01 en un bucle for layer in model.linears: gptq_quantize(layer, calib_data).

TODOs

Bloque A — extiende el cuantizador

  • Añade quantize_symmetric_per_group(W, bits=4, group_size=64, dim=1) a src/miniquant/quantize.py. Reshape W: (out, in) → (out, in/group_size, group_size); elige escala por grupo a lo largo del último eje; cuantiza; reshape de vuelta.
  • Almacenamiento: guarda como int8 con valores en [-7, 7] (para INT4 simétrico con 15 códigos usados; un código desperdiciado por simetría). No empaquetes en bits a un formato 4-bit real todavía — eso es el lab 03 (GGUF export).
  • Añade tests para la nueva función (Claude hace el scaffold).

Bloque B — extiende QuantizedLinear

  • Acepta un argumento scheme: "per_tensor", "per_channel", "per_group_64", "per_group_128", "gptq_per_group_64".
  • Para los esquemas GPTQ, el constructor acepta una H de calibration (calculada externamente vía la maquinaria del lab 01).

Bloque C — pipeline de calibration

Para la fila GPTQ:

  • Ejecuta MiniGPT en FP32 sobre 128 secuencias held-out; registra las activaciones de entrada por-Linear.
  • Para cada Linear, calcula H = X X.T / n; aplica el GPTQ del lab 01 para obtener el peso cuantizado.
  • Envuelve el Linear original con un QuantizedLinear que lleve el resultado de GPTQ.

Bloque D — mide PPL, accuracy de tiempo verbal y bytes por esquema

  • PPL vía la misma evaluación del lab 00 (split held-out del corpus de verbos).
  • Accuracy de clasificación de tiempo verbal: alimenta un batch de frases con una conjugación verbal held-out, pide al modelo que puntúe la forma correcta vs incorrecta (p. ej., He __ to the store con candidatos walk / walks / walked). Elige la forma argmax-probabilidad; cuenta aciertos contra la verdad de campo. Esta es la métrica de la tarea según §A13.
  • Bytes: suma del almacenamiento de todos los pesos incluyendo escalas (escalas FP16 para INT8/INT4; resta los bytes del embedding si cotizas tamaños "solo-Linear").

Bloque E — gráfico Pareto

  • Eje x: bytes, escala log. Eje y: PPL, lineal.
  • Un punto por esquema, etiquetado.
  • Dibuja la frontera Pareto (la envolvente inferior-izquierda).

Bloque F — overlay sobre el roofline

  • Reutiliza las líneas de techo de experiments/01-roofline/.
  • Calcula la intensidad aritmética de un único paso de inferencia de MiniGPT en FP32, INT8, INT4. Dibuja los puntos.
  • Anota: ¿qué punto está sobre el techo de memoria, cuál sobre el techo de cómputo?

Bloque G — interpreta en README.md

Cuatro preguntas:

  1. ¿Qué esquemas están en la frontera Pareto? Espera: FP32 (una esquina), algún esquema INT8 (en medio), INT4 por-grupo=64 + GPTQ (la otra esquina). Los intermedios FP16 e INT8 por-tensor pueden estar Pareto-dominados.
  2. ¿Cuál es la diferencia de PPL de INT4 por-grupo=64 + GPTQ vs FP32? Debería ser < 15% (umbral del DoD) y con suerte < 5%. Si es mucho peor, tu pipeline de GPTQ tiene un bug.
  3. Según el overlay del roofline, ¿cuánto speedup teórico compra INT4? Usa la razón de intensidades. Compara con lo que entregaría un CPU VNNI real (el número "esperado" — el i5-8250U de Borja no lo mostrará porque carece de kernels INT8).
  4. ¿Dónde pararías en producción? Elige el esquema que enviarías si Borja desplegara esto en una Raspberry Pi. Justifica en 3 frases.

Restricciones

  • Todas las mediciones usan el mismo split de evaluación (determinista).
  • seed_everything(42) al comienzo de cada script.
  • No cuantices la tabla de embedding; mantenla en FP16. (Revisado en teoría; consistente con la práctica de producción para modelos pequeños.)
  • No cuantices los parámetros de layer-norm (son escalares por-canal; la cuantización no compra nada).
  • El conteo de bytes debe incluir escalas y zero-points, no solo pesos.

Condiciones de parada

Terminado cuando:

  1. Siete esquemas medidos y la tabla está en results.json.
  2. Diferencia de PPL de INT4 por-grupo=64 + GPTQ < 15% (DoD).
  3. El overlay del roofline muestra el desplazamiento de intensidad.
  4. README.md responde las cuatro preguntas.

Trampas

  • El esquema GPTQ es peor que RTN por-grupo. El lab 01 no testeó completamente sobre la H de una capa real de MiniGPT. Re-deriva H desde activaciones reales y comprueba que los fuera-de-diagonal estén no-trivialmente poblados.
  • PPL de INT4 es mucho peor que INT8. ¿Pusiste el grid correcto? INT4 simétrico debería redondear a [-7, 7], no [-8, 7] ni [-127, 127].
  • Los puntos del roofline no cuadran con las predicciones. Los recuentos de bytes del mundo real incluyen escalas, activaciones y biases. La intensidad no es solo "FLOPs / bytes de peso"; es "FLOPs / tráfico de memoria total". Recalcula incluyendo activaciones.

Cuándo consultar solutions/

Tras commitear los cuatro archivos y cumplido el DoD. La referencia en solutions/02-quant-curve-ref.md (apertura de fase) compara la forma de la frontera Pareto.


Siguiente lab: lab/03-gguf-export.md.