系列CMU 11-868 是 Lei Li 開的 LLM 系統研究所課:從 CUDA kernel、自己的 MiniTorch 框架,一路做到分散式訓練、SGLang 服務與 RLHF。Spring 2026 的 28 份講義、7 份作業頁與 7 個起始碼 repo 全部公開,可評為 A3;缺的是錄影、GPU 與 PSC 帳號、quiz,以及「哪兩份作業是選修」這件事官方沒寫。
CMU 11-868 第一講用 51 頁投影片論證一件事:LLM 的瓶頸不只在模型,而在「用更少的 GPU、記憶體與電力,更快地在更大的資料上訓練與推論更大的模型」。它把一個 Transformer 拆成矩陣乘法、reduction、map、記憶體搬移四種底層運算子,再把難題分到 kernel、框架、分散式系統三層,並提醒光把計算變快不夠,資料搬移同樣花時間。
CMU 11-868 的 GPU 三講回答一個問題:為什麼寫對的 CUDA matmul 在 A100 上只用到 2.48% 的 FP32 算力。L02 講 SM、warp 與 grid/block/thread,L03 講 cudaMalloc、cudaMemcpy 與 kernel 索引,L04 用 tiling、coalesced access 與避開 bank conflict,把資料從約 500 個 cycle 外的 global memory 搬近一點。
11-868 第一份作業要你在 src/combine.cu 寫四個 CUDA kernel(map 15、zip 25、reduce 25、matmul 30 分),接回 MiniTorch 的 Python 後端,再用 5 分的整合測試收尾。reduce 與 matmul 的 shared-memory 優化標為 Optional。作業頁明寫需要 GPU,評分用的是不公開的私有測資。
L05 用一個四層的情感分類網路當主線,先把計算表示成計算圖、用拓撲排序算出前向值,再用連鎖律與向量–Jacobian 乘積反向傳回梯度,最後拆解 TensorFlow v1 的 placeholder、variable、operation 與 session。投影片有一頁直接標著「important for HW2」。
11-868 第二份作業分三塊:自動微分的 topological_sort 與 backpropagate(40 分)、Linear 層與 MLP 網路(30 分)、binary cross entropy 與訓練迴圈(30 分),最後在 SST-2 上用 GloVe 詞向量訓練情感分類器,驗證準確率要到 75%。預設後端是你作業一寫的 CUDA kernel;repo 已在 2026-09-02 合併了 Fall 2026 的小修正。
11-868 只花兩堂課講模型本身:L06 把 Transformer 拆成 embedding、多頭注意力、FFN、LayerNorm 與殘差,L07 用 T5、LLaMA、GPT-3 三個模型示範現代 LLM 改了哪些地方。對系統工程師來說,重點是記住形狀:GPT-3 175B 是 96 層、d_model 12288、context 2048,訓練 3,000 億 token;LLaMA 65B 是 80 層、d_model 8192、訓練 1.4 兆 token。這些數字決定了後面每一堂加速、平行與服務課要處理的量。
L08 從 BPE 講到講者 Lei Li 參與的 VOLT:詞表大小有成本也有價值,VOLT 用「每加一個 token 能降多少正規化熵」找划算的點,再化成最佳傳輸問題求解;後半講 LLaMA 3 詞表從 32k 擴到 128k、中文字被 byte-level BPE 切成三個 token 的代價。L09 從 greedy、取樣、beam search 一路講到 speculative decoding:小模型先猜 N 個 token,大模型一次前向驗證,因為驗證比生成便宜;最後介紹 EAGLE 改成預測最後一層特徵。
HW3 要你在 HW1、HW2 做出來的 MiniTorch 上補齊 softmax loss、Dropout、LayerNorm、Embedding,再組出 pre-LN 的 GPT-2 decoder,最後在 IWSLT14 德英翻譯上訓練。配分是 tensor functions 20、basic modules 20、decoder LM 40、翻譯管線 20;滿分條件是通過私有測試且 BLEU 約 20±2。作業頁警告光訓練就要至少 10 小時,PSC 的 V100 一個 epoch 約一小時,要跑 10 個 epoch。2026 春季版 2/4 發、2/18 截止。
11-868 第 10 講用 Lei Li 團隊自己的 LightSeq/LightSeq2 當教材,拆出四招:把矩陣乘法以外的小運算融合成一個 kernel、改寫 LayerNorm 與 Softmax 的公式來減少 thread 同步、參數與梯度用 FP16 存但 FP32 算、依反向傳播的相依關係重用記憶體。投影片報告的 WMT14 英德翻譯訓練加速是 1.4–3.5 倍。沒有錄影,本文依投影片頁碼與兩篇論文整理。
11-868 第四份作業要你照 LightSeq 的做法,親手寫 attention softmax 與 LayerNorm 的 CUDA kernel(前向、反向各一),接回自己的 MiniTorch,再換進 HW3 的 Transformer 訓練一個 epoch。配分是 Softmax 40、LayerNorm 40、整合 20。作業頁預期單一 kernel 快 3.7 到 15.8 倍,整個訓練卻只快約 1.1 倍,原因是 Amdahl 定律。需要一張 NVIDIA GPU;repo 在 2026 秋季已被改過。
11-868 第 14、15 講從 parameter server 講到 PyTorch DDP:先用 NCCL 的五個 collective(Broadcast、Reduce、AllReduce、ReduceScatter、AllGather)當積木,推出 ring 為什麼能讓廣播時間幾乎不隨 GPU 數增加,再把 AllReduce 拆成 ReduceScatter 加 AllGather。第二講拆 DDP 的兩個關鍵設計:把梯度分桶(預設 25 MB)、在反向傳播還沒結束時就開始同步。沒有錄影,本文依投影片頁碼與 VLDB 2020 論文整理。
CMU 11-868 在 2026 春季用兩講回答「模型太大,一張 GPU 放不下」:L16 講切層的 pipeline parallelism(GPipe 的 micro-batch、1F1B、交錯 stage)和切矩陣的 tensor parallelism(Megatron-LM 對 FFN、attention、embedding 的切法),結論是節點內用 TP、跨節點用 PP、再外面疊 DP;L17 把 MoE 當成第三種切法——每張卡放不同的專家、其餘部分複製,代價換成 all-to-all 通訊與負載平衡,並以 GShard、DeepSpeed-MoE、DeepSeek-V3 的設計逐一說明。
資料平行每張卡都存一份完整的參數、梯度和 optimizer state;用 Adam 混合精度訓練時,每個參數約要 20 bytes,其中 16 bytes 是 optimizer 相關,LLaMA-3 8B 光這些就要 160GB。CMU 11-868 L18 以 ZeRO 論文為主軸,逐格動畫示範三個階段:ZeRO-1 切 optimizer state、ZeRO-2 再切梯度、ZeRO-3 連參數也切。投影片的結論是前兩階段不增加通訊、最多省 8 倍記憶體;第三階段每張卡的用量隨 GPU 數下降,代價是投影片估的約 3 倍通訊。
CMU 11-868 第五份作業改用 PyTorch 與 Hugging Face 的 GPT-2,要你只用 torch.distributed 和 torch.multiprocessing 寫出資料平行(切資料、建 process group、平均梯度,50 分),再寫出 GPipe 式的管線平行(切模型、產生時脈排程、用 worker thread 跑 micro-batch,50 分)。兩部分都要在至少兩張 GPU 上做 benchmark 並交圖:資料平行要在 2 張卡上達到至少 1.5 倍加速,管線平行要比單純模型平行快。2026 春季版 3/25 截止。
11-868 用兩講處理量化:L19 從 BF16、absmax/zero-point 講到 AdaQuant、ZeroQuant、LLM.int8(),L20 整講拆解 GPTQ。GPTQ 只量化權重,每次量化一欄就用二階資訊修正還沒量化的權重,再靠 lazy batch update 與 Cholesky 讓它跑得動 175B。它省下的主要是記憶體;推論變快,是因為單一 batch 的 decode 本來就卡在讀權重,運算量本身沒有減少。
標準 attention 會把 N×N 的分數矩陣寫回 HBM 再讀出來,時間大多花在搬資料。FlashAttention 用 tiling 加 softmax rescaling,讓每一塊都在 SRAM 裡算完,backward 則重算而不存。Tri Dao 在 11-868 的客座講義裡給了一組數字:backward 的 FLOPs 多了 13%,HBM 讀寫少了 9 倍,時間快了 6 倍。之後 FA3、FA4 的主題也一樣:硬體變了,瓶頸跟著搬家,演算法就得跟著改。
Google 的 Srinath Mandalapu 用兩講、兩百多頁,把一個 attention 從 Python 一路追到 TPU 的 VLIW 指令。L12 講 JAX 生態、TPU Ironwood 的記憶體與運算單元,以及 XLA 怎麼把 attention 編成三個融合 kernel。L13 講 XLA 做不到的部分:用 Pallas 自己控制 HBM 與 VMEM 之間的搬運,寫出 FlashAttention,再加上區塊稀疏變成 Splash Attention。思路跟 GPU 相同,差別在於:TPU 上排程主要交給編譯器,要介入就得用 Pallas 把迴圈與區塊大小攬回自己手上。
11-868 第 23 講把微調當成記憶體問題來算:LLaMA-8B 全參數半精度微調約要 80GB,換成 LoRA 約 33GB,再把凍結權重存成 4-bit 的 QLoRA 壓到約 9.2GB。這講的主線是三步:只訓練低秩的 A、B 兩個小矩陣(投影片說這招最早出自 CIAT);用 NF4 查表與雙重量化把凍結權重壓到約 0.52 bytes/參數;用 paged optimizer 在 GPU 快爆時把 optimizer state 換到 CPU。
11-868 用兩講回答同一個問題:一台推論伺服器怎麼同時服務大量請求,又不浪費 GPU 上的 KV cache。第 22 講(Lei Li)從 SGLang 的排程迴圈講起:ORCA 的 continuous batching、用 radix tree 管 KV 的 RadixAttention、依前綴命中率排序與分流、把 CPU 排程藏到 GPU 計算後面。第 24 講由 vLLM 作者 Woosuk Kwon 主講:PagedAttention 把 KV cache 切成固定大小的 block,用 block table 做虛擬化,讓同一張 A100 的 batch 從 8 撐到 40;後半講 vLLM 怎麼壓 CPU overhead、用 piecewise CUDA graph、切模型平行與管理混合架構的記憶體。
11-868 第六份作業第一次放下自己寫的 MiniTorch,改用產業框架。兩題各 50 分:第一題改一支 DeepSpeed 訓練腳本,打開 LoRA,讓 Llama-2-7B 在 2 張 16GB 的 V100 上訓練得起來;第二題填完 SGLang 推論腳本的 TODO,並調參數讓生成跑快一點。兩題要的 GPU 互相衝突:SGLang 不支援 V100,要換 L40S、A6000 或 A100。春季版 4/13 截止,作業頁不提供評分測資。
11-868 最後一組講義有五份:DistServe 的 Hao Zhang、NVIDIA Dynamo 的 Vikram Mailthody、LMCache 的 Junchen Jiang、Mooncake/KTransformers 的 Mingxing Zhang,加上 Lei Li 的框架地圖。它們回答同一個問題:服務規模從一台機器擴到一座資料中心之後,算力和 KV cache 要放在哪裡。主線有三步:量尺從 throughput 換成符合 SLO 的 goodput;prefill 與 decode 拆到不同 GPU;KV cache 從 GPU 記憶體擴張到 CPU、SSD 與遠端儲存。
11-868 的 RL 系統講題沒有投影片,Syllabus 只列了 ReaLHF 一篇論文。作業七倒是完整公開:用 Anthropic HH-RLHF 資料訓練 DistilBERT reward model(40 分),在 VERL 風格的 trainer 裡補上 GAE、PPO loss 與 entropy,微調 GPT-2(40 分),最後比較 RLHF 前後的 reward 分布(20 分)。起始碼的 trainer 沒有 import verl 套件,學的是 RLHF 的資料流,不是 VERL 的分散式引擎。