COMPUTE OPTIMIZATION · FROM SILICON TO TOKENS

算力优化技术全解

从芯片微架构、内存与互联,到训练与推理的每一层优化手法——一份把「算力为什么会被浪费、怎么被抢回来」彻底讲清楚的教材式长文。基于国内外一线论文、工程博客与官方文档编写,全部来源可溯。

版本:v1.0 · 2026-08-25 预计阅读:3–4 小时(可分章阅读) 配套:附录含分级精选阅读清单

CHAPTER 00全景:一次推理请求在硬件里的旅程

先建立一张地图。后面九章讲的每一种优化手法,都是在这条旅程的某个路段上抢时间。

你在对话框里敲下"帮我写个排序函数",按下回车。接下来发生的事,可以拆成一条清晰的物理链路——理解这条链路,就理解了算力优化的全部战场。

第一步:文字变数字。分词器(tokenizer)把这句话切成若干 token(约 10 个),每个 token 变成一个整数 ID,再通过嵌入表(embedding table)查表变成一个向量——比如 4,096 维的浮点数组。此刻数据量还很小,几十 KB。

第二步:数据进入显存。模型权重早已驻留在 GPU 的 HBM(高带宽显存)里。以 70B 参数的模型、BF16 精度计算,权重占 70×10⁹ × 2 字节 = 140 GB——一张 80GB 的 H100 装不下,所以必须切开放到至少两张卡上(这就是模型并行的物理起因:不是为了快,首先是为了装得下)。

第三步:逐层计算。输入向量穿过几十到上百层 Transformer 层,每层做同样的两件事:注意力(Attention)——让每个 token 去"看"上下文里的其他 token;前馈网络(FFN/MLP)——对每个 token 做一次独立的非线性变换。这两件事的绝大部分计算量都是矩阵乘法(GEMM),这就是为什么 GPU 里专门造了 Tensor Core 这种"只会算矩阵乘"的电路。每一层的计算都需要:把这一层的权重从 HBM 搬到芯片内部的缓存 → 搬到计算单元 → 算 → 结果写回。注意这个"搬"字——它是全文最重要的动词。

第四步:跨卡通信。如果模型被切在 8 张卡上,那么每一层算完(甚至算的中间)都需要卡与卡交换数据:把各自算的一部分结果汇总(all-reduce),或者把 token 分派给不同的专家(all-to-all)。这些通信走 NVLink(卡间)或 InfiniBand/RoCE(机间)。通信时计算单元在等待——这是有效算力被吃掉的第一大口。

第五步:出第一个字,然后逐字往外蹦。穿过所有层后得到 logits(词表上的概率分布),采样出第一个 token。到这里叫 Prefill(预填充)阶段结束,用户看到第一个字,这段耗时就是 TTFT。接着进入 Decode(解码)阶段:把刚生成的字接到序列末尾,再走一遍所有层,生成下一个字——每生成一个字,都要把 140 GB 的权重完整读一遍。这就是为什么 decode 阶段是被显存带宽卡死的,而不是被算力卡死。

第六步:省下的功夫。每个 token 在注意力里算出的 Key 和 Value 会被缓存下来(KV Cache),下一个 token 就不用重算前面所有 token 的 K/V——用显存换算力。上下文越长,这块缓存越大,长对话之所以贵就贵在这里。

一次请求的完整旅程:数据在哪里、瓶颈在哪里
上半为 Prefill(读题,算力受限);下半为 Decode(逐字作答,带宽受限)。红色标注的是算力被吃掉的五个位置
用户输入 切成 token HBM 显存(80GB · 3.35 TB/s):权重 140GB 装不下 → 必须切到多卡 | KV Cache 也住这里 逐层计算(几十~上百层) 注意力 + 前馈网络 绝大部分是矩阵乘 → 吃 Tensor Core 跨卡通信 all-reduce / all-to-all 走 NVLink 或 IB/RoCE → 计算单元在等待 出第一个字 到这里 = TTFT(首字时延) 此前叫 Prefill 阶段 算力受限(AI 高) ↓ 然后进入 Decode 循环:每生成一个字,都要把全部权重重读一遍 读全部权重 140 GB ÷ 3.35 TB/s ≈ 24 token/s 物理上限 (batch=1 时) 读写 KV Cache 用显存换算力 上下文越长越贵 吐出下一个字 间隔 = TPOT(逐字时延) 带宽受限(AI ≈ batch) 循环,直到生成结束 算力被吃掉的五个位置 = 本文余下九章的全部内容 ① 数据搬运(内存墙)→ 算子融合、量化、KV 压缩 ②跨卡通信等待(通信墙)→ 并行策略、通信计算重叠 ③ 计算单元空转 → 批处理、连续批处理、PD 分离 ④精度冗余 → 混合精度、低比特量化 ⑤ 故障与重算 → 容错、checkpoint、弹性训练
这条旅程上,算力被浪费在哪里

把上面的链路翻过来看,就是一张优化清单: 数据搬运的时间(内存墙)→ 用算子融合、量化、KV 压缩来少搬; 跨卡通信的等待(通信墙)→ 用并行策略设计、通信计算重叠来藏起来; 计算单元的空转(利用率)→ 用批处理、连续批处理、PD 分离来填满; 数值精度的浪费 → 用混合精度、低比特量化来降本; 故障与重算的损失 → 用容错、checkpoint、弹性训练来挽回。本文余下九章,就是这五件事的展开。

训练的旅程比推理多两段:算完前向要沿着同一条路反向传播算梯度(计算量约为前向的两倍),再用优化器(如 Adam)更新权重。所以训练不但要存权重,还要存梯度和优化器状态——显存压力是推理的好几倍,通信压力也是(每一步都要在成千上万张卡之间同步梯度)。这就是训练比推理难得多的根本原因。

CHAPTER 01硬件层:芯片、显存、互联

算力优化的一切上限都由硬件设定。这一章把"卡"拆开来看:算的部件、存的部件、连的部件。

1.1 GPU 为什么适合 AI:SIMT 与 Tensor Core

CPU 的设计目标是把一条复杂的指令流跑到最快,所以它花了大量晶体管在分支预测、乱序执行、大容量缓存上——像几个博士,各自能解难题。GPU 的设计目标相反:把成千上万条相同的简单运算同时跑完,所以它把晶体管几乎全部铺成计算单元——像几万个小学生,每人只会算加减乘除,但可以同时开工。

GPU 的组织方式叫 SIMT(Single Instruction, Multiple Threads,单指令多线程):硬件把线程按 32 个一组打包成 warp,一个 warp 里的 32 个线程在同一时刻执行同一条指令、只是作用在不同数据上。这个设计的代价是"分支分歧"(warp divergence)——如果 warp 内有一半线程走 if、一半走 else,硬件只能先跑完一支再跑另一支,效率对半砍。这就是为什么 GPU 讨厌带条件判断的代码,喜欢整齐的大块数据运算。

物理上,GPU 由几十到上百个 SM(Streaming Multiprocessor,流式多处理器)组成,每个 SM 内部有一批通用计算核心(CUDA Core)、若干 Tensor Core、寄存器堆和共享内存。Tensor Core 是 AI 时代的关键发明:它不是"更多的算术单元",而是一个专门的矩阵乘加电路——一条指令就完成一个小矩阵(如 16×16)与另一个小矩阵的乘加,把原本需要几百条指令的工作压成一条。代价是它只会做这一件事。这带来一个极其重要的性能事实:

Tensor Core 算力 ≈ 通用核心(CUDA Core)算力 × 8~16 倍 所以"能不能用上 Tensor Core"往往不是优化 10%、20% 的问题,而是差一个数量级。任何不能表达成矩阵乘的计算(逐元素加法、归一化、激活函数、softmax)都只能用通用核心跑,天然慢——这是"算子融合"这门手艺存在的根本原因:把这些碎片计算尽量合并、并塞进矩阵乘的间隙里。

1.2 内存层级:为什么"搬"比"算"贵

芯片上的存储不是一块,而是一座金字塔:越靠近计算单元的越快越小,越远的越慢越大。

GPU 内存层级金字塔(以 H100 SXM 为量级参考)
越往下容量越大、带宽越低、延迟越高;每下一级,"搬一个字节"的代价高一个台阶
寄存器 Registers 约 256 KB/SM · 数十 TB/s · ~1 周期 共享内存 / L1(SM 内,可编程) 约 228 KB/SM · 十几 TB/s · ~30 周期 L2 缓存(全芯片共享) 50 MB 量级 · 数 TB/s · ~200 周期 HBM 显存(板载) 80 GB · 约 3.35 TB/s · ~400–600 周期 ← 权重、KV Cache、激活值都住这里 主机内存 / NVMe(跨 PCIe) TB 级 · 数十~百 GB/s · 微秒级 ← offload 的去处,慢但便宜 容量↑ 带宽↓ 延迟↑ 关键比例:HBM 带宽 3.35 TB/s,而 BF16 算力约 990 TFLOPS —— 算力是带宽的近 300 倍 于是:每从 HBM 搬 1 字节,硬件"期待"你至少做 300 次浮点运算,否则算力就在空转

上图最后一行是全文的枢纽:现代加速器的算力增长远快于内存带宽增长(业界称"内存墙")。H100 的 BF16 算力约 990 TFLOPS,HBM 带宽约 3.35 TB/s,两者相除得到一个"硬件期望的计算密度"——约 300 次浮点运算/字节。任何低于这个密度的计算,都注定跑不满算力。这个数字是下一章 Roofline 分析的核心。

再看一个直觉:大矩阵乘法(GEMM)的计算密度可以做到很高(矩阵越大,每搬一个元素能参与的乘加次数越多),所以它能吃满 Tensor Core;而逐元素运算(如给张量每个数加个偏置)搬一个字节只算一次,密度约 1,比硬件期望低了两个数量级——这类算子无论在什么卡上都只能跑到峰值算力的百分之几,它们的耗时几乎完全由带宽决定。这就是为什么优化的第一原则往往不是"算得更快",而是"少搬数据"。

1.3 互联:从卡到超节点到集群

单卡装不下大模型,于是有了多卡;多卡需要交换数据,于是互联带宽成了新的瓶颈。层级从内到外:

层级技术带宽量级典型用途
卡内HBM 显存总线TB/s 级权重与激活读写
节点内(同一台服务器 8 卡)NVLink + NVSwitch(NV 系)/HCCS 等(国产系)数百 GB/s ~ 1 TB/s 级张量并行——通信最频繁,必须放在这一层
节点间(机架内/跨机架)InfiniBand 或 RoCE(以太网承载 RDMA)每卡 200–400 Gb/s 量级数据并行的梯度同步、流水线并行的层间传递
集群胖树(Fat-Tree)/轨道优化(rail-optimized)拓扑收敛比决定实际可用带宽万卡规模的整体组网

两个必须理解的概念:NVSwitch 与"全互联"——早期 GPU 之间是点对点连线,任意两卡之间带宽有限且不均等;加入交换芯片后,节点内任意两张卡都能以全带宽通信,这对张量并行至关重要(它的通信模式是全体参与的 all-reduce)。一个集群"能不能做大张量并行",直接由节点内有没有交换式全互联决定——这也是评价国产集群方案的关键指标之一,也是"超节点"路线的技术动机:用更大的高带宽域(把几十到上千张卡纳入一个近似全互联的域)来弥补单卡能力的不足。

InfiniBand 与 RoCE 的取舍——IB 是为高性能计算设计的专用网络,天生具备无损传输与低延迟,但贵且封闭;RoCE 是在以太网上跑 RDMA,成本低、生态开放,但需要精细的拥塞控制与流控调优(PFC/ECN),否则丢包重传会让集合通信性能雪崩。国产大规模集群多走 RoCE 路线,于是"网络调优"成了国产集群交付里一项独立的高价值手艺。

1.4 另一条路:DSA 与达芬奇架构

GPU 是"通用并行处理器",而 AI 芯片还有一条路线叫 DSA(Domain-Specific Architecture,领域专用架构):既然负载主要是矩阵乘,那就造一块专门算矩阵乘的电路,把通用性砍掉换能效。谷歌 TPU 的脉动阵列(systolic array)是经典代表——数据像脉搏一样在计算单元阵列中流动,每个单元只做"乘加并把结果传给邻居",几乎没有取指、调度、访存的额外开销,能效极高,但只对规整的大矩阵乘友好。

华为昇腾的达芬奇架构是同一思路的另一种实现:每个 AI Core 内部分成三个单元——Cube(矩阵计算单元,一拍完成大量乘加,对应 Tensor Core 的角色,是算力主体)、Vector(向量单元,处理归一化、激活、逐元素运算)、Scalar(标量单元,做控制流与地址计算);配合多级片上缓冲(L0 用于 Cube 的输入输出、L1 与统一缓冲 UB 用于更大块的数据暂存)。它与 GPU 的关键差别在于片上内存需要程序员显式管理:CUDA 编程时你主要管线程逻辑、缓存由硬件自动打理;而在达芬奇上写算子(Ascend C)必须自己规划数据怎么分块(Tiling)、什么时候从 HBM 搬进 UB、怎么在 Cube 与 Vector 之间编排流水。

这个架构差异的直接后果,也是国产卡"难用"的技术起点

CUDA 算子无法翻译,只能按硬件重写——生态迁移不是编译问题,是重写工作量问题; Cube 强而 Vector 相对弱,模型里"不像矩阵乘"的部分容易成为瓶颈,对算子融合的依赖更重; 矩阵与向量单元之间的数据倒手若缺少共享的高速缓冲,像 FlashAttention 这种"矩阵—向量交替"的核心算子实现难度陡增; 显式内存管理意味着性能与开发者水平强相关——同一块硬件,高手和新手写出的算子可能差数倍。这四条合起来,就是"同样的卡,会用和不会用差一倍以上"的物理解释。

1.5 国产路线的最新答卷:昇腾 950 与灵衢总线

2025 年 9 月至 2026 年 6 月,华为陆续发布了两份技术纲领性文件——《昇腾 950 NPU 架构白皮书》灵衢(UnifiedBus)2.0 技术规范及配套的《基于灵衢的超节点参考架构白皮书》。它们把前四节讲的所有权衡(单卡 vs 系统、SIMT vs DSA、消息语义 vs 内存语义)摆到了一个具体的技术路线上,值得单独一节精读。

