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)asrc/miniquant/quantize.py. ReshapeW: (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
int8con 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
Hde 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, calculaH = X X.T / n; aplica el GPTQ del lab 01 para obtener el peso cuantizado. - Envuelve el
Linearoriginal con unQuantizedLinearque 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 storecon candidatoswalk/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:
- ¿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.
- ¿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.
- 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).
- ¿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:
- Siete esquemas medidos y la tabla está en
results.json. - Diferencia de PPL de INT4 por-grupo=64 + GPTQ < 15% (DoD).
- El overlay del roofline muestra el desplazamiento de intensidad.
README.mdresponde las cuatro preguntas.
Trampas¶
- El esquema GPTQ es peor que RTN por-grupo. El lab 01 no testeó completamente sobre la
Hde una capa real de MiniGPT. Re-derivaHdesde 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.