Skip to content

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:

  1. ¿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.
  2. ¿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).
  3. 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.
  4. ¿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.md lo 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:

  1. overhead.png muestra un desglose por componente claro.
  2. README.md incluye los cuatro párrafos de interpretación.
  3. El ratio per_step_ms_with_mask / per_step_ms_no_mask está 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.