rukh · lab

// M2 · lección 11

Más datos, no más red: de small a medium-v4

La lección del módulo que no estaba en el plan: por qué small se quedaba corto, qué se probó primero y qué se probó después, la escalera de Elo que estaba mal calibrada y el modelo de 115 millones de parámetros sobre 1 681 millones de tokens del que parten los dos módulos siguientes.

  • tiempo de trabajo35 min
  • además, ejecución sin supervisión+ 368 min de GPU y red
  • nivel base
  • actualizado el23 de septiembre de 2026

Qué vas a construir

medium-v4: el decoder de 115 120 128 parámetros entrenado sobre 1 681 millones de tokens, con 1504 de Elo estimado (IC 95 % 1446-1558) y un 99,8 % de jugadas legales sin máscara. De él parten M4 y M5, y se publica como chorcat/rukh-medium.

Pero lo que importa es cómo se llegó a él. La curva de small invitaba a dos conclusiones: que le faltaba entrenamiento y que tocaba una red más grande. Las dos eran equivocadas, y lo demuestra una división. Es la pregunta que se hace cualquier equipo que preentrena un LLM antes de pedir más GPU: ¿me falta modelo o me faltan datos?

Las dos cifras de la cabecera miden cosas distintas: 35 minutos son los tuyos, leyendo y lanzando comandos; las algo más de seis horas de máquina (368 minutos) son las descargas, las tres corridas y las cuatro horas de medium-v4, que trabajan solas mientras haces otra cosa.

El diagnóstico cabe en una división

«Exportar a ONNX» terminó con el hueco entre entrenamiento y validación de small creciendo (0,021, 0,046, 0,060) mientras el top-1 se aplanaba. Antes de tocar nada, la cuenta:

data/tokens/uci/train/meta.json: 2 949 514 partidas, 240 068 954 tokens
parámetros de small: 38 971 392
tokens únicos por parámetro: 240 M / 39 M = 6,2
pasadas sobre el corpus: 20 000 pasos × 256 secuencias × 200 tokens = 1 024 M / 240 M = 4,3

Seis tokens por parámetro, cuando la literatura de escalado da como razonable unos veinte, y cuatro pasadas y pico sobre el mismo material. El hueco que crecía era la firma de repetir material, y explica por qué medium, con el triple de parámetros y los mismos datos, solo compró 84 puntos de Elo (1091 frente a 1007, en la escalera sin corregir) con los intervalos solapados. Más red sobre el mismo libro recita mejor el libro.

Ese medium v1 es configs/train/medium.yaml de p3-elo-1200: la receta de small con el preset medium, 20 000 pasos sobre los mismos 240 M tokens, lr: 4.5e-4 y lotes de 32 × 8 (unas dos horas en la 5090). No se repite aquí porque solo sirve de contraste; si quieres reproducirlo, es uv run rukh train --config configs/train/medium.yaml con ese fichero.

Y había 238 millones de tokens parados: el mes de febrero entero era validación, para un bucle que evalúa leyendo 640 000. Primera palanca, y sin descargar nada.

Tres ejecuciones, una palanca cada una

// Antes de empezarQué cuesta cada lab, y cuál puedes saltarte

LabRutaRelojDejaAtajo
Corrida v2Más datos con la misma red pequeñacuesta máquina~45 mincheckpoints/small-v2-<fecha>/best.ptno hay
Corrida v3La Elite de 44 meses, tokenizada y entrenadacuesta máquina~1,5 h de descarga + 5 min de tokenizar + ~45 de entrenardata/elite/games.parquet, checkpoints/small-v3-<fecha>/best.ptrukh pull rukh-games-elite small, desde un clon de la versión final (ver arriba)
Corrida v4medium-v4: la capacidad, cuando por fin está justificadacuesta máquina4 h 3 min + ~30 de evaluacióncheckpoints/medium-v4-<fecha>/best.pt, la base de M4 y M5rukh pull medium-v4, desde un clon de la versión final (ver arriba)
cuesta máquina
Tiempo real de GPU, red o motor. El reloj es el de la RTX 5090 de referencia.

Las tres comparten planificador, semilla y la misma validación congelada, las 100 000 primeras partidas de 2025-02. Cada una cambia una sola cosa respecto a la anterior, para que la diferencia sea atribuible.

