26年前老年機跑Llama2,每秒39個token:你的AI PC,也可以是Windows 98
机器之心發表於2024-12-30
讓 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 埠、串列埠,以及至關重要的、後來被證明是必不可少的乙太網埠。下一個挑戰是將檔案傳輸到機器上。我們需要傳輸模型權重、tokenizer 配置和推理程式碼。現代解決方案都失敗了:- 我們的 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 年曆史的整合開發環境,仍然能夠完成任務。這讓我們想到了 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 是一種使用三元權重的 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 / 秒)執行;
在 EXO,我們研究三元模型已經有一段時間了。2024 年 4 月,我們釋出了在蘋果晶片上高效執行的 MLX-BitNet。在 2024 年的 ICML 會議上,我們首次展示了用於蛋白質語言建模的 BitNet 實現,並正在開發用於蛋白質建模的更大 BitNet 模型。雖然目前還沒有大型開源 BitNet 模型,但我們相信三元模型是人工智慧的未來。我們計劃在 2025 年訓練一個三元模型。我們希望看到更多的努力集中於在舊硬體上執行人工智慧模型。從最佳化記憶體使用到探索能在有限硬體上高效執行的新架構,都有大量工程工作要做。如果你對在舊硬體(如舊 Mac、Gameboy、摩托羅拉手機,甚至舊 Raspberry Pi)上執行模型感興趣,請檢視程式碼並加入我們的 Discord #retro 頻道。人工智慧的未來不一定要被鎖在龐大的資料中心裡,它可以在你已有的硬體上執行。參考連結:https://blog.exolabs.net/day-4/