大多數處理大型語言模型的開發者和研究人員透過 PyTorch 或 Hugging Face Transformers 等高階框架與之互動。這些框架在優雅的 API 背後隱藏了巨大的複雜性,但同時也模糊了這些模型實際學習的基本機制。llm.c 撕開了這層抽象,提供了一個在純 C 中完整、可運作的 GPT-2 訓練實作。
由 Andrej Karpathy(前 Tesla AI 總監、OpenAI 共同創辦人)創建,llm.c 首先是一個教育專案。它使用僅標準 C 函式庫的內容,完全沒有 PyTorch、TensorFlow 或任何機器學習框架的依賴,實作了 Transformer 語言模型的完整前向傳播、反向傳播和訓練迴圈。
教育理念雖然激進但有效:當你剝離框架時,每個矩陣乘法、每個梯度計算、每個最佳化器更新都必須明確編寫。沒有 autograd 隱藏反向傳播。沒有 model.compile() 抽象化訓練迴圈。每一行程式碼都直接對應於 Transformer 架構中的數學運算。
llm.c 如何實作完整訓練流程?
llm.c 在明確的 C 程式碼中實作了 Transformer 訓練流程的每個組件。
graph LR
A[輸入文字\n已分詞] --> B[嵌入層\nToken + 位置嵌入]
B --> C[Transformer 區塊 x12\n自注意力 + FFN]
C --> D[層歸一化 + 最終投影]
D --> E[交叉熵損失]
E --> F[反向傳播\n明確梯度]
F --> G[參數更新\nC 語言 Adam 最佳化器]
G --> B
subgraph 反向傳播
F --> H[嵌入的梯度]
F --> I[注意力的梯度\nQ, K, V, 輸出]
F --> J[FFN 的梯度\n閘門, 向上, 向下]
F --> K[層歸一化的梯度\n縮放 + 偏移]
end
沒有 autograd 引擎。每個梯度公式都經過推導和手動實作,使反向傳播的數學完全透明。
llm.c 中的關鍵實作細節
該實作涵蓋了 Transformer 訓練堆疊的每個主要組件。
| 組件 | C 實作 | 你學到的內容 |
|---|---|---|
| Token 嵌入 | 嵌入查找表 | Token 如何變成向量 |
| 位置編碼 | 學習的位置嵌入 | 位置資訊如何添加 |
| 自注意力 | QKV 投影 + softmax + 聚合 | 注意力權重如何計算 |
| 多頭注意力 | 分割/合併頭 | 並行注意力計算 |
| 前饋網路 | 兩層 MLP 搭配 GELU | FFN 如何轉換表示 |
| 層歸一化 | 均值 + 變異數計算 | 歸一化如何穩定訓練 |
| 殘差連接 | 跳躍連接 | 梯度如何在網路中流動 |
| Adam 最佳化器 | 動量 + 自適應學習率 | 參數如何更新 |
| 交叉熵損失 | Softmax + 負對數似然 | 損失如何衡量預測品質 |
每個組件通常在 50-100 行 C 程式碼中實作,使整個架構易於理解。
llm.c 與 PyTorch 實作的比較
llm.c 方法與 PyTorch 抽象之間的對比是驚人的。
| 方面 | PyTorch 實作 | llm.c 實作 |
|---|---|---|
| 程式碼行數(完整訓練) | ~500(含框架) | ~5000(無框架) |
| 反向傳播 | 自動(autograd) | 手動(每個梯度) |
| GPU 支援 | 自動(CUDA 張量) | 手動(自訂 CUDA 核心) |
| 依賴 | PyTorch、CUDA、分詞器 | 僅標準 C 函式庫 |
| 可讀性(ML 專家) | 高(抽象化) | 高(明確) |
| 教育價值 | 良好(高階理解) | 優秀(完全理解) |
程式碼增加 10 倍不是臃腫——而是框架通常隱藏的缺失解釋。
CUDA 版本如何加速訓練?
CUDA 實作提供有意義的訓練速度,同時保持教育清晰度。
| 組件 | CPU 實作 | CUDA 核心 |
|---|---|---|
| 矩陣乘法 | 巢狀迴圈 | 共享記憶體平舖 |
| Softmax | 順序計算 | Warp 層級歸約 |
| 層歸一化 | 順序統計 | 並行歸約 |
| 注意力 | 完整 O(n^2) 矩陣 | 記憶體高效核心 |
| Adam 更新 | 參數上的迴圈 | 元素級並行 |
CUDA 核心的編寫在效能和可讀性之間取得平衡,作為 ML 工作負載 GPU 編程的實用範例。
常見問題
什麼是 llm.c? Andrej Karpathy 的教育性 GPT-2 訓練實作,使用純 C/CUDA。
為什麼使用純 C? 為了移除抽象層,使每個梯度計算明確可見。
CUDA 版本添加了什麼? 所有操作的 GPU 加速核心,實現有意義的訓練速度。
真的可以訓練模型嗎? 是的,可以訓練完整的 GPT-2 模型,產生真實的檢查點。
可以學到什麼? 完整 Transformer 訓練堆疊的深入理解,從注意力到最佳化器。
延伸閱讀
- llm.c GitHub 儲存庫 – Andrej Karpathy 的原始碼、文件和範例
- 從零構建 GPT – Karpathy 關於從零構建 GPT 的影片講座
- Attention Is All You Need (ArXiv) – 原始 Transformer 論文
- CUDA 程式設計指南 – 官方 NVIDIA CUDA 文件
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!