v2: devolver el mes de validación al entrenamiento. configs/data/pipeline-v2.yaml deja val_games: 100000 y manda el resto al corpus: 240 M → 471 M tokens únicos, de 6,2 a 12,1 por parámetro. La misma receta de small, con 28 000 pasos.

Terminal
uv run rukh data tokenize --config configs/data/pipeline-v2.yaml --scheme uci --pack
uv run rukh train --config configs/train/small-v2.yaml

v3: cambiar de qué está hecho el corpus. La Lichess Elite Database (database.nikonoel.fr) publica por meses las partidas de 2500+ contra 2300+, sin bullet. Veinticuatro meses son unos 6,5 millones de partidas: más datos y otra distribución, porque el corpus de 1800+ tiene un 3,4 % de partidas con las blancas en 2400 o más y la Elite un 93 %. configs/data/pipeline-v3.yaml las añade con extra_train_parquets y deja la validación donde estaba.

Terminal
uv run rukh data elite --config configs/data/pipeline-elite44.yaml # o bájalo publicado (arriba)
uv run rukh data tokenize --config configs/data/pipeline-v3.yaml --scheme uci --pack
uv run rukh train --config configs/train/small-v3.yaml

(pipeline-elite44.yaml descarga los 44 meses de la ejecución final; la v3 de referencia usó 24, y si sigues el orden de esta página la tuya llevará 44.)

Con v1 al lado, «general» es la validación congelada y «fuerte», la misma pérdida sobre partidas de 2200+:

Modelo Par. Tokens únicos general top-1 fuerte 2200+ top-1 hueco train/val
small v1 39 M 240 M 1,5197 51,20 % 1,5391 50,84 % +0,0603
medium v1 115 M 240 M 1,4782 52,31 % 1,4880 52,06 % —
small v2 39 M 471 M 1,4703 52,49 % 1,4652 52,69 % +0,0242
small v3 39 M 1 095 M 1,4770 52,19 % 1,4537 53,02 % —

Dos lecturas:

  1. Recuperar el mes vale −0,049 nats y el hueco cae a la mitad. Un nat es la unidad de la pérdida cuando el logaritmo es natural, como en la entropía cruzadaEntropía cruzadaLa pérdida con la que se entrena todo modelo de lenguaje: menos el logaritmo de la probabilidad que el modelo le dio al token que venía de verdad, promediado sobre las posiciones. Si le dio 0,70, paga 0,35; si le dio 0,035, paga 3,35. En PyTorch es F.cross_entropy(logits, objetivo), que hace el softmax por dentro, y en Rukh lleva ignore_index=0 para que el relleno <pad> no cuente. Un modelo que reparte por igual entre las 2 030 jugadas paga ln 2030 ≈ 7,6: es el punto de partida de toda curva de pérdida del decoder. de la tabla: la «general» de v2 es 0,049 menor que la de v1. small v2, con 39 millones de parámetros, bate al medium de 115 entrenado con los datos viejos. El cuello eran los datos, y ahora está medido.
  2. La composición mueve otra cosa que la cantidad. v3 cede 0,007 en juego promedio y gana 0,012 en juego fuerte. Y mueve el eje de Elo: la divergencia KLPenalización KLLa divergencia KL mide cuánto se aleja una distribución de otra: Σ p · log(p/q), cero si son iguales y mayor cuanto más difieren (no es simétrica, así que no es una distancia en sentido estricto). La penalización KL es el término que ata la política a la copia congelada de donde salió; sin él, una recompensa verificable es una invitación a dejar de jugar al ajedrez y ponerse a cultivar el número. Rukh usa el estimador k3, exp(d) − d − 1 con d = log π_ref − log π, que es no negativo por construcción: la diferencia de log-probabilidades a secas es negativa la mitad de las veces y pagaría al modelo precisamente por alejarse. (cuánto se separan dos distribuciones; cero si son iguales) entre las jugadas que propone con la cabecera <2800> y con <1800> pasa de 0,047 nats en v1 y 0,049 en v2 a 0,115 en v3. Duplicar los datos no movió ese eje; cambiar de qué están hechos, sí. Sin élite, el «juega como 1500 / 2000 / 2400» de M4 no tenía de dónde salir.

La escalera estaba torcida

Mientras se medían esas ejecuciones, la contradicción de la escalera se hizo imposible de ignorar: small v2 puntuaba 0,725 contra UCI_Elo 1320 y perdía veinte a cero contra skill-3, etiquetado con 1250. La medida de los escalones está en «El Elo y la suite»; esto es lo que la corrección le hizo a lo publicado:

