NightRun:无操作系统启动,直接跑本地大模型
NightRun 是一个无 OS 的 LLM 推理运行时,从 U 盘或 SD 卡直接启动,在裸机 UEFI 环境下加载并…
NightRun 是一个直接在裸机上启动并运行大语言模型的运行时环境。它不依赖传统操作系统(Linux、macOS、Windows),机器固件(UEFI)会直接加载 NightRun,把量化后的模型文件读入内存,并在显示帧缓冲上绘制一个终端界面供用户对话。整个流程离线完成,无网络栈、无浏览器、无宿主机进程。
项目定位与运行方式
NightRun 的核心思路是「机器只做一件事」。它被烧录到 U 盘或 SD 卡中,从该介质启动后:
- 固件直接调用 NightRun,不再加载任何 OS;
- 1.3 至 2.4 GB 的量化模型以流式方式读入内存,并在读取过程中完成校验和验证;
- 存储在读取完成后被「密封」,后续任何磁盘读操作都会被触发硬错误;
- 用户随即看到一个聊天提示符,所有推理在 CPU 上本地完成。
项目以 Rust 实现,关键路径使用 no_std,支持 x86_64 普通 PC(U 盘启动)和 Raspberry Pi 5(SD 卡启动),并可通过 QEMU 进行无硬件测试。
技术实现要点
- 启动与运行时:单一 UEFI 应用,自带 GOP 帧缓冲渲染、位图字体、USB 键盘输入(含光标编辑与回滚)、多核固件 MP 服务用于并行推理,以及串口诊断输出。在 Pi 5 上还会通过 RP1 驱动风扇。
- 模型生命周期:自研 .nrm 容器格式替代通用 GGUF 用于运行时加载,但支持从 GGUF 转换;模型必须完全驻留在内存中才开始对话;CRC-32 校验在文件流式读取过程中完成,不存在独立的「二次校验」阶段。
- 推理内核:手写量化内核,x86_64 平台使用 AV2 + FMA + F16C,Pi 5 平台使用 NEON,并保留标量参考实现。Q8_0、Q4_K、Q6_K 权直接以量化形式参与计算,不先生成去量化副本。Prompt 处理批量化,单次最多 64 个 token,并被证明与逐 token 解码逐位一致;生成循环不进行堆分配。
- 正确性保证:贪心解码结果在每次改动后都与 llama.cpp 进行 token 级比对;分词器与官方 Hugging Face 分词器生成的测试夹具对齐;对话模板对照 apply_chat_template 验证。任何破坏一致性的内核改动都会被直接判定为错误。
已支持的模型与硬件
| 模型 | 量化 | 大小 | 所需内存 | 平台 |
|---|---|---|---|---|
| Llama 3.2 1B Instruct | Q8_0 | 1.3 GB | 4 GB | x86_64、Pi 5 |
| Llama 3.2 3B Instruct | Q4_K_M | 1.9 GB | 6 GB | x86_64、Pi 5 |
| Granite 4.1 3B | Q4_K_M | 2.0 GB | 6 GB | x86_64、Pi 5 |
| Qwen3 4B Instruct 2507 | Q4_K_M | 2.3 GB | 8 GB | x86_64、Pi 5(8 GB) |
针对三种架构,项目分别处理了 Llama 3.2 的 GQA、相邻配对 RoPE、tied embeddings;Qwen3 的 NEOX 风格 RoPE、per-head Q/K RMSNorm、无 BOS token 以及注意力宽度大于隐藏层维度等细节;Granite 4.1 仅支持 dense Transformer,混合 SSM/MoE 变体在转换阶段会被明确拒绝。任何使用 Q8_0、Q4_K、Q6_K 或 F32 张量的 GGUF 都可在保留原始 dtype 的前提下转换,但新架构仍需手动编写引擎与参考验证。
架构选择与意义
NightRun 故意停留在 UEFI Boot Services 阶段,不调用 ExitBootServices(),从而复用固件自带的 USB 键盘、显示与磁盘读取能力,避免自带「半套内核驱动」。项目方明确表示,「no conventional OS」并不意味着「pure bare metal」,措辞上的精确比噱头更重要。
从工程角度看,这是一个相当极客的实验性项目:它证明了大模型推理栈可以被压缩到一个 UEFI 应用之内,并保证与 llama.cpp 的输出一致。对于关注离线推理、嵌入式 AI、可信执行环境的开发者而言,NightRun 提供了一个可复现的起点。但它仍是社区驱动的小项目,并非主流厂商产品,性能、易用性与生态支持仍非常有限,更适合作为研究参考而非生产部署方案。
