Z80-μLM在极限存储约束下实现对话能力,为嵌入式设备、边缘设备等资源受限环境引入AI应用新可能。
Z80-μLM 是一个"对话式 AI",生成短的逐字符序列,采用量化感知训练(QAT)在具有 64KB 内存的 Z80 处理器上运行。
这个项目的根本问题是:我们能有多小的规模同时保持人格特征?能否轻松训练或微调?能否轻松自托管分发?
答案是肯定的!一个 40KB 的 .com 二进制文件(包括推理、权重和聊天风格的 UI)运行在 1976 年的 4MHz 处理器上。
它不会通过图灵测试,但它可能会让你在绿屏前微笑。
有关如何最好地训练您自己的模型的见解,请参阅 TRAINING.md。
包含两个预构建示例:
一个在随意的问答对上训练的对话聊天机器人。用简洁的、有个性的答案回应问候、关于自己的问题和一般性的闲聊。
> hello
HI
> are you a robot
YES
> do you dream
MAYBE
一个 20 个问题游戏,其中模型知道一个秘密主题,并对您的问题回答 YES/NO/MAYBE。猜对即赢。
包括使用 LLM(Ollama 或 Claude API)生成训练数据和平衡类分布的工具。
5 分钟内快速开始:
从 GitHub Releases 下载预构建二进制文件
安装一个仿真器:
CP/M: iz-cpm CHAT.COM
ZX Spectrum: fuse --tape CHAT.TAP, then LOAD "" CODE and RANDOMIZE USR 32768
如需从源代码构建或训练自己的模型,请参阅 TRAINING.md。
三字符哈希编码:输入文本被哈希到 128 个桶中 - 容错拼写、词序不变
2 位权重量化:每个权重为 {-2, -1, 0, +1},每字节打包 4 个
16 位整数推理:所有数学运算使用 Z80 原生的 16 位有符号算术
~40KB .COM 文件:适配 CP/M 的临时程序区(TPA)
自回归生成:逐字符输出文本
无浮点运算:所有运算都是整数数学,使用定点缩放
交互聊天模式:仅运行 CHAT,无需参数
Z80-μLM 运行在多个基于 Z80 的平台上:
CP/M:原始目标平台。使用 buildz80com.py 生成 .COM 文件
ZX Spectrum 48K:通过 buildz80tap.py 提供完整支持。详见 ZX-SPECTRUM.md
使用 buildz80tap.py 生成 .TAP 文件供仿真器或真实硬件使用
使用 ZX Spectrum ROM 例程进行 I/O
针对 48K 系统优化内存
与大多数 ZX Spectrum 仿真器兼容
对于 ZX Spectrum 构建,在示例目录中使用 run-zx.sh,或参阅 ZX Spectrum 指南。
您的输入通过三字符编码被哈希到 128 个桶中 - 一个抽象的"标签云"表示。模型对输入的形状作出响应,而不是精确的词语:
"hello there" → [bucket 23: 64, bucket 87: 32, ...]
"there hello" → [bucket 23: 64, bucket 87: 32, ...] (same!)
"helo ther" → [bucket 23: 32, bucket 87: 32, ...] (similar - typo tolerant)
这对于短输入在语义上很强大,但有一个限制:较长的或依赖顺序的句子会模糊在一起,因为概念竞争相同的桶。"Open the door and turn on the lights" 可能太接近,无法与 "turn on the door and open the lights" 区分。
1-2 个单词的回应可以传达令人惊讶的微妙性:
OK - 确认,中立
WHY? - 质疑你的前提
R U? - 投射存在性疑问
MAYBE - 真实的不确定
AM I? - 反问回去
这不一定是一个限制 - 这是一种不同的交互模式。简洁的回应迫使您从上下文推断含义,或提出探索性的直是/否问题,以查看它是否理解(例如 'are you a bot'、'are you human'、'am i human' 显示逻辑上一致的记忆答案)
短的、多样的输入,输出一致的分类
模糊匹配(拼写错误、重新表述、词序)
通过词汇选择的人格
在受限的 8 位硬件上运行
生成新颖句子的聊天机器人
深度跟踪多轮上下文的东西
理解语法的解析器
接近通用智能的任何东西
它很小,但功能完整。有时候,这正是你所需要的。
输入:128 个查询三字符桶 + 128 个上下文桶
隐层:可配置的深度/宽度,例如 256 → 192 → 128
输出:每个字符集中的字符一个神经元
激活:隐层之间的 ReLU
Z80 是一个 8 位 CPU,但我们使用其 16 位寄存器对(HL、DE、BC)来处理激活和累加器。权重每字节打包 4 个(每个 2 位),并解包为 8 位有符号值以进行乘法累加。
16 位累加器给了我们数值稳定性(不溢出地求和 256 个输入),但模型的表现力仍然受到 2 位权重的限制,不进行 QAT 的天真训练可能会溢出或表现"奇怪"。
推理的核心是紧密的乘法累加循环。权重每字节打包 4 个:
; Unpack 2-bit weight from packed byte
ld a, (PACKED) ; Get packed weights
and 03h ; Mask bottom 2 bits
sub 2 ; Map 0,1,2,3 → -2,-1,0,+1
ld (WEIGHT), a
; Rotate for next weight
ld a, (PACKED)
rrca
rrca
ld (PACKED), a
乘法累加处理 4 个可能的权重值:
MULADD:
or a
jr z, DONE ; weight=0: skip entirely
jp m, NEG ; weight<0: subtract
; weight=+1: add activation
ld hl, (ACC)
add hl, de
ld (ACC), hl
ret
NEG:
cp 0FFh
jr z, NEG1 ; weight=-1
; weight=-2: subtract twice
ld hl, (ACC)
sbc hl, de
sbc hl, de
ld (ACC), hl
ret
NEG1:
; weight=-1: subtract once
ld hl, (ACC)
sbc hl, de
ld (ACC), hl
ret
每层之后,算术右移 2 位以防止溢出:
sra h ; Shift right arithmetic (preserves sign)
rr l
sra h
rr l ; ACC = ACC / 4
这就是整个神经网络:解包权重、乘法累加、移位。每生成一个字符重复约 100K 次。
MIT 或 Apache-2.0,随您所愿。