主题
零基础到大模型精通 —— 第四阶段:精通·底层性能优化大纲
前置要求:完成第三阶段(进阶原理),理解 MoE、KV Cache、分布式并行的原理层面。 阶段目标:8~12 周内深入大模型系统的" silicon 层"——CUDA/Triton 算子、注意力内核、推理引擎运行时、投机解码、编译优化、分布式通信,达到"能读 vLLM/SGLang 源码、能写自定义算子、能做系统级性能调优"的顶尖工程水平。
模块 19:GPU 体系结构与性能分析基础(1~2 周)⭐ 地基模块
19.1 GPU 硬件模型
- SM / CUDA Core / Tensor Core / Warp / 线程块调度
- 内存层级:寄存器 → Shared Memory → L2 → HBM,带宽与延迟的数量级
- HBM vs SRAM:为什么大模型推理是访存瓶颈(memory-bound)
- 算力规格解读:FP16/BF16/FP8/INT8 TFLOPS、NVLink/NVSwitch 拓扑
- Hopper(H100)/ Blackwell(B200)新特性:TMA、FP8、WGMMA 扫盲
19.2 性能分析方法论
- Roofline 模型:算术强度(Arithmetic Intensity)判定 compute-bound / memory-bound
- 推理两阶段分析:prefill(compute-bound)vs decode(memory-bound)
- 工具链:
nvidia-smi→nsys(Nsight Systems 时间线)→ncu(Nsight Compute 内核级) - PyTorch Profiler:算子级耗时、显存曲线
- 瓶颈定位套路:看时间线 → 找空隙(气泡)→ 内核内分析
实战:
- 用 Roofline 模型手算:7B 模型 FP16 decode 在 A100 上的理论 token/s 上限,并与实测对比
- 用 nsys 抓一次 vLLM 推理的时间线,标出 prefill/decode/通信各段,写瓶颈分析报告
模块 20:CUDA 与 Triton 算子开发(2~3 周)⭐ 重点模块
20.1 CUDA C++ 编程
- 线程模型:grid / block / thread 索引、warp 内原语(shuffle、ballot)
- 内存优化:全局内存合并访问(coalescing)、Shared Memory 分块(tiling)、Bank Conflict
- 经典练习:向量加 → 矩阵转置 → 朴素 GEMM → Shared Memory GEMM → 向量化加载
- 减少 kernel launch 开销:算子融合(fusion)的动机
- PyTorch 自定义算子:
torch.utils.cpp_extension加载 CUDA 扩展
20.2 Triton 编程
- Triton 心智模型:块级编程、tl.load/store、mask、自动共享内存管理
- 从 PyTorch 到 Triton:RMSNorm / SiLU 手写并 benchmark
- 注意力相关:softmax、fused RoPE、量化反量化 kernel
- Triton 调优:num_warps、num_stages、BLOCK_SIZE 的网格搜索(autotune)
20.3 大模型关键算子剖析
- GEMM 与量化 GEMM(W4A16、FP8 GEMM)
- RMSNorm / LayerNorm 的融合实现
- RoPE 的就地计算与融合
- MoE 算子:分组 GEMM(grouped GEMM)、scatter/gather 与 permutation kernel
- 采样算子:top-k/top-p 的 GPU 实现
实战:
- CUDA 手写 GEMM,逐版优化(naive → tiling → 向量化),对照 cuBLAS 达到 60%+ 峰值
- Triton 实现 fused RMSNorm + RoPE,集成进一个小模型替换原生实现并验证精度
- 为 INT4 权重写一个反量化 + GEMV 的 decode kernel,与 PyTorch 原生对比 token/s
模块 21:注意力内核与 KV Cache 系统(2 周)⭐ 重点模块
21.1 FlashAttention 原理与实现
- 问题本质:注意力是访存瓶颈,N² 中间矩阵不写回 HBM
- 在线 softmax(online softmax):分块计算、running max/sum 的数学推导
- FlashAttention-2/3 的演进:warp 分工、流水线、FP8 支持
- 变长序列:varlen kernel 与 cu_seqlens
21.2 PagedAttention 与 KV Cache 管理
- 操作系统的类比:虚拟内存 → 分页 → KV block
- vLLM 的 block 管理器:分配、共享(prefix caching)、驱逐
- KV Cache 量化:FP8/INT8 KV 的精度与容量权衡
- MLA 的 KV 压缩对系统的影响(DeepSeek 案例)
21.3 前缀缓存与长上下文系统
- Prefix Caching(RadixAttention):SGLang 的 Radix Tree 设计
- Chunked Prefill:长 prefill 与 decode 的公平调度
- 长上下文服务化:KV offload(GPU → CPU → SSD)、分层存储
实战:
- 推导在线 softmax 并用 Triton 实现一个单头 FlashAttention,与
torch.nn.functional.scaled_dot_product_attention对齐数值 - 阅读 vLLM 的 block manager 源码,画出 block 分配/共享/驱逐的状态图
- 实测:开启/关闭 prefix caching 对多轮对话场景吞吐的影响
模块 22:推理引擎运行时(vLLM / SGLang 源码级)(2~3 周)⭐ 核心模块
22.1 引擎架构总览
- vLLM V1 架构:EngineCore / Scheduler / ModelRunner / Worker 的职责划分
- 请求生命周期:API 接收 → tokenize → 调度 → 执行 → detokenize → 流式返回
- 连续批处理(Continuous Batching):迭代级调度的实现
- 调度器策略:FCFS、抢占(preemption)、优先级
22.2 模型执行路径
- 模型加载与并行化:权重分片、自定义线性层(ColumnParallel/RowParallel)
- 采样器(Sampler):logits 处理管线(penalty → temperature → top-p/k)
- CUDA Graph 在 vLLM 中的应用:capture 时机、padding 策略
- 多模态输入的处理路径
22.3 源码精读专题
- vLLM:
vllm/v1/engine/、vllm/v1/worker/、vllm/attention/、vllm/model_executor/models/qwen3.py - SGLang:RadixAttention、约束解码(compressed FSM)、 PD 分离(Prefill-Decode Disaggregation)
- 对比分析:两家引擎在调度、缓存、解耦上的设计哲学差异
22.4 二次开发能力
- 为 vLLM 添加一个新模型的支持(model executor 注册流程)
- 自定义采样参数 / 自定义 logits processor
- 性能回归测试:benchmark 套件的使用
实战:
- 给 vLLM 添加一个自定义 logits processor(如自定义重复惩罚),并通过测试
- 魔改实验:修改调度器的一处策略(如 preemption 触发条件),压测对比影响
- 输出《vLLM 源码解析》系列笔记:至少覆盖调度器、KV 管理、模型执行三条主线
模块 23:投机解码与生成加速(1~2 周)⭐ 重点模块
23.1 投机解码(Speculative Decoding)原理
- 核心洞察:decode 是访存瓶颈 → 一次前向验证多个 token 是"免费"的
- 草稿模型 + 目标模型的验证算法(投机采样,保持分布一致的数学证明)
- 接受率(acceptance rate)与加速比的关系
- 变体家族:
- 独立草稿模型(draft model)
- Medusa:多头预测
- EAGLE / EAGLE-2/3:特征级草稿、动态草稿树
- N-gram / prompt lookup:无模型的投机
- vLLM 中启用:
--speculative-config的配置与实测
23.2 其他生成加速技术
- 并行解码 / Lookahead decoding 扫盲
- 早退(early exit)与级联模型
- 结构化输出加速:约束解码(xgrammar / outlines)的性能开销与优化
- 长输出场景的调度优化
实战:
- 推导投机采样的接受/拒绝概率公式,手写一个玩具版(NumPy)验证分布一致性
- vLLM 实测:n-gram vs EAGLE 在不同任务(闲聊/代码/翻译)上的加速比与接受率
- 训练/获取一个 EAGLE 草稿头,接入引擎完成端到端加速
模块 24:编译优化与图优化(1~2 周)
24.1 PyTorch 编译栈
torch.compile原理:Dynamo 图捕获 → AOTAutograd → Inductor 代码生成- 图 break 的诊断与消除
- 编译产物分析:读懂 Inductor 生成的 Triton 代码
- mode 选择:default / reduce-overhead(含 CUDA Graph)/ max-autotune
24.2 CUDA Graph
- Kernel launch 开销与 CPU bound 问题:为什么小 batch decode 需要 CUDA Graph
- 捕获与回放机制、静态地址约束
- 在推理引擎中的工程化:按 batch size 分桶捕获、内存池
24.3 TensorRT-LLM 与部署级优化
- TensorRT 基础:图优化、算子融合、精度校准(FP8/INT8 PTQ)
- TensorRT-LLM 的 in-flight batching 与插件体系
- vLLM vs TensorRT-LLM 的性能与灵活性权衡(结合模块 11 的选型能力深化)
实战:
- 对一个 decode 循环分别测:eager / torch.compile / torch.compile(reduce-overhead) / 手写 CUDA Graph 的 token/s
- 用 Inductor 生成代码做"考古":找到一处可手动优化点并改写 Triton
- (可选)用 TensorRT-LLM 部署同一模型并与 vLLM 做 P50/P99 延迟对比
模块 25:分布式推理与大规模服务(1~2 周)
25.1 推理并行策略
- 张量并行(TP):注意力与 FFN 的切分方式、all-reduce 通信量计算
- 流水线并行(PP)在推理中的局限
- 专家并行(EP):MoE 模型的 all-to-all 通信、EPLB 负载均衡(DeepSeek 案例)
- 数据并行 + 多副本:attention DP 的兴起
- 序列并行 / 上下文并行(CP):长上下文的 KV 切分
25.2 通信原语与库
- NCCL 原语:all-reduce / all-gather / reduce-scatter / all-to-all 的语义与带宽模型
- NVLink / PCIe / RDMA(IB)的带宽差异对并行策略的决定作用
- 通信与计算重叠(overlap):流水线、分块 all-reduce
25.3 大规模推理架构
- PD 分离(Prefill-Decode Disaggregation):为什么要拆开、KV 传输(KV connector)
- 全局路由与调度:多实例负载均衡、缓存亲和路由(cache-aware routing)
- 弹性与容错:故障实例摘除、请求重试
- 成本工程:Spot 实例、异构混布、离线批推(batch inference)与在线服务的资源复用
实战:
- 手算:8B 模型 TP=4 下每层 all-reduce 的通信字节数,对比 NVLink 与 PCIe 的理论开销差异
- 部署一个 PD 分离的 vLLM 集群(2 节点),压测对比合并部署的 P99 延迟
- 设计评审:给一个 10 万 QPS 的业务设计完整推理架构(模型选型、并行策略、PD 配比、路由、容灾)
模块 26:精通阶段毕业项目(2~3 周)
项目(三选一或组合):
A. 写一个迷你推理引擎
- 支持连续批处理、Paged KV Cache、CUDA Graph、投机解码(n-gram 版)
- 目标:7B 模型在单卡上达到 vLLM 同级性能的 50%+,写清每一段差距的原因
B. 算子级深度优化
- 针对一个具体模型(如 Qwen3-MoE)的 decode 路径做端到端剖析
- 至少交付 2 个自定义 Triton/CUDA kernel,端到端 token/s 提升 ≥ 15%
- 输出完整 profiling 报告(Roofline 分析 + nsys 时间线 + 优化前后对比)
C. vLLM 源码贡献
- 从 issue/roadmap 中选一个真实改进点(新模型支持、算子优化、调度改进)
- 提交 PR 并通过 review(或至少通过 CI 与 maintainer 初审)
毕业标准(自检清单):
- [ ] 能用 Roofline 模型判断任意推理场景的瓶颈类型并给出优化方向
- [ ] 能手写达到 cuBLAS 60%+ 性能的 CUDA GEMM 及常用 Triton 融合算子
- [ ] 能推导在线 softmax 并实现单头 FlashAttention
- [ ] 能画出 vLLM 一次请求的完整内部路径(调度 → KV → 执行 → 采样)
- [ ] 能推导投机采样的分布一致性证明并实测加速比
- [ ] 能说清 torch.compile / CUDA Graph / TensorRT 各自的优化层级与边界
- [ ] 能为 MoE 大模型设计 EP + PD 分离的生产推理架构并估算成本
时间规划参考
| 周次 | 内容 |
|---|---|
| 第 1~2 周 | 模块 19:GPU 体系结构与性能分析(地基) |
| 第 3~5 周 | 模块 20:CUDA/Triton 算子(重点) |
| 第 6~7 周 | 模块 21:FlashAttention 与 KV Cache 系统(重点) |
| 第 8~10 周 | 模块 22:vLLM/SGLang 源码级剖析(核心) |
| 第 11~12 周 | 模块 23:投机解码(重点) |
| 第 13~14 周 | 模块 24:编译优化 |
| 第 15~16 周 | 模块 25:分布式推理与 PD 分离 |
| 第 17~19 周 | 模块 26:毕业项目 |
配套资源
| 类型 | 资源 |
|---|---|
| 课程 | GPU MODE(原 CUDA MODE)系列、Stanford CS149(并行计算)、CMU 15-445 式系统课思维 |
| 论文 | FlashAttention 1/2/3、PagedAttention(vLLM)、Speculative Decoding、Medusa、EAGLE、SGLang(RadixAttention) |
| 代码 | vLLM、SGLang、FlashAttention、Triton tutorials、TensorRT-LLM、llm.c(Karpathy) |
| 工具 | Nsight Systems / Nsight Compute、PyTorch Profiler、vLLM benchmark、NCCL tests |
| 社区 | vLLM/SGLang GitHub Discussions、GPU MODE Discord、各类引擎 release notes(跟踪前沿) |