口径说明:本节标注【白皮书】的数据出自《昇腾 950 NPU 架构白皮书》(2026 年 6 月,40 页)正文与表格;标注【发布会】的出自 2025 年 9 月华为全联接大会主题演讲与官方新闻稿;标注【第三方】的为非华为来源的分析或估算。三者不可混用——例如白皮书正文全程只称"高速片上内存",从未出现 HiBL / HiZQ 这些内存品牌名,那些名称只见于发布会口径。

一颗 die,两种内存:用内存做产品线分割

950PR 与 950DT 是共架构、同源同 die 的两款芯片【白皮书】,物理构成为多 die 合封:2 个 AI die + 2 个 IO die + 若干高速片上内存模块,通过片间互联构成统一内存访问(UMA)整体。完整规格含 36 个第三代达芬奇 AI 子系统(每个 = 1 个 Cube Core + 2 个 Vector Core)、4 个 AI CPU 集群、128MB 统一 L2 Cache,Cube 阵列仍是 16×16×16 FP16。

真正区分两款产品的是内存

项目昇腾 950PR昇腾 950DT参照:H100 SXM
定位推荐系统、大模型 Prefill、多模态推理预训练、后训练、推理全流程(含 Decode)通用
FP8 类算力(HiF8/MXFP8/FP8)919 TFLOPS1,034 TFLOPS1,979(稠密)
MXFP4 算力1,784 TFLOPS2,007 TFLOPS—(Hopper 无 FP4)
BF16 / FP16486 TFLOPS547 TFLOPS989
片上内存容量128 GB144 GB80 GB
内存带宽1.6 TB/s4 TB/s3.35 TB/s
对外互联带宽2 TB/s(2,016 GB/s 双向)同左0.9 TB/s(NVLink4)

算力数据为白皮书表 3-1 的顶配值(该表还列出了 28/32 核等裁剪档位)。发布会口径的"1 PFLOPS FP8 / 2 PFLOPS FP4"是约整说法,精确值即上表。H100 数字为官方稠密口径,供量级对照。

这张表里有三个值得停下来想的事实。第一,访存带宽已经反超。950DT 的 4 TB/s 高于 H100 的 3.35 TB/s(HBM3),逼近 HBM4 级别——回想第 1.2 节的结论"搬比算贵"、第 2 章的"Decode 阶段被带宽卡死",带宽领先在推理场景的价值被严重低估了第二,FP8 稠密算力仍有数倍差距(对比同期的 B300 更明显),这是制程代差的直接体现,短期无解。第三,用内存切分产品线是垂直整合才有的自由度:同一颗 die 配低成本大容量内存就做 Prefill 与推荐(发布会称硬件投资成本降低 40% 以上,访存粒度从 512 字节降到 128 字节),配高带宽内存就做训练与 Decode。向外采购 HBM 的厂商做不到这件事——而 HBM 供应此前恰恰是国产算力真正的瓶颈(不是制程,是内存买不到就直接停摆)。

HiF8:一种绕开缩放因子的 8 位浮点格式

第 5.2 节讲过 FP8 的困境:8 位的动态范围太窄,业界主流方案(MXFP8)靠外挂一个 8 位缩放因子把数值拉回可表示范围。HiF8 走了另一条路——把自适应机制做进格式内部【白皮书】。

它的编码用一段变长前缀码(白皮书称"点位域 Dot")来显式指示"这个数的阶码占几位":Dot=0 表示阶码为 0,Dot=1 表示 ±1,Dot=2 表示 ±[2,3],Dot=3 表示 ±[4,7],Dot=4 表示 ±[8,15];阶码用原码编码并隐藏 1 个固定比特不存储,确保不同位宽的阶码表达范围不重复——即无冗余编码。加上非规格化数的处理,综合阶码范围达到 [-22, 15] 共 38 个阶码,而 FP8 的 E4M3 格式只有 18 个(FP16 是 40 个)。

这个设计的两个直接后果

① 不需要额外的缩放因子。白皮书原文明确对比:相比 MXFP8,HiF8 无需那 8 位 MX 缩放因子——省掉的是缩放因子的存储、传输与对齐开销,量化策略也从"逐张量/逐块搜 scale"部分转向"信任格式本身"。② 锥形精度(tapered precision)。数值靠近 1 时精度最高(有效位 4 bit),远离 1 时精度按 1 bit 逐级渐变、无跳变——这恰好匹配神经网络中数值分布集中在 1 附近的特性。代价是工具链负担:需要专门的转换算子、校准流程与混合精度搜索策略。

算力上的对应关系很干净:同频下 HiF8/MXFP8/FP8 = 2× FP16,MXFP4 = 4× FP16。MXFP4 那 4 倍算力是最大的诱惑也是最大的难题——要真正吃到,需要解决 4 bit 下权重与激活的可用性,这是算法与 Infra 的共同课题。(顺带一个易错点:HiF4 是下一代昇腾 960 的特性,不在 950 上。)

路线图:一年一代,算力与互联双双翻倍

昇腾芯片路线图(2026–2028):官方给出的倍数关系
柱长为 FP8 稠密算力(PFLOPS);下方标注互联带宽与访存带宽的代际倍数 · 来源:发布会口径
昇腾 950PR 2026 Q1 FP8 1 P · FP4 2 P | 内存 128GB / 1.6 TB/s | 互联 2 TB/s 昇腾 950DT 2026 Q4→提前 8 月 FP8 1 P · FP4 2 P | 内存 144GB / 4 TB/s | 互联 2 TB/s 昇腾 960 2027 Q4 FP8 2 P · FP4 4 P | 规格全面翻倍 + 新增 HiF4 | 互联 4 TB/s 昇腾 970 2028 Q4 FP8 4 P · FP4 8 P | 访存 ≥1.5× | 互联 8 TB/s 规律:算力每代 ×2、互联带宽每代 ×2、访存带宽 ×1.5~2,节奏是一年一代 对比第 1.2 节的行业规律(算力每两年 3.0×、带宽仅 1.6×)——这份路线图承诺的是带宽与算力同步翻倍,即刻意不让内存墙继续恶化。 这与"互联带宽每代翻倍"合起来,指向同一个战略:把竞争维度从单卡挪到系统。

灵衢(UnifiedBus):把"网络"和"内存"之间那道墙拆掉

如果说昇腾 950 是这条路线的"点",灵衢就是把点连成面的东西——也是这两份白皮书里技术含量最高的部分。官方定义:"华为定义的统一的互联标准协议,更高效地支持计算原生的内存语义、IO 语义和网络通信语义"【白皮书术语表】。名字取自"九省通衢",寓意大规模算力的联通。

它要解决的问题,正是第 1.3 节那条铁律的成因:传统架构里"网络层"与"内部架构层"之间有一道墙——数据跨节点要"打包、发送、等待、解包",每次都要开门再关门。灵衢的做法是直接拆掉这道墙:底层用网络的逻辑连设备,上层用架构的逻辑管资源。灵衢团队自己的说法是做"算力普通话"——一套协议同时覆盖超节点内的 CPU/NPU 沟通与超节点间的集群互联,不用中途换语言。

两种语义:消息语义(RDMA)vs 内存语义(UB Memory)
这是灵衢最核心的设计,也是它对 Infra 软件影响最大的地方
消息语义(TCP / RDMA) 显式 · 粗粒度 · 有软件握手开销 应用准备缓冲区 打包 · 提交请求 网卡发送 · 对端接收 轮询完成队列 解包 · 交给应用 每次跨节点访问都要走完整条流水 软件开销固定,小数据尤其不划算 内存语义(UB Memory) 原生指令 · 细粒度 · 无应用层干预 计算核心直接发指令 Load / Store / Atomic Memory Decoder 定位目的节点与地址 对端 UMMU 地址翻译 + 权限校验 直接读写对端内存 → 全程无应用参与 配套的异步通道 URMA(消息/拷贝语义) 队列 + Doorbell 入口,支持 Write / Read / Send / 原子操作 两种传输层:可靠传输(端到端重传)与简易传输(换取更多端口带宽) 硬件卸载的集合通信单元 CCU Broadcast / Reduce-Scatter / All-Gather / All-Reduce / All-to-All 由专用引擎完成 → 不占用计算核心算力,也不吃系统总线带宽 前提条件:统一地址空间(UB Memory 最高 128 TB 共享)+ 超低时延高带宽的 Scale-Up 网络 没有统一寻址就无法内存池化,无法池化就无法把 KV Cache、参数、CPU 内存池当成一块大内存用

灵衢 2.0 的关键指标【发布会 / 白皮书】:互联时延 2.1 微秒(1,024 卡系统的端到端往返时延低至 3 微秒,为另一口径)、互联距离超过 200 米、故障检测与保护达 100 纳秒级、光互联可靠性提升 100 倍、单芯片 UB 带宽 2,016 GB/s 双向、最大支持 8,192 卡的高带宽域(上一代是 384 卡)、共享内存空间最高 128 TB。官方给出的实测收益是 AI 大模型训练端到端提升 20% 以上。

开放策略:2025 年 9 月发布并开放灵衢 2.0 技术规范,公开的文件包括《灵衢基础规范 2.0》《灵衢固件规范 2.0》《灵衢使能操作系统参考设计 2.0》《基于灵衢的超节点参考架构白皮书》,并配套第三方协议验证机制(厂商按标准实现后可验证合规)。从物理层到事务层的规范全部公开,路径是"先企标、再团标、乃至国标"。这与 NVLink 的封闭形成鲜明对照,也是它试图撬动生态的关键筹码——不过截至目前,已公开的加入厂商名单仍是信息缺口

超节点:把竞争维度从单卡挪到系统

项目Atlas 950 SuperPoDAtlas 960 SuperPoD当前商用单元
卡规模8,192 张 950DT15,488 张 9601,024 卡
FP8 / FP4 总算力8 / 16 EFLOPS30 / 60 EFLOPS1 / 2 EFLOPS
总内存(统一编址)1,152 TB4,460 TB256 TB
互联总带宽16.3 PB/s34 PB/sTB 级/卡
机柜 / 占地160 柜 / 约 1,000 m²220 柜 / 约 2,200 m²20 柜
上市2026 Q42027 Q4已商用(PUE < 1.15)

官方给出的对比口径全部是系统级的:Atlas 950 超节点相对英伟达 NVL144,NPU 数量 56.8 倍、总算力 6.7 倍、内存容量 15 倍、互联带宽 62 倍【发布会】。再往上还有集群层:64 个超节点组成的 SuperCluster 达 52 万卡、524 EFLOPS(FP8);2027 年规划百万卡级、2 ZFLOPS。

读这些数字时必须同时看到代价

这是一条明确的"规模换效率"路线:用互联能力与系统集成,把单 die 的制程劣势在系统层抹平。代价是实打实的:8,192 卡要 160 个机柜、约 1,000 平方米场地;第三方评估认为单位算力能效约差 2.3 倍(非官方口径,且官方未公布超节点整体功耗,引用需谨慎)。换句话说,这条路线的成立前提是电力与场地成本相对可承受——在电价低廉、土地充裕的地区它非常合理,换个约束条件结论就会不同。对本文的读者,这是一个绝佳的案例:没有绝对最优的架构,只有在给定约束下最优的架构。

最后回到第 4 章要用的那条结论:高带宽域从 384 卡扩到 8,192 卡,是并行策略设计空间的质变。张量并行不再被"单机 8 卡"的墙锁死,序列并行不再受机内卡数限制,MoE 的专家可以整体放进一个高带宽域而不被机器边界撕裂——而最痛的 all-to-all 通信还被 CCU 硬件接走了。具体这对优化工作意味着什么,第 9.6 节会接着讲。

CHAPTER 02Roofline:判断瓶颈的通用标尺

优化之前必须先回答一个问题:这段代码是被算力卡住,还是被带宽卡住?Roofline 模型给出可计算的答案。

2.1 三个量:FLOPs、Bytes、算术强度

任何一段计算都可以用三个数字刻画:需要做多少次浮点运算(FLOPs)、需要从显存搬多少字节(Bytes)、以及两者的比值——算术强度(Arithmetic Intensity,也叫计算密度):

算术强度 AI = 总浮点运算次数 ÷ 总访存字节数 (单位:FLOPs/Byte) 硬件侧对应一个"拐点":拐点 = 峰值算力 ÷ 峰值内存带宽。低于拐点的负载受带宽限制(memory-bound),高于拐点的受算力限制(compute-bound)。
拐点(H100, BF16) = 990 TFLOPS ÷ 3.35 TB/s ≈ 295 FLOPs/Byte 即:一段计算若每搬 1 字节做不到约 300 次浮点运算,它就永远吃不满 H100 的 Tensor Core,无论代码写得多好——上限由带宽决定。
Roofline 图:屋顶下的两个世界
横轴算术强度(对数尺度),纵轴可达性能;斜坡=带宽受限区,平顶=算力受限区
算术强度 AI(FLOPs/Byte,对数) 可达性能(TFLOPS) 拐点 ≈ 295 带宽上限(斜坡) 算力上限 990 TFLOPS(平顶) memory-bound:搬不过来 compute-bound:算不过来 逐元素算子 / LayerNorm(AI≈1–10) Decode 阶段(AI≈batch 大小量级) 未优化 Attention 大矩阵乘 / Prefill(AI 可达数百~数千)

2.2 三个算例:把每类负载放到图上

算例一 · 逐元素算子为什么无药可救

给一个 BF16 张量每个元素加个偏置:读 2 字节、写 2 字节,只做 1 次加法 → AI = 1 ÷ 4 = 0.25 FLOPs/Byte。距拐点 295 差了三个数量级,可达性能 ≈ 0.25 × 3.35 TB/s ≈ 0.84 TFLOPS,只有峰值的 0.08%。结论:这类算子的耗时纯粹由访存量决定,唯一的优化是把它"融合"进相邻算子里,省掉一次显存往返。这就是 kernel fusion 的全部收益来源。

算例二 · Decode 阶段的天花板(推理成本的物理下限)

