26年前老年機(jī)跑Llama2,每秒39個(gè)token:你的AI PC,也可以是Windows 98
讓 Llama 2 在 Windows 98 奔騰 2(Pentium II)機(jī)器上運(yùn)行,不但成功了,輸出達(dá)到 39.31 tok / 秒。
這臺(tái) PC 可能比你的年齡還大,要知道它已經(jīng)是 26 年前的硬件了,配備英特爾奔騰 2 CPU 和 128MB 的內(nèi)存。
該項(xiàng)目是一個(gè)名為 EXO Labs 組織的一次大膽嘗試,其證明了如果 Llama 模型能在 26 年前的硬件上跑通,那么它可以在任何地方運(yùn)行。
為了證明這是真實(shí)發(fā)生的,EXO Labs 還放出了一段視頻。視頻顯示一臺(tái)古老的 350 MHz Elonex 奔騰 2 電腦啟動(dòng) Windows 98 后,然后啟動(dòng)了基于 Andrej Karpathy 開(kāi)發(fā)的 Llama2.c 定制的純 C 推理引擎,并要求 LLM 生成一個(gè)關(guān)于 Sleepy Joe 的故事。
令人驚訝的是,它成功了,故事的生成速度非???。
不過(guò),上述令人大開(kāi)眼界的壯舉遠(yuǎn)不是 EXO Labs 的最終目標(biāo)。這個(gè)有點(diǎn)神秘的組織于 9 月正式成立,其使命是「讓人工智能普及大眾」。該組織由牛津大學(xué)的研究人員和工程師組成。簡(jiǎn)而言之,EXO 認(rèn)為少數(shù)幾家大公司控制人工智能對(duì)文化、真理和我們社會(huì)的其他基本方面來(lái)說(shuō)是一件非常糟糕的事情。因此,EXO 希望建立開(kāi)放的基礎(chǔ)設(shè)施來(lái)訓(xùn)練前沿模型,并使任何人都可以在任何地方運(yùn)行它們。通過(guò)這種方式,普通人幾乎可以在任何設(shè)備上訓(xùn)練和運(yùn)行人工智能模型 —— 而這個(gè)瘋狂的 Windows 98 運(yùn)行大模型只是一個(gè)演示,展示了在(嚴(yán)重)有限的資源下我們可以做些什么。
正如讀者所料,EXO 輕而易舉地從 eBay 上買(mǎi)到了一臺(tái)舊的 Windows 98 PC 作為該項(xiàng)目的基礎(chǔ),硬件有了,但仍有許多障礙需要克服。EXO 解釋說(shuō),將數(shù)據(jù)導(dǎo)入舊硬盤(pán)就是一項(xiàng)巨大的挑戰(zhàn),因此他們只能使用老式 FTP(good old FTP)通過(guò)這臺(tái)古老機(jī)器的以太網(wǎng)端口進(jìn)行文件傳輸。
然而,更大的挑戰(zhàn)是讓 Windows 98 編譯現(xiàn)代代碼。好在 EXO 找到了 Andrej Karpathy 的 llama2.c 項(xiàng)目。借助此資源和舊的 Borland C++ 5.02 IDE 和編譯器(加上一些小調(diào)整),可以將代碼制作成與 Windows 98 兼容的可執(zhí)行文件并運(yùn)行。
代碼已經(jīng)開(kāi)源。
項(xiàng)目地址:https://github.com/exo-explore/llama98.c
為了讓大家更好的了解這項(xiàng)研究,EXO Labs 還專(zhuān)門(mén)寫(xiě)了一篇博客,通過(guò)這篇博客,我們看看具體實(shí)現(xiàn)過(guò)程。
硬件設(shè)置
首先,需要機(jī)器本身。我們?cè)?eBay 上以 118.88 英鎊的價(jià)格找到了一臺(tái) Windows 98 奔騰 II 電腦。
我在 eBay 上發(fā)現(xiàn)了這個(gè)泛黃的主機(jī),一臺(tái) Windows 98 奔騰 II,128MB 內(nèi)存,售價(jià) 118.88 英鎊。
讓它與現(xiàn)代外圍設(shè)備一起工作是第一個(gè)挑戰(zhàn),我們的 USB 鍵盤(pán)或鼠標(biāo)都無(wú)法工作。解決辦法是重新使用傳說(shuō)中的 PS/2 接口,但有一個(gè)問(wèn)題要注意:鼠標(biāo)必須放在端口 1,鍵盤(pán)放在端口 2。反向配置則行不通。
背板展示了 PS/2 端口、串行端口,以及至關(guān)重要的、后來(lái)被證明是必不可少的以太網(wǎng)端口。
文件傳輸:回歸 FTP
下一個(gè)挑戰(zhàn)是將文件傳輸?shù)綑C(jī)器上。我們需要傳輸模型權(quán)重、tokenizer 配置和推理代碼。現(xiàn)代解決方案都失敗了:
- 系統(tǒng)無(wú)法識(shí)別 RW 磁盤(pán)
- 我們的 4TB USB 驅(qū)動(dòng)器對(duì)于 FAT32 格式來(lái)說(shuō)太大了
最后成功的是古老的 FTP。事實(shí)證明,F(xiàn)TP 多年來(lái)一直保持向后兼容。我們?cè)?M4 MacBook Pro 上運(yùn)行 FileZilla FTP 服務(wù)器,通過(guò)以太網(wǎng)(使用 USB-C 轉(zhuǎn)以太網(wǎng)適配器)連接到 Windows 98 機(jī)器,設(shè)置靜態(tài) IP,然后就可以直接從命令行傳輸文件了。
使用手動(dòng) IP(192.168.1.1)配置 MacBook 的 USB-C 以太網(wǎng)適配器,以便與 Windows 98 通信。
設(shè)置網(wǎng)絡(luò)配置后,我們需要驗(yàn)證連接。一個(gè)簡(jiǎn)單的 ping 測(cè)試確認(rèn)了機(jī)器之間可以相互通信:
成功!Windows 98 機(jī)器與 MacBook 的連接延遲小于 1 毫秒。
建立網(wǎng)絡(luò)連接后,我們終于可以使用 FTP 傳輸文件了。一個(gè)關(guān)鍵問(wèn)題是:可執(zhí)行文件無(wú)法運(yùn)行,直到我們發(fā)現(xiàn)它們需要以二進(jìn)制模式傳輸。解決方法很簡(jiǎn)單,只需在 FTP CLI 中輸入「二進(jìn)制」即可:
通過(guò) FTP 以二進(jìn)制模式傳輸 stories260K.bin 模型文件。
編譯挑戰(zhàn)
在 Windows 98 下編譯現(xiàn)代代碼非常棘手。我們首先嘗試了 mingw,據(jù)說(shuō)它可以為 Windows 98/Pentium II 編譯現(xiàn)代 C++。結(jié)果卻走入了死胡同 — 可能是由于 CMOV 指令不支持奔騰 Pro 之前的版本。
于是,我們采用了老式的方法:Borland C++ 5.02 是一款有 26 年歷史的集成開(kāi)發(fā)環(huán)境和編譯器,可直接在 Windows 98 上運(yùn)行。唯一的問(wèn)題是它支持的是非常老的 C/C++ 版本?,F(xiàn)代 C++ 是不可能的,但幾十年來(lái) C 語(yǔ)言的變化卻少得驚人。C 語(yǔ)言最大的變化是在 1999 年(C99),所以很遺憾我們錯(cuò)過(guò)了。舊版 C 的主要限制是不能「隨處聲明」變量,所有變量都必須在函數(shù)的開(kāi)始部分聲明。
圖片
Karpathy 救場(chǎng)
這讓我們想到了 Andrej Karpathy 的 llama2.c:700 行純 C 語(yǔ)言,可以在具有 Llama 2 架構(gòu)的模型上運(yùn)行推理。非常完美,但為了在奔騰 II 上運(yùn)行 Win98,它仍然需要一些調(diào)整:
- 用「DLONGWORD」代替「long long」(使用類(lèi)型定義);
- 將所有變量聲明移至函數(shù)起始處;
- 簡(jiǎn)化了從磁盤(pán)到內(nèi)存的加載(內(nèi)存映射會(huì)導(dǎo)致 SEGFAULTS);
- 通過(guò)用 GetTickCount () 代替 clock_gettime 修復(fù)了時(shí)間戳問(wèn)題。
本項(xiàng)目的代碼可在 GitHub 上的 llama98.c 獲取。
成功!在 Windows 98 上運(yùn)行的 260K 參數(shù) Llama 模型生成了一個(gè)關(guān)于 Sleepy Joe 的故事。
結(jié)果
終于讓它工作了!以下是我們實(shí)現(xiàn)的結(jié)果,完全在 Pentium II CPU 上運(yùn)行,無(wú)需 GPU:
Llama 3.2 1B 的結(jié)果是基于運(yùn)行適合內(nèi)存的模型碎片的基準(zhǔn)測(cè)試和磁盤(pán)讀取基準(zhǔn)測(cè)試得出的。Llama98.c 正在通過(guò)卸載功能進(jìn)行擴(kuò)展,以運(yùn)行更大的模型來(lái)進(jìn)行實(shí)際測(cè)試。
雖然沒(méi)有達(dá)到 ChatGPT 的速度,但讓任何現(xiàn)代人工智能模型在二十多年前的 CPU 硬件上運(yùn)行,都是朝著我們的使命邁出的重要一步。在此特別感謝 Chris Wellons 關(guān)于如何在 Windows 98 上運(yùn)行 C++ 的精彩博文。
未來(lái):BitNet 及其他
BitNet 是前沿模型真正可以在任何硬件上運(yùn)行的一個(gè)前景廣闊的方向。BitNet 是一種使用三元權(quán)重的 transformer 架構(gòu),每個(gè)權(quán)重只能是 0、-1 或 1,每個(gè)權(quán)重只需要 1.58 比特(log?(3) ≈ 1.58)。這一簡(jiǎn)單的變化具有重大意義:
Matmul 變成了具有三元權(quán)重的加法(Ma et al. 2024)。
由于乘以 0 是省略,乘以 1 是加法,而乘以 - 1 是減法,因此所有常見(jiàn)的矩陣乘法都變成了加法和減法。
這樣做的好處是顯而易見(jiàn)的:
- 一個(gè) 7B 參數(shù)的 BitNet 模型只需要 1.38GB 的存儲(chǔ)空間,小到足以安裝在大多數(shù)硬件上,甚至是幾十年前的 PC(我們使用的 PC 只有 1.6GB 的硬盤(pán)驅(qū)動(dòng)器);
- CPU 優(yōu)先:微軟的 BitCPP 在 M2 Ultra CPU 上每秒可生成 52 個(gè) token,在英特爾 i7 上每秒可生成 18 個(gè) token;
- 更令人印象深刻的是:100B 參數(shù)的 BitNet 可在單個(gè) CPU 上以人類(lèi)讀取速度(5-7 個(gè) token / 秒)運(yùn)行;
- 節(jié)能:比全精度模型節(jié)能 50% 以上。
在 EXO,我們研究三元模型已經(jīng)有一段時(shí)間了。2024 年 4 月,我們發(fā)布了在蘋(píng)果芯片上高效運(yùn)行的 MLX-BitNet。在 2024 年的 ICML 會(huì)議上,我們首次展示了用于蛋白質(zhì)語(yǔ)言建模的 BitNet 實(shí)現(xiàn),并正在開(kāi)發(fā)用于蛋白質(zhì)建模的更大 BitNet 模型。
雖然目前還沒(méi)有大型開(kāi)源 BitNet 模型,但我們相信三元模型是人工智能的未來(lái)。我們計(jì)劃在 2025 年訓(xùn)練一個(gè)三元模型。
然后呢?
我們希望看到更多的努力集中于在舊硬件上運(yùn)行人工智能模型。從優(yōu)化內(nèi)存使用到探索能在有限硬件上高效運(yùn)行的新架構(gòu),都有大量工程工作要做。
如果你對(duì)在舊硬件(如舊 Mac、Gameboy、摩托羅拉手機(jī),甚至舊 Raspberry Pi)上運(yùn)行模型感興趣,請(qǐng)查看代碼并加入我們的 Discord #retro 頻道。人工智能的未來(lái)不一定要被鎖在龐大的數(shù)據(jù)中心里,它可以在你已有的硬件上運(yùn)行。