Etapa Publicado Corregido IC 95 %
small v1 1007 1359 1293-1429
small v2 1070 1407 1344-1462
small v3 1095 1425 1367-1485

El listón de 1200 nunca se falló: small v1 estaba publicado con «Elo bar not met» y estaba en 1359. Lo relativo aguanta: la corrección sube a los tres casi lo mismo (+352, +337 y +330), el orden no cambia y la mejora de los datos sigue ahí.

medium-v4: capacidad, cuando por fin está justificada

Con 1 681 millones de tokens únicos (enero, el resto de febrero y 44 meses de Elite, 18 942 740 partidas) salen 14,6 tokens únicos por parámetro para 115 millones, siete veces los 2,1 de medium v1: medium deja de ser una red grande sobre un libro pequeño. configs/train/medium-v4.yaml da 48 000 pasos, 2 457 millones de tokens vistos (21 por parámetro, la cifra que engaña si se confunde con la de únicos) y 1,46 pasadas.

Terminal window
uv run rukh data tokenize --config configs/data/pipeline-v4.yaml --scheme uci --pack
uv run rukh train --config configs/train/medium-v4.yaml
uv run rukh eval --model "$RUKH_HOME/checkpoints/medium-v4-<fecha>/best.pt" --config configs/eval/greedy.yaml --stage medium-v4-greedy
Terminal window
uv run rukh data tokenize --config configs/data/pipeline-v4.yaml --scheme uci --pack
uv run rukh train --config configs/train/medium-v4.yaml
uv run rukh eval --model "$env:RUKH_HOME\checkpoints\medium-v4-<fecha>\best.pt" --config configs/eval/greedy.yaml --stage medium-v4-greedy

Tokenizar tarda cinco minutos y deja 3,3 GB en data/tokens-v4/uci/. El entrenamiento duró 4 h 3 min, el trabajo más largo de la primera fase: se lanza al final de una sesión y se recoge en la siguiente. La evaluación canónica (greedy.yaml, temperatura 0,05, cabecera en 1800, escalera corregida) tarda media hora.

Modelo Par. Tokens únicos val/loss Elo IC 95 % legal argmax top-1 puzles
small v1 39 M 240 M 1,5197 1359 1293-1429 99,40 % 51,10 % 22,07 %
medium v1 115 M 240 M 1,4782 — — 99,40 % 52,90 % 23,93 %
small v2 39 M 471 M 1,4703 1407 1344-1462 99,30 % 51,80 % 26,93 %
small v3 39 M 1 095 M 1,4770 1425 1367-1485 99,10 % 52,40 % 26,73 %
medium-v4 115 M 1 681 M 1,3733 1504 1446-1558 99,80 % 54,40 % 37,50 %

Elo, legalidad, top-1 y puzles vienen de la evaluación canónica, que no es el top-1 de validación de la tabla anterior (por eso medium v1 lee 52,90 % aquí y 52,31 % allí). Su Elo va en blanco porque solo se midió en la escalera torcida; ponerle un número sería inventarlo.

Tres cosas de esa fila:

  • No era la arquitectura. El mismo medium, con la misma receta, pasa de 1,4782 con 240 M de tokens repetidos 4,3 veces a 1,3733 con siete veces más material único.
  • La legalidad no era una tendencia. La serie 99,40 → 99,30 → 99,10 % de las tres small era un modelo de 39 M estirándose sobre un corpus creciente; con capacidad suficiente, fuerza y legalidad suben juntas.
  • Los puzles son donde más se ve: de 22,07 % a 37,50 %. Un puzle pide la jugada única que gana, no la que jugó un humano, y es la métrica que menos premia imitar.

Los +145 Elo entre small v1 y medium-v4, palanca a palanca: recuperar el mes de validación +48, la Elite +18, la capacidad ya justificada +79.

Lo que se publica y lo que se mide después

chorcat/rukh-small es small v3, la mejor de la serie, y chorcat/rukh-medium es medium-v4. La demo sirve small porque 79 MB en fp16 caben en un móvil y 231 no.

Los modelos publicados sirven para comparar. Exporta tu medium-v4, cárgalo en la demo con «Tu propio modelo», elige después Rukh medium (fp16) y juega la misma apertura. Si tu entrenamiento salió bien, las partidas se parecerán; si la tuya juega notablemente peor, tienes la pista antes de gastar media hora de evaluación.

