rukh · lab

// M6 · lección 02

Evaluar: lo que salió

La tabla única entera, medida el mismo día con la misma suite, y cómo se lee: qué se movió respecto a los números de cada hito y cuánto de eso es el instrumento; el suelo medido cuatro veces; los dos baselines públicos; el encoder; lo que cuesta el int8 en Elo; la demo con arena y puzles; y lo que quedó fuera.

  • 120 min
  • nivel medio
  • vigente
  • actualizado el21 de septiembre de 2026

Parte 2 de 3 del módulo «Evaluar, exportar, publicar». Viene de «Evaluar: la teoría justa» y sigue en «Evaluar: los labs de cierre».

La tabla, el mismo día

Al terminar esta sección sabrás leer la tabla entera del proyecto con las gafas de la parte 1, y distinguir en ella lo que dice el modelo de lo que dice el instrumento.

Esta es la tabla. Trece filas de decoder, cuatro de encoder, y todas las de decoder medidas el 2026-09-21 con rukh eval nightly y la misma suite: 1 000 posiciones de legalidad y de acierto, 6 000 puzles, 160 partidas por etapa, temperatura 0,05 y top_k 1. Se ordena por cualquier columna; las filas marcadas son los baselines que no entrenó nadie de aquí, y cada fila enlaza a su card y a la arena de la demo con esa etapa cargada.

La tabla única del hito

Una fila por etapa evaluada, en el orden del curso. Pulsa una cabecera para ordenar por esa columna; otra vez, para invertir. Legalidad, top-k y puzles son porcentajes; el Elo lleva su intervalo del 95 %; la entropía de la primera jugada dice si el modelo abre siempre igual (0) o reparte (más bits).

Tabla con desplazamiento horizontal.

Enlaces
karvonen-8lbaseline25,7 M99,6 %50,7 %47,5 %26,0 %10,8 %1328 (1250 … 1391)
lora-d4115,1 M99,8 %55,1 %83,0 %57,4 %37,5 %16,9 %1535 (1481 … 1582)0,02
lora-e4115,1 M99,8 %54,7 %83,3 %58,1 %38,2 %17,2 %1538 (1488 … 1604)0,02
medium-elo115,1 M99,7 %54,9 %82,5 %59,8 %37,1 %16,6 %1592 (1532 … 1650)1,74
medium-masters115,1 M99,7 %54,9 %82,3 %58,1 %38,7 %17,1 %1563 (1502 … 1630)1,89
medium-v4-dpo-greedy115,1 M99,8 %53,4 %80,5 %58,3 %39,9 %18,1 %1586 (1530 … 1651)1,78
medium-v4-dpo-onpolicy-greedy115,1 M99,2 %52,3 %79,9 %59,0 %40,3 %17,8 %1632 (1567 … 1706)1,75
medium-v4-greedy115,1 M99,8 %54,4 %82,2 %57,9 %38,0 %16,6 %1535 (1476 … 1599)1,77
medium-v4-grpo-greedy115,1 M99,3 %53,3 %80,3 %58,9 %39,1 %17,8 %1577 (1526 … 1632)1,79
qwen3-pgn-qlorabaseline596,0 M62,5 %12,5 %1,8 %0,7 %0,4 %320 (… 807)
small-greedy39,0 M99,4 %51,1 %79,4 %34,7 %21,1 %10,3 %1355 (1297 … 1420)1,74
small-v3-greedy39,0 M99,1 %52,4 %80,5 %41,0 %27,0 %12,2 %1425 (1367 … 1484)1,64
tiny-greedy5,3 M94,5 %40,3 %67,1 %14,1 %8,6 %3,9 %778 (479 … 904)1,72

Fuente: rukh eval nightly · actualizado 21/09/2026 · 13 etapas · 2 baselines · 4 filas del encoder en su propia tabla

Cuatro lecturas, en el orden en que conviene hacerlas.

Primera: las columnas se mueven por separado. medium-v4-dpo-onpolicy es la fila con más Elo (1632, intervalo 1567-1706) y tiene peor top-1 que su base (52,3 % frente a 54,4 %) y peor legalidad (99,2 % frente a 99,8 %). GRPO igual: 1577 de Elo, 53,3 % de top-1, 99,3 % de legalidad. Los dos alineados dejaron de imitar a los humanos de 1800 y empezaron a ganar más al motor, y pagaron el peaje de M5 en jugadas ilegales. Ninguna columna sola cuenta esa historia.

