Skip to content

llm.c 閱讀心得

從高階框架到底層實作

看 llm.c 最震撼的感受是:原來 Transformer 訓練真的不需要黑盒子。所有 PyTorch 中 nn.Linearnn.LayerNorm 一行的東西,到 C 裡就是三重迴圈 + 指針偏移。

這顛覆了我過去「訓練 LLM 一定要用框架」的直覺。Karpathy 用 ~1000 行 C 程式碼就實現了完整的 GPT-2 訓練,說明了深度學習的數學本質其實很簡潔。

程式碼即教學

train_gpt2.c 的風格非常有教學意義:

  • 每個 forward 函式都有完整的 shape 註解,如 // out is (B,T,C)
  • backward 函式嚴格對稱 forward,註解標明「in forward this was: ... so now we have: ...」
  • 使用 += 累加梯度,保留了計算圖中梯度累加的特性

相較之下,train_gpt2.cu 則展示了從原型到高效能的演化路徑:

  • CPU 版 → 純 CUDA kernel → cuBLAS/cuDNN 整合 → 多 GPU 訓練
  • 每一步的增量和權衡都清晰可見

對工程思維的啟發

  1. 漸進式優化: 先寫出正確的 naive 實作,再逐層加速。matmul_forward_naivematmul_forward (loop unrolling) → matmul_forward_cublaslt (cuBLASLt)
  2. 記憶體與計算的權衡: recompute 選項讓你可以用額外計算換取記憶體空間,這在 LLM 訓練中至關重要
  3. 教學 > 效能: Karpathy 明確表示「如果 PR 增加 2% 效能但多了 500 行複雜程式碼,我會拒絕」,因為複雜性會破壞可讀性

最大收穫

理解了 GPU 訓練中真正的瓶頸不在矩陣乘法(cuBLAS 已經做得很好),而在 LayerNorm、GeLU 等 element-wise 操作和記憶體頻寬的管理。這也是為什麼 fused kernel(如 fused_residual_forward5)能帶來顯著加速。