Al comparar con las cards, una advertencia: small v3 midió 1425 (1367-1485) un día y 1365 (1293-1423) al siguiente, con la misma config, semilla y pesos. El rival juega por tiempo y con UCI_LimitStrength, que aleatoriza a propósito, así que la escalera tiene un suelo de reproducibilidadSuelo de reproducibilidadCuánto se mueve una medición cuando no se cambia nada: el límite por debajo del cual dos números del mismo instrumento no se pueden distinguir. En la escalera de Rukh son unos 40 puntos de Elo de una sigma —±80 al 95 %—, medidos midiendo medium-elo a <w1800> dos veces con la misma semilla y obteniendo 1498 y 1558. La semilla fija el muestreo del modelo y no el del rival, que juega por tiempo y con UCI_LimitStrength, así que «las mismas 160 partidas» no son las mismas partidas. Cualquier diferencia entre modelos más pequeña que eso no es una diferencia entre modelos, y no hay número de partidas que lo arregle. de unos 40 puntos. Es la báscula de baño que te da 82 y 84 al subirte dos veces seguidas: no está rota, pero no te deja afirmar que has adelgazado un kilo. Dos Elo de la escalera se comparan dentro de una misma tirada, no entre tiradas, y por eso las cifras se mueven unas decenas de puntos cuando la tabla única vuelve a medir los modelos juntos (small v1 1355, medium-v4 1535).

// Ejercicio 01Haz la división antes de tu siguiente ejecución

Toma meta.json del corpus con el que entrenaste small y calcula tokens únicos por parámetro y pasadas. Haz lo mismo para tiny (6 000 pasos de 128 × 2 × 200 tokens sobre el mismo corpus). ¿Cuál estaba más lejos de los veinte? ¿Cuál repitió más el material?

// SoluciónVer la solución

small: 240 M / 39 M ≈ 6,2 tokens por parámetro y 1 024 M / 240 M ≈ 4,3 pasadas. tiny: 240 M / 5,3 M ≈ 45 por parámetro y 307 M tokens vistos, 1,3 pasadas. tiny estaba sobrado de datos y corto de red; small, al revés. La palanca de small era material, y la de tiny habría sido capacidad, que es justo lo que small es respecto a tiny.

// Ejercicio 02Predice el Elo desde la pérdida, y comprueba cuánto te fías

Con small v1 (1,5197 → 1359) y medium-v4 (1,3733 → 1504) traza una recta pérdida-Elo y predice el Elo de small v2 (1,4703). Compáralo con el medido, 1407 (1344-1462). ¿Sirve la recta como criterio de aceptación?

// SoluciónVer la solución

La pendiente es (1504 − 1359) / (1,5197 − 1,3733) ≈ 990 Elo por nat, y la predicción para v2, 1359 + 990 × 0,0494 ≈ 1408: clavado. Aun así no sirve como criterio. La recta se ajustó con modelos entrenados sobre la distribución de la validación, y v3, con élite, cae fuera (predice 1401 y midió 1425). Y la escalera tiene un suelo de unos 40 puntos, así que una predicción a diez puntos es más precisa que el instrumento que la contrastaría. Sirve para descartar un experimento en 40 minutos; el Elo se mide siempre.

Qué has aprendido, cómo se mide

La primera pregunta ante un modelo que se queda corto no es cuántos parámetros tiene, sino cuántos tokens distintos ha visto por cada uno, y el hueco entre entrenamiento y validación responde antes de gastar una GPU. Cantidad y composición del corpus son palancas distintas, y solo la segunda mueve un eje que no estaba en los datos. Una escala contra la que mides tiene que haberse medido a sí misma. Y escalar la red es lo correcto justo cuando la división lo permite, y un error un momento antes.

medium-v4: 1504 de Elo (1446-1558) y 99,80 % de legalidad sin máscara, los dos criterios del hito con el intervalo entero por encima, y 37,50 % de puzles.

Al empezar el módulo, el aprendiz solo sabía cómo se escribe una jugada. Ahora ha leído millones de partidas y juega de oído: propone jugadas legales el 99,8 % de las veces y le planta cara a un Stockfish limitado a 1500, sin haber visto nunca un tablero. Es lo que tiene cualquier LLM recién preentrenado: sabe continuar muy bien lo que ha leído. Lo que todavía no sabe es juzgar: mirar una posición entera y decir quién va mejor o dónde estuvo el error. Eso es M3.

