
📃作者主页:编程的一拳超人
⛺️ 欢迎关注:👍点赞 👂🏽留言 🌟收藏 💞 💞 💞
于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。
大模型研发重难点全栈手册

从预训练、混合精度、3D 并行、吞吐优化,到对齐微调、推理部署、RAG/Agent 与评测(最全完整版)
本手册是一份自包含的高级 AI 研发技术文档,统一采用「核心问题 → 原理与公式 → 为什么难 → 工业级解法 → 定量权衡 → 踩坑清单 」的骨架。所有显存/通信/吞吐数字均可用配套脚本
cluster_config_calculator.py复算,所有最小实现见配套脚本tp_1f1b_minimal.py、fp8_delayed_scaling.py。
适用读者:已经能跑通 demo、想系统吃透工业级大模型训练---对齐---部署---应用---评测全链路重难点的研发工程师。
- 大模型研发重难点全栈手册
-
- [从预训练、混合精度、3D 并行、吞吐优化,到对齐微调、推理部署、RAG/Agent 与评测(最全完整版)](#从预训练、混合精度、3D 并行、吞吐优化,到对齐微调、推理部署、RAG/Agent 与评测(最全完整版))
- [第 0 章 全局导航中枢:能力地图、因果链与阅读路径](#第 0 章 全局导航中枢:能力地图、因果链与阅读路径)
-
- [0.0 想看具体文章,走这三个入口](#0.0 想看具体文章,走这三个入口)
- [0.1 五大模块因果链(先看清"谁喂给谁")](#0.1 五大模块因果链(先看清"谁喂给谁"))
- [0.2 分角色阅读路径(不必从第 1 章顺序读到 24 章)](#0.2 分角色阅读路径(不必从第 1 章顺序读到 24 章))
- [0.3 模块全景(一页记住边界)](#0.3 模块全景(一页记住边界))
- [0.4 24 章导航索引(一句话定位 + 跳转,正文不在此重复)](#0.4 24 章导航索引(一句话定位 + 跳转,正文不在此重复))
- [0.5 怎么用这套材料(避免两份内容打架)](#0.5 怎么用这套材料(避免两份内容打架))
- [第一部分 预训练](#第一部分 预训练)
-
- [第 1 章 训练稳定性:Loss Spike 全链路复盘 ▸ 独立长文(./第1章_预训练稳定性_LossSpike全链路复盘.md)](#第 1 章 训练稳定性:Loss Spike 全链路复盘 ▸ 独立长文)
-
- [1.1 核心问题](#1.1 核心问题)
- [1.2 原理:四个根因](#1.2 原理:四个根因)
- [1.3 工业级解法](#1.3 工业级解法)
- [1.4 三层兜底与"为什么必须回滚 checkpoint"](#1.4 三层兜底与"为什么必须回滚 checkpoint")
- [1.5 踩坑](#1.5 踩坑)
- [第 2 章 混合精度:FP32/BF16/FP8 的数值安全边界 ▸ 独立长文(./第2章_混合精度_FP32_BF16_FP8数值安全边界.md)](#第 2 章 混合精度:FP32/BF16/FP8 的数值安全边界 ▸ 独立长文)
-
- [2.1 位级家底](#2.1 位级家底)
- [2.2 Loss Scaling 与 BF16 为何不需要](#2.2 Loss Scaling 与 BF16 为何不需要)
- [2.3 混合精度三铁律(顺序不能乱)](#2.3 混合精度三铁律(顺序不能乱))
- [2.4 FP8 训练与 Delayed Scaling](#2.4 FP8 训练与 Delayed Scaling)
- [2.5 逐算子精度白名单](#2.5 逐算子精度白名单)
- [第 3 章 3D 并行:显存与通信逐项算账 ▸ 独立长文·待扩写(./第3章_3D并行_显存与通信逐项算账.md)](#第 3 章 3D 并行:显存与通信逐项算账 ▸ 独立长文·待扩写)
-
- [3.1 显存账本](#3.1 显存账本)
- [3.2 三种并行的定量本质](#3.2 三种并行的定量本质)
- [3.3 黄金嵌套与实算](#3.3 黄金嵌套与实算)
- [第 4 章 吞吐优化:Roofline、FlashAttention、SP 与重计算 ▸ 独立长文·待扩写(./第4章_吞吐优化_Roofline_FlashAttention_序列并行_重计算.md)](#第 4 章 吞吐优化:Roofline、FlashAttention、SP 与重计算 ▸ 独立长文·待扩写)
-
- [4.1 Roofline 先定性](#4.1 Roofline 先定性)
- [4.2 FlashAttention:IO-aware,减 HBM 不减 FLOPs](#4.2 FlashAttention:IO-aware,减 HBM 不减 FLOPs)
- [4.3 激活重计算:用算力换显存](#4.3 激活重计算:用算力换显存)
- [4.4 序列并行 SP:补 TP 没切干净的激活](#4.4 序列并行 SP:补 TP 没切干净的激活)
- [4.5 MFU 度量](#4.5 MFU 度量)
- [第 5 章 数据工程:比模型结构更决定成败的一环 ▸ 独立长文·待扩写(./第5章_数据工程_预训练语料配比去重清洗.md)](#第 5 章 数据工程:比模型结构更决定成败的一环 ▸ 独立长文·待扩写)
-
- [5.1 核心问题](#5.1 核心问题)
- [5.2 处理流水线与每一步的难点](#5.2 处理流水线与每一步的难点)
- [5.3 Tokenizer](#5.3 Tokenizer)
- [5.4 数据配比(Data Mixture)](#5.4 数据配比(Data Mixture))
- [5.5 踩坑](#5.5 踩坑)
- [第 6 章 优化器、初始化、学习率调度与收敛诊断 ▸ 独立长文·待扩写(./第6章_优化器_初始化_学习率调度与收敛诊断.md)](#第 6 章 优化器、初始化、学习率调度与收敛诊断 ▸ 独立长文·待扩写)
-
- [6.1 AdamW 与权重衰减的正确打开方式](#6.1 AdamW 与权重衰减的正确打开方式)
- [6.2 学习率调度](#6.2 学习率调度)
- [6.3 初始化与残差缩放(稳定性的隐藏功臣)](#6.3 初始化与残差缩放(稳定性的隐藏功臣))
- [6.4 收敛诊断:怎么判断"健不健康"](#6.4 收敛诊断:怎么判断"健不健康")
- [6.5 踩坑](#6.5 踩坑)
- [第 7 章 MoE 与专家并行(EP) ▸ 独立长文·待扩写(./第7章_MoE与专家并行EP.md)](#第 7 章 MoE 与专家并行(EP) ▸ 独立长文·待扩写)
-
- [7.1 核心问题与原理](#7.1 核心问题与原理)
- [7.2 三大难点](#7.2 三大难点)
- [7.3 权衡](#7.3 权衡)
- [7.4 踩坑](#7.4 踩坑)
- [第 8 章 长上下文:外推、序列并行与"中间遗忘" ▸ 独立长文·待扩写(./第8章_长上下文_位置外推_序列并行_中间遗忘.md)](#第 8 章 长上下文:外推、序列并行与"中间遗忘" ▸ 独立长文·待扩写)
-
- [8.1 位置编码外推难题](#8.1 位置编码外推难题)
- [8.2 长序列的显存/算力墙与序列并行](#8.2 长序列的显存/算力墙与序列并行)
- 8.3 "Lost in the Middle"
- [8.4 踩坑](#8.4 踩坑)
- [第 9 章 工程基建:通信、容错、存储、Profiling 与框架 ▸ 独立长文·待扩写(./第9章_工程基建_通信_容错_存储_Profiling_框架.md)](#第 9 章 工程基建:通信、容错、存储、Profiling 与框架 ▸ 独立长文·待扩写)
-
- [9.1 通信库与网络拓扑](#9.1 通信库与网络拓扑)
- [9.2 容错与弹性训练](#9.2 容错与弹性训练)
- [9.3 Checkpoint 存储](#9.3 Checkpoint 存储)
- [9.4 Profiling:MFU 低了到底卡在哪](#9.4 Profiling:MFU 低了到底卡在哪)
- [9.5 框架选型](#9.5 框架选型)
- [9.6 踩坑](#9.6 踩坑)
- [第二部分 微调与对齐](#第二部分 微调与对齐)
-
- [第 10 章 SFT:监督微调的数据与训练 ▸ 独立长文·待扩写(./第10章_SFT监督微调的数据与训练.md)](#第 10 章 SFT:监督微调的数据与训练 ▸ 独立长文·待扩写)
-
- [10.1 核心问题](#10.1 核心问题)
- [10.2 数据工程](#10.2 数据工程)
- [10.3 训练要点](#10.3 训练要点)
- [10.4 踩坑](#10.4 踩坑)
- [第 11 章 LoRA / QLoRA:低秩适配的原理与边界 ▸ 独立长文·待扩写(./第11章_LoRA_QLoRA低秩适配原理与边界.md)](#第 11 章 LoRA / QLoRA:低秩适配的原理与边界 ▸ 独立长文·待扩写)
-
- [11.1 原理:为什么低秩有效](#11.1 原理:为什么低秩有效)
- [11.2 秩 r 与挂载位置](#11.2 秩 r 与挂载位置)
- [11.3 QLoRA:把显存压到极限的三招](#11.3 QLoRA:把显存压到极限的三招)
- [11.4 什么时候必须全参微调](#11.4 什么时候必须全参微调)
- [11.5 踩坑](#11.5 踩坑)
- [第 12 章 对齐进阶:RLHF(PPO) → DPO → GRPO ▸ 独立长文·待扩写(./第12章_对齐进阶_RLHF_PPO_DPO_GRPO.md)](#第 12 章 对齐进阶:RLHF(PPO) → DPO → GRPO ▸ 独立长文·待扩写)
-
- [12.1 RLHF/PPO 为什么难](#12.1 RLHF/PPO 为什么难)
- [12.2 DPO:绕开奖励模型的直接偏好优化](#12.2 DPO:绕开奖励模型的直接偏好优化)
- [12.3 GRPO:去掉 Critic 的群体相对策略优化](#12.3 GRPO:去掉 Critic 的群体相对策略优化)
- [12.4 方法对比与选型](#12.4 方法对比与选型)
- [12.5 踩坑](#12.5 踩坑)
- [第 13 章 对齐税(Alignment Tax) ▸ 独立长文·待扩写(./第13章_对齐税_AlignmentTax.md)](#第 13 章 对齐税(Alignment Tax) ▸ 独立长文·待扩写)
-
- [13.1 现象](#13.1 现象)
- [13.2 根因](#13.2 根因)
- [13.3 缓解](#13.3 缓解)
- [13.4 踩坑](#13.4 踩坑)
- [第三部分 推理部署](#第三部分 推理部署)
-
- [第 14 章 KV Cache 与 PagedAttention(vLLM 为什么快) ▸ 独立长文·待扩写(./第14章_KVCache与PagedAttention.md)](#第 14 章 KV Cache 与 PagedAttention(vLLM 为什么快) ▸ 独立长文·待扩写)
-
- [14.1 KV Cache 显存怎么估](#14.1 KV Cache 显存怎么估)
- [14.2 原生批处理的痛点](#14.2 原生批处理的痛点)
- [14.3 PagedAttention:像操作系统管内存一样管 KV](#14.3 PagedAttention:像操作系统管内存一样管 KV)
- [14.4 权衡](#14.4 权衡)
- [14.5 踩坑](#14.5 踩坑)
- [第 15 章 推理量化:GPTQ / AWQ / SmoothQuant 选型 ▸ 独立长文·待扩写(./第15章_推理量化_GPTQ_AWQ_SmoothQuant.md)](#第 15 章 推理量化:GPTQ / AWQ / SmoothQuant 选型 ▸ 独立长文·待扩写)
-
- [15.1 核心矛盾](#15.1 核心矛盾)
- [15.2 三种主流方法](#15.2 三种主流方法)
- [15.3 定量选型表](#15.3 定量选型表)
- [15.4 流程与验证](#15.4 流程与验证)
- [15.5 踩坑](#15.5 踩坑)
- [第 16 章 投机解码(Speculative Decoding) ▸ 独立长文·待扩写(./第16章_投机解码_SpeculativeDecoding.md)](#第 16 章 投机解码(Speculative Decoding) ▸ 独立长文·待扩写)
-
- [16.1 原理:用小模型换大模型延迟](#16.1 原理:用小模型换大模型延迟)
- [16.2 为什么"无损"](#16.2 为什么"无损")
- [16.3 变体与权衡](#16.3 变体与权衡)
- [16.4 踩坑](#16.4 踩坑)
- [第 17 章 高并发推理服务:Continuous Batching 与 SLO 指标 ▸ 独立长文·待扩写(./第17章_高并发推理_ContinuousBatching与SLO.md)](#第 17 章 高并发推理服务:Continuous Batching 与 SLO 指标 ▸ 独立长文·待扩写)
-
- [17.1 三个互相打架的核心指标](#17.1 三个互相打架的核心指标)
- [17.2 Prefill / Decode 两阶段的不同瓶颈](#17.2 Prefill / Decode 两阶段的不同瓶颈)
- [17.3 工程要点](#17.3 工程要点)
- [17.4 容量规划公式](#17.4 容量规划公式)
- [17.5 踩坑](#17.5 踩坑)
- [第四部分 RAG 与 Agent 工程化](#第四部分 RAG 与 Agent 工程化)
-
- [第 18 章 RAG 检索为什么不准:全链路系统性调优 ▸ 独立长文·待扩写(./第18章_RAG检索为什么不准_全链路调优.md)](#第 18 章 RAG 检索为什么不准:全链路系统性调优 ▸ 独立长文·待扩写)
-
- [18.1 核心问题](#18.1 核心问题)
- [18.2 分块(Chunking)的粒度悖论](#18.2 分块(Chunking)的粒度悖论)
- [18.3 嵌入与混合检索](#18.3 嵌入与混合检索)
- [18.4 度量先行](#18.4 度量先行)
- [18.5 踩坑](#18.5 踩坑)
- [第 19 章 向量数据库与 ANN 索引:召回-延迟曲线 ▸ 独立长文·待扩写(./第19章_向量数据库与ANN索引_召回延迟曲线.md)](#第 19 章 向量数据库与 ANN 索引:召回-延迟曲线 ▸ 独立长文·待扩写)
-
- [19.1 为什么需要近似最近邻(ANN)](#19.1 为什么需要近似最近邻(ANN))
- [19.2 HNSW 原理与关键参数](#19.2 HNSW 原理与关键参数)
- [19.3 IVF 与量化压缩](#19.3 IVF 与量化压缩)
- [19.4 选型维度](#19.4 选型维度)
- [19.5 踩坑](#19.5 踩坑)
- [第 20 章 RAG 进阶:Rerank、查询改写与 Self-RAG ▸ 独立长文·待扩写(./第20章_RAG进阶_Rerank_查询改写_SelfRAG.md)](#第 20 章 RAG 进阶:Rerank、查询改写与 Self-RAG ▸ 独立长文·待扩写)
-
- [20.1 为什么召回后还要精排(Rerank)](#20.1 为什么召回后还要精排(Rerank))
- [20.2 查询侧优化(很多坏 RAG 坏在 query)](#20.2 查询侧优化(很多坏 RAG 坏在 query))
- [20.3 Self-RAG / 自适应检索与生成](#20.3 Self-RAG / 自适应检索与生成)
- [20.4 生成侧:防幻觉拼装](#20.4 生成侧:防幻觉拼装)
- [20.5 踩坑](#20.5 踩坑)
- [第 21 章 Agent 为什么在生产不可靠:规划、工具调用与错误恢复 ▸ 独立长文·待扩写(./第21章_Agent生产可靠性_规划_工具调用_错误恢复.md)](#第 21 章 Agent 为什么在生产不可靠:规划、工具调用与错误恢复 ▸ 独立长文·待扩写)
-
- [21.1 核心问题](#21.1 核心问题)
- [21.2 主要失效模式](#21.2 主要失效模式)
- [21.3 工业级解法(用工程确定性约束模型不确定性)](#21.3 工业级解法(用工程确定性约束模型不确定性))
- [21.4 ReAct vs 状态机的取舍](#21.4 ReAct vs 状态机的取舍)
- [21.5 踩坑](#21.5 踩坑)
- [第五部分 机制原理、评测与基础设施](#第五部分 机制原理、评测与基础设施)
-
- [第 22 章 手写 Attention 与 RoPE:算子级理解 ▸ 独立长文·待扩写(./第22章_手写Attention与RoPE_算子级理解.md)](#第 22 章 手写 Attention 与 RoPE:算子级理解 ▸ 独立长文·待扩写)
-
- [22.1 逐步实现一个数值稳定的 Attention](#22.1 逐步实现一个数值稳定的 Attention)
- [22.2 RoPE 旋转位置编码](#22.2 RoPE 旋转位置编码)
- [22.3 常见机制补充](#22.3 常见机制补充)
- [第 23 章 大模型评测方法论:为什么公开榜单不能全信 ▸ 独立长文·待扩写(./第23章_大模型评测方法论.md)](#第 23 章 大模型评测方法论:为什么公开榜单不能全信 ▸ 独立长文·待扩写)
-
- [23.1 评测的三类指标](#23.1 评测的三类指标)
- [23.2 pass@1 与 pass@k 的区别](#23.2 pass@1 与 pass@k 的区别)
- [23.3 榜单不可全信的四大陷阱](#23.3 榜单不可全信的四大陷阱)
- [23.4 可靠评测怎么做](#23.4 可靠评测怎么做)
- [23.5 踩坑](#23.5 踩坑)
- [第 24 章 可观测性与成本治理 ▸ 独立长文·待扩写(./第24章_可观测性与成本治理.md)](#第 24 章 可观测性与成本治理 ▸ 独立长文·待扩写)
-
- [24.1 训练侧可观测](#24.1 训练侧可观测)
- [24.2 推理/服务侧可观测](#24.2 推理/服务侧可观测)
- [24.3 Token 与成本核算](#24.3 Token 与成本核算)
- [24.4 稳定性与降级链路](#24.4 稳定性与降级链路)
- [24.5 踩坑](#24.5 踩坑)
- [附录 A 关键公式速查表](#附录 A 关键公式速查表)
- [附录 B 显存-通信-MFU 配置计算器(配套脚本)](#附录 B 显存-通信-MFU 配置计算器(配套脚本))
- [附录 C 故障与决策速查树](#附录 C 故障与决策速查树)
- [附录 D 24 篇技术文章映射](#附录 D 24 篇技术文章映射)
第 0 章 全局导航中枢:能力地图、因果链与阅读路径
【请先读这一段】本章是「导览 / 导航章节」,不是技术正文。 这里只放全局能力地图、分角色阅读路径和文章跳转索引,不展开任何具体技术内容 (不写公式推导、可运行代码、消融数据与踩坑细节)------这些实质内容全部在每一篇独立文章里。如果你是来学某个具体技术点的,请不要停在本章,按下面 0.0 的入口直接跳到对应文章。
0.0 想看具体文章,走这三个入口
| 你的目的 | 去哪里看 |
|---|---|
| 还不确定看哪篇,想先按主题挑 | 看 0.4「24 章导航索引」表:每章一句话定位 + 直达链接 |
| 已经知道章节号 | 直接翻到正文该章标题,点标题末尾的 [▸ 独立长文] 跳转链接 |
| 想找文章源文件 / 线上原文 | 每篇都是与本手册同目录的独立 .md(命名 第N章_主题.md);线上对应「大模型研发重难点」专栏中的同名单篇文章 |
怎么判断链接能不能点开:
- 标
[▸ 独立长文]------ 已写完的成稿,可直接打开阅读; - 标
[▸ 独立长文·待扩写]------ 链接位置已预埋、文章正在逐篇扩写,该篇文件一生成即自动可点(命名已固定,不会出现死链)。
配套可运行脚本(
cluster_config_calculator.py显存-通信-MFU 计算、tp_1f1b_minimal.py并行最小实现、fp8_delayed_scaling.pyFP8 定标状态机、verify_pure_logic.py纯逻辑自检)统一放在本手册同一目录,相关文章内会注明对应脚本。
0.1 五大模块因果链(先看清"谁喂给谁")
┌─────────────────────────────────────────┐
│ 第一部分 预训练(决定模型"出生素质") │
│ 稳定性→精度→并行→吞吐→数据→优化器→MoE→长上下文→基建 │
└───────────────┬─────────────────────────┘
│ 基座模型 checkpoint
┌────────────────────┴───────────────────┐
▼ ▼
┌──────────────────────────┐ ┌──────────────────────────┐
│ 第二部分 微调与对齐 │ │ 第五部分 机制/评测/可观测 │
│ SFT→LoRA→RLHF/DPO/GRPO │ │ 原理深挖、评测、成本治理 │
└────────────┬─────────────┘ └──────────────────────────┘
▼ 对齐后模型
┌──────────────────────────┐
│ 第三部分 推理部署 │
│ KV Cache/量化/投机解码/批处理 │
└────────────┬─────────────┘
▼ 在线推理服务
┌──────────────────────────┐
│ 第四部分 RAG / Agent 工程 │
│ 检索/向量库/重排/Agent可靠性 │
└──────────────────────────┘
一条主线记牢:预训练管"模型本身强不强、稳不稳";对齐管"听不听话、会不会用";推理管"省不省钱、快不快";RAG/Agent 管"能不能接入真实业务闭环";评测与可观测贯穿全程,是每一步的"度量衡"。前一环节的产物(checkpoint / 对齐模型 / 推理服务)是后一环节的输入,跳步往往就是线上事故的来源。
0.2 分角色阅读路径(不必从第 1 章顺序读到 24 章)
| 你的目标 | 推荐路径(按序) | 可先跳过 |
|---|---|---|
| 预训练/大模型训练工程师 | 1→2→3→4→6→5→7→8→9,配 22 补算子原理 | 10--21 按需 |
| 推理部署/推理引擎工程师 | 22→2→14→15→16→17→24,再回看 3、4 | 10--13、18--21 |
| 对齐/后训练工程师 | 22→10→11→12→13→23,补 1、2 数值底座 | 3、4、14--21 主体 |
| RAG/Agent 应用工程师 | 22→23→18→19→20→21→17(懂服务瓶颈) | 1--16 训练/推理内核按需 |
| 面试/体系化查漏补缺 | 先读 0.1 因果链,再按附录 A 公式表反查薄弱章 | ------ |
前置依赖:第 3、4、7、8 章依赖第 1、2 章的数值底座;第 12 章依赖第 10、11 章;第 16、17 章依赖第 14、15 章;第 20、21 章依赖第 18、19 章。
0.3 模块全景(一页记住边界)
| 模块 | 章节 | 主题 | 该模块要回答的核心问题 |
|---|---|---|---|
| 一·预训练 | 1-4 | 稳定性 / 混合精度 / 3D 并行 / 吞吐 | 怎么把模型稳定、高效、算得动地训出来 |
| 一·预训练补缺 | 5-9 | 数据 / 优化器初始化 / MoE / 长上下文 / 基建 | 规模上去后,数据、优化、并行、容错怎么撑住 |
| 二·对齐 | 10-13 | SFT / LoRA·QLoRA / RLHF·DPO·GRPO / 对齐税 | 怎么让基座听话、会用,且不牺牲能力 |
| 三·推理 | 14-17 | KV Cache·PagedAttn / 推理量化 / 投机解码 / 连续批处理 | 怎么又快又省又满足 SLO 地服务 |
| 四·应用 | 18-21 | RAG 调优 / 向量库 ANN / 重排改写 / Agent 可靠性 | 怎么接进真实业务闭环并可控 |
| 五·底座 | 22-24 | Attention·RoPE / 评测方法论 / 可观测成本 | 原理、度量衡与成本治理 |
| 附录 | A-D | 公式速查 / 配置计算器 / 故障决策树 / 发文映射 | 速查与落地工具 |
0.4 24 章导航索引(一句话定位 + 跳转,正文不在此重复)
形态说明:独立长文 =已扩写为 8 千~1.6 万字、带推导/代码/SOP/文献的定稿(单独文件);本册纲要=当前在本手册内的精简版(约 1000 字),将逐章扩写,扩完即升级为独立长文、以其为准。
| 章 | 标题 | 一句话解决的问题 | 形态 / 跳转 |
|---|---|---|---|
| 1 | 训练稳定性 Loss Spike 全链路复盘 | 训练十几万步后几秒雪崩到 NaN 的根因与三层防线 | ✅独立长文,点击跳转:第1章_预训练稳定性_LossSpike全链路复盘 |
| 2 | 混合精度 FP32/BF16/FP16/FP8 | 各格式数值边界、三铁律、FP8 定标状态机 | ✅独立长文,点击跳转:第2章_混合精度_FP32_BF16_FP8数值安全边界 |
| 3 | 3D 并行:显存与通信逐项算账 | DP/TP/PP/ZeRO 各省多少显存、花多少通信 | ✅独立长文,点击跳转:第 3 章 3D 并行:显存与通信逐项算账 |
| 4 | 吞吐优化 Roofline/FA/SP/重计算 | 算力为什么喂不满、怎么把 MFU 顶上去 | ✅独立长文,点击跳转:第 4 章 吞吐优化:Roofline、FlashAttention、SP 与重计算(完整版) |
| 5 | 数据工程 | 配比、去重、清洗、课程学习如何决定上限 | ✅独立长文,点击跳转: 第 5 章 数据工程:比模型结构更决定成败的一环(完整版·可工程化) |
| 6 | 优化器/初始化/调度/收敛诊断 | AdamW 家族、缩放初始化、怎么判断真收敛 | ✅独立长文,点击跳转: 第 6 章 优化器、初始化、学习率调度与收敛诊断(完整版・可工程化) |
| 7 | MoE 与专家并行 EP | 稀疏激活怎么扩参、路由与负载均衡 | 本册纲要 §7 |
| 8 | 长上下文 | 位置外推、序列并行、中间遗忘 | 本册纲要 §8 |
| 9 | 工程基建 | 通信/容错/存储/Profiling/训练框架 | 本册纲要 §9 |
| 10 | SFT 监督微调 | 指令数据构造与训练的坑 | 本册纲要 §10 |
| 11 | LoRA / QLoRA | 低秩适配为什么有效、边界与秩选择 | 本册纲要 §11 |
| 12 | RLHF(PPO)→DPO→GRPO | 三类对齐算法的机理、成本与取舍 | 本册纲要 §12 |
| 13 | 对齐税 | 对齐为什么会掉能力、怎么补 | 本册纲要 §13 |
| 14 | KV Cache 与 PagedAttention | 显存为何被 KV 吃掉、vLLM 为什么快 | 本册纲要 §14 |
| 15 | 推理量化 GPTQ/AWQ/SmoothQuant | W4A16/W8A8 怎么选、掉点多少 | 本册纲要 §15 |
| 16 | 投机解码 | 小模型起草、大模型验证怎么无损加速 | 本册纲要 §16 |
| 17 | 高并发推理服务 | Continuous Batching 与 SLO 调度 | 本册纲要 §17 |
| 18 | RAG 为什么不准 | 检索全链路系统性调优 | 本册纲要 §18 |
| 19 | 向量库与 ANN 索引 | 召回-延迟曲线与索引选型 | 本册纲要 §19 |
| 20 | RAG 进阶 Rerank/改写/Self-RAG | 召回后怎么提精、查询怎么改写 | 本册纲要 §20 |
| 21 | Agent 生产可靠性 | 规划/工具调用/错误恢复为什么不稳 | 本册纲要 §21 |
| 22 | 手写 Attention 与 RoPE | 算子级吃透注意力与旋转位置编码 | 本册纲要 §22 |
| 23 | 评测方法论 | 公开榜单为什么不能全信、怎么自建评测 | 本册纲要 §23 |
| 24 | 可观测性与成本治理 | 训练/推理全链路指标与单位成本 | 本册纲要 §24 |
0.5 怎么用这套材料(避免两份内容打架)
- 单一事实源原则:每章一旦扩成"独立长文",该主题以独立长文为准;本手册内对应纲要只作 30 秒速览,不再承担完整论述,避免纲要与长文各改一份、内容不一致。
- 速览走纲要、深读走长文:想快速回忆框架看本册 §X;要推导、代码、踩坑数据和文献,跳到对应独立长文。
- 配套脚本 :数字可复算用
cluster_config_calculator.py,最小可运行实现见tp_1f1b_minimal.py、fp8_delayed_scaling.py,纯逻辑自检见verify_pure_logic.py。
第一部分 预训练
第 1 章 训练稳定性:Loss Spike 全链路复盘 ▸ 独立长文
1.1 核心问题
训练跑到十几万 step,loss 在几秒内垂直起跳直至 NaN。它不是缓慢劣化,而是正反馈雪崩,留给自动兜底的窗口只有几个 step。
严格用梯度范数序列 g_t 判别(裁剪阈值 τ=1.0):
- 健康:
g_t∈[0.2,1.2],从不触发裁剪; - 温和尖峰:单步到 3~8 后立刻回落,可 skip;
- 发散充要判据 :连续 3 步
g_t>τ且g_{t+1}>g_t(裁剪后仍单调放大)。
1.2 原理:四个根因
(1) 雅可比连乘导致梯度指数放大。 ∂L/∂x₀=(∂L/∂x_L)·Π J_l,每层最大奇异值 σ_l:σ=1.03 叠 80 层 1.03^80≈10.6,σ=1.05 则 ≈49.5;σ=0.97 则消失到 0.089。深层网络对每层 3%~5% 尺度偏差极度敏感。
(2) AdamW 挡不住突发尖峰。 m_t=β1m+(1-β1)g、v_t=β2v+(1-β2)g²,v 是平方 EMA 存在一拍滞后;β2 越大越钝。连续放大时一阶矩 m 的增长会在数步内超过 √v 的压制。故稳定性优先取 β2=0.95 而非 0.99,用稍大噪声换快速响应。
(3) Attention logits 爆炸(首发爆点)。 设 q、k 元素方差 σ²、维度 d,内积 Var[q·k]=dσ⁴,除 √d 后分数标准差=σ²(四次方关系) 。σ 从 1 漂到 1.5,分数标准差变 2.25;漂到 3 变 9。logits 到 ±20 时 e^20≈4.85e8,softmax 饱和成 one-hot、熵坍缩,临界区梯度尖锐。
(4) softmax 能量漂移是监控盲区。 所有 logits 同加常数,softmax 输出与主交叉熵都不变,但 z=logsumexp(logits) 单调增大------主 loss 看不到,却是溢出领先指标(常早千步)。
1.3 工业级解法
| 手段 | 作用层 | 关键做法 |
|---|---|---|
| QK-RMSNorm | 架构 | q、k 各自投影后、内积前都归一,把 σ 强制锁 1;必须从头加 |
| z-loss | 损失 | loss=ce+1e-4·mean(logsumexp²),系数刻意小,正常比 ce 小 2~4 个数量级 |
| online-softmax | 数值 | 先减行最大值再 exp,exp(0)=1 永不溢出 |
| global grad clip | 优化器 | g_i*=min(1,τ/‖g‖),只改幅度不改方向,是保险丝不是灭火器 |
| fp32 master + bf16 | 数值 | 主权重/优化器/归约 fp32,前向 bf16 |
| warmup + cosine | 优化器 | 早期最高发,warmup 必须给够 |
QK-Norm 正确位置:
python
q = q_proj(h); k = k_proj(h)
q = q_norm(q) # 投影之后、matmul 之前,逐 head 在 head_dim 归一
k = k_norm(k) # q、k 缺一不可,只 norm 一个锁不死
scores = (q @ k.transpose(-2,-1)) / sqrt(head_dim)
1.4 三层兜底与"为什么必须回滚 checkpoint"
- 预防:上表全部配齐。
- 在线 :step 级监控每层 grad norm、logits max、z;异常先 skip step(丢弃坏更新不写回权重),连续放大则降 lr;同一数据分片反复爆先查脏数据。
- 恢复(重点) :确认发散必须回滚,且权重 + 优化器状态(m,v) + lr 调度进度 + 数据游标 + 随机数状态五件套一起回 。原因:① NaN 污染 EMA 形式的 m/v,单点置 0 无效;② 坏权重落入坏盆地,硬训常"假性恢复→二次更猛 spike";③ lr 调度是时间函数,权重回退而调度不回则错配;④ 回滚只丢最近一段算力,远小于带病硬训。回滚点选"连续 50 步 norm 平稳、z 不抬升"的健康点,而非最近 ckpt;重启只改一处(首选 lr×0.8)便于归因。双层 ckpt:每 15~30 分钟滚动留 3~5 份近期 + 长期永久。
1.5 踩坑
只回权重不回 m/v;fp16 不配 loss scaling;master 也用低精度;把 clip 收紧当根治;QK-LN 中途热插入;z-loss 系数给太大压平 logits;最近 ckpt 已在亚临界还回滚到它;只看全局 loss 不看分层领先指标。
第 2 章 混合精度:FP32/BF16/FP8 的数值安全边界 ▸ 独立长文
2.1 位级家底
浮点值 =(-1)^s·2^(e-bias)·(1.f),范围看指数位 E,精度看尾数位 M(数值 x 附近相邻间隔≈x·2^-M)。
| 格式 | E/M | 最大值 | x≈1 时间隔 | 用途 |
|---|---|---|---|---|
| FP32 | 8/23 | 3.4e38 | 1.19e-7 | master/优化器/归约 |
| FP16 | 5/10 | 65504 | 9.77e-4 | 旧方案,需 loss scaling |
| BF16 | 8/7 | 3.4e38 | 7.81e-3 | 训练默认,范围同 fp32 |
| FP8 E4M3 | 4/3 | 448 | 极粗 | 前向(要精度) |
| FP8 E5M2 | 5/2 | 57344 | 更粗 | 反向(要范围) |
两个手算:① 10000×10=1e5>65504 在 FP16 直接 inf,BF16 无碍;② BF16 在 1 附近间隔 0.0078,1.000+0.003=1.000(小数被吃),所以累加绝不能在 BF16。
2.2 Loss Scaling 与 BF16 为何不需要
FP16 最小正规数 6.1e-5,梯度 1e-6 直接下溢为 0;前向乘 S=1e5→0.1 可表示,更新时在 fp32 master 上除回。BF16 最小正规数 1.18e-38(范围同 fp32),无需 scaling,省掉整套动态缩放逻辑------训练默认 BF16 的决定性理由。
2.3 混合精度三铁律(顺序不能乱)
- fp32 master weight:优化器更新永远在 fp32,否则 1e-5 量级更新被 BF16 间隔吞掉;
- 归约/累加 fp32:matmul 可 bf16 走 Tensor Core,但部分和、norm 均值方差、softmax 求和、loss 累加必须 fp32;
- 敏感算子提精度:norm/softmax/exp-log/cross-entropy/全局归约内部 fp32,只在边界 cast。
混合精度 AdamW 模型状态 = 16 字节/参数(fp32 master 4 + bf16 w 2 + bf16 g 2 + m 4 + v 4)。7B=112GB、70B=1120GB,单卡放不下,直接逼出第 3 章并行。
2.4 FP8 训练与 Delayed Scaling
定标方向(最易写反):scale(除数)=amax/448,scale_inv=448/amax,量化 x_fp8=x·scale_inv,使历史最大 amax 贴到 448。例 amax=28 → scale=0.0625、scale_inv=16、28×16=448。
- per-tensor 一张量一尺度(粗、省);per-block(1×128) 小块独立定标(精度好,Hopper 主流);
- delayed/history:前向只记录 amax、用上一拍冻结的 scale_inv(避免同步等归约),step 末 all-reduce MAX 入长度 16 历史窗,按窗内最大值更新下一拍 scale,并限单步最多变 2 倍防抖;
- non-finite 回退 :量化输入/权重/GEMM 输出任一 inf/nan 或超 448 饱和 → 拒绝
optimizer.step()、scale×0.5、清梯度、dataloader 游标不动、同一 batch 重算(单步级保险丝,区别于 loss spike 的检查点级回滚)。完整状态机见fp8_delayed_scaling.py(已含自检)。
2.5 逐算子精度白名单
| 算子 | 计算精度 | 累加 | 可否 FP8 |
|---|---|---|---|
| 大 GEMM | bf16/FP8 | fp32 | 可,收益最大 |
| Norm/Softmax/CE/优化器 | fp32 | fp32 | 否 |
| QKᵀ 打分 | bf16 | fp32 | 谨慎常保 bf16 |
| RoPE/逐元素 | bf16 | --- | 一般不 |
上线 FP8 前逐层算 bf16 vs fp8 输出余弦相似度,低于 0.999 的层回退 bf16。
第 3 章 3D 并行:显存与通信逐项算账 ▸ 独立长文·待扩写
3.1 显存账本
训练显存 = 模型状态(16 字节/参数)+ 激活 + 缓冲。激活(FlashAttention、bf16、K_ACT≈12 个 hidden 宽向量/层/token):
激活/卡 ≈ (L/PP)·bm·s·K_ACT·h·2 / TP · α # α=重算保留系数
3.2 三种并行的定量本质
数据并行 DP :每卡完整副本、只分数据,反向 Ring-AllReduce 梯度,每卡通信 2(N-1)/N·M≈2M。不省模型状态,只摊激活,作最外层。
张量并行 TP :层内切矩阵。列切 A=[A₁..Aₙ] 前向零通信,行切 B=[B₁;..;Bₙ] 输出处 all-reduce 求部分和;一对列+行前向 1 次、反向 1 次,一个 Transformer 层共 4 次 all-reduce 。参数/状态/激活全部随 TP 线性省。通信穿插在每层、对延迟极敏感,只能放机内 NVLink,TP≤单机卡数(通常 8) 。代码见 tp_1f1b_minimal.py(用 autograd.Function 把通信挂在正确的前/反向边上)。
流水线并行 PP :按层切 stage,仅相邻 stage 边界 P2P 传一次激活,通信量最小、唯一适合跨机;代价是气泡:
气泡占比 = (PP-1)/(m+PP-1) # m=micro-batch 数
PP=4 时 m=8 气泡 27.3%、m=16 15.8%、m=64 4.5%,故 m≥4·PP 起步、目标 ≥8·PP 。调度:GPipe(先全 F 后全 B,激活峰值高)→ 1F1B(warmup 做 PP-1-r 个 F、稳态一 F 一 B 使在途 micro 恒为 PP、cooldown 排空,激活峰值低)→ Interleaved(虚拟 stage v,气泡再除 v,通信翻倍)。
ZeRO(精细化 DP):S1 切优化器状态、S2 再切梯度、S3 再切参数(用时 AllGather、用完释放,单卡模型状态=16Ψ/N,但要预留 gather 峰值缓冲);Offload 把优化器状态卸 CPU/NVMe,省显存但受 PCIe 限速。
3.3 黄金嵌套与实算
TP 锁机内(≤8)→ PP 跨少机(m≫PP)→ DP/ZeRO 铺最外。70B 实算(脚本真实输出,H100 80GB):模型状态 1120GB,TP8×PP4=32 → 每卡 35GB;bm=8 激活 16.1GB,合计 55.1GB/80GB;气泡 4.48%;32 卡理想 step 27.8s,MFU=50% 时 step 55.7s、37.7k tokens/s;加 DP2(64 卡)吞吐近翻倍到 75.4k。对照 32×A100 仅 11.9k tokens/s(算力代差 312 vs 989TF 主导)。
第 4 章 吞吐优化:Roofline、FlashAttention、SP 与重计算 ▸ 独立长文·待扩写
4.1 Roofline 先定性
算术强度 I=FLOPs/Byte,脊点 I*=峰值算力/显存带宽。H100:989TF/3.35TB/s≈295 FLOP/Byte。大 Linear 的 I≈2h 极高(compute-bound);标准 Attention 要读写 N×N 矩阵,I 低(memory-bound),减 FLOPs 无用,减访存才提速。
4.2 FlashAttention:IO-aware,减 HBM 不减 FLOPs
原生实现把 N×N 的 S、P 写回 HBM 再读出(显存 O(N²)、带宽爆炸)。FA 分块载入 SRAM,用 online-softmax 递推边算边更新,全程不落地 N×N:
m_new = max(m_old, rowmax(S_j))
l_new = exp(m_old-m_new)·l_old + rowsum(exp(S_j-m_new))
O_new = exp(m_old-m_new)·O_old + exp(S_j-m_new)·P_j·V_j # 最后 O/=l
HBM 访问从 O(N²) 降到 O(N²·d/M)、激活 O(N),FLOPs 几乎不变。收益随序列长度增大;短序列/大 Linear 上有限。FA2/3 进一步优化并行度与硬件调度。
4.3 激活重计算:用算力换显存
不存全部激活、反向重算前向。全重算多约 1/3 FLOPs;选择性重计算只丢"访存大、重算便宜"的注意力中间量,通常只多 3%~8% 算力。口诀:显存临界/要开更大 batch 时开(换空间提 MFU 稳赚),算力已打满且显存富余时关。
4.4 序列并行 SP:补 TP 没切干净的激活
TP 下 LayerNorm/Dropout 激活在 TP 组内每卡冗余一份;SP 沿 sequence 维切,把层间 AllReduce 等价改写为 ReduceScatter + AllGather(通信量几乎不增),该冗余激活随 TP 线性省。SP 依附 TP 存在。
4.5 MFU 度量
每 token≈6Ψ FLOPs(前 2 后 4);理想 step=6Ψ·tokens/(卡数·单卡峰值);MFU=理想/实测 ,只能用实测 tokens/s 反推。损失归因:1-MFU≈通信占比+气泡+重算+调度/内存墙空转。调优顺序:先加 micro 消气泡 → 开 FA/SP 腾显存开大 micro-batch 喂饱 Tensor Core → 显存临界才选择性重算。考核只认端到端 tokens/s 与 MFU,SM 占用 100% 不作数。
第 5 章 数据工程:比模型结构更决定成败的一环 ▸ 独立长文·待扩写
5.1 核心问题
工业界共识"数据配比 > 模型结构微调"。同样架构,数据清洗与配比不同,最终 loss/下游能力可差数个点;数据污染还会让评测虚高、让训练中途 spike。
5.2 处理流水线与每一步的难点
原始语料 → 抽取/解码 → 语言识别&过滤 → 去重 → 质量过滤 → 脱敏 → 分词 → 配比混合 → 打包
- 抽取解码:PDF/HTML 去模板噪声,乱码与控制字符必须清,否则产生异常 token 序列诱发 spike。
- 去重(最关键) :
- 精确去重用哈希;模糊去重用 MinHash + LSH :把文档切成 5-gram 集合算 MinHash 签名(如 128 置换),Jaccard 相似度近似=
签名相等比例,超阈值(如 0.8)判重复并并查集聚类删除。 - 必须做近重复而非只精确去重:模板化网页、搬运文只改几个字,精确哈希漏检。
- 精确去重用哈希;模糊去重用 MinHash + LSH :把文档切成 5-gram 集合算 MinHash 签名(如 128 置换),Jaccard 相似度近似=
- 质量过滤:规则(长度、符号比、困惑度 PPL、分类器打分)。PPL 过高=乱码、过低=模板套话,两端都滤。
- 脱敏:邮箱/手机/身份证/密钥正则 + NER,去隐私与去污染。
- 去污染(decontamination):用评测集(MMLU/GSM8K 等)的题面做 n-gram 匹配,把训练语料里"撞题"片段剔除,否则评测分数是背出来的(详见第 23 章)。
5.3 Tokenizer
- BPE 逐合并最高频 byte-pair;词表大小权衡:小词表→单样本 token 多、训练算力涨;大词表→embedding/softmax 层参数暴涨、稀疏语言覆盖差。主流 32k~128k。
- 多语言要保证各语种碎片率(fertility)均衡,否则小语种被切成单字节、序列爆炸。
- 数字/空格/代码要专门测:代码模型对缩进、符号敏感;数字切分差会直接拖累数学能力。
- tokenizer 一旦随 checkpoint 发布不可改(改了 embedding 对不齐),必须在预训练前定稿。
5.4 数据配比(Data Mixture)
- 按"域"分桶(网页/代码/数学/书籍/论文/对话),按比例采样;比例是超参,常用**小规模缩放实验(scaling proxy)**先扫配比再上全量。
- 课程学习(curriculum):先通用后专精 / 先易后难;末尾"退火(annealing)"阶段喂高比例高质量数据,常能再提一档。
- epoch 数:通用网页 1~2 epoch(多了过拟合记忆),高质量小数据(代码/数学)可 2~4 epoch。重复 token 过多既浪费又导致记忆与 spike。
- 经验:遇到周期性 loss 抖动先怀疑数据顺序/重复 batch,再怀疑优化器。
5.5 踩坑
只做精确去重漏近重复;tokenizer 训练语料没覆盖代码/公式;配比拍脑袋不做缩放实验;评测集泄漏进训练;不打乱域顺序导致同域连续 batch 引起 loss 周期性波动;超长样本不截断/不分桶引发激活峰值 OOM(需按长度分桶或排序采样)。
第 6 章 优化器、初始化、学习率调度与收敛诊断 ▸ 独立长文·待扩写
6.1 AdamW 与权重衰减的正确打开方式
- AdamW 是解耦权重衰减 :
w←w−lr·(m̂/(v̂^0.5+ε)+wd·w),衰减项直接乘权重、不进梯度动量;Adam+L2 把衰减加进梯度,二者在自适应学习率下不等价,Transformer 必须用 AdamW。 - β1=0.9、β2=0.95(稳定性优先,别用 0.99)、eps=1e-8、wd=0.1(仅权重不衰减 bias/norm 参数)。
- 梯度累积:累积 k 个 micro-batch 等效扩大 batch,但lr 应按等效 global batch 调;BN/归一化统计、随机种子在累积期保持一致。
6.2 学习率调度
- warmup:从 0 线性升到峰值,步数通常取总 token 的 0.5%~2%,早期失稳高发区,warmup 不足是常见 spike 元凶。
- cosine decay:平滑降到 min_lr(常取峰值 10%);**WSD(warmup-stable-decay)**用一段稳定平台 + 末尾短退火,便于随时停训/继续喂数据,是长训主流。
- 峰值 lr 与 batch 近似满足缩放律:batch×k,lr 可近似 ×√k(平方根缩放)或 ×k(线性缩放,需更长 warmup),过大必崩。
6.3 初始化与残差缩放(稳定性的隐藏功臣)
- 残差分支累加 L 层,方差随深度增长;GPT-NeoX 等对残差路径投影权重乘
1/√(2L),把残差流方差钉住,与第 1 章 σ 漂移问题同源。 - embedding 与输出 LM head 初始化偏小(否则初始 logits 过大,直接触发第 1 章熵坍缩);norm 的 weight 初始为 1、bias 为 0。
- 深层/大词表下初始化尺度没调好,会在训练前几千 step 就表现为 z 持续抬升。
6.4 收敛诊断:怎么判断"健不健康"
| 信号 | 健康 | 异常与处置 |
|---|---|---|
| loss 曲线 | 平滑下降、抖动小 | 周期抖动查数据;阶跃下跳后不回查重复/泄漏 |
| grad global norm | 稳定区间、clip 偶发 | 持续触顶=lr 过大/缺 QK-LN |
| update/weight 比 | ≈1e-3 量级 | 过大在乱跳、过小学不动 |
| 分层梯度范数 | 各层同量级 | 某层异常大=该层是爆点 |
| logits max / z | 平稳 | 单调抬升=失稳领先指标 |
| 验证 loss | 跟随训练 loss | 背离=过拟合/数据重复 |
update-to-weight ratio = ‖lr·更新量‖/‖w‖,是比 loss 更早的健康度信号。
6.5 踩坑
对 norm/bias 也加权重衰减;β2 盲目调大;lr 随 batch 线性放大却不延长 warmup;不看 update ratio 只看 loss;残差缩放缺失导致深层激活方差缓慢膨胀。
第 7 章 MoE 与专家并行(EP) ▸ 独立长文·待扩写
7.1 核心问题与原理
稠密模型每 token 激活全部参数,算力随参数线性涨。混合专家(Mixture of Experts) :把 FFN 换成 N 个专家 FFN,由 router/gate 每 token 只选 top-k(常 k=2)个专家激活,总参数量大、单 token 计算量小(用稀疏换规模)。
gate_logits = x·W_gate [N_expert]
prob = softmax(gate_logits + noise)
top-k 专家: y = Σ_{i∈topk} prob_i · Expert_i(x)
7.2 三大难点
(1) 负载均衡 :router 倾向挤兑少数"热门专家",其他专家饿死,形成路由坍缩。解法是辅助负载均衡 loss:
L_bal = N · Σ_i f_i · p_i
f_i = 分到专家 i 的 token 比例(硬路由频率)
p_i = router 给专家 i 的平均概率(软分配)
总 loss = 任务loss + λ_bal·L_bal
f 与 p 分别从"实际分配"和"路由倾向"两侧逼均匀;另可加 capacity factor 限制每专家容量、溢出 token 走残差(dropless 则动态扩容、免丢弃但有对齐开销)。
(2) All-to-All 通信 :token 分散在各卡、选中的专家分散在各卡,需两次 all-to-all(分发 token、收回结果),通信模式比 TP 的 all-reduce 更不规则、对网络拓扑敏感。专家并行 EP 把不同专家放不同卡,常与 TP/DP 嵌套:EP 组跨机扩专家数,TP 仍锁机内。
(3) 训练不稳定与收敛:router 与专家互相适应,早期路由剧烈变化;专家"专业化"是否形成、是否有专家死亡(dead expert,长期零分配)都要监控。
7.3 权衡
- 收益:参数规模与激活算力解耦,同算力下知识容量更大;
- 代价:all-to-all 通信、负载均衡损失、显存碎片、推理时专家显存全驻留但激活稀疏(推理 batch 小会让"稀疏"优势打折,需要专家并行调度);
- 适用:超大规模、知识密集;小模型用稠密更省心。
7.4 踩坑
只看总 loss 不监控每专家频率导致死专家;capacity 太小丢 token、太大浪费;EP 跨机 all-to-all 没做拓扑亲和;aux loss 系数过大逼"平均主义"损害专业化;推理沿用训练的稀疏假设却忽略小 batch 下专家覆盖不全。
第 8 章 长上下文:外推、序列并行与"中间遗忘" ▸ 独立长文·待扩写
8.1 位置编码外推难题
RoPE 用旋转矩阵把相对位置编进 Q/K,训练最大长度 L₀ 内正常;直接输入 >L₀ 时旋转角超出训练分布,注意力失效("失忆")。原因是 RoPE 内积对位置差 m-n 敏感,未见过的大角度让相似度坍缩。
外推手段:
- 位置插值 PI:把位置索引按 L_new/L₀ 压缩回训练区间,需少量微调;
- NTK-aware / YaRN :按频率分段缩放(高频少缩保局部、低频多缩扩全局),YaRN 用温度因子修正注意力幅值,外推效果与稳定性最好,是长上下文主流;
- 本质权衡:插值不增算力但牺牲有效分辨率,外推不训练会崩,通常要少量长文本继续训练。
8.2 长序列的显存/算力墙与序列并行
- 自注意力对长度:算力 O(N²)、原生显存 O(N²),长度翻倍是 4 倍代价;FlashAttention 把显存降到 O(N)(第 4 章)。
- Ring Attention / 序列并行 :把超长序列沿 token 维切到多卡,每卡只持一段 Q,K/V 沿环逐跳传递并累积 softmax(复用 online-softmax 递推),用环形通信与计算重叠把"单卡装不下的超长上下文"摊到多卡;通信量与计算重叠是关键,重叠不好就被环传输拖死。
8.3 "Lost in the Middle"
即使装得下,模型对文档开头和结尾的信息利用好、正中间的召回显著变差 (注意力分布与位置偏差导致)。工程对策:① RAG 召回时把关键片段放首尾(见第 18 章);② 长上下文继续训练/指令微调校准;③ 用重排而非一味堆长度。别迷信"上下文窗口=有效利用长度",窗口能装下不代表用得上。
8.4 踩坑
不微调直接外推;只扩窗口不做长文本继续训练导致中段能力塌;Ring 通信不与计算重叠;把"标称窗口"当"有效上下文"做产品承诺;RoPE base 频率(theta)不随长度上调。
第 9 章 工程基建:通信、容错、存储、Profiling 与框架 ▸ 独立长文·待扩写
9.1 通信库与网络拓扑
- 机内:NVLink/NVSwitch(H100 双向 900GB/s 级,集合通信有效 ~400GB/s),TP 必须在此域;跨机:InfiniBand/RoCE(400Gbps≈50GB/s 级,走 RDMA 绕过 CPU),PP/DP 在此域。
- NCCL 调优:拓扑感知(GPU 与 NIC 亲和绑定)、用 GRPC 还是 NVLink、
NCCL_*环境变量调通道与缓冲;跨机 all-reduce 用 Ring/Tree 算法选择;慢节点(straggler)会拖垮全局同步。
9.2 容错与弹性训练
- 大规模训练"故障是必然":万卡规模下 GPU/网卡/电源日均故障多次。必须:① 高频 ckpt(第 1 章双层策略);② 自动检测掉线 rank 并重启(torchrun elastic / 调度器重拉);③ 从最近 ckpt 恢复 m/v/调度/数据游标;④ 数据加载支持断点续传、不重不丢。
- 训练步幂等:同一 step 重算结果可复现(固定种子、确定性算法可选)。
9.3 Checkpoint 存储
- 一份含优化器状态的 ckpt:16 字节/参数,70B ≈ 1.12TB/份,多份滚动会爆盘。
- 异步分片 ckpt:训练继续、后台把各分片并行写到并行文件系统/对象存储;用分片(per-rank shard)而非单大文件,写带宽随卡数扩展;必要时只存权重的"轻量 ckpt"与含 m/v 的"完整 ckpt"分级。
9.4 Profiling:MFU 低了到底卡在哪
- 工具:PyTorch Profiler / Nsight Systems 看时间线,区分 Compute / Communication / Idle(等待/气泡/内存墙) 三类;NCCL 日志看集合通信耗时;
nvidia-smi dmon看 SM 利用率、显存带宽、功耗墙(是否降频)。 - 定位顺序:先看流水线气泡(加 micro)→ 再看通信是否与计算 overlap(未重叠的 NCCL 核会显式空转)→ 再看是否 memory-bound(FA 是否开启、kernel 是否融合)→ 最后看小 kernel launch 开销(算子融合/增大 micro-batch)。
9.5 框架选型
| 框架 | 定位 | 适合 |
|---|---|---|
| Megatron-LM | 张量/流水线并行最细、性能极致 | 大规模从头预训练 |
| DeepSpeed | ZeRO/Offload 易用、配置化 | 显存吃紧、中等规模、SFT |
| FSDP(PyTorch 原生) | 类 ZeRO-3、无重依赖 | 与生态原生集成 |
| 组合使用 | Megatron 核心 + 自研调度 | 工业大模型常见 |
9.6 踩坑
TP 跨机;NCCL 不绑拓扑走了 TCP 慢十倍;ckpt 同步写导致每小时卡几分钟;不做弹性,掉一张卡整训重跑;只看 SM 100% 不看时间线,把通信空转当高利用率;没有慢节点监控。
第二部分 微调与对齐
第 10 章 SFT:监督微调的数据与训练 ▸ 独立长文·待扩写
10.1 核心问题
基座模型只会续写,SFT 让它学会"按指令/对话格式回答"。SFT 的瓶颈是数据质量与配比,不是参数量:几千~几十万条高质量样本往往胜过百万条噪声样本(LIMA 证明少量高质量对齐即可显著改变行为)。
10.2 数据工程
- 格式统一:system/user/assistant 模板全量一致,只对 assistant 段算 loss(prompt mask),否则模型去学提问、风格漂移。
- 质量 > 数量:去重、去脏、长度分布合理;答案要有推理过程而非只给结论;多样性覆盖目标任务分布。
- 配比:通用指令 + 任务专项 + 安全拒答 + 风格(如简洁)按比例混;专项能力靠上采样但别过拟合。
- 过拟合信号:train loss 持续降而验证/人评变差、回答变模板化、复读。SFT 通常 2~3 epoch 即够,高质量小数据 1~2 epoch。
10.3 训练要点
- 学习率比预训练小 1~2 个数量级(如 1e-5~2e-5 全参、LoRA 可 1e-4~2e-4),cosine + 短 warmup;
- 灾难性遗忘:lr 过大或 epoch 过多会洗掉基座能力,混入 5%~10% 通用/预训练风格数据(replay)缓解;
- 全参 SFT 显存 = 推理权重 + 梯度 + 优化器状态(仍约 16 字节/参数),故常用 LoRA/ZeRO/Offload。
10.4 踩坑
对 user/system 段也算 loss;数据格式不一致;盲目堆量不洗数据;lr 过大掉能力;不划验证集凭感觉停训;多条对话拼一个样本却不做 attention mask 导致跨样本互看。
第 11 章 LoRA / QLoRA:低秩适配的原理与边界 ▸ 独立长文·待扩写
11.1 原理:为什么低秩有效
冻结原权重 W∈R^(d×d),只学低秩增量:
h = Wx + ΔWx = Wx + B·A·x , A∈R^(r×d), B∈R^(d×r), r≪d
初始 A 高斯小随机、B=0 → 训练开始 ΔW=0(不破坏原模型)
假设权重更新本质低秩(位于低维子空间),故 r 取 8/16/64 即可。可训练参数降到 0.1%~1%,优化器状态随之骤降,单卡可微调大模型 ;推理时可把 W+BA 合并回 W,零额外延迟。
11.2 秩 r 与挂载位置
- r 越大表达力越强但越易过拟合、越省不动显存;按任务选:风格/轻任务 r=8,复杂推理/多任务 r=64~128;
- 只挂 Attention 的 Q/V 是早期省法,复杂任务建议 Q,K,V,O + MLP up/down/gate 全挂,MLP 承载大量知识,漏挂会欠拟合;
- alpha 缩放:
ΔW·(alpha/r),常用 alpha≈2r 稳定尺度;dropout 防小数据过拟合。
11.3 QLoRA:把显存压到极限的三招
- 4bit NF4 量化基座(NormalFloat-4,针对正态分布权重最优的量化网格)冻结权重;
- 双重量化:连量化常数本身再量化一遍,再省一点;
- 分页优化器(paged optimizers) :用统一内存页应对激活峰值,防瞬时 OOM。
计算时反量化到 bf16 做前反向,LoRA 参数保持 bf16 训练。代价是反量化带来训练变慢、吞吐下降,换来单卡微调超大模型。
11.4 什么时候必须全参微调
- 注入大量新知识/改语言/改领域根基、要求逼近 SOTA 效果;
- LoRA 容量不足(r 拉满验证集仍上不去);
- 结论:资源够、追求上限用全参;资源受限/快速迭代/多任务插拔用 LoRA。LoRA 多任务可训练多个适配器按需切换或合并,但合并前需确认它们作用在同一基座版本。
11.5 踩坑
只挂 Q/V 导致知识类任务欠拟合;r 盲目拉大反而过拟合;alpha/r 比例失调尺度不稳;LoRA lr 沿用全参的小 lr 导致学不动;QLoRA 把 LoRA 本身也 4bit(错,LoRA 要 bf16);合并时基座版本不一致。
第 12 章 对齐进阶:RLHF(PPO) → DPO → GRPO ▸ 独立长文·待扩写
12.1 RLHF/PPO 为什么难
经典三阶段:SFT → 训奖励模型 RM(对 chosen/rejected 排序)→ 用 PPO 让策略模型最大化 RM 打分并加 KL 惩罚约束别偏离 SFT 模型:
目标 = E[RM(x,y)] − β·KL( π_θ(y|x) ‖ π_ref(y|x) )
难点:① 要同时驻留 Actor、Critic(价值)、RM、Ref 四个模型,显存 4 倍;② reward hacking(钻 RM 漏洞刷分);③ 奖励与 KL 的平衡脆弱,超参稍偏就崩(输出变长、复读、风格异常);④ on-policy 采样贵、训练不稳定。
12.2 DPO:绕开奖励模型的直接偏好优化
DPO 用数学等价把"RM + RL"目标改写成对偏好数据的直接监督分类损失,无需在线采样、无需 Critic:
L_DPO = −log σ( β·[ logπθ(y_w|x)/πref(y_w|x) − logπθ(y_l|x)/πref(y_l|x) ] )
y_w=chosen, y_l=rejected
- 优点:只比 SFT 多一份 ref 模型(可离线算 logp 缓存),训练像 SFT 一样稳、便宜;
- 代价:离线偏好、探索能力弱,对偏好数据质量极敏感,β 控制偏离强度。
12.3 GRPO:去掉 Critic 的群体相对策略优化
PPO 的 Critic 既贵又难训。GRPO 对同一问题采样一组(group)回答,用组内奖励的均值/标准差做归一化作为相对优势,不再需要价值网络:
对一组输出 {o_i},A_i = ( r_i − mean(r) ) / ( std(r)+ε )
目标 = E[ A_i · logπθ(o_i) ] − β·KL_to_ref
省掉 Critic(显存大降),组内相对比较天然做了基线,配合可验证奖励(数学/代码对错)效果突出,是推理类模型强化的主流。代价:要对每题采样多个回答,采样算力上升;组太小则优势估计噪声大。
12.4 方法对比与选型
| 方法 | 是否需 RM | 是否在线采样 | 额外模型 | 稳定性 | 适合 |
|---|---|---|---|---|---|
| PPO-RLHF | 是 | 是 | Actor+Critic+RM+Ref | 低、难调 | 资源足、追求上限 |
| DPO | 否 | 否 | +Ref(可缓存) | 高、简单 | 偏好对齐、快速落地 |
| GRPO | 奖励函数/规则 | 是(组采样) | Actor+Ref(无 Critic) | 中 | 可验证任务、推理强化 |
12.5 踩坑
PPO 不配 KL 约束导致模型跑偏;奖励模型有偏被 hack;DPO 偏好数据 chosen/rejected 区分度不够白训;GRPO 组太小优势噪声大;把在线 RL 的 lr 设成 SFT 同级导致崩;只看奖励分不做人评与基准验证。
第 13 章 对齐税(Alignment Tax) ▸ 独立长文·待扩写
13.1 现象
模型变"乖"之后,基座的原始能力(知识、代码、长文、某些创造性/多语言)出现可测下降,称为对齐税。典型表现:过度拒绝(benign 请求也拒)、回答变短变套话、复读安全模板、困惑度上升。
13.2 根因
- SFT/偏好数据分布窄,把输出"压"到单一风格,牺牲分布外能力;
- RL 优化目标(安全/有用/简洁)与"保留基座全部能力"冲突;
- 优化过度、数据缺乏难例与正常边界样本。
13.3 缓解
① 对齐数据混入足量"正常能力"样本与通用知识 replay;② 用一组能力回归基准在对齐前后对比,量化对齐税(而不是只看对齐成功率);③ 拒答策略用更精细的分类而非一刀切;④ DPO 调 β、RL 调 KL 系数,在对齐强度与能力保留间取帕累托前沿;⑤ 多阶段、小步对齐,每步回归测试。
13.4 踩坑
只测对齐指标不测能力回归;安全数据全是"拒绝"导致过度防御;对齐一上来就大 lr 长训;没有保留一份未对齐基座做对照。
第三部分 推理部署
第 14 章 KV Cache 与 PagedAttention(vLLM 为什么快) ▸ 独立长文·待扩写
14.1 KV Cache 显存怎么估
自回归解码每生成一个 token 都要复用前面所有 token 的 K、V,缓存下来避免重算。每层每 token KV 大小:
KV/token = 2(K和V) · L层 · n_kv_head · head_dim · 精度字节
以 70B(L=80, n_kv=8 GQA, head_dim=128, bf16) 为例:
= 2·80·8·128·2 = 327680 B ≈ 0.31 MB/ token(每序列)
上下文 8k 单序列 ≈ 2.56 GB;32 并发 ≈ 82 GB ------ KV 成为推理显存大头
GQA/MQA:让多 Q 头共享 KV 头(n_kv_head≪n_head),直接把 KV 显存砍几倍,是长上下文标配,代价是极小的质量损失。
14.2 原生批处理的痛点
静态 batching 必须等最长序列生成完才能返回整批,短请求被长请求拖死(队头阻塞);KV 显存按最大长度预分配,内部碎片严重;不同请求生成长度差异大时 GPU 大量空转。
14.3 PagedAttention:像操作系统管内存一样管 KV
借鉴虚拟内存分页:把 KV cache 切成固定大小 block(如每块 16 token),逻辑连续、物理可不连续,用 block table 映射:
- 按需分配,消除内部碎片(显存利用率从 ~20% 提到 >90%);
- Continuous Batching(连续批处理/In-Flight Batching):以 iteration 为粒度,谁生成完就立刻换下一个请求进 batch,不必等整批;
- Prefix Caching:相同前缀(system prompt、few-shot)的 KV block 全局共享命中,省重复计算;
- 写时复制(COW)支持并行采样/beam search 共享前缀。
14.4 权衡
分页引入 block table 间接寻址与极小编排开销,换来吞吐数倍提升;block 太小元数据多、太大碎片回升,16/32 token 是常见甜点。
14.5 踩坑
不估 KV 直接定并发数导致 OOM;不用 GQA 硬扛长上下文;静态 batch 导致 GPU 利用率忽高忽低;prefix cache 开了却没让公共前缀真的对齐(模板前面插入动态内容导致不命中)。
第 15 章 推理量化:GPTQ / AWQ / SmoothQuant 选型 ▸ 独立长文·待扩写
15.1 核心矛盾
权重/激活里存在少量离群值(outlier,幅度比其他大 1~2 个数量级,常集中在特定通道),均匀量化时为容纳离群值必须放大步长,普通值精度被吃光。三类方法从不同角度解。
15.2 三种主流方法
GPTQ(权重-only,训练后) :逐列量化权重,量化一列后用 Hessian 逆信息把误差补偿到尚未量化的列,最小化层输出误差。W4A16(4bit 权重、16bit 激活),推理需反量化,省显存、带宽收益大,质量损失小。
AWQ(权重-only,激活感知) :观察到"保护那 1% 离群通道的权重比优化全部权重更重要"。先找激活幅度大的显著通道,给这些通道权重乘缩放因子 s(等价在数学上对消、不额外推理开销),再做 4bit 量化,显著通道被保护,精度优于朴素 W4。
SmoothQuant(权重+激活都量化 W8A8) :激活离群难量化、权重分布平滑,于是把难度从激活"迁移"到权重 :对离群通道,激活除以 s、权重乘 s(s_j=max(|X_j)|^α / max(|W_j|)^(1-α),α≈0.5),让两者都变平滑,从而都能 8bit 整数计算,可吃 INT8 Tensor Core 提速(权重-only 省显存但计算仍反量化到 fp16,提速有限)。
15.3 定量选型表
| 方法 | 量化对象 | 主要收益 | 能否吃整数算力提速 | 适合 |
|---|---|---|---|---|
| GPTQ | 权重 W4 | 显存/带宽 | 否(反量化) | 显存受限、单卡装大模型 |
| AWQ | 权重 W4(保护离群通道) | 显存/带宽、精度更好 | 否 | W4 部署首选之一 |
| SmoothQuant | 权重+激活 W8A8 | 显存+吞吐提速 | 是(INT8 GEMM) | 高吞吐服务、batch 大 |
| FP8(W8A8) | 权重+激活 | 显存+吞吐 | 是(FP8 Tensor Core) | Hopper 及以上新硬件 |
15.4 流程与验证
校准集要覆盖目标分布(几百条有代表性数据即可);量化后必须做逐层输出余弦 + 端到端困惑度/任务基准对比,个别敏感层(如某些 attention 投影)可保高精度(混合精度量化)。
15.5 踩坑
校准集与线上分布不一致;以为 W4 一定提速(其实主要省显存/带宽,compute-bound 场景提速有限,要 W8A8/FP8 才吃整数算力);不做逐层验证,整体 PPL 崩了找不到是哪层;离群通道没保护直接均匀量化。
第 16 章 投机解码(Speculative Decoding) ▸ 独立长文·待扩写
16.1 原理:用小模型换大模型延迟
自回归解码是显存带宽受限:每生成一个 token 都要把全部权重从 HBM 读一遍,GPU 算力大量闲置。投机解码利用这点:
- 小草稿模型(draft)自回归快速起草 k 个候选 token(便宜);
- 大目标模型一次前向并行验证这 k 个 token(并行,几乎只花 1 步的时间);
- 从左到右按采样分布接受/拒绝,接受前缀直接采纳,在第一个被拒位置由大模型修正,再继续。
16.2 为什么"无损"
经典投机采样在数学上保证最终输出分布与单独用大模型采样完全一致 (通过特定接受准则与拒绝后重采样),即提速不降质。期望接受长度决定加速比:草稿越准、接受越长,提速越多(常见 1.5~3×,简单任务更高)。
16.3 变体与权衡
- 自投机/Medusa/EAGLE:不用独立小模型,而是在大模型上挂多个"预测头"一次猜多个后续 token,省掉维护两套模型、避免大小模型版本/词表不一致;
- 草稿模型选择:越小越快但接受率低,需在接受长度与草稿成本间找最优;
- 适合带宽受限、输出较长、任务可预测(代码补全、常规问答);强创造性、草稿老猜错时反而变慢(白起草),可动态开关。
16.4 踩坑
以为任何场景都加速(输出极短/难任务接受率低反而增开销);草稿模型与目标模型 tokenizer/版本不一致;忽略验证阶段额外显存(要同时驻留草稿模型);用贪心却声称无损分布却没对齐采样准则。
第 17 章 高并发推理服务:Continuous Batching 与 SLO 指标 ▸ 独立长文·待扩写
17.1 三个互相打架的核心指标
- TTFT(Time To First Token,首 token 延迟):用户"等多久开始出字",主要受排队 + 预填充(prefill)影响;
- TBT/TPOT(Between/Per Output Token,token 间隔):"出字流不流畅",受解码阶段 batch 大小影响;
- 吞吐(tokens/s) :总产出。三者互相制约:batch 越大吞吐越高,但每个请求的 TBT 越大、TTFT 越差。服务工程就是在 SLO(如 TTFT P99<500ms、TBT P99<50ms)约束下最大化吞吐。
17.2 Prefill / Decode 两阶段的不同瓶颈
- Prefill(处理输入 prompt):compute-bound,一次性并行算全部输入,FLOPs 大;
- Decode(逐 token 生成) :memory-bandwidth-bound,每步只读权重+KV。
两者混在同一 batch 会互相干扰(长 prefill 卡住 decode 的 TBT)。高级调度做 chunked prefill(把长 prompt 切块与 decode 交错)、disaggregation(prefill 与 decode 分离到不同 GPU 池)。
17.3 工程要点
- Continuous batching 以 iteration 粒度动态进出请求(第 14 章);
- 调度器按 KV block 余量做准入控制,超并发排队而非 OOM;
- 优先级/抢占:高优请求可抢占、低优请求 KV 换出(swap)或重算;
- 多模型/多副本路由、熔断与降级(高峰回退小模型/缩短上下文)。
17.4 容量规划公式
单卡可承载并发序列数 ≈ (总显存 − 权重 − 预留) / 单序列 KV(=KV/token·平均上下文长度)
总吞吐 ≈ batch·每步token / 单步耗时;再用 SLO 反推最大 batch
配合第 15 章量化(降权重/KV)与第 16 章投机解码(降 TBT)联合提容。
17.5 踩坑
只看平均不看 P99;prefill 和 decode 不隔离导致长请求拖垮所有人出字;不做准入控制高峰直接 OOM 雪崩;用离线吞吐数字做在线容量规划(忽略排队与 SLO);KV 不按真实上下文长度分布估算导致并发数定错。
第四部分 RAG 与 Agent 工程化
第 18 章 RAG 检索为什么不准:全链路系统性调优 ▸ 独立长文·待扩写
18.1 核心问题
RAG 效果差通常不是大模型不行,而是检索没把对的上下文送进去 。RAG 是一条链:切分→嵌入→召回→重排→拼装→生成,任一环短板都决定上限(短板效应),必须分段度量、分段优化。
18.2 分块(Chunking)的粒度悖论
- 块太小:语义破碎、缺上下文,向量表达不准;块太大:一个块混入多主题、稀释语义、召回噪声多、还浪费 token。
- 工业做法:父子分块(small-to-big)------用小块做精准检索命中,实际喂给模型的是其所属的大块/父块,兼顾命中精度与上下文完整;按文档结构(标题/段落/代码块)切分而非定长硬切;块间留 overlap(如 10%~15%)避免切断关键句。
18.3 嵌入与混合检索
- 纯向量是"语义模糊匹配",对专有名词、编号、精确短语、代码符号不敏感(向量会把"未登录精确词"平滑掉);
- 混合检索 = 稀疏(BM25/关键词,强精确匹配)+ 稠密(向量,强语义) ,用 RRF(Reciprocal Rank Fusion)融合排序:
score(d)=Σ 1/(k+rank_i(d)),k 常取 60,无需调分数量纲; - 多路召回(向量+BM25+元数据过滤+知识图谱关系)再合并去重,召回率天花板显著高于单路。
- query 与 doc 嵌入分布不一致时,可加 embedding 微调或用非对称模型(query/doc 不同编码)。
18.4 度量先行
- 召回阶段看 Recall@k / MRR / nDCG:先建一个带标注的检索评测集(问题→应命中的块),确认"对的块在不在 top-k",召回没上来之前优化生成毫无意义;
- 生成阶段看上下文命中率、答案忠实度(faithfulness,是否有据)、引用准确率;
- 端到端做消融:关 BM25、换 chunk size、换 top-k,逐项看指标变化,别一次改多个。
18.5 踩坑
定长硬切断语义;只靠纯向量丢精确匹配;top-k 拍脑袋(太大引入噪声、太小漏召回);不建检索评测集凭体感调;把超长上下文全塞给模型当"万能 RAG"(叠加第 8 章中间遗忘,反而更差);文档更新后索引不更新。
第 19 章 向量数据库与 ANN 索引:召回-延迟曲线 ▸ 独立长文·待扩写
19.1 为什么需要近似最近邻(ANN)
精确暴力检索对 N 百万~千亿向量算余弦,延迟不可接受。ANN 用少量召回损失换数量级加速,核心是在召回率与 QPS/延迟之间调参。
19.2 HNSW 原理与关键参数
HNSW(分层可导航小世界图):多层近邻图,上层稀疏做长距离跳跃、下层稠密做精排,查询从顶层贪心下降。
efSearch(搜索宽度):越大召回越高、延迟越大,是线上最该调的旋钮;M(每节点连边数):越大图越密、召回高、内存大;efConstruction影响建图质量;- 典型:先把 efSearch 从小往大调,画出 召回率-P95 延迟曲线,选满足召回(如 ≥0.95)下延迟最低的拐点。
19.3 IVF 与量化压缩
- IVF:先 k-means 聚类成 nlist 个簇,查询只扫最近 nprobe 个簇;nprobe 越大召回越高、越慢。
- PQ(乘积量化):把向量切子段各自聚类编码,大幅压缩内存但损失精度;**SQ(标量量化)**如 int8 折中;HNSW+PQ/IVF+PQ 用于超大规模省内存。
- 过滤条件下的召回塌陷:带 metadata 过滤时若"先 ANN 后过滤",可能过滤完没剩几条;需要"预/后过滤策略"调参或用支持过滤的索引,否则线上带筛选时召回骤降还难排查。
19.4 选型维度
| 维度 | 考量 |
|---|---|
| 规模/内存 | 全内存 vs 磁盘(DiskANN 类);PQ 压缩比 |
| 更新模式 | 频繁写入看增量索引/删除能力 |
| 过滤 | 标量过滤与向量检索的融合方式 |
| 运维 | 分布式分片、副本、持久化、混合检索支持 |
19.5 踩坑
不画召回-延迟曲线直接上默认参数;nprobe/efSearch 为省延迟调太低保召回;带过滤查询召回塌陷;向量维度/距离度量(内积 vs 余弦,需不需要归一化)搞错;索引构建参数和查询参数混淆。
第 20 章 RAG 进阶:Rerank、查询改写与 Self-RAG ▸ 独立长文·待扩写
20.1 为什么召回后还要精排(Rerank)
向量/BM25 是双塔/轻量打分 (query 和 doc 独立编码,快但粗);Cross-Encoder 重排把 query 和每个候选拼一起过一遍模型,做真正的交叉注意力,精度高但成本高。故用"便宜召回取 top-50~100 → cross-encoder 精排取 top-5"的漏斗,兼顾成本与精度,通常能再提一档答案准确率。
20.2 查询侧优化(很多坏 RAG 坏在 query)
- 查询改写/扩展:口语化、缺指代的问题先让 LLM 改写成更适合检索的形式;
- Multi-Query / HyDE :Multi-Query 生成多个等价问法分别召回再融合;HyDE 先让模型"假设性生成"一段答案,用这段假设答案去检索(假设答案与文档语料分布更接近,比短问题更好命中);
- 子问题分解(Routing/Decomposition):复杂问题拆成多个子问题分别检索再汇总;查询路由(直接回答 / 走知识库 / 走结构化数据库 / 走工具)。
20.3 Self-RAG / 自适应检索与生成
不是每句都检索,而是模型自评是否需要检索、检索到的块是否相关、生成是否有据,按需触发检索并自我批判修正(带 reflection token / critic)。代价是多轮自评的延迟与 token,收益是减少无关检索、提升忠实度。
20.4 生成侧:防幻觉拼装
- 上下文按相关度排序,关键信息放首尾(呼应第 8 章中间遗忘);
- 强约束 prompt:只依据给定材料、无据则明说"未找到"、逐条标注引用来源;
- 输出做引用对齐校验:每个结论必须能回指到具体 chunk,否则判为不可信。
20.5 踩坑
召回 500 条全塞精排(成本爆炸,应漏斗);只优化 doc 侧不优化 query;HyDE 假设答案本身错误反而带偏检索;不做引用校验让模型自由发挥;每问必检索增加无谓延迟。
第 21 章 Agent 为什么在生产不可靠:规划、工具调用与错误恢复 ▸ 独立长文·待扩写
21.1 核心问题
Demo 里惊艳、生产里翻车,根因是长链路误差累积 + 开放环境不确定性:每一步的小错误(参数错、解析错、检索错)沿多步链路相乘,链路越长成功率指数下降。
21.2 主要失效模式
- 上下文漂移/超限:多轮后早期目标和中间结果被挤出窗口或被噪声淹没;
- 工具调用参数幻觉:字段名、类型、枚举值、单位出错,或调用了不存在的工具;
- 规划失败:任务分解错误、死循环(反复调同一工具)、过早结束、目标漂移;
- 环境不确定:接口超时/返回异常/数据变化,模型不会处理;
- 不可复现:采样随机性导致同一任务时好时坏。
21.3 工业级解法(用工程确定性约束模型不确定性)
- 结构化约束 :工具 schema 严格校验(Pydantic/JSON Schema),参数非法直接拦截重试,而非把错误传下去;用状态机/工作流固化主干流程,只在确需"智能"的节点让 LLM 决策(workflow-first,agent-second);
- 可控规划:限制最大步数与调用次数、检测重复调用/循环并强制跳出;给模型**可回退的执行计划(plan-execute)**而非纯 ReAct 走一步看一步;
- 错误恢复:每步幂等、可重试、可补偿(saga);工具异常返回结构化错误让模型据此改道;关键操作(写/支付/删除)加人工确认(human-in-the-loop);
- 状态外置:把记忆/中间结果写外部存储而非全塞上下文,按需检索,控制上下文长度与漂移;
- 可观测与可复现:全链路 trace(每步 prompt/输出/工具入参出参/耗时/token),固定关键步骤温度为 0,保留回放能力;
- 评估闭环 :建任务成功率评测集,按"步骤成功率→端到端成功率"分层定位,单步 95% 成功率、10 步链路只有
0.95^10≈0.60,必须靠校验与重试把每步拉到接近 1。
21.4 ReAct vs 状态机的取舍
| 方式 | 灵活度 | 可控/可测 | 适合 |
|---|---|---|---|
| 纯 ReAct 自主循环 | 高 | 低、易飘 | 开放式探索、低风险 |
| 固定工作流+LLM 节点 | 低 | 高、稳定 | 生产主流程、高可靠要求 |
| 计划-执行 + 局部自主 | 中 | 中 | 复杂但可分解的任务 |
21.5 踩坑
追求"全自主"不用状态机导致不可控;工具返回自然语言错误让模型猜;不设步数/循环上限烧钱卡死;不做 trace 出问题无法复盘;把 LLM 输出直接当可信指令执行(缺校验与权限沙箱);链路每步成功率不度量,端到端崩了不知道崩在哪一步。
第五部分 机制原理、评测与基础设施
第 22 章 手写 Attention 与 RoPE:算子级理解 ▸ 独立长文·待扩写
22.1 逐步实现一个数值稳定的 Attention
python
import torch
def attention(Q, K, V, mask=None): # Q,K,V: [B,H,T,d]
d = Q.shape[-1]
scores = Q @ K.transpose(-2, -1) / (d ** 0.5) # 1) 缩放打分
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
m = scores.max(dim=-1, keepdim=True).values # 2) 数值稳定:减最大值
p = torch.softmax(scores - m, dim=-1) # 3) softmax(在线版见第4章)
return p @ V # 4) 加权求和
要点:① 除 √d 控制方差(第 1 章 σ² 推导);② softmax 先减最大值防 exp 溢出;③ 因果 mask 用 -inf 填充;④ 生产替换为 FlashAttention(分块 online-softmax),数学等价、省 HBM。
22.2 RoPE 旋转位置编码
对二维子向量 (x₁,x₂) 旋转位置 m 角度 mθ:
[x₁'] = [cos mθ -sin mθ][x₁]
[x₂'] [sin mθ cos mθ][x₂]
θ_i = base^(-2i/d),base 常取 10000(长上下文可调大,见第8章)
关键性质:旋转后两向量内积只依赖相对位置差 m-n(绝对位置被消去),因此天然编码相对位置;复数视角即给每维乘 e^{imθ}。实现上把 d 维两两配对旋转、与频率表逐位置相乘即可。外推(超出训练长度)失效与 YaRN 缩放见第 8 章。
22.3 常见机制补充
- RMSNorm vs LayerNorm:RMSNorm 去掉减均值、只用均方根归一,少一次归约、更快,效果相当;
- SwiGLU FFN :用门控
Swish(xW_gate)·(xW_up)再投影,比 ReLU FFN 效果好,FFN 维度通常取(2/3)·4h再凑整以保持参数量; - GQA/MQA:多 Q 共享 KV 头,省 KV cache(第 14 章)。
第 23 章 大模型评测方法论:为什么公开榜单不能全信 ▸ 独立长文·待扩写
23.1 评测的三类指标
- 知识/客观题:MMLU、C-Eval 等(选择/填空,看准确率);
- 推理:GSM8K/MATH(数学)、HumanEval/MBPP(代码 pass@k);
- 开放生成/对齐:人评、LLM-as-judge、对话偏好胜率。
23.2 pass@1 与 pass@k 的区别
采样 n 个解,其中正确 c 个,pass@k=1−C(n-c,k)/C(n,k)。pass@1 衡量"一次做对"(线上最相关),pass@k 衡量"有没有潜力做对"(研究常用),两者不可混用,采样温度与 n 也影响数值,引用榜单必须带相同口径。
23.3 榜单不可全信的四大陷阱
- 数据污染:评测题进了训练集(第 5 章 decontamination 没做好),模型是"背答案",换个变体就露馅;
- 刷榜/过拟合公开集:针对固定榜单反复调,分布外不泛化;
- LLM-as-judge 偏差:裁判模型有位置偏好(偏爱先出现的答案)、长度偏好(偏爱更长)、自我偏好(偏爱同家族输出),需交换位置、多次评、校准;
- 口径不一致:prompt 模板、few-shot 数、采样参数不同,分数不可直接比。
23.4 可靠评测怎么做
- 自建私有评测集并定期换题防污染;按能力维度建分层 benchmark;
- 报告多次运行均值+方差(生成有随机性);固定 prompt 模板与版本;
- 客观自动评 + 抽样人评校准裁判;做污染检测(n-gram 命中、扰动变体测试);
- 关注鲁棒性(改写问法、加噪)而非只看标准分;对齐前后加跑能力回归(第 13 章对齐税)。
23.5 踩坑
只看单一榜单;把 pass@k 当线上能力;裁判不做位置去偏;不测方差拿一次运气分下结论;评测集泄漏不检测;用训练分布内的题评估真实泛化。
第 24 章 可观测性与成本治理 ▸ 独立长文·待扩写
24.1 训练侧可观测
step 级采集:loss、分层 grad/param norm、update ratio、logits max、z、clip 触发率、MFU、tokens/s、显存峰值、通信占比;配第 1 章自动 skip/降 lr/回滚;长期看 loss 缩放曲线(loss 对 token 量)判断是否符合 scaling 趋势。
24.2 推理/服务侧可观测
- 业务指标:TTFT、TBT/TPOT、端到端延迟 P50/P95/P99、吞吐 tokens/s、并发、错误率、超时率;
- 资源指标:KV cache 利用率、batch 大小、prefix 命中率、SM/显存/功耗、各队列等待时间;
- 质量指标:拒答率、人工/自动评分、幻觉投诉、检索命中率(RAG)。
24.3 Token 与成本核算
- 成本 = 输入 token × 输入单价 + 输出 token × 输出单价(输出通常贵 3~5 倍,因解码逐 token);
- 建立按租户/功能/模型/版本 维度的 token 台账与预算告警;prompt 与 few-shot 是重复成本,用 prefix cache 摊薄;
- 多级模型路由:简单请求走小模型、难请求升级大模型;结果缓存;上下文按需裁剪(RAG 控制 top-k);批量离线任务走低价时段/批处理 API。
24.4 稳定性与降级链路
多模型/多供应商 fallback、超时与重试(注意幂等)、熔断、限流、降级(高峰缩短上下文/关投机外特性/换小模型保可用);全链路 trace 串联"请求→检索→模型→工具→响应",出问题能定位到具体环节。
24.5 踩坑
只记平均不记 P99;token 成本不分摊到功能导致不知道谁在烧钱;公共 system prompt 不做 prefix 缓存重复计费;没有降级链路,单点模型抖动全站故障;trace 不串联,跨组件问题无法复盘。
附录 A 关键公式速查表
| 主题 | 公式 | 含义/取值 |
|---|---|---|
| 混合精度模型状态 | 16 字节/参数 | fp32master4+bf16w2+bf16g2+m4+v4 |
| QK 内积标准差 | √d·σ²,除√d 后=σ² | σ 漂移经四次方放大,QK-Norm 锁 σ=1 |
| z-loss | ce+1e-4·mean(logsumexp²) | 锚 softmax 能量,领先指标 |
| 梯度裁剪 | g·min(1,τ/‖g‖) | 只改幅不改向,τ=1.0 |
| 激活显存/卡 | (L/PP)·bm·s·K_ACT·h·2/TP·α | K_ACT≈12,α=重算保留系数 |
| Ring-AllReduce | 2(N-1)/N·M≈2M | 每卡通信量 |
| PP 气泡 | (PP-1)/(m+PP-1) | m≥4·PP 起步 |
| 训练 FLOPs | 6·P·tokens | 前 2 后 4 |
| MFU | 理想 step/实测 step | 用实测 tokens/s 反推 |
| Roofline 脊点 | 峰值算力/显存带宽 | H100≈295 FLOP/Byte |
| KV/token | 2·L·n_kv·head_dim·字节 | GQA 靠减 n_kv 省 KV |
| LoRA | Wx+BAx,r≪d | B 初始 0,alpha≈2r |
| DPO | -logσ(β·(Δlogp_w-Δlogp_l)) | 无需 RM/Critic |
| GRPO 优势 | (r_i-mean)/std(组内) | 去掉 Critic |
| RRF 融合 | Σ1/(k+rank),k≈60 | 多路检索融合 |
| 链路成功率 | p^n | 单步 0.95、10 步仅 0.60 |
附录 B 显存-通信-MFU 配置计算器(配套脚本)
cluster_config_calculator.py(纯标准库)固化了模型状态、激活、TP/PP/DP 通信、气泡、FLOPs、各 MFU 假设下 step 时间与吞吐,并反算 bm 上限。改 analyze(P,L,h,n_h,s,tp,pp,dp,bm,global_bs,卡型) 即可输出你自己的配置。实跑样例(H100 80GB):
| 配置 | 状态/卡 | 激活/卡 | 合计 | 气泡 | 理想 step | MFU50% step / 吞吐 |
|---|---|---|---|---|---|---|
| 7B 单机 TP8,bm16 | 14.0GB | 25.8GB | 43.8GB | 0 | 11.1s | 22.3s / 94.2k tok/s |
| 70B 32卡 TP8PP4,bm8 | 35.0GB | 16.1GB | 55.1GB | 4.48% | 27.8s | 55.7s / 37.7k tok/s |
| 70B 64卡 +DP2 | 35.0GB | 16.1GB | 55.1GB | 4.48% | 13.9s | 27.8s / 75.4k tok/s |
| 70B 32×A100,bm4 | 35.0GB | 8.1GB | 47.1GB | 2.29% | 88.2s | 176.4s / 11.9k tok/s |
附录 C 故障与决策速查树
训练 loss 异常
├─ NaN/inf logits?─────────────► 回滚五件套(权重+m/v+调度+数据游标+种子),重启 lr×0.8
├─ grad norm 连续单调放大?─────► skip step→降 lr;压不住即回滚
├─ logits max / z 缓升?────────► 领先预警,降 lr 10~20%,查 QK-LN/z-loss
└─ 周期性抖动?─────────────────► 查数据顺序/重复分片/长度桶
推理变慢/OOM
├─ KV 爆?──────────────────────► GQA、量化 KV、降并发、PagedAttention 分页
├─ TTFT 高?────────────────────► 开 prefix cache、chunked prefill、加副本
├─ TBT 高?──────────────────────► 降 batch、投机解码、W8A8/FP8
└─ 吞吐低?──────────────────────► continuous batching、prefill/decode 分离
RAG 答不好
├─ Recall@k 低?────────────────► 混合检索+父子块+调 chunk/top-k/efSearch
├─ 召回准但答错?───────────────► cross-encoder 重排+查询改写+引用约束
└─ 幻觉?──────────────────────► 无据则拒答+结论回指 chunk+忠实度评测
Agent 翻车
├─ 参数错?─────────────────────► schema 强校验+重试
├─ 死循环/跑偏?────────────────► 状态机主干+步数上限+循环检测
└─ 端到端成功率低?─────────────► 度量每步成功率,把短板步拉到≈1(校验/补偿/人审)
附录 D 24 篇技术文章映射
| # | 章节 | 建议文章标题 |
|---|---|---|
| 1 | 1 | 第1章_预训练稳定性_LossSpike全链路复盘 |
| 2 | 2 | 第2章_混合精度_FP32_BF16_FP8数值安全边界 |
| 3 | 3 | 第 3 章 3D 并行:显存与通信逐项算账 |
| 4 | 4 | FlashAttention/序列并行/重计算的收益边界与 MFU 实战 |
| 5 | 5 | 预训练数据工程:去重、配比、tokenizer 与污染 |
| 6 | 6 | AdamW/初始化/lr 调度与收敛诊断信号 |
| 7 | 7 | MoE 与专家并行:负载均衡与 all-to-all |
| 8 | 8 | 长上下文:RoPE 外推、Ring Attention 与中间遗忘 |
| 9 | 9 | 万卡训练基建:NCCL、容错、异步 ckpt 与 Profiling |
| 10 | 10 | SFT 数据与训练:为什么质量碾压数量 |
| 11 | 11 | LoRA/QLoRA 原理、秩的选择与全参边界 |
| 12 | 12 | RLHF→DPO→GRPO 演进与选型 |
| 13 | 13 | 对齐税:模型变乖后能力为什么掉 |
| 14 | 14 | KV Cache 估算与 PagedAttention/vLLM |
| 15 | 15 | GPTQ/AWQ/SmoothQuant 推理量化选型 |
| 16 | 16 | 投机解码与 EAGLE/Medusa |
| 17 | 17 | 高并发推理:TTFT/TBT/吞吐的权衡与调度 |
| 18 | 18 | RAG 全链路调优与召回度量 |
| 19 | 19 | 向量库 ANN:HNSW/IVF/PQ 召回-延迟曲线 |
| 20 | 20 | Rerank、HyDE/Multi-Query 与 Self-RAG |
| 21 | 21 | 生产级 Agent 可靠性工程 |
| 22 | 22 | 手写 Attention 与 RoPE(算子级) |
| 23 | 23 | 大模型评测陷阱与可靠 benchmark |
| 24 | 24 | LLM 可观测性与 token 成本治理 |
结语:全栈一张图
预训练 用 QK-LN/z-loss/精度/并行/吞吐/数据/优化器把一个强基座稳定训出来;对齐 用 SFT→LoRA→DPO/GRPO 把它调成可用形态并控制对齐税;推理 用 KV 分页/量化/投机解码/连续批处理把它又快又省地服务出去;RAG/Agent 用检索漏斗、结构化约束与错误恢复把它接进真实业务;评测与可观测贯穿始终提供度量衡。任何单点优化都要回到"显存---带宽---延迟---质量---成本"这本总账上检验,这就是高级研发与调参教程的根本分野。