Appearance
llm.c 閱讀心得
從高階框架到底層實作
看 llm.c 最震撼的感受是:原來 Transformer 訓練真的不需要黑盒子。所有 PyTorch 中 nn.Linear、nn.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 訓練
- 每一步的增量和權衡都清晰可見
對工程思維的啟發
- 漸進式優化: 先寫出正確的 naive 實作,再逐層加速。
matmul_forward_naive→matmul_forward(loop unrolling) →matmul_forward_cublaslt(cuBLASLt) - 記憶體與計算的權衡: recompute 選項讓你可以用額外計算換取記憶體空間,這在 LLM 訓練中至關重要
- 教學 > 效能: Karpathy 明確表示「如果 PR 增加 2% 效能但多了 500 行複雜程式碼,我會拒絕」,因為複雜性會破壞可讀性
最大收穫
理解了 GPU 訓練中真正的瓶頸不在矩陣乘法(cuBLAS 已經做得很好),而在 LayerNorm、GeLU 等 element-wise 操作和記憶體頻寬的管理。這也是為什麼 fused kernel(如 fused_residual_forward5)能帶來顯著加速。