La cheatsheet del módulo está justo debajo.

// el recorrido · lo conseguido

  1. M0 El tallerEntorno reproducible(hecho)
  2. M1 Datos y tokensDatos y tokenización(hecho)
  3. M2 El decoderPreentrenar un GPT(hecho)
  4. M3 El encoderEmbeddings y clasificar(por delante)
  5. M4 Fine-tuningSFT y LoRA(por delante)
  6. M5 AlineamientoPreferencias: DPO, GRPO(por delante)
  7. M6 Evaluar y publicarMedir y desplegar(por delante)
  8. FASE 2 El entrenadorAgentes, RAG, MCP

lo que tienes ahora

Tres GPT entrenados desde cero en una GPU, más del 99 % de jugadas legales sin ayuda, un Elo medido con su margen de error y el modelo jugando en tu navegador.

siguiente parada · M3 El encoder

Aprende a mirar una posición entera y juzgarla: quién va mejor y si la última jugada fue un error.

// cheatsheet M2

Once preguntas para llevarte

01Explica la atención en tres frases.
Cada posición proyecta su vector en una consulta (Q), una clave (K) y un valor (V). El producto escalar entre la consulta de una posición y las claves de todas las demás, dividido por la raíz de la dimensión de la cabeza y pasado por softmax, da un reparto de pesos que suma 1. La salida es la media de los valores ponderada por esos pesos: softmax(QKᵀ/√d)·V. La escala 1/√d existe porque el producto escalar de d dimensiones tiene varianza d y sin ella el softmax saturaría y el gradiente se anularía.
02¿Qué es la máscara causal y qué pasa si falta?
Poner a menos infinito, antes del softmax, el peso de toda clave posterior a la consulta, de modo que la matriz de atención queda triangular inferior. Sin ella la posición t puede leer el token t+1, que es justo el que tiene que predecir: la tarea pasa de predecir a copiar, la pérdida se desploma y el top-1 se dispara, pero al generar (donde no hay futuro) el modelo juega al azar. Se detecta porque la legalidad sin máscara se hunde, y se verifica con un test: cambiar un token futuro no debe mover los logits pasados ni un decimal.
03¿Por qué pre-norm y no post-norm?
Pre-norm pone el LayerNorm dentro de la rama, antes de la subcapa (x = x + attn(ln(x))), así que la conexión residual queda libre: la derivada de cada bloque es la identidad más la de la subcapa y el gradiente llega íntegro desde la pérdida hasta el embedding. Post-norm normaliza después de la suma, mete la normalización en el camino residual y hace que una pila profunda solo entrene con warmup largo e inicialización muy cuidada. Es un cambio de dos caracteres que convierte doce capas entrenables con suerte en doce capas entrenables.
04¿Qué hace el warmup y qué pasa sin él?
Sube la tasa de aprendizaje linealmente desde cero durante los primeros pasos (1 000 en rukh-small) antes de empezar el coseno. En los primeros pasos, Adam estima el segundo momento con un puñado de gradientes y su paso normalizado puede mover un parámetro tanto como la tasa entera; sobre una red recién inicializada eso satura la atención y el modelo cae en predecir siempre las jugadas más frecuentes. No suele explotar con un NaN: se queda en una pérdida mediocre que ya no baja, que es peor porque no se nota.
05Temperatura y top-k: ¿en qué se diferencian?
La temperatura divide los logits antes del softmax y reescala toda la distribución: por debajo de 1 la concentra (con 0 es el argmax), por encima la aplana. El top-k no reescala, recorta: deja solo los k tokens de mayor probabilidad y pone el resto a cero. Son complementarios, no alternativas. Con 2 030 jugadas, la cola de mil opciones improbables suma un porcentaje apreciable de disparates; el top-k la elimina y la temperatura decide cuánto arriesga el modelo dentro de lo que queda. Rukh usa temperatura 0,6 y k = 20, y lo paga: en small, jugar a 0,6 en vez de casi a cero cuesta unos 180 puntos de Elo.
06¿Qué mide la legalidad sin máscara, por qué hay dos cifras y por qué no vale medirla con máscara?
Mide el porcentaje de jugadas legales que propone el modelo cuando se le deja emitir el token que quiera, sobre 1 000 posiciones de validación. Se publica dos veces: legality_argmax toma el token más probable (sin temperatura ni top-k) y legality_sampled saca uno como lo saca la demo (temperatura 0,6 y top-k 20), que es siempre la menor de las dos porque muestrear mete cola. El listón de ≥ 99 % para rukh-small es el argmax, porque habla de lo que saben los pesos y no de un ajuste del muestreador; la muestreada es lo que experimenta un jugador y va al lado con su definición. Con la máscara de legalidad puesta el 100 % está garantizado por construcción, así que estarías midiendo a python-chess y no al modelo.
07¿Por qué bf16 y no fp16?
Los dos ocupan 16 bits, pero reparten distinto. fp16 tiene 5 bits de exponente y 10 de mantisa: mucha precisión y poco rango, con el mínimo normal en torno a 6e-5, justo donde viven los gradientes de una red profunda, así que se van a cero y hace falta un GradScaler con escalado dinámico de la pérdida. bf16 tiene 8 bits de exponente (el mismo rango que fp32) y 7 de mantisa: menos precisión por número y nada que se desborde por abajo, así que entrena sin escalar nada. En una GPU moderna es nativo, así que la simplicidad sale gratis.
08¿Qué es un checkpoint y qué tiene que llevar dentro?
Una fotografía del entrenamiento en disco. No basta con los pesos: lleva el paso alcanzado, el estado del optimizador (los momentos de Adam), el estado de los generadores aleatorios, la configuración del modelo y de la tirada y la procedencia (hash del vocabulario, hash del manifiesto de datos y SHA de git). Con eso se puede reanudar exactamente donde se cortó, evaluar el modelo meses después y decir con qué datos exactos se entrenó. Rukh escribe uno cada 1 000 pasos más best.pt por pérdida de validación.
09¿Qué es la perplejidad?
La exponencial de la entropía cruzada media. Se lee como entre cuántas opciones equiprobables duda el modelo: con un vocabulario de 2 030 jugadas, un modelo sin entrenar tiene perplejidad 2 030 y pérdida ln(2030) ≈ 7,6; una pérdida de 3,0 es perplejidad 20, es decir, acierta como si eligiera al azar entre veinte jugadas. Como en una posición típica hay unas treinta legales, esa cifra ya implica bastante aprendizaje. No es una métrica aparte: es la misma pérdida en otra escala.
10¿Qué significa un intervalo de confianza del Elo y por qué importa?
El Elo estimado es el valor que mejor explica los resultados contra rivales de fuerza conocida según la fórmula logística P = 1/(1+10^((rival−modelo)/400)); el intervalo del 95 % dice cuánto podría moverse ese valor si se repitieran las partidas, y se calcula por bootstrap remuestreando los resultados y reajustando mil veces. La suite juega 20 partidas contra cada uno de ocho escalones, 160 en total: a un 50 % de rendimiento la desviación típica sería de unos 27 puntos (±54), y el bootstrap sobre las partidas reales de small da ±68 (1359, IC 1293-1429), porque contra la mayoría de escalones el modelo está lejos del 50 % y cada partida informa menos. Es decir: una mejora de 10, 30 o 50 puntos de Elo medida con una escalera de 160 partidas no es una mejora, es ruido, y presumir de ella es el error clásico de los benchmarks.
11¿Cuándo se escala la red? Tokens únicos por parámetro.
Antes de subir de talla, divide los tokens únicos del corpus (los de meta.json, no los vistos por el bucle: repetir material no lo convierte en material nuevo) entre los parámetros. small v1 iba a 240 M / 39 M = 6,2, con 4,3 pasadas sobre el mismo corpus, y su hueco train/val crecía (+0,060) mientras el top-1 se aplanaba: la firma de material agotado, y triplicar la red (medium v1, mismos datos) solo compró 84 Elo con los intervalos solapados. Devolver el mes de validación al corpus (471 M, 12,1 por parámetro) bajó la pérdida del mismo small de 1,5197 a 1,4703 y batió a medium. medium-v4, con 1 681 M de tokens únicos (14,6 por parámetro, 1,46 pasadas), da 1504 de Elo y 99,80 % de legalidad. Hueco creciendo y métrica plana: faltan datos; hueco estable y métrica subiendo: hay margen en pasos o en capacidad.
Todas las cheatsheets, imprimibles →