English · Español
Lab 03 — Medir el sobrecoste de construcción de la máscara¶
Objetivo: cuantificar cuánto tiempo wall-clock añade la máscara por paso de decode; colocar esto sobre el modelo mental de roofline de la Fase 1.
Tiempo estimado: 60–90 minutos.
Prerrequisito: lab 02 terminado.
Lo que produces¶
Un directorio experiments/30-mask-overhead/ que contiene:
bench.py— script de medición.results.json—{vocab_size, per_step_ms_no_mask, per_step_ms_with_mask, ratio}.overhead.png— gráfica: gráfico de barras del tiempo wall por paso sin máscara vs con máscara.manifest.json.README.md— interpretación.
TODOs¶
Bloque A — medición¶
- Usa la máscara de esquema de conjugación del lab 01.
- Ejecuta
generate(prompt, mask=None, max_new_tokens=64)10 veces. Registra el tiempo wall total. Divide entre(10 * 64)para obtener ms por paso. - Ejecuta
generate(prompt, mask=JSONSchemaMask(...), max_new_tokens=64)10 veces. Registra ms por paso. - Marca calentamiento: la primera iteración de cada una se descarta (fallos de página, efectos tipo-JIT del intérprete de Python).
Bloque B — descomponer¶
En bench.py, instrumenta la máscara:
- ¿Cuánto tiempo se gasta en la simulación de la máquina de estados por paso a través de todos los tokens del vocab?
- ¿Cuánto tiempo se gasta en sumar el array de máscara a los logits?
- ¿Cuánto tiempo es el resto del decoder (matmul, softmax, sample)?
Dibuja un desglose de barras apiladas.
Bloque C — interpretar¶
En README.md, responde:
- ¿Qué fracción del tiempo por paso es construcción de máscara? Para el vocab de la Fase 30 de ~512 y una sim de máquina de estados, esto debería ser pequeño — quizá 20–40% en Python puro.
- ¿Cómo escalaría esto a vocab=50k? Linealmente. 50k / 512 ≈ 100× → la construcción de máscara dominaría. Por esto producción usa máscaras precomputadas (
theory/03-grammar-as-dfa.md). - Colocación en roofline. El bucle de construcción de máscara es mayoritariamente ramificación de Python y consultas de dict; está limitado por latencia del intérprete. No está limitado por ancho de banda ni por cómputo en el sentido habitual. Documéntalo.
- ¿Cuál es el coste en tokens-por-segundo? Si no enmascarado obtienes X tok/s, enmascarado obtienes Y tok/s. ¿Es Y / X < 0,5? Documenta el ratio real.
Restricciones¶
- Gobernador de CPU = performance. Igual que los labs de la Fase 1 (
learners/borja/profile.mdlo menciona). - Hilo único. No introduzcas threading para este lab.
- Semilla fija. Ambas ejecuciones usan la misma semilla RNG para que la ruta de muestreo sea idéntica (solo difiere la máscara).
Condiciones de parada¶
Terminado cuando:
overhead.pngmuestra un desglose por componente claro.README.mdincluye los cuatro párrafos de interpretación.- El ratio
per_step_ms_with_mask / per_step_ms_no_maskestá documentado y explicado.
Trampas¶
- Recolección de basura. El GC de Python puede dispararse durante la ejecución y sesgar los números. Desactívalo durante la medición (
gc.disable() / gc.enable()). - Sobrecoste del logger. Si el decoder loguea cada paso (el tracing de la Fase 21), eso domina. Desactiva el tracing para este benchmark.
- Distintas rutas de muestreo. Si tu estado de RNG difiere entre ejecuciones, podrías decodificar tokens distintos, golpeando rutas distintas en el código de máscara. Fija la semilla y verifica que salgan los mismos tokens (módulo filtrado de máscara).
- Ruido por max_new_tokens pequeño. 64 tokens × 10 pruebas es una estimación ruidosa. Si el ratio está al límite (digamos 1,5×), súbelo a 32 pruebas.
Cuándo consultar solutions/¶
Después de que tus números estén limpios. La solución probablemente observará la misma forma — la mayor parte del sobrecoste por paso está en iterar la máquina de estados a través de 512 tokens de vocabulario, y el camino a seguir es la precomputación.
Indicaciones de reflexión¶
Estas no son puertas; son para tu learners/borja/journal/.
- ¿Te sorprendió el coste de la máscara? ¿Por qué sí o por qué no?
- ¿Dónde crees que esto rompería (p. ej., vocab 100×, complejidad de esquema 10×)?
- ¿Dónde encaja esto en el gráfico de roofline de la Fase 1 (intensidad? ancho de banda?)?
Labs de la Fase 30 completos. Escribe PHASE_30_REPORT.md.