70B 模型、BF16 权重(140 GB),batch=1 时每生成一个 token 必须把全部权重读一遍:AI ≈ 2×70e9 FLOPs ÷ 140e9 Bytes = 1 FLOPs/Byte——严重带宽受限。理论速度上限 = 3.35 TB/s ÷ 140 GB ≈ 24 token/s(单卡若装得下的情况下)。关键洞察:把 batch 提到 64,权重只需读一次却服务 64 个请求,算术强度和吞吐几乎线性提升,而单请求速度几乎不变。这就是连续批处理(continuous batching)为什么是推理优化的第一杠杆——它把 decode 从带宽受限往算力受限的方向拖。

算例三 · Prefill 与训练为什么能吃满算力

Prefill 阶段一次处理整段输入(如 2,048 个 token),权重读一次服务 2,048 个 token 的计算,算术强度轻松达到数百以上 → 落在平顶区,是 compute-bound。推论:Prefill 与训练比的是算力和算子实现质量;Decode 比的是带宽、显存和批处理策略。同一套硬件上,这是两门不同的手艺——这也正是第 7 章 PD 分离的理论依据。

2.3 优化决策树:先量瓶颈,再动手

Roofline 给出的不只是解释,更是一套动作指引:

诊断症状有效手段无效手段
带宽受限算力利用率极低,改用更强算力的卡毫无提升算子融合、量化(减少字节)、KV Cache 压缩、提高 batch、重排数据布局提升缓存命中换算力更高的卡、优化数学运算次数
算力受限已接近峰值算力的合理比例用上 Tensor Core(对齐尺寸/精度)、更优的分块与流水、降低精度(BF16→FP8)继续减少访存
延迟受限算力与带宽都不满,卡在等指令或等同步消除 host 瓶颈(图模式/CUDA Graph)、增大并发、异步化、通信计算重叠单纯优化单个算子
通信受限单卡指标正常但集群扩展性差调整并行策略、拓扑感知放置、通信压缩与重叠、网络调优优化单卡算子

工程实践上,这四类诊断靠 profiling 工具(NVIDIA 侧的 Nsight Systems/Compute,昇腾侧的 msprof/MindStudio)给出的时间线来区分:看计算流、通信流、host 侧调度三条时间线上谁在忙、谁在等。不做 profiling 就动手优化,是这一行最常见的浪费。

CHAPTER 03软件栈:从驱动到框架的七层

硬件的能力要经过一整条软件链路才能被模型用上。任何一层不成熟,上面的性能就漏水——这是"生态"二字的技术含义。

3.1 七层结构与两大生态对照

职责NVIDIA 生态昇腾生态
① 驱动 / 固件操作系统与芯片对话,设备管理NVIDIA DriverAscend Driver + 固件
② Runtime内存分配、任务下发、流与事件同步CUDA RuntimeCANN Runtime(ACL 接口)
③ 算子库预先写好并调优的高性能计算内核cuBLAS / cuDNN / CUTLASSaclnn 算子库 / Ascend C 自定义算子
④ 通信库多卡集合通信(all-reduce 等)NCCLHCCL
⑤ 编译器 / 图引擎把计算图优化并编译为设备可执行NVCC、TensorRT、torch.compile/InductorGE 图引擎、毕昇编译器、AOE 自动调优
⑥ 框架定义与执行模型,自动微分PyTorch(一等公民)、JAXMindSpore(原生)、torch_npu(适配层)
⑦ 分布式 / 服务引擎大规模训练与推理的调度编排Megatron-LM、DeepSpeed、vLLM、SGLangMindSpeed、上述引擎的昇腾适配版本
两大生态的软件栈逐层对照
同一层做同样的事,成熟度差距主要在算子库、编译器与社区厚度三层
NVIDIA 生态 昇腾生态 PyTorch(一等公民)· JAX MindSpore(原生)· torch_npu(适配层) Megatron · DeepSpeed · vLLM · SGLang MindSpeed · 上述引擎的昇腾适配版 TensorRT · XLA · torch.compile GE 图引擎 · 毕昇编译器 · AOE 自动调优 cuBLAS · cuDNN · CUTLASS aclnn 算子库 · Ascend C · Catlass NCCL(集合通信) HCCL(集合通信) CUDA Runtime CANN Runtime(AscendCL) Driver + 固件(nvidia-smi) Driver + 固件(npu-smi) 框架 分布式/引擎 编译 算子库 通信 Runtime 驱动 「能跑」只需要算子库与框架的基本功能可用;「跑得好」要求这七层每一层都逼近硬件上限 迁移的工作量集中在算子库、编译、通信这三层——恰好也是最需要硬件纵深知识的三层

这张表解释了两件事。第一,为什么"能跑"和"跑得好"差距巨大:模型能跑起来只需要③⑥两层最基本的功能可用;而跑得好要求③的算子逼近硬件峰值、④的通信高效、⑤的编译能做全局优化、⑦的调度不留空转——任何一层短板都直接砍掉有效算力。第二,为什么迁移的工作量被系统性低估:迁移不是"改个 device 名",而是要在③④⑤三层逐一验证性能与数值,而这三层恰好是最需要硬件纵深知识的地方。

3.2 算子:性能的最小单元

算子(Operator / Kernel)是计算图的最小执行单位:一次矩阵乘、一次 softmax、一次归一化都是一个算子。一个大模型跑起来是几百上千个算子按顺序执行。三个必须理解的概念:

3.3 执行方式:即时执行、图模式与 CUDA Graph

同一个模型有三种执行方式,性能差异显著:

即时执行(Eager)

CPU 逐个算子向设备下发指令。灵活、易调试(Python 里可以单步看每个中间结果),但每个算子都有固定的下发开销。当单个算子的执行时间小于下发开销时,设备就在等 CPU——这就是 host bound

图模式(Graph Mode)

先把整张计算图捕获下来,做全局优化(融合、常量折叠、内存复用)后一次性交给设备执行。性能好,但要求形状静态、调试困难、动态控制流受限。昇腾的"整图下沉"、TensorFlow 的静态图都属于这一路。

CUDA Graph / 图下沉

折中方案:把一串算子的下发过程"录制"成一个可重放的单元,之后一次调用重放全部。消除 CPU 下发开销而不必重写模型,对 decode 这种小算子密集的场景收益显著,vLLM/SGLang 默认启用。

编译器的角色与局限。AI 编译器(TVM、XLA、torch.compile、昇腾侧的图算融合与 AOE)自动完成"图 → 高效设备代码"的翻译,能自动做算子融合、内存规划与部分调优。但业界的现实是:编译器自动生成的算子在关键路径上通常仍打不过顶尖手写实现(手写能利用编译器难以自动发现的数学等价变换与硬件细节)。因此专业团队的标准打法是"手写关键算子攻性能、编译器铺长尾补覆盖"——这也是评估一个优化团队深度的试金石:只会调编译器参数的是使用者,能手写关键算子的才是能解决问题的人。

CHAPTER 04训练优化 I:并行策略全谱

一个模型放不进一张卡,就必须切开。怎么切决定了通信量,通信量决定了集群效率——这是大规模训练最核心的设计决策。

4.1 先看清约束:为什么必须切

训练一个 70B 模型,显存需求远不止权重那 140 GB。用 Adam 优化器的混合精度训练,每个参数需要存:

每参数显存 ≈ 2(BF16 权重)+ 2(BF16 梯度)+ 4(FP32 主权重)+ 4(Adam 一阶动量)+ 4(Adam 二阶动量)= 16 字节 70B 参数 × 16 字节 ≈ 1,120 GB —— 还没算激活值。一张 80GB 的卡装不下十四分之一。这就是模型并行的第一动机:不是为了快,是为了装得下。

加上前向过程中必须保存下来供反向使用的激活值(与批大小、序列长度成正比,长序列场景下可能比权重还大),显存就是大规模训练的第一约束。于是有了下面这一整套"怎么切"的技术谱系。

四种并行的切分维度:切什么、通信什么
同一个模型(3 层、每层一个权重矩阵)在 4 张卡上的四种切法
① 数据并行 DP:每卡一份完整模型,各算不同数据 卡0 · batch A 卡1 · batch B 卡2 · batch C 卡3 · batch D 每步一次 all-reduce 同步梯度(通信量 ≈ 2×参数量) ✓ 实现最简单、扩展性最好 ✗ 每卡都要装下整个模型 → 大模型放不下 → 于是有了 ZeRO(第 5 章)来切分状态 ② 张量并行 TP:把每一层的权重矩阵横向切开,多卡合力算一层 卡0 卡1 卡2 卡3 每层前向 + 反向各一次 all-reduce → 通信极其频繁 ✓ 单层显存压力直接除以卡数 ✗ 通信在关键路径上,必须高带宽 → 只能放在节点内(NVLink 域) ③ 流水线并行 PP:按层纵向切,每卡负责几层,像装配线接力 第 1 层 卡0 第 2 层 卡1 第 3 层 卡2 第 4 层 卡3 ✓ 通信量最小(只传层间激活值) ✗ 有"气泡":卡等上游 → 需切 micro-batch 填充 → 适合跨节点使用 ④ 专家并行 EP(MoE 专用):按"专家"分卡,token 被路由到不同卡 专家 1–2 专家 3–4 专家 5–6 专家 7–8 ✓ 激活参数少、总容量大 ✗ all-to-all 通信 + 负载不均

4.2 数据并行(DP):最简单,也最先撞墙

做法:每张卡保存一份完整模型,各自处理不同的数据批次,反向算完梯度后所有卡做一次 all-reduce 求平均,再各自更新权重——保证所有卡的模型始终一致。

通信量:每步需要同步全部梯度,通信量约为 2 × 参数量(ring all-reduce 的经典结论:每张卡发送与接收的数据量各约等于梯度总量,与卡数几乎无关,这是它扩展性好的原因)。70B 模型 BF16 梯度约 140 GB,即每一步都要在网络上搬运百 GB 量级的数据——所以数据并行的规模上限往往由网络带宽和梯度同步能否与反向计算重叠决定。

局限:每卡都要装下完整的权重 + 梯度 + 优化器状态。这直接催生了 ZeRO(第 5 章)——它把"每卡一份完整状态"改成"状态也切开",在保持数据并行简洁性的同时解决显存问题。

4.3 张量并行(TP):算一层要多卡合作

做法:把单个权重矩阵切开。以 Transformer 的 FFN 为例:第一个矩阵按列切(每卡算一部分中间结果,无需通信),第二个矩阵按行切(每卡算出部分和,然后 all-reduce 求和得到正确结果)。注意力部分则按注意力头切分——天然并行,每卡算一部分头。这套切法是 Megatron-LM 的经典设计,妙处在于一层里只需要在特定位置做两次通信(前向一次 all-reduce、反向一次)。

代价:通信次数与层数成正比,且位于计算的关键路径上(下一步计算必须等通信完成)。所以 TP 有一条铁律:张量并行组必须放在同一节点内、走 NVLink 级的高带宽域。跨节点做 TP 会让通信开销吞掉全部收益。这也解释了第 1 章的结论:节点内是否有交换式全互联,直接决定这个集群能做多大的 TP,进而决定能训多大的模型。

4.4 流水线并行(PP):气泡是它的原罪

做法:把模型按层切成若干"段"(stage),每卡负责一段,数据像流水线一样依次穿过。通信量最小——只在段与段之间传递激活值。

气泡(bubble):朴素实现下,卡 1 在算的时候卡 2、3、4 都在等,利用率极低。解法是把一个批次切成多个 micro-batch 依次注入,让各段同时忙起来。但流水线的填充和排空阶段仍有空转:

气泡占比 ≈ (p − 1) / (m + p − 1)  p = 流水线段数,m = micro-batch 数量 例:p=8、m=8 时气泡占比 = 7/15 ≈ 47%(浪费近一半);把 m 提到 64,气泡降至 7/71 ≈ 10%。这就是为什么大规模训练要用很大的全局批量——不是为了收敛,是为了填流水线。此外,1F1B(交替执行一次前向一次反向)与交错式(interleaved)调度可以进一步压缩气泡与激活显存。

4.5 专家并行(EP)与序列/上下文并行(SP/CP)

专家并行是 MoE 模型的专属切法:把不同的专家放到不同卡上,每个 token 经路由器决定去哪几个专家。通信模式是 all-to-all——每张卡都要把自己的 token 发给持有对应专家的所有卡,再把结果收回来。这是最"吵"的通信模式,对互联带宽的要求比 all-reduce 更苛刻;再叠加专家负载不均(热门专家所在的卡忙死、冷门专家的卡闲着),使 MoE 的工程难度显著高于稠密模型。DeepSeek 等团队的做法是大规模 EP(把专家摊到上百张卡)配合冗余专家副本与精细的通信—计算重叠。

序列并行 / 上下文并行解决的是长序列问题:当上下文长到 128K、1M,单卡连一条序列的激活值都存不下,于是把序列本身切开分到多卡。注意力需要每个 token 看到全部上下文,因此要用 Ring Attention 之类的方案,让各卡的 K/V 分块像接力一样环形流转,边传边算。

4.6 组合:3D 并行与配置原则

实际的万卡训练是多种并行的乘积组合,例如 TP=8 × PP=4 × DP=32 共用 1,024 卡。业界形成的配置原则相当稳定:

并行方式通信模式与频率通信量级放置位置主要作用
张量并行 TPall-reduce,每层数次高(激活值级 × 层数)节点内,通常 ≤8降低单层显存与单卡算力压力
专家并行 EPall-to-all,每 MoE 层两次高且不规则节点内优先,可跨节点承载 MoE 的巨大总参数量
序列/上下文并行环形 P2P 或 all-gather中(与序列长度相关)节点内优先支撑超长上下文
流水线并行 PP点对点,每段边界一次低(只传边界激活)跨节点把超大模型摊到更多节点
数据并行 DPall-reduce,每步一次(可与反向重叠)中(梯度级,可重叠隐藏)最外层,跨机架扩大吞吐、消化更多数据
配置的经验法则(这几条是并行调优的"内行常识")

