Bitácora · Kiko Cisneros
coco · motor de inferencia nº 01

Cada modelo de IA nuevo rompe las herramientas. Hice un motor al que no le pasa.

Cada vez que sale una arquitectura nueva, los programas que ejecutan modelos de IA hay que reescribirlos casi desde cero. Me cansé de eso y construí un motor con una única pieza intercambiable. Te lo enseño por dentro.


Un modelo de IA es, por dentro, una torre de capas idénticas apiladas. Cada capa hace dos cosas: mezcla información entre las palabras (la parte famosa, la "atención") y luego piensa sobre cada palabra por separado. La torre entera se repite decenas de veces y de ahí sale la respuesta.

El problema práctico es este: cada laboratorio publica su modelo con una forma ligeramente distinta de hacer esa mezcla. Uno usa atención clásica. Otro la comprime para ahorrar memoria. El de este mes se inventa una "atención lineal" que no vuelve a leer el pasado. Y los programas que ejecutan estos modelos —los motores de inferencia— suelen tener un fichero enorme y distinto por cada arquitectura. Sale un modelo nuevo, toca copiar-pegar-y-rezar.

Motor tradicional 1 fichero nuevo por modelo llama_model.c qwen_model.c deepseek.c mistral.c … modelo_nuevo.c ⟳ cada uno reimplementa TODA la torre otra vez coco 1 fila + 1 línea por modelo Registro de arquitecturas "Qwen3" → Qwen3 · "DeepSeek" → MLA … Un solo decoder genérico normalizar ◆ mixer (pieza intercambiable) pensar (FFN)
Izquierda: el patrón habitual — un fichero gigante por arquitectura. Derecha: coco reduce cada modelo a una fila en un registro y una sola pieza intercambiable dentro de un decoder genérico.

La idea: una sola costura

La observación clave es que las arquitecturas modernas solo se diferencian en cómo mezclan información entre palabras. Todo lo demás —normalizar, la parte de "pensar", apilar capas— es idéntico. Así que en coco todo eso es código genérico escrito una vez, y la única parte que cambia es un hueco con forma de enchufe: el SequenceMixer.

Un SequenceMixer es un contrato: "dame las palabras, devuélveme las palabras mezcladas". Cualquier forma de atención que respete ese contrato encaja en el hueco. Hoy tengo tres piezas que encajan:

Una capa normalizar ◆ hueco: SequenceMixer Box<dyn SequenceMixer> pensar (FFN) atención completa (GQA) atención latente (MLA) atención lineal (GatedDeltaNet) añadir una arquitectura = 1 fila + 1 match
Tres piezas encajan hoy en el mismo hueco: la atención clásica (Qwen), la atención comprimida de DeepSeek (MLA) y una atención lineal recurrente (GatedDeltaNet). El resto de la torre no se entera.

Míralo funcionando

Aquí tienes el motor generando una respuesta. A la derecha, la telemetría: cada token que sale atraviesa las 24 capas del modelo, y cada capa consulta a su mixer. Fíjate cómo las capas de atención completa tienen que releer todo el contexto (sube la barra de "relee memoria"), mientras que las de atención lineal guardan un estado fijo y apenas gastan. Dale al play:

↑ Ilustración del diseño con una torre híbrida 3:1 (estilo Qwen3.5). Hoy corren de verdad Qwen (todo atención completa) y DeepSeek (todo MLA); la pieza GatedDeltaNet está validada y entrando.

lo que funciona hoy Cuatro arquitecturas completas por el mismo decoder — Qwen2, Qwen3, Qwen3-MoE y DeepSeek V2/V3 — con tres mixers intercambiables. Compila limpio y pasa 12/12 de sus tests. Añadir la quinta no es reescribir el motor: es rellenar el hueco.

Por qué me importa

Porque el ritmo de arquitecturas nuevas no va a bajar — va a subir. Un motor que trata cada modelo como un caso especial se pasa la vida persiguiendo al último paper. Un motor con una sola costura convierte "soportar el modelo de moda" en un trabajo de tarde, no de mes.

Y hay una honestidad incómoda en todo esto que me gusta enseñar: la quinta arquitectura (una híbrida muy reciente) coco la reconoce pero todavía se niega a ejecutarla, con un mensaje de error que te dice exactamente qué falta por enchufar. Prefiero un "todavía no" ruidoso y sincero a un camino verde falso. Pero esa es otra entrada.


Siguiente en la bitácora: cómo traduje una "atención" nueva a Rust sin fallar ni un decimal — la disciplina de validar contra la verdad antes de cablear nada.