LLM 性能与 Infra
从单机 TTFT/ITL 追到集群数据移动、并行拓扑与 SLO
建议阅读:约 20 分钟
学习目标
本章关键词
| 关键词 | 解释 | ESP32 工程类比 |
|---|---|---|
| TTFT | 从请求发出到首个 token 返回的时间。 | 像首次中断到第一条有效状态消息的延迟。 |
| p95 | 95% 请求不超过的尾延迟分位数。 | 像对最慢一小部分现场事件的时延预算。 |
| Goodput | 在给定正确性与 SLO 约束内完成的有效工作量,而非原始峰值吞吐。 | 像只统计按 deadline 校验通过的数据帧,不把迟到或 CRC 错误帧算成绩。 |
| PD 解耦 | 把 Prefill 与 Decode 放到可独立调度和扩缩容的 worker 池。 | 像把批量预处理与实时控制任务分到不同核,但跨核队列与复制仍有成本。 |
承上:回顾与定位
Day 13 已能证明请求实际经过哪些 backend;本章把正确性基线升级为跨尺度性能账本,从单设备测量延伸到集群通信、状态调度和服务目标。
历史发展脉络
大规模 LLM Infra 不是一条由更快 GPU 单独推动的路线。芯片线持续改变计算、内存与互连比例;系统线则用分片、I/O-aware 算法和请求调度把这些硬件拼成可用服务。两条线必须同时阅读。
芯片与互连线
GPU 深度学习证明高吞吐并行计算的规模效应
AlexNet 用 GPU 训练大规模卷积网络,让通用并行加速器成为深度学习主力;后续系统问题随即从单 kernel 扩展到多卡供数与同步。
AlexNet 原始论文 ↗TPU 与 Tensor Core 把矩阵乘变为专用快速路径
TPU 论文展示 systolic array 与片上缓冲如何围绕神经网络推理组织;同一时期 Tensor Core 推动混合精度矩阵运算,模型与 kernel 开始共同适配专用数据路径。
TPU 原始论文 ↗混合精度把数值格式变成系统杠杆
FP16 计算配合 FP32 累加与 loss scaling,在维持训练可用性的同时减少带宽和存储压力;BF16、FP8 与量化延续了模型—硬件协同方向。
混合精度训练原始论文 ↗机架级 AI 系统把互连、供电与散热一起设计
加速器不再只是可互换的 PCIe 卡;机架内网络、交换芯片、CPU、存储层、功率和冷却共同约束可持续吞吐,因此比较必须绑定具体工作负载与系统配置。
MLPerf Training 官方结果与规则 ↗并行算法与服务系统线
Megatron 让 Transformer 层内张量并行可规模化
Megatron-LM 系统化切分 attention 与 MLP 矩阵,并将张量、流水线和数据并行组合,清晰暴露了并行维度与互连拓扑的关系。
Megatron-LM 原始论文 ↗FlashAttention 用 I/O-aware 分块减少 HBM 往返
它没有把 attention 近似掉,而是按片上存储容量组织精确计算,减少中间矩阵读写,说明算法复杂度相同并不代表真实硬件成本相同。
FlashAttention 原始论文 ↗PagedAttention 之后,KV 成为集群级调度对象
vLLM 将 KV 分页以减少碎片并支持共享;随后 prefix-aware 路由、分层缓存与 Prefill/Decode 解耦把状态位置、传输和 SLO 带入服务控制面。
vLLM / PagedAttention 原始论文 ↗类比图解
把性能分析想成追查一趟总迟到的高铁
乘客只感受到总行程,这就是端到端延迟;进站安检像预处理,等首班车像 TTFT,途中每站间隔像 inter-token latency。平均到站时间看似正常,但少数暴雨天的严重晚点就是 p95。只把列车最高时速提高,若检票、换轨或进站仍占大头,总时间几乎不变;车厢空调全开还会提高每位乘客的能耗并触发温度保护。真正的优化要拿时刻表、轨迹和电表对账。
类比的边界: 列车各段通常近似串行,而推理可能流水化、异步复制或将多个请求合批;单请求阶段之和也不直接等于高并发吞吐。类比用于提醒分段和长尾,不能取代 trace 时间戳、硬件计数器与排队模型。
本章讲解
先写实验契约,再启动计时器
一次可比较基准至少固定模型与哈希、量化格式、runtime commit、线程和绑核、prompt token 数、输出上限、采样、并发、供电及散热。先 warm-up,再执行足够重复次数并保留原始样本。若两轮测试的输入长度或温度不同,p95 与 tokens/s 没有直接可比性。把这些字段保存为机器可读 manifest,可让固件或模型升级后自动复跑。
TTFT 与生成速度必须拆开诊断
TTFT 包含排队、模板化、tokenize、context 准备、prefill 和首轮采样;稳定 decode 则主要反映逐步读取权重与 KV、执行小批矩阵和采样输出。长 prompt 会显著拉高前者,长 context 与带宽压力会拖慢后者。应在相同请求上打单调时钟时间戳,并报告 prompt tokens/s、ITL 分布和 output tokens/s,而不是只给总耗时。
用瓶颈假设驱动下一项观测
看到 CPU 利用率低,不应直接断言“算力富余”:线程可能等待内存、锁、GPU 同步或网络背压。先由 trace 找最长阶段,再提出可证伪假设。若怀疑带宽,改变量化或 context 并观察速度与 bytes moved;若怀疑计算,改变核心数或频率;若怀疑 copy,记录分区边界。每次只改一个变量,让证据能区分相关性与因果。
先画数据移动层级,再谈算力
一个 kernel 中最热的标量可能停在寄存器,线程块复用的数据进入片上 SRAM/shared memory,模型权重、激活与 KV cache 主要驻留 HBM;跨卡张量经 PCIe 或专用 scale-up 互连,跨节点 collective 经过网卡与交换网络,checkpoint 最终落到本地 NVMe 或远端对象/并行文件系统。每向外一层,容量往往更大,但延迟、能耗和争用也上升。算术强度描述每搬一个字节能完成多少计算;Attention、MoE dispatch 和 embedding lookup 的瓶颈可能完全不同。工程分析应给每条边标注字节数、频率、并发者与拓扑,而不是笼统地说“GPU 很快”。HBM 容量决定模型能否放下,HBM 带宽决定许多逐 token kernel 的上限,节点内互连影响 TP collective,节点间网络影响 DP、EP 与 checkpoint 恢复。峰值 FLOPS 只有在数据及时到达计算单元、kernel 形状合适且通信被隐藏时才可能转化为有效吞吐。
六种并行是在不同维度切同一个训练图
数据并行 DP 复制模型、切输入 batch,并在反向后规约梯度;张量并行 TP 在单层内部切矩阵或 attention head,因此每层都可能触发 all-reduce 或 reduce-scatter/all-gather,最依赖低延迟高带宽节点内互连;流水线并行 PP 按连续层切 stage,搬运 stage 边界激活,并以 microbatch 填充流水线,气泡和负载不均是关键成本。上下文并行 CP 切长序列维度,需要交换 attention 所需的 K/V 或中间结果;专家并行 EP 把 MoE 专家分散到 rank,通过 all-to-all dispatch/combine 搬 token,路由倾斜会让少数专家拖住全局。FSDP/ZeRO 则切参数、梯度与优化器状态:计算前 all-gather 所需参数,反向后 reduce-scatter 梯度,再释放完整副本。它们不是互斥按钮,真实作业常用多维 device mesh 组合,但每新增一维都增加布局转换、故障面与调参空间。
在线推理有两个阶段、两类延迟和一个持续增长的状态
Prefill 并行处理 prompt token,通常能形成较大的矩阵乘,决定 Time To First Token;Decode 每轮只生成少量 token,却要读取所有层的权重和历史 K/V,常受内存带宽与调度开销约束,Inter-Token Latency 决定流式体验。KV cache 让系统不必为旧 token 重算 attention,但其容量随并发、上下文长度、层数、head 数和 dtype 增长。PagedAttention 把逻辑连续序列映射到可分页物理 block,降低外部碎片并支持灵活共享;prefix cache 复用相同前缀 block,但命中率取决于模板规范化、租户隔离与路由局部性。continuous batching 在每个 decode 迭代接纳和移除请求,减少静态 batch 的空槽,却使排队策略、抢占与尾延迟成为一等问题。吞吐必须在给定 TTFT/ITL SLO 下报告,超时后才完成的 token 不属于有效服务能力。
用 SLO、可观测性和故障演练闭环容量规划
服务入口应记录输入/输出 token、模型和 tokenizer 版本、采样参数、租户、deadline 与 trace id;路由器记录选择原因、prefix 命中和队列估计;worker 暴露 TTFT、逐 token ITL、batch 宽度、KV block 使用率、抢占、OOM 与错误;网络侧观察 collective 或点对点传输字节、拥塞和重试。容量模型至少区分短问答、长上下文、批处理与多轮会话,因为均值流量会掩盖长 prompt 对 Prefill 和 KV 的冲击。压测要回放到达过程与长度分布,并同时报告 p50/p95/p99 和 SLO goodput。故障演练包括杀 worker、降速网络、填满 KV、破坏一个 checkpoint 分片以及滚动升级不兼容 runtime。只有当系统在这些条件下能拒绝、降级、回滚并留下证据,峰值 benchmark 才能变成可运营的容量结论。
基础设施项目图谱与跨尺度启示
技术状态核验日期:
以下是按职责层级整理的代表性开源项目,不是性能排名。版本、硬件支持和接口会变化;选型时应回到链接的官方文档或仓库,并用自己的模型、拓扑和 SLO 复测。
训练分片与并行
-
PyTorch FSDP2 / DTensor ↗
- 解决的问题
- 以设备网格表达参数和张量分片,降低全分片训练的内存冗余。
- 核心机制
- 参数以 DTensor 分片保存,在计算前 all-gather,反向后 reduce-scatter,并支持二维 mesh 组合。
- 适用边界
- 它不替你选择网络拓扑、checkpoint 策略或模型并行维度;峰值内存仍取决于预取与激活。
-
Megatron Core ↗
- 解决的问题
- 为大型 Transformer 组合 TP、PP、CP、EP 与 DP。
- 核心机制
- 按 Transformer 结构切矩阵、层、序列与专家,并提供调度和通信重叠路径。
- 适用边界
- 性能依赖受支持模型、并行布局和加速器拓扑,不能把示例吞吐直接搬到另一集群。
-
DeepSpeed ↗
- 解决的问题
- 提供 ZeRO、流水线、混合精度与训练/推理系统能力。
- 核心机制
- 分片模型状态并协调通信、offload 和执行调度。
- 适用边界
- 功能覆盖广不等于每个组合都最优;需锁定版本并验证与模型代码的契约。
通信与 Kernel
-
NCCL / RCCL ↗
- 解决的问题
- 在 GPU 间执行拓扑感知 collective。
- 核心机制
- 选择 ring/tree 等算法与传输路径,暴露 all-reduce、all-gather、reduce-scatter 等原语。
- 适用边界
- 通信库不会决定上层切分是否合理;RCCL 是 AMD 平台对应实现,应按硬件阅读各自支持矩阵。
-
Triton / FlashAttention ↗
- 解决的问题
- 减少算子实现成本与 attention 的 HBM 中间数据往返。
- 核心机制
- 编译专用 tile kernel;FlashAttention 用 I/O-aware 分块实现精确 attention。
- 适用边界
- 形状、dtype、架构和编译版本影响收益,不能把单 kernel 加速等同于端到端吞吐。
-
DeepEP / NIXL ↗
- 解决的问题
- 处理 MoE token dispatch 与跨内存/节点数据移动等进阶数据面。
- 核心机制
- DeepEP 优化专家 all-to-all;NIXL 为 KV 等对象提供跨异构内存层的传输抽象。
- 适用边界
- 二者解决的对象不同,也不替代通用 collective、路由控制面或一致性协议。
模型服务 Runtime
-
vLLM ↗
- 解决的问题
- 提高生成式服务的 KV 利用率与动态请求吞吐。
- 核心机制
- PagedAttention、continuous batching、prefix cache 与多类并行/连接器。
- 适用边界
- 功能开关并非普遍增益;必须按 workload 验证 TTFT、ITL、尾延迟与显存。
-
SGLang ↗
- 解决的问题
- 组织结构化生成程序与高吞吐模型服务。
- 核心机制
- 将前端语言/缓存复用与后端调度、attention kernel 和分布式 serving 结合。
- 适用边界
- API 与后端快速演化;迁移前要验证 tokenizer、采样和输出语义一致。
-
TensorRT-LLM ↗
- 解决的问题
- 在 NVIDIA 平台构建优化的 LLM 推理 engine 与服务执行路径。
- 核心机制
- 图优化、专用 kernel、量化、并行和 in-flight batching。
- 适用边界
- 平台绑定和构建产物管理是成本;不可与跨厂商结果脱离环境比较。
分布式服务编排
来源机制—工程启示—适用边界
| 来源机制 | 工程启示 | 适用边界 |
|---|---|---|
| 数据移动层级 | 把权重、激活、梯度、KV 和 checkpoint 分别标到实际内存/网络层。 | 不能只用容量判断;还要测访问频率、争用与尾延迟。 |
| 多维并行 | 让高频、细粒度通信留在最快拓扑,低频、大粒度通信再跨节点。 | 最佳 mesh 随模型形状、序列长度和集群拓扑变化。 |
| 分页 KV 与解耦服务 | 状态位置和所有权必须进入调度决策,并对传输失败负责。 | 缓存命中和阶段分离只有在目标 workload 下才构成收益。 |
| SLO goodput | 以 deadline 内完成的请求或有效训练 token 做容量目标。 | 平均 tokens/s 无法代表尾延迟、公平性或故障恢复。 |
动态过程演示
一次请求穿过 Prefill/Decode 解耦服务集群
逐步观察 token、KV blocks 与调度元数据走不同路径;每一步都可能改变 TTFT、ITL 或缓存命中。
准入与分词 · prompt + tenant + deadline → token IDs
网关校验限额、套用版本化聊天模板并估算 prompt/output 预算
错误 tokenizer 或模板会同时破坏语义、容量估算与 prefix 命中
循环 / 返回条件: 多轮会话携带稳定 prefix 再次进入路由;缓存命中时可跳过部分 Prefill。完成、取消、驱逐或版本变化时,KV 所有权必须原子释放,路由索引也要同步失效。
查看静态全景图
request → queue → prefill → decode → stream
│ TTFT │ ITL / KV
chip memory ↔ scale-up ↔ scale-out ↔ storage
└── topology + parallelism + SLO ──┘代码或命令示例
record(model, quant, prompt_tokens, output_tokens, hardware, temperature)
measure(TTFT, ITL_p50, ITL_p95, tokens_per_s, joules_per_token)
# 集群侧再记录 collective、KV 占用、goodput 与失败恢复时间动手实验
实验记录与导出
工程陷阱
核心测试
完成 3 道单选题后提交;提交前不会显示答案。
在 GitHub 上讨论本章
登录 GitHub 后提问、补充实测或分享你的实现;评论会保存在本课程的 GitHub Discussions 中。
评论区需要 JavaScript;也可以直接打开 GitHub 讨论区: 打开 GitHub 讨论区 ↗
延伸阅读
启下:下一章如何使用本章能力
终章把模型包、runtime、异构 backend、MCU/Host 安全边界、能耗、回退、OTA 与可观测性收束成可交付的端侧 LLM 产品。
下一天: Day 15 · 端侧 LLM 产品化