从内到外按通信频率排列:TP/EP 在最内(节点内),PP 居中(跨节点),DP 在最外——让最吵的通信走最短的线; TP 规模不超过单节点卡数(通常 8),除非有超节点级的大高带宽域; 先用 TP 把单卡显存压下来,再用 PP 扩到装得下,剩下的卡全部给 DP 提吞吐; micro-batch 数量至少是流水线段数的 4 倍以上,否则气泡吃掉的比并行省下的更多; 一切以 profiling 结果为准——同样的模型换一种网络拓扑,最优配置可能完全不同。"并行策略定制"这项服务的技术含量就在这里:它是一个受硬件拓扑、模型结构、序列长度、批量大小共同约束的搜索问题,没有通用最优解。

CHAPTER 05训练优化 II:显存、精度、算子与 MFU

并行解决"装得下",这一章解决"跑得快、算得准、省得下"——以及如何用一个数字衡量全部成果。

5.1 显存账本:钱花在哪了

70B 模型训练的显存构成(Adam + BF16 混合精度,单卡视角,未做任何切分)
每参数 16 字节的拆解——这张图解释了 ZeRO 为什么必须存在
BF16 权重 140 GB(2 字节/参数) BF16 梯度 140 GB(2 字节/参数) FP32 主权重 280 GB(4 字节/参数) Adam 动量 m 280 GB(4 字节/参数) Adam 方差 v 280 GB(4 字节/参数) 激活值 与批量 × 序列长度成正比,长序列下可超过权重 合计 ≈ 1,120 GB + 激活值 → 需要 14 张 80GB 卡才装得下「一份」训练状态 优化器状态(FP32 主权重 + 两个动量)占了 75%——这正是 ZeRO 首先要切的部分

ZeRO(Zero Redundancy Optimizer)的洞察极简:在数据并行里,每张卡都存着完全相同的优化器状态、梯度和权重——这是纯粹的冗余。既然如此,不如切开,每卡只存 1/N,需要时再临时通信取回:

阶段切分内容显存降幅(N 卡数据并行)额外通信典型用法
ZeRO-1优化器状态约降至 1/4(占比最大的部分被切)基本无额外(reduce-scatter 替代 all-reduce)几乎无脑开启
ZeRO-2+ 梯度约降至 1/8轻微常用默认
ZeRO-3+ 权重(用时 all-gather 取回)约 1/N(线性下降)显著:每层前向/反向都要收集权重显存极度紧张时;需与计算重叠
Offload状态挪到 CPU 内存 / NVMe显存几乎不受限受 PCIe 带宽严重限制小规模/单机场景救急
ZeRO 三阶段:切掉数据并行里的冗余
以 4 卡为例。同色块代表同一份数据;朴素数据并行下每卡都存着完全相同的副本
朴素数据并行:每卡一份完整状态(16 字节/参数) 权重 梯度 优化器状态 75% × 4 卡,四份完全一样 → 纯冗余 70B 模型:每卡 1,120 GB,装不下 ZeRO-1:切优化器状态(显存降至约 1/4,通信量不变——几乎免费) 其他卡持有 每卡只存 1/4 的优化器状态,更新时各管一段 ZeRO-2:再切梯度(约 1/8,通信量仍不变) 反向时用 reduce-scatter 替代 all-reduce,各卡只收自己负责那段的梯度 ZeRO-3:连权重也切(显存随卡数线性下降,代价是通信量 ×1.5) 每层前向/反向都要临时 all-gather 把权重收回来算完再丢掉 → 必须与计算重叠(prefetch 下一层),否则通信开销吃掉收益

激活重计算(gradient checkpointing)是另一把利器:前向时只保存少数"检查点"层的激活,其余丢弃;反向需要时用检查点重新算一遍。典型效果是激活显存降低到平方根量级,代价是额外约 30% 的前向计算量——标准的时间换空间。这也引出了一个重要的指标区分:MFU 与 HFU。HFU(Hardware FLOPs Utilization)把重计算的额外计算也算作"有用工作",MFU 只算模型本身所需的计算。所以同一次训练 HFU 总是高于 MFU,比较两个团队的成绩时必须确认口径一致——这是行业里常见的"数据打架"来源之一。

5.2 数值精度:动态范围比精度更重要

格式总位数指数位 / 尾数位特点用途
FP32328 / 23范围与精度都够用,慢且占显存主权重、优化器状态、敏感计算
TF3219(存储仍占 32)8 / 10范围同 FP32、精度降低,Tensor Core 可加速NVIDIA 上的默认矩阵乘加速档
FP16165 / 10精度尚可但动态范围窄,易上溢/下溢需配 loss scaling;推理常用
BF16168 / 7范围与 FP32 相同,精度更低但训练更稳现代训练的默认选择
FP88E4M3 / E5M2 两种再快一倍、再省一半,但需精细的缩放策略前沿训练与推理,工程门槛高

这张表里最关键的一行是 BF16 与 FP16 的对比。FP16 只有 5 个指数位,能表示的最小正常数约 6×10⁻⁵——而深度学习里梯度经常比这更小,于是直接变成 0(下溢),训练失败。历史上的解法是 loss scaling:把损失乘上一个大系数(如 1024)把梯度整体抬进 FP16 的可表示范围,更新前再除回去。BF16 用 8 个指数位换掉 3 位尾数,动态范围与 FP32 一致,从此不再需要 loss scaling——训练稳定性的价值超过了那点精度损失,这是深度学习数值实践中最重要的一次取舍。

FP8 的挑战在于 8 位的动态范围实在太窄,必须做细粒度的缩放(per-tensor 甚至 per-block 的缩放因子)、并对敏感环节(如注意力的累加、优化器更新)保留更高精度。DeepSeek V3 的技术报告展示了一套完整的 FP8 训练方案(细粒度量化 + 高精度累加 + 关键路径保留 BF16),是这条路线上最重要的公开工程参考。

跨硬件的精度陷阱:为什么"同样的配方在新卡上炼糊了"

浮点加法不满足结合律:(a+b)+c ≠ a+(b+c)。而不同硬件的归约顺序、累加位宽、并行拆分方式各不相同,于是同一个数学表达式在两块芯片上得到的结果在最后几位就是不同的。单步差异微不足道,但训练要走几十万步,误差会被反复放大、与学习率和梯度裁剪相互作用,最终可能表现为 loss 曲线分叉、发散或收敛到更差的点。这就是"精度对齐"工作的本质:不是要求两块卡逐位一致(通常做不到),而是要把差异控制在不影响收敛的范围内,并具备逐层定位差异来源的能力。标准方法论是分层对标——先固定随机性(种子、确定性算子)→ 单算子逐个比对(输入相同,看输出的相对误差与最大绝对误差)→ 逐层前向比对 → 反向梯度比对 → 短程训练 loss 曲线比对 → 长程收敛验证。每一步都要有工具支撑(dump + 自动比对),这是国产卡训练交付里最耗人力、也最难替代的一环。

5.3 FlashAttention:算子融合的教科书案例

注意力机制的朴素实现分四步:算 S = Q·Kᵀ(得到一个 N×N 的矩阵,N 是序列长度)→ 做 softmax → 乘 V → 输出。问题出在那个 N×N 矩阵:序列 8K 时它是 6,400 万个数,必须写进 HBM 再读出来,显存占用和访存量都随序列长度平方增长。按第 2 章的 Roofline 分析,这是典型的带宽受限灾难。

FlashAttention 的核心思想:永远不把那个 N×N 矩阵完整地写进显存。做法是分块(tiling)——把 Q、K、V 切成能装进片上共享内存的小块,在片上完成"算一块 → 局部 softmax → 乘 V → 累加到输出",然后用 online softmax(在线归一化)技巧,边算边修正之前的归一化因子,保证分块计算的结果与一次性算全局 softmax 数学等价。

FlashAttention:把注意力矩阵留在片上
左:朴素实现,中间矩阵往返 HBM;右:分块融合,只有输入输出经过 HBM
朴素实现:4 次核启动、3 次 HBM 往返 HBM 显存 Q·Kᵀ softmax ×V 输出 N×N 中间矩阵反复写入/读出 HBM → 访存量 O(N²) FlashAttention:1 次核启动、中间结果不落显存 HBM 显存(只进出 Q/K/V 与输出) 片上共享内存(SRAM)内循环 分块算 Q·Kᵀ → online softmax → ×V → 累加 逐块滑动,全程不物化 N×N 矩阵 访存量降到 O(N) 量级 → 长序列速度与显存双双改善 同一个数学公式,两种实现,性能差数倍——这就是"算子实现质量"的分量

三代演进的脉络:FlashAttention-1 确立了分块 + online softmax 的 IO 感知思路;-2 改进了工作划分与并行维度(沿序列维度并行、减少非矩阵乘运算占比),把 GPU 利用率进一步推高;-3 针对 Hopper 架构利用异步执行与低精度(FP8)特性再次提速。这条演进线本身就是一个重要启示:同一个算子,随着对硬件特性的挖掘不断改进,性能可以持续翻倍——而每一代改进都需要对目标硬件的深入理解,这正是"新硬件上缺少顶尖算子实现"造成的性能差距的来源。

5.4 MFU:用一个数字衡量全部工作

前面所有优化的成果,最终收敛到一个数字:MFU(Model FLOPs Utilization)= 模型实际所需的浮点运算量 ÷(硬件峰值算力 × 训练时间)。计算它需要一个经典公式:

训练总计算量 ≈ 6 × N × D (N = 参数量,D = 训练 token 数) 系数 6 的来历:前向每参数每 token 约 2 次浮点运算(一次乘、一次加),反向约为前向的两倍(要算输入梯度和权重梯度)即 4,合计 6。这个"6ND 法则"是估算训练成本最有用的一把尺。
完整算例 · 训练一个 70B 模型要多久、多少钱

题目:70B 参数,训练 15T token,用 1,024 张 H100(BF16 峰值 990 TFLOPS/卡),MFU 假设 40%。

第一步 · 总计算量:6 × 70e9 × 15e12 = 6.3e24 FLOPs

第二步 · 集群有效算力:1024 × 990e12 × 0.40 ≈ 4.06e17 FLOPs/s

第三步 · 时间:6.3e24 ÷ 4.06e17 ≈ 1.55e7 秒 ≈ 180 天

关键推论:若把 MFU 从 40% 提到 50%(相对提升 25%),训练时间缩短到约 144 天,省下 36 天 × 1,024 张卡的机时。按当前市场的卡时价格,这是数千万元量级的差异——而工作量只是几个人几周的调优。这就是算力优化的商业价值最直白的算法。

反过来,这个公式也是尽调工具:听到"我们用 X 张卡训了 Y 天做出 Z 参数的模型",用 6ND 一算就能反推出对方的 MFU 是否可信。行业参照:顶级团队在 NVIDIA 集群上的稠密模型训练 MFU 通常在 35–50% 区间,MoE 模型因通信更重通常更低;国产卡集群普遍在 30% 上下甚至更低,能稳定做到 45%+ 属于顶尖水平。

CHAPTER 06训练优化 III:长稳工程

万卡集群跑上几十天,硬件必然会坏。有效算力等于"峰值算力 × MFU × 正常运行时间比例"——第三个因子往往被低估。

6.1 故障是常态,不是异常

规模带来的统计规律很残酷:单张卡的故障率乘上一万,再乘上几十天,故障就从"意外"变成"日常"。Meta 公开的 Llama 3 训练记录是这方面最有价值的公开数据:在 16,384 张 H100 上训练 54 天,共发生 466 次作业中断,其中 419 次为非预期故障,硬件问题(GPU 故障、HBM 故障、网络)占绝大多数——平均每天约 8 次以上非预期中断。他们最终仍把有效训练时间维持在 90% 以上,靠的是一整套自动化的检测、隔离与恢复机制。

一次故障的损失构成:为什么"快速恢复"值钱
同一次故障,有无自动化恢复机制的差别
无自动化:人工介入 正常训练 故障 人工排查定位(数十分钟~小时) 重启 + 加载 ckpt 重算丢失的进度 恢复训练 损失 = 排查 + 重启 + 重算(自上次 checkpoint 起的全部计算) 有自动化:检测—隔离—续训 正常训练 故障 秒级检测 自动换备机 续训 正常训练(分钟级内恢复) 同样的硬件故障率,有效训练时间可以从 60–70% 拉到 90%+ —— 相当于凭空多出三成算力

6.2 四件必备的工程能力

① 快速检测与定位

不仅要发现"进程挂了",还要发现更难缠的慢节点(straggler)——某张卡因降频、ECC 错误或网络劣化变慢,由于集合通信要等最慢的那个,整个集群被拖到它的速度。检测手段:逐 step 时间监控、各 rank 通信等待时间比对、定期健康巡检。

② Checkpoint 策略

存得太频繁浪费时间(TB 级状态写盘很慢),太稀疏则故障损失大。工程要点:异步 checkpoint(先拷到 CPU 内存再后台落盘,训练不停)、分片并行写、只存必要状态。最优频率由"写一次的成本"与"平均故障间隔"共同决定。

③ 弹性与自动替换

热备节点池 + 故障自动隔离 + 拉起新 rank 后重建通信域。理想状态是训练框架能在不重启整个作业的情况下完成成员变更(弹性训练),把恢复时间从小时级压到分钟级甚至秒级。

④ 可复现与确定性

出问题要能重现,否则无从调试。需要固定随机种子、使用确定性算子实现、记录完整的运行配置与数据顺序。代价是性能通常会损失几个百分点——所以通常只在排查阶段开启。

这一章的内容在商业上常被低估:客户容易理解"MFU 提升 20%",不容易理解"有效运行时间从 70% 提到 92%"其实是同等量级甚至更大的收益。实际交付中,长稳工程往往是第一个月最先见效、也最容易让客户产生信任的部分。

CHAPTER 07推理优化:把单位 Token 成本打下来

训练是一次性投入,推理是每天都在流血的成本。这一章从物理下限出发,逐层拆解把成本降下来的每一种手法。

7.1 推理算术:先算清物理下限

推理优化的一切讨论都应该从两个数字开始。