Segunda: afinar no mueve la competencia, y aquí se ve en la misma tirada. Los dos adaptadores LoRA dan 1538 y 1535 sobre una base a 1535; medium-elo y medium-masters dan 1592 y 1563. El intervalo de cada una tiene ±55 de semiancho: ninguna de las cuatro se separa de la base. Lo que sí las separa, y a distancia enorme, es la entropía de la primera jugada: 0,016 y 0,021 bits en los adaptadores (abren siempre igual) frente a 1,77 de la base. M4 lo midió con cinco instrumentos; la tabla lo deja en una columna.

Tercera: los puzles ordenan por tamaño y el top-1 apenas. De tiny a small-v3 a medium-v4 el tramo fácil de puzles va 14,1 % → 41,0 % → 57,9 % y el top-1 va 40,3 % → 52,4 % → 54,4 %. El top-3 acompaña al top-1 (67,1 → 80,5 → 82,2). Ver táctica cuesta parámetros; imitar la siguiente jugada humana se satura pronto, porque los humanos de 1800 tampoco juegan siempre la misma.

Cuarta: la fila de tiny es la de un modelo que no sabe del todo las reglas. 94,5 % de legalidad sin máscara, y un Elo de 778 con un intervalo de 479 a 904: el más ancho de la tabla, porque una de cada veinte jugadas la elige el rescate y no el modelo. Es la fila que enseña por qué la legalidad es la métrica de suelo.

Lo que se movió respecto a los números de cada hito

Cada módulo había medido lo suyo el día que cerró. La tabla de hoy vuelve a medirlo todo, y comparar las dos versiones es la mejor lección de reproducibilidad del curso, porque el modelo no cambió y la suite tampoco.

Etapa Elo al cerrar su hito Elo el 2026-09-21 Diferencia
tiny-greedy 921 (713-1040) 778 (479-904) −143
small-v3-greedy 1365 (1293-1423) 1425 (1367-1484) +60
medium-v4-greedy 1504 (1446-1558) 1535 (1476-1599) +31
medium-elo 1558 (1500-1609) 1592 (1532-1650) +34
medium-masters 1583 (1525-1641) 1563 (1502-1630) −20
medium-v4-dpo-onpolicy-greedy 1560 (1500-1617) 1632 (1567-1706) +72
medium-v4-grpo-greedy 1572 (1512-1640) 1577 (1526-1632) +5
medium-v4-dpo-greedy 1529 (1470-1583) 1586 (1530-1651) +57
small-greedy (v1) 1359 (1293-1429) 1355 (1297-1420) −4

Y las demás columnas: no se movieron nada. Legalidad, top-1, top-3, los tres tramos de puzles y la entropía dan hoy exactamente el mismo número que el día de su hito, hasta el tercer decimal, porque a temperatura 0,05 el muestreo es casi determinista y esas medidas no tienen un rival con reloj. La única columna que se mueve es la única que juega contra Stockfish, y se mueve lo que su intervalo dice que se puede mover: cinco de las nueve diferencias caben en un semiancho de ±55; las de small-v3 (+60) y del DPO fuera de política (+57) lo rozan; la de dpo-onpolicy (+72) lo pasa y roza el suyo propio, que es de ±69; y la de tiny (−143) cabe de sobra en el suyo, que es enorme.

La que más conviene mirar es la de dpo-onpolicy: +72 en un día. Con la tabla vieja, la ventaja del alineado sobre su base era de 56 puntos; con la de hoy, de 97. Ninguna de las dos es la medida: la medida es el enfrentamiento directo de M5, +57 (36-79) con 800 partidas, y la tabla está para ordenar etapas, no para restar filas. Es exactamente la frase de la parte 1, con los números que la hicieron necesaria.

El suelo del instrumento, medido cuatro veces

Antes de reconstruir la tabla se midió cuánto se mueve la escalera cuando no cambia nada: medium-v4, misma semilla, dos veces con el rival por reloj y dos veces con un presupuesto de nodos, con la máquina parada y quince minutos de descanso entre tiradas.

