為什麼要純C語言手搓GPT-2,Karpathy回應網友質疑

机器之心發表於2024-04-11
Karpathy:for fun.

幾天前,前特斯拉 Autopilot 負責人、OpenAI 科學家 Andrej Karpathy 釋出了一個僅用 1000 行程式碼即可在 CPU/fp32 上實現 GPT-2 訓練的專案「llm.c」。

圖片

llm.c 旨在讓大模型(LM)訓練變得簡單 —— 使用純 C 語言 / CUDA,不需要 245MB 的 PyTorch 或 107MB 的 cPython。例如,訓練 GPT-2(CPU、fp32)僅需要單個檔案中的大約 1000 行乾淨程式碼(clean code),可以立即編譯執行,並且完全可以媲美 PyTorch 參考實現。

圖片

專案連結:https://github.com/karpathy/llm.c

專案的 Star 量不到七個小時就衝上了 2000,目前已經接近一萬 Star。很多網友驚呼太強了:「即使頂著指標 ptsd,我也能感受到這些程式碼的美。」

圖片

然而,llm.c 專案收到的不只是稱讚,還有很多質疑的聲音。例如,有網友直接提問:「能具體描述下這個專案做了什麼嗎,解決了什麼問題?」

圖片

對此,Karpathy 今天正面回應了網友們的疑問,詳細闡述了 llm.c 專案的意義是什麼,優缺點有哪些。

圖片

機器之心對 Karpathy 敘述原文進行了不改變原意的編譯、整理,我們來看下 Karpathy 是怎麼說的:

訓練大型語言模型 (LLM),例如 ChatGPT,涉及大量程式碼,複雜度很高。例如,典型的 LLM 訓練可能會使用 PyTorch 深度學習庫。PyTorch 本身就相當複雜,因為它實現了:

  • 一個非常通用的張量抽象(一種排列和運算元組的方法,這些陣列用於儲存神經網路引數和啟用);

  • 一個非常通用的反向傳播 Autograd 引擎(訓練神經網路引數的演算法) ;

  • 神經網路中使用的大量深度學習層。

PyTorch 專案有 11449 個檔案中的 3327184 行程式碼。最重要的是,PyTorch 是用 Python 編寫的,Python 本身就是一種非常高階的語言 —— 必須執行 Python 直譯器將訓練程式碼轉換為低階計算機指令。例如,執行此轉換的 cPython 專案包含 4306 個檔案中的 2437955 行程式碼。

llm.c 專案旨在移除所有這些複雜性,並將 LLM 訓練簡化為其最基本的要素,用非常低階的語言 (C 語言) 直接與計算機對話,並且沒有其他庫依賴項,唯一的抽象是彙編程式碼本身。

令人驚訝的是,訓練像 GPT-2 這樣的 LLM 實際上只需要在單個檔案中使用大約 1000 行 C 語言程式碼。我透過直接在 C 語言中實現 GPT-2神經網路訓練演算法來實現這種壓縮。這實際上很困難,因為你必須詳細瞭解訓練演算法,能夠匯出所有層反向傳播(backpropagation)的 forward pass 和 backward pass,並非常仔細地實現所有陣列索引計算,因為沒有可用的 PyTorch 張量抽象。但一旦這樣做了,並且透過再次檢查 PyTorch 來驗證正確性,你就會得到一些非常簡單、小且精緻的東西。

那麼,為什麼人們不一直這樣做呢?

第一:這放棄了很大的靈活性。如果你想改動神經網路,在 PyTorch 中你可能只需要更改一行程式碼。而在 llm.c 中,改動很可能會涉及更多程式碼,可能會更加困難,並且需要更多專業知識。例如。如果涉及一個新的操作,你可能就需要做一些微積分,並寫出它的 forward pass 和 backward pass 以進行反向傳播,並確保其在數學上是正確的。

第二:放棄速度,至少一開始是這樣的。天下沒有免費的午餐 —— 不應該指望僅 1000 行程式碼就能達到最先進的速度。PyTorch 在後臺做了很多工作,以確保神經網路非常高效。不僅所有張量操作都非常仔細地呼叫最高效的 CUDA 核心,而且還有 torch.compile 等等,以進一步分析和最佳化神經網路並有效地在計算機上執行。

現在,原則上,llm.c 應該能夠呼叫所有相同的核心並直接執行。但這需要更多的工作,就像上述第一點一樣,如果更改神經網路或正在執行的計算機的任何內容,你可能必須使用不同的引數呼叫不同的核心,並且可能會手動進行更多更改。

總的來說,llm.c 是訓練 GPT-2 的直接實現。這個實現結果出人意料地簡短。但 llm.c 不支援其他神經網路,僅支援 GPT-2,如果你想更改神經網路的任何內容,則需要專業知識。幸運的是,所有最先進的 LLM 實際上與 GPT-2 根本沒有太大的區別。並且,llm.c 必須進行額外的調整和完善,但原則上我認為它應該幾乎能夠媲美,甚至超越 PyTorch,因為我們消除了所有開銷。

最後,我為什麼要做這個工作?因為這很有趣。它也很有教育意義,因為只需要那 1000 行非常簡單的 C 語言程式碼。它只是一些陣列和對其元素進行一些簡單的數學運算,例如 + 和 *。對於正在進行的更多工作,它可能會變得實際有用。

參考連結:https://twitter.com/karpathy/status/1778153659106533806

相關文章