每个 token 的前向计算量 ≈ 2 × 参数量 (每参数一次乘、一次加) 70B 模型每生成一个 token 约需 1.4e11 = 140 GFLOPs。H100 的 BF16 算力约 990 TFLOPS,纯算力视角每秒能算 7,000 个 token——但实际远达不到,因为瓶颈不在算力。
单请求 decode 速度上限 ≈ 显存带宽 ÷ 权重字节数 70B BF16(140 GB)在 3.35 TB/s 带宽下:3.35e12 ÷ 1.4e11 ≈ 24 token/s。这是物理上限,任何软件优化都无法突破——因为每生成一个 token 必须把全部权重读一遍。

把这两个数字并列,推理优化的全部逻辑就清楚了:算力有 7,000 的能力,带宽只允许 24 的产出——两者相差近 300 倍,这就是"decode 阶段算力大量空转"的准确含义。于是所有推理优化都在做同一件事的变体:让每次昂贵的权重读取服务更多的计算。

最直接的手段是提高批量(batching):把 64 个请求攒在一起,权重仍然只读一次,却同时算出 64 个 token。算力占用增加 64 倍(反正原本空转),带宽占用几乎不变——吞吐提升近 64 倍,而单个用户的速度几乎不受影响。这就是为什么推理服务的第一优化永远是批处理策略,也是为什么"单请求延迟"和"系统吞吐"是两个必须分开谈的指标。

阶段计算特征算术强度瓶颈优化方向
Prefill(读题)一次处理整段输入的所有 token,大矩阵乘高(数百以上)算力算子质量、并行策略、FP8;长输入要防显存爆
Decode(作答)每步只处理 1 个 token × batch,瘦长矩阵低(≈batch 量级)显存带宽提高 batch、量化权重、KV 压缩、投机解码

7.2 KV Cache:省了算力,吃掉了显存

注意力机制要求每个新 token 与之前所有 token 计算相关性。若每步都重算全部历史的 Key/Value,计算量随长度平方增长;把它们缓存下来,就变成每步只算新 token 的 K/V——这就是 KV Cache,用显存换算力的经典交易。代价是这块显存随上下文线性增长,且必须一直驻留。

KV Cache 大小 = 2 × 层数 × KV 头数 × head_dim × 精度字节 × 序列长度 × 批量 系数 2 = Key 和 Value 各一份。注意公式里是 KV 头数而不是注意力头数——这正是 GQA 优化的着力点。
算例 · 长上下文为什么这么贵

以一个 70B 级模型为例(80 层、8 个 KV 头(GQA)、head_dim 128、BF16):
单 token 每层 KV = 2 × 8 × 128 × 2 字节 = 4 KB全模型单 token = 4 KB × 80 层 = 320 KB

那么:8K 上下文 ≈ 2.5 GB/单请求;128K 上下文 ≈ 40 GB/单请求。

结论:一张 80GB 的卡装完 140GB 权重的一半后所剩无几——所以长上下文服务必须多卡、必须压缩 KV。若不用 GQA 而是 64 个 KV 头的传统多头注意力,上面的数字要再乘 8(128K 上下文将占 320 GB),这就是 GQA/MQA/MLA 这类"KV 压缩"架构成为标配的原因。

KV Cache 随上下文长度增长(单请求,70B 级模型三种注意力结构)
纵轴显存占用,横轴上下文长度;虚线为单张 80GB 卡的显存总量
0 80 160 240 320 GB 0 32K 64K 96K 128K 单卡 80GB 显存上限 MHA(64 KV 头)→ 320 GB GQA(8 KV 头)→ 40 GB MLA(压缩潜向量)→ 个位数 GB 注意力结构的选择,直接决定一张卡能同时服务多少个长上下文请求

7.3 PagedAttention:把操作系统的智慧搬进显存

传统推理框架为每个请求预留一整块连续显存,大小按可能生成的最大长度算。问题显而易见:一个实际只生成 100 个 token 的请求,却按 2,048 预留,剩下的全部浪费;而且这些连续大块会造成外部碎片——总显存够,却找不到连续的一块。vLLM 论文测得传统方式的显存浪费高达 60–80%。

PagedAttention 的解法直接借自操作系统的虚拟内存:把 KV Cache 切成固定大小的"块"(如 16 个 token 一块),逻辑上连续的序列在物理显存里可以散落各处,用一张块表(block table)记录映射。收益有三层:

PagedAttention:从"整块预留"到"按需分页"
上:传统预留造成大量浪费;下:分页按需分配,并可在请求间共享物理块
传统连续预留 预留但用不到(浪费) 已用 请求 A(按最大长度预留) 浪费 已用 请求 B 碎片:装不下新请求 → 论文测得显存浪费 60–80%,并发数被严重压低 PagedAttention 分页 逻辑序列 A: A1 A2 A3 逻辑序列 B: B1 B2 块表映射 物理显存块池(可乱序、无需连续) 灰色 = 空闲可分配 → 几乎零浪费,并发数大幅提升 → 三重收益:①几乎消除浪费 ②按需增长不必预留 ③相同前缀的物理块可被多请求共享(copy-on-write) 共享是隐藏的大招:同一个系统提示词、同一段文档被 100 个请求引用时,物理上只存一份。 这也是下一节 RadixAttention(前缀缓存)的基础。

7.4 RadixAttention 与前缀复用:Agent 时代的关键优化

PagedAttention 让"共享"成为可能,RadixAttention(SGLang 提出)则让共享变成自动的:用一棵基数树(radix tree)组织所有活跃与近期请求的 KV Cache,新请求进来时自动在树上匹配最长公共前缀,命中的部分直接复用、不再重算。

为什么这在 2026 年格外重要?因为现代负载的前缀重复率极高: 系统提示词——每个请求都带着相同的几百上千 token 的指令; 多轮对话——第 N 轮的前缀就是前 N-1 轮的全部内容; Agent 场景——同一个任务模板反复调用,工具描述、少样本示例大段重复; 文档问答——同一份长文档被多个问题反复引用。命中前缀缓存意味着 Prefill 的计算被整段跳过,TTFT 大幅下降、成本大幅下降。这就是为什么各家 API 都推出了"缓存命中"的差别定价,命中与未命中的输入价格可以相差一个数量级以上。

7.5 连续批处理:从"拼车"到"流水席"

7.1 节说明了批处理是第一杠杆,但传统的静态批处理有个致命问题:一批请求必须一起开始、一起结束。而生成长度天然不齐——有的请求生成 20 个 token,有的生成 2,000 个,短的早早算完却必须占着位置等最长的那个,造成大量空转。

连续批处理(Continuous Batching,源自 Orca 论文的 iteration-level scheduling)把调度粒度从"一批"细化到"一次迭代":每生成一个 token 就检查一遍,谁完成了就立即释放位置、把等待队列里的新请求补进来。批次的成员在不断流动,硬件始终满载。

静态批处理 vs 连续批处理(横轴为时间,每行一个槽位)
灰色 = 空转等待;彩色 = 有效计算
静态批处理:一起开始,一起结束 槽 1 槽 2 槽 3 槽 4 全批结束才能接新请求 → 大量灰色空转:短请求占着槽位等最长的那个 连续批处理:谁完成谁让位,随时补新请求 槽 1 槽 2 槽 3 → 几乎无空转,吞吐可达静态批处理的数倍(Orca 论文量级);新请求等待时间也大幅缩短

7.6 PD 分离:两种负载,两套硬件

第 2 章证明了 Prefill 是算力受限、Decode 是带宽受限;7.5 节的连续批处理又带来一个新矛盾:当一个超长输入的 Prefill 插进来时,它会占用大量算力,导致同批次里所有正在 decode 的请求卡顿——用户感受是"打字突然停顿"(TPOT 抖动)。

PD 分离(Prefill-Decode Disaggregation,DistServe、Mooncake 等系统的核心设计)的思路:把两个阶段拆到不同的硬件池,各自用最适合的配置与并行策略,Prefill 完成后把 KV Cache 传给 Decode 池继续。收益是三重的:互不干扰(延迟指标稳定)、各自可独立扩缩容(按实际负载配比)、可用不同硬件(Prefill 用算力强的卡、Decode 用带宽大显存大的卡)。代价是 KV Cache 的跨节点传输开销——这对互联带宽提出要求,也是这套架构在国产集群上落地的主要难点与手艺所在。

PD 分离架构
两个资源池各自优化,KV Cache 经高速网络传递
用户请求 长输入 调度器 路由/前缀命中 Prefill 池 算力受限负载 · 大 TP 配算力强的卡 · 追求 TTFT Decode 池 带宽受限负载 · 大 batch 配大显存大带宽 · 追求 TPOT KV Cache 传输 走 RDMA / 高速互联 这是该架构的主要开销 逐字返回 流式输出 收益:延迟指标互不干扰 · 两池按负载独立扩缩 · 可用不同型号硬件各司其职

7.7 量化:用精度换成本

既然 decode 受带宽限制,而带宽消耗正比于权重字节数,那么把权重从 16 位压到 8 位或 4 位,速度就能接近翻倍或翻两倍——量化是推理降本最直接的杠杆。方法按"压什么"分为几类:

方法压什么核心思想典型效果注意
GPTQ仅权重(W4/W8)逐层做二阶近似的最优舍入,逐列量化并补偿误差4 bit 下精度损失小需校准数据;计算时反量化回高精度做矩阵乘
AWQ仅权重识别对输出影响大的"重要通道"并保护其精度与 GPTQ 相当,实现更简洁同样需要少量校准数据
SmoothQuant权重 + 激活(W8A8)把激活的离群值"平滑"迁移到权重上,让两者都好量化可用整数 Tensor Core,吞吐提升明显激活离群值是 LLM 量化最大难点
FP8 推理权重 + 激活用硬件原生 FP8 格式,无需复杂校准接近 2 倍提速,精度损失很小需硬件支持 FP8(部分国产卡尚缺)
KV Cache 量化KV 缓存(8 bit / 4 bit)缓存本身降精度存储直接放大可服务的并发与上下文长上下文场景收益最大

工程铁律:任何量化都必须配套精度评测——不只看困惑度(PPL)这类粗指标,要在真实业务的评测集上比对优化前后的效果,把"可接受的效果损失"写成明确的验收标准。这是把量化从"技术尝试"变成"可交付服务"的关键一步。

7.8 投机解码与 MoE 服务

投机解码(Speculative Decoding)利用了一个不对称性:验证比生成便宜。做法是让一个小的"草稿模型"(或模型自身的浅层、或额外的预测头如 Medusa/EAGLE)一次性猜出接下来的 k 个 token,然后让大模型一次前向并行验证这 k 个猜测——猜对的部分直接采纳,第一个猜错处截断重来。因为验证 k 个 token 的前向与生成 1 个 token 的前向成本几乎相同(都受带宽限制、算力有余),所以只要接受率够高,就能把单请求速度提升 1.5–3 倍。关键指标是"接受率":草稿模型越接近大模型的分布,接受率越高、收益越大;但草稿模型越大,本身的开销也越大——这是一个需要按场景调优的平衡。

MoE 服务的挑战在第 4 章已埋下伏笔:推理时每个 token 只激活少数专家,但显存必须装下全部专家。于是大规模 MoE 推理走"大规模专家并行"路线:把专家摊到很多卡上(业界已有 EP 上百的部署),每张卡只存一部分专家。这带来两个必须解决的工程问题: all-to-all 通信成为主要开销,需要精细的通信—计算重叠与拓扑感知放置; 专家负载天然不均(热门专家被更多 token 选中),需要冗余副本、动态重平衡等手段,否则少数卡成为全系统的瓶颈。这也是 DeepSeek 等团队公开的推理基础设施里最有技术含量的部分。

推理优化手法总表:按"先做什么"排序

第一层(必做,收益最大):连续批处理 + PagedAttention + 前缀缓存——这三项是现代推理引擎的默认配置,不开启等于白扔一半算力。第二层(按场景选):量化(成本敏感)、PD 分离(延迟敏感且规模大)、KV 量化(长上下文)、投机解码(单请求速度敏感)。第三层(深水区):算子级优化与缺失算子补齐、MoE 的 EP 部署与负载均衡、跨硬件适配调优——这一层需要芯片级知识,也是新兴硬件上性能差距的主要来源。

CHAPTER 08RL 后训练基础设施

2025 年之后,算力的增量重心从预训练转向强化学习后训练。它把训练和推理两种截然不同的负载塞进同一个循环,是当前最难的系统工程。

8.1 一个 RL step 里发生了什么

经典 PPO 需要同时持有四个模型:actor(既要训练又要生成)、critic(训练)、reward model(只前向打分)、reference model(只前向,用于约束偏离)。系统的全部复杂度都源于这个组合:两个训练态 + 两个推理态 + 一个横跨两态的 actor。

一个 RL 训练步的数据流
Rollout 通常吃掉整步 70–90% 的时间(长思维链与 Agent 场景更高)
① 取题 prompt batch ② Rollout(推理态) 每题采样 G 条回答 占整步 70–90% 时间 ③ 打分 RM / 验证器 / 沙箱 ④ logprob 重算 actor + reference 两遍全序列前向 ⑤ 更新 优势估计+多轮 ⑥ 权重同步:把新 actor 权重灌回推理引擎(几十到几百 GB / step) 训练侧分片布局(DP+PP+TP+EP+CP)≠ 推理侧布局(DP+TP+EP)→ 需要重分片 resharding ④ 在算法上"免费"(不产生新数据),在系统上是实打实两遍前向——这是 RL 系统常被低估的开销 整个循环里,同一批 GPU 要在"高效训练"和"高效生成"两种模式间反复切换

为什么 rollout 吃掉这么多时间?回到第 7 章的物理:解码是带宽受限且耗时随序列长度线性增长,而训练是算力受限、能靠批处理摊平。再叠加长尾拖尾(straggler)——同一批里有的回答 200 个 token 就结束、有的写了 8,000 个思维链 token,而同步屏障让所有卡等最慢的那一条。长思维链和 Agent 场景把这个问题放大到极致。

算法侧的演进也在减轻系统负担:GRPO 用组内相对奖励替代价值网络,直接删掉 critic,把"带优化器状态的模型"从 2 个减到 1 个;DAPO 增加动态采样(过滤掉全对或全错的组,避免零梯度浪费)与超长惩罚;GSPO 把重要性采样从 token 级抬到序列级,理由是长序列上 token 级修正会累积高方差噪声,可能导致不可逆的模型崩塌——在 MoE 上尤其明显。

