26年前老年机跑Llama2,每秒39个token:你的AI PC,也可以是Windows 98

机器之心报道
编辑:陈陈、蛋酱

让 Llama 2 在 Windows 98 奔腾 2(Pentium II)机器上运行,不但成功了,输出达到 39.31 tok / 秒。

这台 PC 可能比你的年龄还大,要知道它已经是 26 年前的硬件了,配备英特尔奔腾 2 CPU 和 128MB 的内存。

该项目是一个名为 EXO Labs 组织的一次大胆尝试,其证明了如果 Llama 模型能在 26 年前的硬件上跑通,那么它可以在任何地方运行。

图片

为了证明这是真实发生的,EXO Labs 还放出了一段视频。视频显示一台古老的 350 MHz Elonex 奔腾 2 电脑启动 Windows 98 后,然后启动了基于 Andrej Karpathy 开发的 Llama2.c 定制的纯 C 推理引擎,并要求 LLM 生成一个关于 Sleepy Joe 的故事。

令人惊讶的是,它成功了,故事的生成速度非常快。


不过,上述令人大开眼界的壮举远不是 EXO Labs 的最终目标。这个有点神秘的组织于 9 月正式成立,其使命是「让人工智能普及大众」。该组织由牛津大学的研究人员和工程师组成。简而言之,EXO 认为少数几家大公司控制人工智能对文化、真理和我们社会的其他基本方面来说是一件非常糟糕的事情。因此,EXO 希望建立开放的基础设施来训练前沿模型,并使任何人都可以在任何地方运行它们。通过这种方式,普通人几乎可以在任何设备上训练和运行人工智能模型 —— 而这个疯狂的 Windows 98 运行大模型只是一个演示,展示了在(严重)有限的资源下我们可以做些什么。

正如读者所料,EXO 轻而易举地从 eBay 上买到了一台旧的 Windows 98 PC 作为该项目的基础,硬件有了,但仍有许多障碍需要克服。EXO 解释说,将数据导入旧硬盘就是一项巨大的挑战,因此他们只能使用老式 FTP(good old FTP)通过这台古老机器的以太网端口进行文件传输。

然而,更大的挑战是让 Windows 98 编译现代代码。好在 EXO 找到了 Andrej Karpathy 的 llama2.c 项目。借助此资源和旧的 Borland C++ 5.02 IDE 和编译器(加上一些小调整),可以将代码制作成与 Windows 98 兼容的可执行文件并运行。


代码已经开源。

图片

项目地址:https://github.com/exo-explore/llama98.c

为了让大家更好的了解这项研究,EXO Labs 还专门写了一篇博客,通过这篇博客,我们看看具体实现过程。

硬件设置

首先,需要机器本身。我们在 eBay 上以 118.88 英镑的价格找到了一台 Windows 98 奔腾 II 电脑。

图片
我在 eBay 上发现了这个泛黄的主机,一台 Windows 98 奔腾 II,128MB 内存,售价 118.88 英镑。

让它与现代外围设备一起工作是第一个挑战,我们的 USB 键盘或鼠标都无法工作。解决办法是重新使用传说中的 PS/2 接口,但有一个问题要注意:鼠标必须放在端口 1,键盘放在端口 2。反向配置则行不通。

图片
背板展示了 PS/2 端口、串行端口,以及至关重要的、后来被证明是必不可少的以太网端口。

文件传输:回归 FTP

下一个挑战是将文件传输到机器上。我们需要传输模型权重、tokenizer 配置和推理代码。现代解决方案都失败了:

  • 系统无法识别 RW 磁盘
  • 我们的 4TB USB 驱动器对于 FAT32 格式来说太大了

最后成功的是古老的 FTP。事实证明,FTP 多年来一直保持向后兼容。我们在 M4 MacBook Pro 上运行 FileZilla FTP 服务器,通过以太网(使用 USB-C 转以太网适配器)连接到 Windows 98 机器,设置静态 IP,然后就可以直接从命令行传输文件了。

图片
使用手动 IP(192.168.1.1)配置 MacBook 的 USB-C 以太网适配器,以便与 Windows 98 通信。

设置网络配置后,我们需要验证连接。一个简单的 ping 测试确认了机器之间可以相互通信:

图片
成功!Windows 98 机器与 MacBook 的连接延迟小于 1 毫秒。

建立网络连接后,我们终于可以使用 FTP 传输文件了。一个关键问题是:可执行文件无法运行,直到我们发现它们需要以二进制模式传输。解决方法很简单,只需在 FTP CLI 中输入「二进制」即可:

图片
通过 FTP 以二进制模式传输 stories260K.bin 模型文件。

编译挑战

在 Windows 98 下编译现代代码非常棘手。我们首先尝试了 mingw,据说它可以为 Windows 98/Pentium II 编译现代 C++。结果却走入了死胡同 — 可能是由于 CMOV 指令不支持奔腾 Pro 之前的版本。

于是,我们采用了老式的方法:Borland C++ 5.02 是一款有 26 年历史的集成开发环境和编译器,可直接在 Windows 98 上运行。唯一的问题是它支持的是非常老的 C/C++ 版本。现代 C++ 是不可能的,但几十年来 C 语言的变化却少得惊人。C 语言最大的变化是在 1999 年(C99),所以很遗憾我们错过了。旧版 C 的主要限制是不能「随处声明」变量,所有变量都必须在函数的开始部分声明。

图片
Borland C++ 5.02,一款有 26 年历史的集成开发环境,仍然能够完成任务。

Karpathy 救场

这让我们想到了 Andrej Karpathy 的 llama2.c:700 行纯 C 语言,可以在具有 Llama 2 架构的模型上运行推理。非常完美,但为了在奔腾 II 上运行 Win98,它仍然需要一些调整:

  • 用「DLONGWORD」代替「long long」(使用类型定义);
  • 将所有变量声明移至函数起始处;
  • 简化了从磁盘到内存的加载(内存映射会导致 SEGFAULTS);
  • 通过用 GetTickCount () 代替 clock_gettime 修复了时间戳问题。

本项目的代码可在 GitHub 上的 llama98.c 获取。

图片
成功!在 Windows 98 上运行的 260K 参数 Llama 模型生成了一个关于 Sleepy Joe 的故事。

结果

终于让它工作了!以下是我们实现的结果,完全在 Pentium II CPU 上运行,无需 GPU:

图片
Llama 3.2 1B 的结果是基于运行适合内存的模型碎片的基准测试和磁盘读取基准测试得出的。Llama98.c 正在通过卸载功能进行扩展,以运行更大的模型来进行实际测试。

虽然没有达到 ChatGPT 的速度,但让任何现代人工智能模型在二十多年前的 CPU 硬件上运行,都是朝着我们的使命迈出的重要一步。在此特别感谢 Chris Wellons 关于如何在 Windows 98 上运行 C++ 的精彩博文。

未来:BitNet 及其他

BitNet 是前沿模型真正可以在任何硬件上运行的一个前景广阔的方向。BitNet 是一种使用三元权重的 transformer 架构,每个权重只能是 0、-1 或 1,每个权重只需要 1.58 比特(log₂(3) ≈ 1.58)。这一简单的变化具有重大意义:

图片
Matmul 变成了具有三元权重的加法(Ma et al. 2024)。

由于乘以 0 是省略,乘以 1 是加法,而乘以 - 1 是减法,因此所有常见的矩阵乘法都变成了加法和减法。

这样做的好处是显而易见的:

  • 一个 7B 参数的 BitNet 模型只需要 1.38GB 的存储空间,小到足以安装在大多数硬件上,甚至是几十年前的 PC(我们使用的 PC 只有 1.6GB 的硬盘驱动器);
  • CPU 优先:微软的 BitCPP 在 M2 Ultra CPU 上每秒可生成 52 个 token,在英特尔 i7 上每秒可生成 18 个 token;
  • 更令人印象深刻的是:100B 参数的 BitNet 可在单个 CPU 上以人类读取速度(5-7 个 token / 秒)运行;
  • 节能:比全精度模型节能 50% 以上。

在 EXO,我们研究三元模型已经有一段时间了。2024 年 4 月,我们发布了在苹果芯片上高效运行的 MLX-BitNet。在 2024 年的 ICML 会议上,我们首次展示了用于蛋白质语言建模的 BitNet 实现,并正在开发用于蛋白质建模的更大 BitNet 模型。

虽然目前还没有大型开源 BitNet 模型,但我们相信三元模型是人工智能的未来。我们计划在 2025 年训练一个三元模型。

然后呢?

我们希望看到更多的努力集中于在旧硬件上运行人工智能模型。从优化内存使用到探索能在有限硬件上高效运行的新架构,都有大量工程工作要做。

如果你对在旧硬件(如旧 Mac、Gameboy、摩托罗拉手机,甚至旧 Raspberry Pi)上运行模型感兴趣,请查看代码并加入我们的 Discord #retro 频道。人工智能的未来不一定要被锁在庞大的数据中心里,它可以在你已有的硬件上运行。

参考链接:https://blog.exolabs.net/day-4/