- Z80-μLM é um modelo ultracompacto de inteligência artificial conversacional que roda em um processador Z80 de 1976 (4 MHz, 64 KB de RAM)
- Aplica treinamento com reconhecimento de quantização (QAT) para realizar geração de texto em nível de caractere usando apenas pesos de 2 bits e operações inteiras de 16 bits
- Cerca de 40 KB em um executável .COM incluem motor de inferência, pesos e UI de chat
- Com codificação hash de trigramas, converte a entrada em 128 buckets para gerar respostas robustas a erros de digitação e à ordem das palavras
- Não consegue entender contextos complexos, mas chama atenção como um modelo experimental de IA que funciona mesmo em um ambiente limitado de 8 bits
Visão geral do projeto
- O Z80-μLM é um modelo de linguagem ultracompacto capaz de rodar em ambientes de retrocomputação
- Funciona em uma CPU Z80 com 64 KB de RAM e gera respostas conversacionais em nível de caractere
- O tamanho total, incluindo modelo, código de inferência e UI, é de cerca de 40 KB
- A pergunta central do projeto era: “até que ponto dá para reduzir mantendo personalidade?”, e ele também pode ser distribuído em self-hosting
- Não chega ao nível de um teste de Turing, mas oferece conversas simples que podem divertir o usuário
Inclui dois exemplos
-
tinychat
- Um chatbot simples treinado com dados cotidianos de perguntas e respostas
- Fornece respostas curtas e com personalidade para saudações, apresentação pessoal e conversas gerais
- Ex.: “hello” → “HI”, “are you a robot” → “YES”, “do you dream” → “MAYBE”
-
guess
- Um modelo no formato do jogo 20 Questions
- Ele conhece um tema secreto e responde com YES/NO/MAYBE
- Quando o usuário acerta a resposta, exibe “WIN”
- Os dados de treinamento podem ser gerados com Ollama ou a API do Claude, e inclui uma ferramenta de balanceamento da distribuição de classes
Principais recursos
- Codificação hash de trigramas: aplica hash ao texto de entrada em 128 buckets, tolerando erros de digitação e sendo independente da ordem das palavras
- Quantização de pesos em 2 bits: cada peso assume {-2, -1, 0, +1}, com 4 pesos armazenados por byte
- Inferência inteira de 16 bits: usa as operações aritméticas de 16 bits do Z80
- Arquivo .COM de ~40 KB: adequado para a Transient Program Area (TPA) do CP/M
- Geração autorregressiva: gera a saída caractere por caractere
- Sem operações de ponto flutuante, usando escalonamento de ponto fixo
- Suporte a modo interativo: execução com o comando
CHAT
Como funciona a interação
- O modelo não “entende” a entrada, mas reage com base na forma (shape) da entrada
- A frase de entrada é convertida em 128 buckets de trigramas, preservando similaridade semântica
- Ex.: “hello there” e “there hello” são processados com a mesma estrutura de buckets
- Frases longas ou dependentes de ordem são difíceis de distinguir
-
O significado de respostas curtas
- Mesmo respostas de 1 ou 2 palavras podem expressar nuances inesperadas
OK: aceitação neutra
WHY?: contestação da pergunta
R U?: dúvida sobre existência
MAYBE: incerteza
AM I?: pergunta reflexiva
- Essas respostas curtas induzem o usuário a inferir o contexto
Pontos fortes e limitações
- Pontos fortes
- Respostas consistentes do tipo classificação para entradas curtas
- Robusto a erros de digitação, reformulação e mudanças na ordem das palavras
- Expressa personalidade por meio da escolha de vocabulário
- Pode rodar até em hardware limitado de 8 bits
- Limitações
- Não consegue gerar frases novas
- Não consegue rastrear contexto em múltiplos turnos
- Não entende gramática
- Não atinge o nível de inteligência geral
Arquitetura
- Camada de entrada: 128 buckets de consulta + 128 buckets de contexto
- Camada oculta: exemplo de configuração 256 → 192 → 128
- Camada de saída: 1 neurônio para cada caractere do conjunto de caracteres
- Função de ativação: ReLU
-
Restrições de quantização
- O Z80 é uma CPU de 8 bits, mas realiza acumulação e ativação usando pares de registradores de 16 bits (HL, DE, BC)
- Os pesos são armazenados 4 por byte (em unidades de 2 bits)
- O acumulador de 16 bits evita overflow ao somar 256 entradas
- Como os pesos têm 2 bits, a capacidade de expressão é limitada, e sem QAT o treinamento pode gerar resultados instáveis
-
Loop interno do Z80
- O núcleo da inferência é o loop MAC (multiply-accumulate)
- Ele desempacota os pesos e soma ou subtrai do acumulador (ACC) conforme os valores -2, -1, 0, +1
- Após o cálculo de cada camada, aplica um deslocamento de 2 bits à direita para evitar overflow
- Todo o processo de inferência repete cerca de 100 mil operações por caractere
Licença
- É possível escolher entre MIT ou Apache-2.0
2 comentários
Comentários do Hacker News
captura de tela
Não imaginava que alguém fosse postar algo que encaixasse tão perfeitamente nisso. É uma coincidência realmente estranha, mas incrível
Eu fiz um emulador de CP/M e uma IDE baseados no navegador: lockboot.github.io/desktop
Eu ia postar isso, mas acabei caindo numa toca de coelho enquanto procurava uma “demo legal”
Eu tinha escrito um MLP em Fortran IV para uma máquina de cartões perfurados dos anos 60 (projeto Xortran)
Mesmo sem mecanismo de atenção e com o contexto limitado ao trigrama da última frase, a interação era bem razoável
Se algo assim fosse possível em hardware dos anos 60, a ficção científica e a ciência daquela época teriam sido completamente diferentes
Falando em tom meio conspiratório, parece que um dos motivos de as empresas de IA comprarem RAM em massa é impedir que as pessoas percebam que o momento atual se parece com a revolução dos computadores domésticos
Eu uso uma máquina com 1 TB de RAM, e com agentes personalizados o desempenho é melhor do que o de modelos comerciais. É pessoal, seguro e não é monetizado
E a pergunta seguinte é se seria possível criar um modelo pequeno que aprendesse consultando dados externos
Se der para fazer um modelo minúsculo que aprenda em tempo real, isso na prática seria um assistente pessoal totalmente local
Um modelo muito pequeno, com quase nenhum conhecimento enciclopédico, mas com capacidade básica de raciocínio e uso de ferramentas
tweet de referência
Acho que o mundo de hoje seria completamente diferente
É um estudo de caso experimental sobre “e se RNNs fossem adequadas para LLMs?”
É absurdamente rápido em CPU
Mas talvez seja difícil aproveitar bem uma janela de contexto grande
fico curioso se, tendo acesso aos pesos do modelo, seria possível inferir esse segredo ao contrário, ou se ele só seria acessível por meio de perguntas
Ele trata de como inserir backdoors indetectáveis que, na superfície, parecem funcionar normalmente
Em geral, isso entra no problema de interpretabilidade
Tinha uma arquitetura de palavras de 32K×36 bits e não suportava operações de byte
Levar um executável de Z80 de 40 KB diretamente para lá teria sido bem apertado
Mas, se a maior parte fossem pesos de 2 bits, talvez fosse possível
Em hardware posterior, especialmente no Z80 de 1976, isso teria sido bem mais tranquilo
Pretendo expandir na próxima versão, então com certeza quero testar isso
Na época, eles só funcionavam com correspondência exata de palavras-chave, o que era estranho
Acho que o último jogo desse tipo foi Wizardry 8, em 2001
Acho realmente impressionante conseguir rodar tecnologia de ponta em hardware do passado.
Quando a AGI surgir no futuro, será que daria para rodá-la se juntássemos todo o poder computacional existente na Terra hoje?