8.2 两种资源摆法:共置还是分离

共置(Colocate)

训练与生成分时复用同一批卡。Rollout 阶段把优化器状态、梯度卸载到 CPU 腾出显存给 KV Cache,训练阶段再搬回来;权重同步可走同卡的显存共享(CUDA IPC),几乎零传输。优点:卡不空转、利用率高。代价:显存腾挪本身耗时,且两个伸缩行为完全不同的阶段被绑在同一资源池。

分离(Disaggregate)

推理集群与训练集群物理分开,各自选最优并行策略、甚至用不同型号的硬件(生成侧要大显存大带宽,训练侧要算力)。优点:各自最优、易于集成异构引擎。代价:跨集群传权重;且在同步模式下,必有一端空转等待另一端。

共置 vs 分离:同一批卡分时复用,还是两个池子各干各的
横轴为时间。灰色 = 该资源在空转
共置(Colocate):卡不空转,但要反复腾挪显存 GPU 池 Rollout 生成 换装 训练更新 换装 Rollout 生成 训练 「换装」= 把优化器状态/梯度卸载到 CPU 腾出显存给 KV Cache,训练前再搬回来;权重同步走同卡显存共享,几乎零传输 分离(Disaggregate):各自最优,但同步模式下必有一端等待 生成池 Rollout 生成(大显存大带宽的卡) 空转等训练 Rollout 生成 训练池 空转等数据 训练更新(算力强的卡) 每步要跨集群传几十到几百 GB 权重,且训练侧与推理侧的分片布局不同 → 需要重分片(resharding) 异步化是两者共同的解药 部分 rollout(长轨迹分轮续写)+ 陈旧度阈值(容忍数据落后 k 个版本)+ 可中断生成 → 让灰色区域消失

主流框架的分野正在这里:veRL(字节,HybridFlow 论文)的核心贡献是一套混合编程模型——上层数据流用"单控制器"(driver 有全局视野,一段 PPO 逻辑几十行 Python 就能表达),下层每个模型的分布式计算用"多控制器/SPMD"(保留原生训练框架的效率)。它的工程红利极大:只改一处资源池映射就能在共置与分离之间切换,控制逻辑一行不动。论文另一项贡献 3D-HybridEngine 解决 actor 在"训练并行布局"与"生成并行布局"之间的重分片,做到不额外多存一份推理权重。

框架技术栈定位与差异
veRLMegatron/FSDP + vLLM/SGLang + Ray通用;混合控制器;共置/分离皆可;生态最大,已支持多硬件后端与 Agent 循环
OpenRLHFRay + vLLM + DeepSpeed ZeRO-3出发点就是"不要把四个模型全挤在同一批卡上",用 Ray 做细粒度放置
slimeMegatron + SGLang + Data Buffer把单一路径做深;把多轮工具调用与沙箱交互当作"数据生成工作流"接进同一循环,面向 Agent 与长轨迹
AReaLSGLang + Megatron完全异步的代表:可中断 rollout + 解耦的 PPO 目标,报告相对同步系统最高约 2.8× 加速

8.3 异步化:RL 系统的效率主线

同步 RL 的浪费是结构性的:生成时训练卡闲着,训练时生成卡闲着,而且每一步都要等最慢的那条轨迹。三种异步手法:

8.4 训推一致:RL 里最隐蔽的杀手

这是本章最值得记住的一节。同一份权重,在训练框架和推理引擎里算出的 logprob 不一样。原因不是 bug,而是两套系统用了不同的算子实现、不同的融合策略、不同的归约顺序、不同的注意力内核(甚至不同的量化)。浮点加法不满足结合律,于是结果在最后几位不同。

后果非常严重:名义上的 on-policy 训练被隐式变成了 off-policy——重要性比值的分母本身就是错的,梯度估计有偏,表现为训练不稳定甚至崩塌。更微妙的一层是批大小相关的非确定性:不同的 batch size 会改变内核的归约切分方式,于是同一个输入在不同负载下得到不同的输出。有研究指出,即使把推理引擎打补丁让它吐出真实采样概率、把输出头转成 FP32 对齐,不一致依然存在——这是混合后端设计的固有问题。

四条解法(按工程成本从低到高)

① 截断重要性采样(TIS):对"训练概率 ÷ 生成概率"的比值做单边上截断,压住极端权重——最便宜且有效,即使 rollout 走量化也能稳住。② 直接换分母:把推理引擎返回的 logprob 当作行为策略概率,从定义上消除不一致。③ 数值兜底:关键路径用 FP32、显式重算 logprob。④ 批不变内核(batch-invariant kernels):让 RMSNorm、矩阵乘、注意力这三类算子使用与 batch 无关的单一归约策略,从根上实现确定性推理——已有推理引擎落地了这条路,且兼容分块预填充、图模式与前缀缓存,配合采样种子还能做到"多样但可复现"(这正是 GRPO 需要的)。

权重同步的工程细节也值得一提:每步要把几十到几百 GB 权重从训练侧搬到推理侧。通道上,同卡共置走显存共享句柄,跨卡走集合通信广播。但真正的成本在重分片:训练侧的分片布局(DP+PP+TP+EP+CP)与推理侧(DP+TP+EP)不一致,主流做法要先在若干源节点上把分片聚成完整张量、转成目标布局再广播,产生多余流量和热点。优化手段是分桶传输 + 通信与拷贝重叠 + 原地更新避免双份显存——有团队报告把大 MoE 模型的权重传输优化了约一个数量级。

8.5 Agentic RL:CPU 环境与 GPU 空转的新矛盾

当 RL 的对象从"回答问题"变成"完成任务",系统面临全新的瓶颈:一个训练批次可能触发上千次代码执行、网页访问、工具调用。这些是 CPU 密集甚至 IO 密集的工作,而昂贵的 GPU 在旁边干等。业界的应对是把环境服务化——用专门的隔离沙箱服务承接高并发执行,并把"亚秒级启动"作为硬指标(沙箱绝不能成为饿死 GPU 的延迟瓶颈)。

另一个被放大的问题是调度不均:标准 RL 把 rollout 静态均分到 GPU,本已因长度差异造成空等;Agent 场景下每条轨迹跨多个回合、每回合 token 数还不均匀,这种不均衡会在每个回合重复出现并累加,最坏延迟被逐轮放大。当前的趋势是把多轮 rollout 的完整生命周期从训练栈解耦(rollout as a service),让算法与 Agent 设计独立演进。

CHAPTER 09国产卡实战:昇腾软件栈与迁移方法论

前八章的原理是硬件无关的。这一章落到具体:在昇腾生态里,这些优化分别对应什么工具、什么坑、什么手艺。

9.1 CANN 软件栈与 CUDA 生态逐层对位

把第 3 章的七层结构落到具体产品,这张对位表值得背下来——它是与昇腾生态工程师对话的基础词汇:

昇腾(CANN)NVIDIA 对位
驱动 / 固件Ascend Driver + 固件(npu-smiNVIDIA Driver(nvidia-smi
RuntimeAscendCL / acl(aclrtStreamaclrtMemcpyCUDA Runtime(cudaStreamcudaMemcpy
单算子库aclnn / AOL;大模型算子库 ATBcuBLAS + cuDNN;FlashAttention 类库
模板库Catlass(含 Python DSL)CUTLASS
图引擎 / 编译GE 图引擎 + 融合 Pass;毕昇编译器;AOE 自动调优TensorRT / XLA / torch.compile
通信库HCCL(底层 HCOMM)NCCL
框架适配MindSpore(原生)、torch_npu(适配层)PyTorch CUDA 后端
大模型套件MindSpeed / MindSpeed-LLM(Megatron 的 NPU 适配)Megatron-LM / DeepSpeed
2026 年的重要变化(很多中文教程还没更新)

CANN 已大规模开源并迁移代码托管:算子库拆成独立仓库开放(神经网络算子、大模型 Transformer 算子、矩阵乘融合模板、自动融合、并行分块虚拟指令集等),配套训练调优与推理部署的实践仓库也已公开。Ascend C 编程接口新增了四层 API 体系,其中最值得注意的是新增了支持业界通用 SIMT 编程模型的 API 层——这是昇腾主动向 CUDA 心智模型靠拢的信号;同时推出 Python 风格的算子 DSL(对位 Triton 的生态位),号称把编译时间相比 C++ 模板缩短八成以上。结论:生态在快速补齐,但"补齐"与"追平"之间仍隔着社区厚度与长尾算子覆盖。

9.2 Ascend C 算子开发:与 CUDA 的五个关键差异

第 1 章讲了达芬奇架构的硬件差异,这里是它在编程模型上的直接后果。核函数以特定修饰符声明、由主机侧下发,编程范式是 SPMD——多核执行同一份指令,唯一差别是核编号,每个核按编号取自己那一片数据。片上存储层次为:全局显存(HBM) → L2 → L1 → UB(向量单元统一缓冲)/ L0A、L0B(矩阵单元输入)→ L0C(矩阵单元累加输出),一个典型矩阵乘的数据流是 GM→L1→L0A/L0B→Cube→L0C→UB

#CUDA 的做法Ascend C 的做法对开发者的含义
1并行粒度是 thread / warp,几万线程掩盖延迟并行粒度是"核",核少但单核强切分策略偏大块;不能靠海量线程隐藏延迟
2缓存自动命中、访存自动合并必须显式搬运(DataCopy数据流由你规划,写错就慢几倍
3__syncthreads() 隐式同步队列 / 屏障显式同步流水编排是核心手艺
4索引可在核内随意计算Tiling 参数须在主机侧算好传下去分块方案是独立的设计工作
5硬件调度延迟隐藏开 DoubleBuffer 让搬运与计算重叠这是第一档提速手段,几乎必做

一条硬约束值得单独记:统一缓冲(UB)容量有限(数百 KB 量级),分块必须满足 (输入缓冲 + 输出缓冲 + 中间变量) × 数据宽度 × 双缓冲系数 ≤ UB 容量。这个不等式决定了分块的上限,也是算子性能调优的核心旋钮。至于融合算子(矩阵单元输出喂向量单元、再喂回矩阵单元,典型如把矩阵乘 + 缩放 + 掩码 + softmax 融成 FlashAttention),是这一层最有价值也最难的活。

9.3 迁移实战:五类高频坑

PyTorch 迁移的标准三步是:引入适配包 → 设备标识换名 → 设备相关 API 换名。官方提供了三条路径:自动迁移(引入一个转换模块,运行时把 CUDA 接口映射到 NPU,常见场景近乎零改动)、工具迁移(扫描脚本并产出算子支持情况与改动清单)、手工迁移。真正吃时间的是下面五类问题:

① 算子缺失

部分算子或部分用法没有原生实现,前向直接中断。对策按成本递增:等价组合改写 → CPU 回退(慢)→ 自己写 Ascend C 算子。迁移前先跑一遍算子支持性扫描,是最省时间的一步。

② 混合精度行为差异

自动混合精度的实现逻辑与 CUDA 侧不同,梯度出问题未必立刻报错。实践口径:先跑通 FP32 → 再开混合精度 → 加梯度裁剪;优先 BF16 而非 FP16(第 5 章的动态范围原因)。

③ 数据格式转换(最隐蔽)

矩阵单元与向量单元偏好的数据排布不同(ND vs NZ 等),跨单元流动会自动插入格式转换算子——而它常常比矩阵乘本身还贵。profiling 里看到大片转换算子,就要提前统一格式或调整算子顺序。非连续张量同理会触发额外拷贝。

④ 版本配套地狱

驱动/固件、CANN 工具包、框架适配包三者必须严格按官方配套表对齐(适配包版本号本身就编码了框架版本与 CANN 版本)。版本错配是"装不上、跑不起来"的第一大原因。

⑤ 不要自己糊分布式

大模型并行直接用官方的 Megatron 适配套件(已适配张量/流水/序列并行与分布式优化器,并提供权重格式转换与全链路脚本),不要自己从零拼——这是过来人最一致的建议。

9.4 精度对齐:一套可交付的标准流程

第 5 章解释了精度差异的物理原因,这里是把它变成可交付工作的方法论。主力工具是官方的精度调试套件(能力覆盖精度预检、溢出检测、精度比对、梯度监控,同时支持两大框架)。

精度对齐的六步标准流程
从"能跑"到"敢签验收"之间的全部工作
① 对齐基线 超参、数据顺序 权重初始化一致 ② 固定随机性 种子、dropout 开确定性计算 ③ 单算子预检 真实输入双跑 筛不达标算子 ④ 逐层比对 前向 dump 比对 再比反向梯度 ⑤ 短程 loss 前若干 step 误差 ~1e-3 量级 ⑥ 长稳验证 溢出排查 收敛趋势一致 判定指标(业界通用口径) 余弦相似度 > 0.99 且最大绝对误差 < 1e-4 判通过 · "双千/双万"指标:误差超千分之一(万分之一)的元素占比须低于千分之一(万分之一) dump 粒度可选:模块级(附网络结构重建)→ 框架 API 级 → 算子/内核级 这套流程是国产卡训练交付里最耗人力、也最难被替代的一环

注意第 ② 步的代价:开启确定性计算、同时关闭可能引入不确定性的融合与并行归约优化,通常会损失几个百分点的性能——所以它只在排查阶段开启,定稿后关闭。这也是"可复现"与"最快"之间的经典取舍。

9.5 性能调优工具链与昇腾特有的瓶颈

工具链分四块:采集(命令行 profiler 同时采软件栈层与硬件层,框架侧也有对应的 profiler);可视化(时间线视图,读四条泳道——算子执行、通信、调度下发、内存);自动分析(把与对标平台的性能差距拆成算子执行 / 未被掩盖的通信 / 调度开销 / 内存四个维度,并能在集群规模上定位慢节点、慢卡、慢链路);自动调优(分子图调优、算子调优、梯度切分调优三个引擎,官方推荐顺序是先子图后算子——因为子图切分确定后算子形状才最终确定)。

昇腾特有的高频瓶颈:Host Bound

第 3 章讲过 host bound 的普遍原理,它在昇腾上格外常见:主机 CPU 要把算子逐个下发成任务到设备流,当设备执行快于主机下发时,时间线上出现大片"空闲"。对策有三层:开启任务队列流水下发;绑核(把下发线程绑定到固定的 CPU 核心,避免调度抖动)——官方案例把空闲占比从 18% 压到 0.38%;根治手段是模型下沉,把控制流、集合通信、计算整体下沉到设备侧执行,从根本上减少主机与设备的交互。这一条是国产卡调优里"投入产出比最高"的一类工作:不改模型、不改算法,只调执行方式,往往就能拿到两位数的提升。

9.6 集群通信与超节点

通信库提供的原语与 NVIDIA 侧基本一一对应(全归约、广播、全收集、归约散射、全对全、点对点等),架构上分集合通信库与基础通信层两级。工程上有几个要点:通信域通过配置文件(含节点列表、设备、编号、IP)建立;关键环境变量控制通信缓冲区大小(默认值随版本变动,大消息与 MoE 全对全场景常需调大,但会吃显存)与各类超时;算法上实现了环形、网格、递归折半倍增等多种方案并自动选择,经验规则是机内走网格(全互联)、机间走递归折半或环形

超节点改变了优化策略。当几百张卡通过总线语义互联、全局内存统一编址(官方口径包括数百 GB/s 级的卡间双向带宽、几十 TB 的统一编址内存、纳秒级单跳时延),第 4 章的那条铁律就松动了:可以用内存语义(直接读写远端显存)替代消息语义,专家并行域能开得更大,张量并行跨机不再是绝对禁区。这是国产路线"用互联规模弥补单卡差距"的核心逻辑,也解释了为什么它在通信占比高的 MoE 模型上收益最明显。

灵衢 2.0 与昇腾 950 的发布把这件事推得更远(技术细节见 1.5 节)。当高带宽域从 384 卡扩到 8,192 卡、共享地址空间达 128 TB、跨节点访存变成原生 Load/Store 指令时,优化工作的重心会发生四处迁移:①并行策略的搜索空间变大——张量并行与序列并行不再被单机卡数锁死,专家并行可以整体放进一个域,第 4 章的"TP ≤ 8"经验法则需要按实际高带宽域重新标定;②编程范式从"通信库调优"转向"共享内存编程"——需要掌握一致性与同步原语、按 die 分组的亲和性调度、以及本质上是超大规模 NUMA 的非均匀访存延迟,写"看起来像单机、实际是数千卡"的代码是一项新技能;③集合通信算法必须按拓扑重写——nD-Mesh、Clos、混合拓扑各有最优算法,且域内可用硬件集合通信引擎卸载、域间走以太扩展,分层算法的设计空间显著扩大;④算子优化多了几个新抓手——新增的 HiF8 数据格式需要配套的量化与校准策略(它不需要外挂缩放因子,量化思路与 MXFP8 不同),多维数据搬运引擎可以把手写的分块与转置代码下沉硬件,矩阵单元与向量单元之间的直连通路允许随路做精度与排布转换(这意味着融合算子的边界需要重新划分),而 128MB 的 L2 需要像写 CPU 缓存感知代码那样显式管理(可标注哪些数据留在 L2、哪些直写显存以免污染)。

MoE 场景的两项针对性优化值得记住: 分发/合并的通算融合——把通信与计算在底层深度融合,减少数据搬运与排序次数; 支持动态形状的全对全通信,以适配逐 token 变化的不等长负载。官方给出的口径是在数十卡以上规模部署大型 MoE 时启用这些优化可获得两位数百分比的性能提升。

9.7 把前八章的方法论映射到国产卡

通用方法(章节)在昇腾生态里的具体落点难度与价值
Roofline 诊断(第 2 章)用 profiler 时间线区分算子执行 / 通信 / 下发 / 内存四维低难度、必做的第一步
算子融合(第 3、5 章)图融合 Pass + Ascend C 手写融合算子(含 FlashAttention 类)高难度、高价值——生态长尾的主要缺口
并行策略(第 4 章)Megatron 适配套件 + 通信掩盖(把矩阵乘与集合通信拆细流水并发)中高难度,超节点下策略空间更大
混合精度(第 5 章)优先 BF16;FP8 支持取决于芯片代际,需确认硬件能力中难度,代际相关
MFU 提升(第 5 章)自动调优 + 手工算子调优 + 格式转换消除 + 绑核消 host bound最直接可量化的交付成果
长稳工程(第 6 章)集群分析工具定位慢卡慢链路 + 断点续训 + 故障隔离中难度,见效最快
推理优化(第 7 章)推理引擎的昇腾适配版 + 缺失算子补齐 + 量化 + 大规模 EP 部署高难度,直接决定单位 Token 成本
RL 基础设施(第 8 章)RL 框架的昇腾后端 + 训推一致(在双套数值实现上难度更高)最前沿、最稀缺
精度对齐(第 5、9 章)六步流程 + 官方精度工具套件人力密集、最难替代,是信任的基石

这张表也是全文的收束:算力优化不是一项技术,而是一条从芯片微架构一直贯通到业务指标的完整链路。每一层都有可量化的浪费,也都有对应的手艺。而在国产硬件上,因为生态成熟度的差距,这些手艺的边际价值被放大了数倍——这既是工程难题,也是这个时代最确定的技术机会之一。

APPENDIX A精选阅读清单

本文的全部素材来源。按"先读什么"排序,每条注明层级与推荐理由——这份清单本身就是一条完整的学习路径。

入门零基础可读,建立直觉 进阶需要一点背景,讲透机制 论文一手来源,数字与公式的出处

A.1 先读这五份:建立全局直觉

材料层级为什么先读它
Making Deep Learning Go Brrrr From First Principles(Horace He)
horace.io/brrr_intro.html
入门本领域最好的一篇入门文,没有第二候选。它给出一套分类学:任何 GPU 操作只属于三种状态——算力受限、带宽受限、开销受限;先判断自己在哪一类,才知道哪些优化有用。作者是 PyTorch 编译器方向的核心开发者。本文第 2 章的思维框架源于此。
GPU Glossary(Modal)
modal.com/gpu-glossary
入门按"设备硬件/设备软件/主机软件"分层的超链接术语表。被 SM、warp、CTA、cluster、SMEM 这堆缩写淹没时,这是解药。
The Ultra-Scale Playbook(HuggingFace / nanotron)
huggingface.co/spaces/nanotron/ultrascale-playbook
入门→进阶当前最好的一站式分布式训练教材,背后是 4,100+ 次实测实验。DP/TP/SP/CP/PP/ZeRO/重计算全覆盖,内嵌显存分解计算器与性能追踪。本文第 4、5 章的主要参照。
How To Scale Your Model(Google DeepMind)
jax-ml.github.io/scaling-book
入门→进阶从 Roofline 第一性原理讲起:什么时候被算力/带宽/通信卡住,如何据此选并行方案。与上一条互补——它教"为什么",上一条教"怎么做"。其推理章节是第 7 章的教材级参照。
AISystem / AIInfra 开源课程(ZOMI)
infrasys-ai.github.io · GitHub · B 站
入门→高级中文世界最系统的 AI 系统全栈课程:从 AI 芯片 → 编译器(CUDA 与 CANN 并讲)→ 推理引擎 → 分布式训练与集群通信,文稿、视频、PPT 全部开源,作者兼具昇腾与英伟达双栈背景。本文的章节结构与大量国产卡细节参照了这套课程,强烈建议作为长期精读教材。

A.2 硬件架构(对应第 1、2 章)

材料层级推荐理由
NVIDIA H100 架构白皮书
官方 Datasheet
进阶132 个 SM、989 TFLOPS BF16、3.35 TB/s HBM3 等规格的唯一权威出处。避坑:官方表里带星号的算力是"带稀疏"数字,稠密要对折——市面上一半的对比文章在拿稀疏比别人的稠密。
AI and Memory Wall(Gholami et al., IEEE Micro)
arXiv:2403.14123
论文内存墙唯一该引的量化来源:过去 20 年峰值算力每两年 3.0×,而 DRAM 带宽仅 1.6×、互联带宽 1.4×;累计算力涨 60,000×,DRAM 只涨 100×。这解释了 Roofline 拐点为什么一路右移。
Roofline: An Insightful Visual Performance Model(Williams et al., CACM 2009)
dl.acm.org
论文一切性能分析的公共语言。原文里最精髓、二手介绍几乎都漏掉的是 "ceilings"(天花板)那一节:在屋顶下再画若干条线,每条对应一项具体优化,于是 Roofline 从诊断工具升级成优化路线图。
How to Optimize a CUDA Matmul Kernel(Simon Boehm)
siboehm.com
进阶最好的"动手"材料:从只有 cuBLAS 性能 1.3% 的朴素 kernel 出发,逐步做访存合并 → 共享内存分块 → warp tiling → 向量化,最终达到 cuBLAS 的 83.2%。把第 1 章的内存层级理论变成肌肉记忆的最短路径。
Benchmarking and Dissecting the Nvidia Hopper GPU Architecture
arXiv:2402.13499
论文白皮书不会告诉你的东西:各级存储的实测延迟与带宽(共享内存约 30–40 周期、L2 约 200–300、HBM 约 500–700)。
In-Datacenter Performance Analysis of a TPU(Jouppi et al., ISCA 2017)
dl.acm.org
论文脉动阵列的奠基之作:256×256 = 65,536 个 MAC、92 TOPS、28 MiB 软件管理的片上缓冲、能效比同期 CPU/GPU 高 30–80×。理解 DSA 路线必读。
A New Golden Age for Computer Architecture(Hennessy & Patterson,图灵奖演讲)
cacm.acm.org
论文为什么后摩尔时代的出路是领域专用架构(DSA)——第 1.4 节的理论框架。
Colfax CUTLASS 教程:Hopper WGMMA
research.colfax-intl.com
进阶异步 warpgroup 矩阵乘讲到能动手的程度,是公开材料里离生产级 kernel 最近的一套。
Chips and Cheese: H100 的 L2 有多"funny"
chipsandcheese.com
进阶50MB 的 L2 分成两个 partition 带来的非均匀延迟——官方永远不会写这种事。

A.3 训练优化(对应第 4、5、6 章)

材料层级推荐理由
Megatron-LM(张量并行原始定义)
arXiv:1909.08053 + PTD-P 3D 并行
arXiv:2104.04473
论文第一篇定义了 MLP 列切→行切、注意力按头切的经典方案(每层前反向各一次 all-reduce);第二篇是 3D 并行组合原则的奠基之作,含 1T 参数 / 3,072 张 A100 / 502 PFLOP/s(峰值 52%)的实证。第 4 章的主要来源。
ZeRO
arXiv:1910.02054
论文16 字节/参数的显存拆解、三阶段切分、通信量推导(阶段 1/2 通信量不变,阶段 3 才付 1.5× 代价)全在第 5–7 节,教科书级。
Reducing Activation Recomputation in Large Transformer Models
arXiv:2205.05198
论文序列并行 + 选择性重计算。激活显存的精确公式 s·b·h·(34 + 5as/h) 出自此文;实证:激活显存降 5×、重计算开销降 90%+、530B 模型 MFU 从 42.1% 提到 54.2%。
FlashAttention 三部曲
FA1FA2FA3
论文一条完整的"算法—实现—架构"演进线,也是本文第 5.3 节的核心案例。数字:FA2 在 A100 上达 225 TFLOPS(MFU 72%);FA3 在 H100 上 FP16 达 740 TFLOPS(75% 利用率)、FP8 接近 1.2 PFLOPS。关键洞察:三代都不减少 FLOPs,只减少访存。
The Llama 3 Herd of Models
arXiv:2407.21783
论文唯一公开披露万卡级故障统计的前沿模型报告:16K H100、54 天、466 次中断(419 次意外,其中约 78% 归因硬件)、有效训练时间 >90%、4D 并行配置、MFU 38–43%。第 6 章的全部数据来源。
Machine Learning Engineering(Stas Bekman,开源书)
github.com/stas00/ml-engineering
入门→进阶训练工程师的"运维手册":网络吞吐实测方法、MFU 计算脚本、慢节点定位、loss 尖刺处置、checkpoint 策略。全是能直接复制粘贴的命令,来自 BLOOM-176B 的一线经验。
DeepSeek-V3 技术报告
arXiv:2412.19437
论文大规模 FP8 训练的第一份完整工程记录:统一用 E4M3 格式、激活按 1×128 分块 / 权重按 128×128 分块量化、沿 K 维每 128 个元素搬到 FP32 寄存器累加、以及保留高精度的"精度孤岛"清单(embedding、输出头、门控、归一化、注意力)。结果:与 BF16 相比 loss 相对误差 <0.25%。
MegaScale(字节,NSDI'24)
arXiv:2402.15627
论文12,288 张 GPU 训练 175B 模型做到 MFU 55.2%(比 Megatron-LM 高 1.34×),并逐项拆解每个优化贡献多少——其中"通信与计算重叠"单项就贡献了 +6.2% MFU。工业界全栈调优的标杆样本。
Mixed Precision Training(ICLR'18)
arXiv:1710.03740
论文FP32 主权重 + loss scaling + FP32 累加"三件套"的原始出处,也是理解"为什么 BF16 能免掉 loss scaling"的对照组。
Ring Attention
arXiv:2310.01889 · Zero Bubble PP
arXiv:2401.10241
论文前者是上下文并行的理论基础(序列长度随设备数线性扩展、精确无近似);后者证明流水线气泡公式并非不可逾越——把反向拆成"对输入求梯度"与"对权重求梯度"两半去填气泡,同显存下比 1F1B 快 23%。
Transformer Math 101(EleutherAI)
blog.eleuther.ai
入门最快建立"参数量↔显存↔算力↔时间"数量级直觉的短文,配套 cookbook 里有现成的计算脚本。

A.4 推理优化(对应第 7 章)

材料层级推荐理由
Transformer Inference Arithmetic(kipply)
kipp.ly
入门推理算术的圣经。每 token 2N FLOPs、KV Cache 公式、算力受限与带宽受限的边界,全靠纸笔推导,无实验无难数学。所有后续论文的记账方式都源于这里。第 7.1 节的方法来源。
LLM inference speed of light(zeux)
zeux.io
入门一篇讲清"速度上限 = 带宽 ÷ 每 token 字节数",并指出实测通常只有理论值的 50–80%(剩下被读 KV、kernel 启动、采样、通信吃掉)。给单请求性能定基线时最该引的一篇。
Orca(OSDI'22)
usenix.org
论文连续批处理的原始出处:迭代级调度 + 选择性批处理(注意力必须逐请求算、其余算子可合批——这解释了为什么它不是一行代码的事)。GPT-3 175B 上同延迟下吞吐提升 36.9×。
vLLM / PagedAttention(SOSP'23)
arXiv:2309.06180
论文定义了现代推理引擎的显存管理范式。硬数据:既有系统的 KV 显存利用率只有 20.4%–38.2%(即浪费 60–80%),vLLM 降到 <4%,吞吐提升 2–4×。第 7.3 节的来源。
SGLang / RadixAttention(NeurIPS'24)
arXiv:2312.07104
论文前缀复用的标准答案:基数树 + LRU 淘汰 + 引用计数 + 缓存感知调度(主动把共享前缀的请求排到一起,而不是被动等命中)。最高 6.4× 吞吐。
Sarathi-Serve(OSDI'24)
arXiv:2403.02310
论文解决连续批处理引入的新问题——长 prefill 插进来会卡住所有正在解码的请求。方案是分块预填充(chunked prefill),把 prefill 切成等大块与 decode 拼成均匀批次。chunk 大小的选择正好回到 Roofline:512–2048 最合适——大到能让 prefill 算力受限,小到不会卡住 decode。
DistServe(OSDI'24)
arXiv:2401.09670 · Mooncake(FAST'25 最佳论文)
arXiv:2407.00079
论文PD 分离的两篇代表作。前者首次把 goodput(同时满足首字与逐字延迟约束下的每秒请求数)立为优化目标;后者是 Kimi 的生产平台,进一步把 KV Cache 本身做成分布式池("用更多存储换更少计算"),真实部署中多处理 107%–115% 的请求。
Beyond the Buzz(NVIDIA)
arXiv:2506.05508
论文必读的冷水一杯:扫了几十万个设计点后发现,PD 分离只在 prefill 密集的流量和更大的模型上明显赢;真正决定成败的是两池比例的动态匹配与弹性伸缩。与上一条配着读,避免把架构当银弹。
GQA
arXiv:2305.13245 · DeepSeek-V2 MLA
arXiv:2405.04434
论文KV 压缩的两代答案。GQA 的工程贡献是"用原预训练 5% 的算力就能把 MHA 模型转成 GQA";MLA 用低秩联合压缩把 KV 砍掉 93.3% 且效果不降——一个 671B 的 MoE 模型,每 token 的 KV 比 70B 稠密模型还小数倍。
量化三件套GPTQ · AWQ · SmoothQuant论文三篇读完,量化谱系的分歧点全清楚:GPTQ 用二阶信息补偿误差;AWQ 发现"重要性要看激活分布而非权重大小"并用等价变换避免混合精度的硬件低效;SmoothQuant 把激活的离群值难度"平滑"迁移到权重上,从而能用 W8A8 整数张量核。
vLLM: FP8 KV Cache 实测(2026-04)
vllm.ai/blog
进阶本文最重要的一记警钟:FP8 KV 让逐字延迟改善 20–29%,但同一份分析里,128K 长文检索任务的准确率从 BF16 的 91% 掉到 13%(累加精度不足)。"短 benchmark 上无损"的配置可能在长上下文任务上崩掉——量化必须带长上下文评测。
投机解码三代原始论文 · Medusa · EAGLE-3论文第一篇给出接受率与加速比的解析公式并证明输出分布完全无损;Medusa 去掉独立草稿模型(挂多个解码头,2.2–3.6×);EAGLE-3 靠特征融合突破 scaling 天花板(温度 0 下 4.1–6.5×),现已是主流引擎的标配选项。
LMSYS:96×H100 上的大规模 EP 部署
lmsys.org/blog
进阶MoE serving 的当前最优实践公开复现:PD 分离 + 大规模专家并行 + 专家负载均衡全套,做到 0.2 美元/百万输出 token,约为官方 API 定价的五分之一。第 7.8 节的来源。

A.5 RL 基础设施(对应第 8 章)

材料层级推荐理由
HybridFlow / veRL(EuroSys'25)
arXiv:2409.19256 · GitHub
论文RL 系统设计的枢纽论文:上层数据流用单控制器、下层分布式计算用多控制器/SPMD;3D-HybridEngine 解决训练与生成两种并行布局之间的重分片且零显存冗余。工程红利:改一处资源池映射就能在共置与分离间切换。
AReaL
arXiv:2505.24298
论文完全异步 RL 的代表:可中断的 rollout(权重更新时打断正在进行的生成)+ 解耦的 PPO 目标(处理来自多个历史策略版本的混合数据),相对同步系统最高约 2.8× 加速。
slime(智谱)
GitHub · LMSYS 博客
进阶把多轮工具调用与沙箱交互当作"数据生成工作流"接进同一循环——面向 Agent 与长轨迹的设计范本,也是 GLM 系列背后的 RL 框架。
Defeating Nondeterminism in LLM Inference(Thinking Machines)
thinkingmachines.ai
进阶训推一致问题的根因分析:归一化、矩阵乘、注意力这三类算子的数值结果依赖 batch size(不同批量改变归约切分),解法是让 kernel 使用与批量无关的单一归约策略。配 SGLang 确定性推理 看工程落地。第 8.4 节的来源。
Keep the Tokens Flowing(HuggingFace)
huggingface.co/blog
进阶横向比较 16 个开源 RL 库的异步化实现,是 8.3 节三种异步手法的最佳综述。
Kimi k1.5
arXiv:2501.12599
论文部分 rollout(给轨迹设 token 预算、未完成的存回缓冲下轮续跑)的经典出处,解决长思维链的资源独占问题。

A.6 中文优质材料(含国产卡专题,对应第 9 章)

这一节是中文读者的主场。国产卡的一手资料几乎全部只有中文,且质量参差——下面这些是经过筛选的。

材料层级推荐理由
ArthurChiao GPU 进阶笔记系列(四篇)
(一)硬件拓扑与集群组网 · (二)昇腾 910B · (三)华为 NPU/GPU 演进 · (四)GH200 与集群
入门→进阶中文里把硬件拓扑 + 集群组网 + 国产 NPU 三件事讲得最系统的一组笔记。第(二)篇是少见的以"对标英伟达视角"梳理昇腾规格与互联的第三方分析。另有《大模型推理的极限》译文,是第 7 章思维模型的中文入口。
猛猿:图解大模型系列(知乎)
张量并行 TP · Megatron 源码解读 · MoE 并行训练 · PagedAttention 原理
入门→高级中文并行训练教学的事实标准,图讲得比论文清楚。从张量并行原理一路到 Megatron 逐行源码、MoE 四维分组策略、vLLM 源码解析,是中文读者绕过英文论文门槛的最短路径。
苏剑林「科学空间」
从熵不变性看 Attention 的 Scale · 低精度 Attention 的有偏舍入误差
高级中文世界最硬核的算法数学博客。第二篇尤其推荐:把"低精度 Transformer 训练为何失败"归因到舍入偏置,是第 5.2 节数值稳定性话题的最佳中文深度阅读。
OneFlow CUDA 优化系列
高效 Softmax kernel · LayerNorm 性能优化
进阶"分档特化"这一优化范式的教科书案例:按列数分三档策略(warp 级 / block+共享内存 / block 无共享内存)。理解第 3.2 节"为什么归一化类算子是带宽瓶颈"的最佳实操材料。
深入浅出 GPU 优化系列
reduce 优化 · GEMM 优化 · 配套代码
进阶7 版 reduce 迭代到 95% 带宽利用率——"优化是怎么一步步逼近硬件上限"的中文范本,配可编译可跑的代码。进阶可看 LeetCUDA(200+ kernel,HGEMM 打到 cuBLAS 98–100%)。
昇腾官方文档
Ascend C 硬件基本架构 · CANN 开源仓库(gitcode) · torch_npu · 精度与性能工具 mstt
进阶达芬奇架构的 Cube/Vector/Scalar 与 L0/L1/UB 缓冲、MTE 搬运引擎的一手中文来源。2026 年重要变化:代码样例已从 gitee 迁往 gitcode,算子库拆成独立仓库开源——大量中文教程仍在引旧路径。分布式训练用 MindSpeed-LLM,不要自己糊。
昇腾 950 NPU 架构白皮书(华为,2026-06,40 页)
官方 PDF
进阶本文第 1.5 节的主要来源,强烈建议原文精读。它给出了媒体几乎从未完整报道的东西:逐精度算力表(含各裁剪档位)、完整的内存层级表、HiF8 编码格式的定义(变长前缀码如何实现 38 个阶码且无需外挂缩放因子)、互联规格(72 Lane SerDes / 18 端口 / 2TB/s)、以及内存 RAS 机制。注意口径:正文全程只称"高速片上内存",不含 HiBL/HiZQ 等发布会用名,也没有功耗与制程数字。
灵衢(UnifiedBus)2.0 技术规范
官方文档仓库 · 发布会 keynote
进阶包含《灵衢基础规范 2.0》《固件规范》《操作系统参考设计》《基于灵衢的超节点参考架构白皮书》及八份关键技术分册(内存池化、设备虚拟化、超节点可靠性、编程编译等)。最值得读的是双语义设计:内存语义(Load/Store/Atomic 直达对端内存,无应用层干预)与消息语义(队列 + Doorbell)如何共存,以及集合通信如何硬件卸载。物理层到事务层规范全部公开,是理解"国产超节点路线"的一手材料。
DeepSeek-V3 中文深度解读
Infra & 硬件篇
进阶FP8 训练、DualPipe 消气泡、无辅助损失负载均衡、免张量并行的显存优化——"用工程换算力"的最佳单一案例,也是国产团队在受限硬件条件下做系统创新的范本。
微软亚洲研究院 AI-System
GitHub
入门→进阶学术味最正的中文系统教材(已出版《深度学习系统设计》),三段式结构:基础全景 / 前沿科研 / 配套实验。与 A.1 的 ZOMI 课程互补。

APPENDIX B数字口径与使用须知

这一节比它看起来重要。技术讨论里大量的"数据打架",根源都是口径不一致。

B.1 引用本文数字时必须注意的七件事

  1. 稠密算力 vs 稀疏算力。芯片厂商规格表里带星号的算力通常是"带 2:4 稀疏"的数字,稠密算力要对折。本文一律用稠密口径(H100 BF16 = 989 TFLOPS,而非 1979)。拿稀疏比别人的稠密,是硬件对比里最常见的作弊。
  2. MFU vs HFU。MFU 只算模型理论必需的计算量,HFU 把重计算等冗余也算作有用工作。全量重计算下 HFU ÷ MFU ≈ 8/6 ≈ 1.33——两个团队报的数字差 30%,可能只是口径不同。
  3. MFU 的分母必须与训练精度匹配。用 BF16 峰值算 FP8 训练的 MFU 会虚高一倍,反之亦然。同一份训练可以合法地报出两个相差一倍的 MFU 数字。
  4. 6ND 是下界估计。它省略了注意力中不含参数的两个矩阵乘,其占比约为 序列长度 ÷ (6 × 隐藏维度)——序列越长越不可忽略(8K 序列、8K 隐藏维度时约 17%)。MoE 模型要用激活参数量而非总参数量。
  5. 论文口径 ≠ 生产表现。本文引用的加速倍数(如 36.9×、6.4×、2.6–5.6×、7.4×)都是特定配置下的论文数字,往往带"同延迟下""模拟场景""理论值"等前提。落地效果通常显著低于论文。
  6. 年化收入 ≠ 会计年度收入。本文不涉及财务数据,但同一原则适用于所有第三方转述的数字:优先找一手来源。
  7. 国产芯片的公开参数口径分歧较大。昇腾 910B/910C 的显存带宽、算力等数字在不同来源间差异明显,且官方未完整披露。本文相关表述均标注为"公开口径",做技术决策请以实机测试为准

B.2 本文哪些数字是推算的

为了让读者能复算,以下推导在正文中都给出了公式与中间步骤,但它们是基于公开规格的计算结果,而非某篇文献的原文数字:Roofline 拐点(989 ÷ 3.35 ≈ 295 FLOPs/Byte);方阵矩阵乘越过拐点所需边长(约 900);各类算子的算术强度(逐元素 0.25、朴素注意力约 d/2、FlashAttention 约 S/2);70B 模型的单请求解码速度上限(约 24 token/s)与 KV Cache 占用(320 KB/token、128K 上下文约 40 GB);训练时间算例(70B × 15T token、1 万卡、MFU 40% → 约 18 天)。如果你的实测与这些推算差很多,先检查前提假设,而不是怀疑物理定律。

B.3 本文没有覆盖的重要话题

数据工程

数据配比、去重、清洗、合成数据——对模型效果的影响往往超过算力优化,但属于算法与数据侧,不在本文范围。

机房基础设施

供配电(12V→48V→垂直供电)、液冷与风冷、机柜密度、选址与电价、光模块与链路洁净度——万卡集群里这些是真实的工程主战场,值得单独一份文档。

调度与云原生

Kubernetes/Slurm 混合调度、GPU 虚拟化与切分、多租户隔离、作业排队与碎片治理——利用率的另一半答案在这里。

模型架构创新

线性注意力、状态空间模型、稀疏注意力、混合架构——从算法侧降低算力需求,是与工程优化并行的另一条路。

本文为内部学习材料,基于截至 2026 年 8 月的公开资料编写。技术演进极快,其中的具体数字(尤其芯片规格、框架版本、价格)会迅速过时;但第 2 章的 Roofline 思维、第 4 章的通信量分析、第 5 章的显存账本、第 7 章的推理算术这四套方法论不会过时——硬件换代之后,把新数字代进同样的公式即可。