- Z80-μLM es un modelo ultracompacto de inteligencia artificial conversacional que funciona sobre un procesador Z80 de 1976 (4 MHz, 64 KB de RAM)
- Aplica entrenamiento consciente de cuantización (QAT) para realizar generación de texto a nivel de caracteres usando solo pesos de 2 bits y operaciones enteras de 16 bits
- Todo el motor de inferencia, los pesos y la UI de chat están incluidos dentro de un archivo ejecutable .COM de unos 40 KB
- Usa codificación hash de trigramas para convertir la entrada en 128 buckets, generando respuestas robustas ante errores tipográficos o cambios en el orden de las palabras
- No puede comprender contexto complejo, pero destaca como un modelo de IA experimental que funciona incluso en un entorno limitado de 8 bits
Resumen del proyecto
- Z80-μLM es un modelo de lenguaje ultrapequeño capaz de ejecutarse en entornos de retrocomputación
- Funciona en una CPU Z80 con 64 KB de RAM y genera respuestas conversacionales a nivel de caracteres
- El tamaño total, incluyendo modelo, código de inferencia y UI, es de unos 40 KB
- La pregunta central del proyecto fue: “¿qué tan pequeño puede hacerse sin perder personalidad?”, y también permite despliegue self-hosted
- No alcanza el nivel de una prueba de Turing, pero está pensado para entretener al usuario con conversaciones simples
Incluye dos ejemplos
-
tinychat
- Un chatbot simple entrenado con datos de preguntas y respuestas cotidianas
- Ofrece respuestas cortas y con personalidad para saludos, presentaciones y conversación general
- Ej.: “hello” → “HI”, “are you a robot” → “YES”, “do you dream” → “MAYBE”
-
guess
- Un modelo en formato de juego de 20 Questions
- Conoce un tema secreto y responde con YES/NO/MAYBE
- Si el usuario acierta la respuesta, muestra “WIN”
- Los datos de entrenamiento pueden generarse usando Ollama o la API de Claude, e incluye una herramienta de balanceo de distribución de clases
Funciones principales
- Codificación hash de trigramas: hace hash del texto de entrada en 128 buckets, tolerando errores tipográficos y siendo independiente del orden de las palabras
- Cuantización de pesos de 2 bits: cada peso toma un valor de {-2, -1, 0, +1}, con 4 almacenados por byte
- Inferencia entera de 16 bits: usa la aritmética de 16 bits del Z80
- Archivo .COM de ~40 KB: adecuado para el Transient Program Area (TPA) de CP/M
- Generación autorregresiva: genera la salida carácter por carácter
- Sin operaciones de punto flotante, usa escalado de punto fijo
- Soporta modo interactivo: se ejecuta con el comando
CHAT
Forma de interacción
- El modelo no “entiende” la entrada, pero reacciona según la forma (shape) de la entrada
- La frase de entrada se transforma en 128 buckets de trigramas, conservando similitud semántica
- Por ejemplo, “hello there” y “there hello” se procesan con la misma estructura de buckets
- Le cuesta distinguir oraciones largas o dependientes del orden
-
El significado de las respuestas cortas
- Incluso respuestas de 1 o 2 palabras pueden expresar matices inesperados
OK: aceptación neutral
WHY?: cuestiona la pregunta
R U?: duda sobre la existencia
MAYBE: incertidumbre
AM I?: pregunta reflexiva
- Estas respuestas breves invitan al usuario a inferir el contexto
Fortalezas y limitaciones
- Fortalezas
- Respuestas consistentes de tipo clasificatorio para entradas cortas
- Resiste bien errores tipográficos, reformulación y cambios en el orden de palabras
- Expresa personalidad a través de la elección de vocabulario
- Puede ejecutarse incluso en hardware limitado de 8 bits
- Limitaciones
- No puede generar oraciones nuevas
- No puede seguir contexto de múltiples turnos
- No comprende la gramática
- No alcanza un nivel de inteligencia general
Arquitectura
- Capa de entrada: 128 buckets de consulta + 128 buckets de contexto
- Capa oculta: configuración de ejemplo 256 → 192 → 128
- Capa de salida: 1 neurona por cada carácter del conjunto de caracteres
- Función de activación: ReLU
-
Restricciones de cuantización
- El Z80 es una CPU de 8 bits, pero realiza acumulación y activación usando pares de registros de 16 bits (HL, DE, BC)
- Los pesos se almacenan de 4 en 1 byte (en unidades de 2 bits)
- El acumulador de 16 bits evita overflow al sumar 256 entradas
- Debido a los pesos de 2 bits, la capacidad de expresión es limitada y sin QAT pueden aparecer resultados de entrenamiento inestables
-
Bucle interno del Z80
- El núcleo de la inferencia es un bucle de multiplicar-acumular (MAC)
- Desempaqueta los pesos y suma o resta al acumulador (ACC) según valores de -2, -1, 0 o +1
- Después de calcular cada capa, realiza un desplazamiento a la derecha de 2 bits para evitar overflow
- El proceso completo de inferencia repite unas 100 mil operaciones por cada carácter
Licencia
- Se puede elegir entre MIT o Apache-2.0
2 comentarios
Comentarios de Hacker News
captura de pantalla
No esperaba que alguien publicara algo que encajara tan perfectamente. Es una coincidencia realmente extraña, pero increíble
Yo hice un emulador de CP/M e IDE basado en navegador: lockboot.github.io/desktop
De hecho iba a publicar eso, pero me fui por una madriguera de conejo mientras buscaba una “demo genial”
Yo escribí un MLP en Fortran IV para una máquina de tarjetas perforadas de los años 60 (proyecto Xortran)
Aunque no tenía mecanismo de atención y el contexto estaba limitado a los trigramas de la última oración, la interacción era bastante buena
Si algo así hubiera sido posible incluso en hardware de los 60, la ciencia ficción y la ciencia de esa época habrían sido totalmente distintas
En modo conspiranoico, una de las razones por las que las empresas de IA están comprando RAM a gran escala parece ser para que la gente no se dé cuenta de que esto se parece mucho a la revolución de las computadoras personales
Yo uso una máquina con 1 TB de RAM y, con agentes personalizados, rinde mejor que modelos comerciales. Es personal, segura y no está monetizada
Y la siguiente pregunta es si se podría hacer un modelo pequeño que aprenda mientras consulta datos externos
Si se pudiera crear un modelo diminuto que aprenda en tiempo real, eso sería básicamente tener un asistente personal completamente local
Un modelo muy pequeño, con casi nada de conocimiento enciclopédico, pero con capacidades básicas de razonamiento y uso de herramientas
tuit de referencia
Si hubiera sido así, siento que el mundo actual sería completamente diferente
Es un caso de estudio experimental de “qué habría pasado si los RNN hubieran sido adecuados para los LLM”
Es absurdamente rápido en CPU
Eso sí, parece difícil que pueda aprovechar bien una ventana de contexto grande
me pregunto si, al acceder a los pesos del modelo, sería posible inferir esa clave al revés, o si solo se podría acceder a ella por medio de preguntas
Trata sobre cómo insertar puertas traseras indetectables que por fuera parecen funcionar normalmente
En general, esto entra dentro del problema de la “interpretabilidad”
Tenía una arquitectura de palabras de 32K×36 bits y no soportaba operaciones a nivel de byte
Si se intentara mover tal cual un ejecutable de Z80 de 40 KB, habría sido bastante justo
Pero como la mayoría son pesos de 2 bits, quizá sí habría sido posible
En hardware posterior, especialmente el Z80 de 1976, habría habido mucho más margen
Pienso ampliarla en la siguiente versión, así que definitivamente quiero intentarlo
En esa época solo funcionaban con coincidencias exactas de palabras clave, así que se sentía raro
Probablemente el último juego de ese estilo fue Wizardry 8 en 2001
Me parece realmente increíble poder ejecutar tecnología de punta en hardware del pasado.
Cuando aparezca una AGI en el futuro, ¿será posible hacerla correr si reunimos toda la potencia de cómputo que existe ahora mismo en la Tierra?