Appearance
llm.c 文件重點
技術核心
1. 純 C 實作 (train_gpt2.c)
- 無框架依賴: 不使用 PyTorch/TensorFlow,僅用標準 C 函式庫
- FP32 精度: 所有計算使用
float型別 - OpenMP 並行: 在矩陣乘法、LayerNorm 等層使用
#pragma omp parallel for - 啟發式優化: matmul 使用 loop unrolling (LOOP_UNROLL=8) 提升快取命中
2. CUDA 實作 (train_gpt2.cu)
- 混合精度訓練: 預設 BF16,支援 FP32 和 FP16
- cuBLASLt 矩陣乘法: 使用
cublasLtMatmul取代手寫 kernel(速度接近硬體上限) - cuDNN Flash Attention: 選用 cuDNN 的 fused attention 實作
- 手寫 Kernel (
llmc/目錄):- LayerNorm:
layernorm_forward_kernel3(無 shared memory) 和kernel6(有 shared memory) - Attention: 自訂 kernel 支援 causal mask
- AdamW:
adamw_kernel3融合更新 - GeLU: 自訂 forward/backward kernel
- LayerNorm:
3. 記憶體管理
- 參數佈局: 所有權重連續配置在單一 GPU 記憶體區塊,用迭代器分配各 tensor
- 激活記憶體: 21 個 activation tensor,支援 recompute 選項以節省 VRAM
- ZeRO 優化: Stage 0-3,支援分散式梯度降
4. 訓練管線
資料載入 → 編碼 → 12層Transformer → LayerNorm → Linear → Softmax → Loss
↓
AdamW 更新 ← 梯度裁剪 ← 梯度同步(NCCL) ← 反向傳播 ← CrossEntropy5. 多 GPU 支援
- MPI 初始化分散式環境
- NCCL AllReduce 梯度同步
- ZeRO-1 對優化器狀態進行分片
- 支援 Slurm 排程器
學習資源
doc/layernorm/layernorm.md: 從 PyTorch 到 C 的逐步教學,涵蓋 forward/backwarddev/cuda/: 手寫 kernel 的 playgroundtest_gpt2.c/test_gpt2.cu: 與 PyTorch 輸出比對的一致性測試