140014501500155016001650Elo medidoStockfish limitado por tiempo · elegidotime-a1538time-b1538Stockfish limitado por nodosnodes-a1541nodes-b1524
Por tiempo
1538 y 1538 → 0 Elo entre tiradas · elegido
Por nodos
1541 y 1524 → 17 Elo entre tiradas
Mismo modelo, misma escalera, misma semilla: no cambia nada. La distancia entre las dos tiradas de cada grupo es lo que el instrumento añade por su cuenta, y por debajo de ella no hay diferencia que publicar. Modelo: checkpoints/medium-v4-20260919-174623/best.pt. 160 partidas por tirada. Se decidió limitar por tiempo.

Por reloj, 1538 y 1538. Por nodos, 1541 y 1524. La hipótesis de D-107, que el rival no repetía porque jugaba por tiempo, era razonable y estaba mal: UCI_LimitStrength aleatoriza al rival a propósito con los dos límites, y las dos tiradas por nodos se separan peldaño a peldaño tanto como las dos por reloj (el 1538 repetido es el agregado; uci-1500 dio 0,45 y 0,625). Los 60 puntos de D-107 fueron una máquina cargada o mala suerte a 1,18 σ. La decisión (D-137) fue la que la regla del plan obligaba a tomar con el número delante: el rival sigue por reloj, no se recalibra la escalera y ningún Elo cambia de escala; lo que entra en el runbook es la condición de no tener nada más en la máquina mientras corre una escalera.

Los dos baselines

Un baseline solo cuenta si se mide con el mismo harness, y la tabla tiene dos. Una marca de maratón en una ciudad y otra en otra no se comparan aunque las dos digan «maratón»: un recorrido es llano y el otro sube, un día hacía viento y el otro no. Un número copiado del paper de otro es una marca de otra ciudad; para compararla hay que traer al corredor a la tuya.

Qwen3 con QLoRA (M4): 596 M de parámetros, afinado sobre PGN, y la fila más baja de la tabla con diferencia: 62,5 % de legalidad, 12,5 % de top-1, 1,8 % del tramo fácil de puzles y un Elo que solo se puede acotar por arriba (< 807, porque perdió casi todo contra el peldaño más bajo). Es la fila que dice qué compra un vocabulario de jugadas y cinco millones de partidas frente a un modelo general cinco veces más grande con unos miles de partidas encima.

El nanoGPT de Karvonen: 8 capas, 25,7 M, entrenado por su autor sobre 16 millones de partidas de Lichess en PGN carácter a carácter. Reimplementado aquí y puesto en la misma escalera, con su formato de prompt exacto y una regla más dura que la suya ante una jugada ilegal.

Su fila: 99,6 % de legalidad sin máscara, 50,7 % de top-1, puzles al 47,5 % / 26,0 % / 10,8 % por tramo y 1328 de Elo (1250-1391). Es la fila más útil de la tabla para situar el proyecto, porque es el único modelo de fuera que juega de verdad: escribe jugadas legales con más fiabilidad que small-v3 (99,6 % frente a 99,1 %) con 25,7 M de parámetros frente a 39 M y tres veces más partidas de entrenamiento; en puzles se reparten (él gana el tramo fácil, 47,5 % frente a 41,0 %, y small-v3 los dos difíciles, 27,0 % frente a 26,0 % y 12,2 % frente a 10,8 %); y en Elo gana small-v3, 1425 (1367-1484) frente a 1328, con los intervalos sin tocarse. Lo que compra el vocabulario de jugadas de M1 frente a leer el PGN carácter a carácter no es legalidad, es fuerza a igualdad de tamaño; y medium-v4, a 1535, ya no tiene comparación pública en la tabla.

El encoder

Las filas del encoder viven aparte porque no comparten una sola columna con las de decoder. La que sirve la demo, encoder-v4 (39,0 M), da F1 de blunder 0,186 con un umbral elegido en la mitad de ajuste, frente a 0,089 de la heurística de material: +9,7 puntos de margen, que es el criterio del módulo. ROC-AUC 0,761, correlación de Pearson con el valor de Stockfish 0,726, y el resultado de la partida al 50,8 %: es la cabeza más ruidosa de las tres, porque todas las posiciones de una partida llevan la misma etiqueta, y la card lo dice. Las tres filas de M3 que quedan (encoder con el esquema moves, encoder-rank y encoder-squares) son la comparación de esquemas de aquel módulo y se conservan con su fecha; las dos que llevaban el nombre de su carpeta de corrida se retiraron con rukh eval drop.

