一个能启动你 PC 的神经网络。
MBR 是 512 字节的手写汇编。它从接下来的 23 个扇区加载一个 11.5 KB 的 int8 模型,并在 386 的 16 位实模式下运行它。没有操作系统,没有 C 运行时,什么都没有。机器醒来后开始梦见一段 Linux 启动日志:时间戳、PCI 基址寄存器、从未存在过的硬件的 ACPI 事件。
构建过程帖:https://x.com/krlntn/status/2116514628457185757
在 8 个字符的上下文和一个隐藏层下,你大致能得到这样的质量:
[ 2.283888] pci 0000:01:01.4: [1b36:0a35] ryndrde c4128 6422 Vveine
[ 1.953886] pci 0000:01:1f.2: reg 0x10: [mem 0x7e4515e5-0x2d766c27] usbbore: reg
[ 0.206596] Command line: BOOT_IMAGE=/vmlinu -5.5.2-1-generic gcc version 13.3.0, GNU ld ...
[ 1.815765] ACPI: PCI Interrupt Link [LNKA: v/s.xos212
[ 1.883084] NET: Registered protocol family 16
运行它
brew install nasm qemu
python3 -m venv .venv && .venv/bin/pip install numpy
./build.sh
./run.sh
disk.img 是一个正常的启动镜像。用 dd 把它写到 U 盘上,如果你有 BIOS 机器就启动它。它只读取自己的扇区。
组成部分
corpus_gen.py生成 3 MB 的假 dmesg。每个启动会话只有一个内核版本和一块磁盘,因为真实的启动日志会自我重复,而这种重复正是让一个小模型看起来正常的原因。
train.py训练模型(字符嵌入、一个隐藏层、softmax),并用 2 的幂缩放把所有内容量化为 int8,这样启动扇区就能用 imul 和一次 idiv 完成整个前向传播。该脚本还会模拟汇编将要执行的精确整数运算,包括 LCG 采样器,因此 Python 输出和启动扇区输出可以逐字符比对。它们逐字符一致。
boot.asm是整个运行时:用 int 13h 加载权重,用 int 10h 打印,用 cdq/idiv 实现 softclip 激活,用定时器播种的噪声做 argmax 采样。按任意键重启机器。
record.py通过 monitor socket 从无头 QEMU 录制演示 gif。不涉及窗口。
启动扇区只有代码。字符串、权重和词表都放在数据扇区里,这是把推理和 BIOS 相关代码塞进 510 字节的唯一办法。
先例
启动扇区这一流派古老而辉煌。Oscar Toledo 把国际象棋、一整个操作系统甚至一个BASIC 解释器都塞了进去,其他人还做了C 编译器,全都在 512 字节之内。他那本关于启动扇区游戏的书值得一读。
最接近的是sectorllm,它用大约 1.2 KB 的实模式汇编启动一个真正的 llama2 transformer(5 层、注意力机制,一应俱全),运行 Karpathy 的 stories260K 模型。sectorlisp-nn在启动时于一个 Lisp 解释器上运行一个用 TensorFlow 训练的网络,还有一些 UEFI 应用能在现代硬件上直接启动到 llama 级别的模型。
bootgpt 走了另一个极端:整个引擎塞进 510 字节的 MBR 本身,权重和字符串存放在后续扇区中,而模型并不是一个通用的故事讲述者,而是一个微小的字符级网络,只针对一件事训练:幻觉出它所唤醒机器的启动日志。