Lo que cuesta el int8

M2 dejó una pregunta abierta y este módulo la cierra jugando: fp32, fp16 e int8 de medium-v4, cada uno como jugador en la misma escalera a través del mismo DecoderPlayer, con el rival por nodos porque ONNX Runtime juega en CPU y por reloj habría cambiado también al motor.

paridad de jugada con el checkpoint0 %25 %50 %75 %100 %fp32100,0 %misma jugada siemprefp1699,9 %0,1 % de jugadas distintasint895,1 %4,9 % de jugadas distintasElo de cada exportación en la misma escalera (por nodos, IC 95 %)1350140014501500155016001650fp321472fp161535int81524
Paridad: en qué fracción de posiciones la exportación elige la misma jugada que el checkpoint en PyTorch. Un 100 % es el mismo modelo; lo que falta hasta 100 es otro modelo, y solo jugar dice cuánto Elo cuesta: el panel de abajo pone las tres exportaciones en la misma escalera, con el rival por nodos, y sus intervalos dicen si la diferencia se ve con este presupuesto de partidas. El enfrentamiento directo fp16 contra int8, que la vería más fina, queda como ejercicio. Modelo: medium-v4.

El int8 no tiene un coste medible con 160 partidas: su intervalo y el del fp16 casi se superponen. Y la fila del fp32, la misma red que el checkpoint, sale 60 puntos por debajo del fp16 sin ningún mecanismo que lo explique: es el suelo del instrumento con el rival por nodos, la misma tarde, y la razón de que la demo pueda servir int8 en el móvil diciendo la verdad: otra etapa, con una fuerza que no se distingue de la del fp16 con este presupuesto de partidas.

La demo: arena y puzles

La demo pasa de una pantalla a tres modos sobre la misma pantalla. La arena carga dos etapas en dos workers y las hace jugar por parejas con colores espejados desde una apertura aleatoria con semilla, y convierte el marcador en una diferencia de Elo con su intervalo bootstrap, con la misma aritmética que rukh eval match; al lado imprime cuántas partidas haría falta jugar para que una diferencia de ese tamaño se separara del cero. Los puzles son los 150 de puzzles.json, cincuenta por tramo del mismo split de test que la suite, preguntados con el prefijo real de la partida y los Elo de los jugadores, y contados con el criterio del harness: la línea entera.

Se verificó en Chrome real con WebGPU antes de cerrar: tiny-int8 contra sí mismo, diez partidas, 2 victorias, 6 tablas y 2 derrotas, y 0 Elo de diferencia con intervalo de −147 a +147, que es lo que tiene que dar un modelo contra sí mismo y lo que M5 llamó el control del instrumento; y los puzles de tiny-int8 al 25 % en los ocho primeros del tramo fácil, contra el 14,1 % de su fila (cincuenta puzles y ocho no se distinguen). ?fen= abre el tablero en una posición y es lo que usa el curso para enlazar una posición desde una lección.

Lo que quedó fuera

  • Maia-2 como segundo baseline, condicionado por Elo: maia2 fija torch 2.8 frente al 2.11 del proyecto y descarga sus pesos de Google Drive. Cabe como proceso hijo en su propio entorno, y el diseño está en el backlog (D-138); no en el hito de cierre.
  • El bot de Lichess del plan original, que era opcional y necesita una cuenta de bot.
  • La imagen Open Graph por lección, aplazada desde P0.

Los criterios del módulo

  • «Una tabla única y reproducible con todas las etapas y los baselines públicos»: cumplido. Trece filas de decoder medidas el mismo día con un comando, dos baselines externos, y el suelo del instrumento medido y publicado con la tabla.
  • «Model cards en inglés para cada modelo de la colección»: cumplido en el lab 4. Veintiuna cards regeneradas desde la tabla, cada una con su lección, su fila, su demo y su comando rukh pull; y la colección del Hub igual al catálogo.
  • «Demo final con selector de etapa, arena y puzles en vivo»: cumplido y verificado en Chrome real.

Lo que queda por decir de cada número está en la parte 3, con el comando que lo produjo.