第四章:工程化
从"能跑"到"能用",工程化是大模型落地的最后一公里。
本章聚焦大模型从研究到生产的关键工程实践,涵盖推理优化、模型压缩、分布式训练和系统评估四大核心主题。掌握这些技术,你就能真正将大模型部署到真实业务场景中。
本章内容
| 页面 | 主题 | 核心内容 |
|---|---|---|
| 推理优化 | 加速模型推理 | KV Cache、PagedAttention、Continuous Batching、vLLM |
| 量化 | 模型压缩 | INT8/INT4 量化、GPTQ、AWQ、GGUF 格式 |
| 分布式训练 | 多卡/多机训练 | 数据并行、模型并行、DeepSpeed ZeRO、FSDP |
| 评估 | 模型能力评测 | 基准测试、LLM-as-a-Judge、人类评估 |
学习路线建议
- 推理优化:理解从 naive inference 到生产级推理引擎的完整优化链路
- 量化:掌握用更少显存跑更大模型的核心技巧
- 分布式训练:当一张卡装不下模型时,如何扩展到多卡多机
- 评估:训练完了怎么知道好不好?系统化评估方法论
前置知识
- 理解 Transformer 架构(第二章)
- 了解 LLM 训练流程(第三章)
- 基本的 PyTorch 使用经验
详细内容索引
deployment.md — 模型部署 (832 lines)
- 在大模型体系中的位置 (L14)
- 部署形态总览 (L29)
- 不同规模模型的硬件需求估算 (L37)
- 推理框架对比 (L59)
- 选型决策树 (L76)
- Ollama 使用指南 (L90)
- 安装与基础使用 (L94)
- API 调用 (L119)
- 自定义 Modelfile (L190)
- llama.cpp 量化推理 (L240)
- GGUF 格式 (L244)
- 量化级别对比 (L259)
- 模型转换与量化 (L273)
- Python 调用 llama.cpp (L301)
- vLLM 服务化部署 (L342)
- 基础部署 (L346)
- 关键参数调优 (L370)
- Python SDK 调用 (L395)
- vLLM 性能基准测试 (L459)
- Docker 容器化部署 (L527)
- vLLM Docker 部署 (L529)
- 性能调优实战 (L613)
- GPU 利用率优化 (L615)
- 调优参数速查表 (L662)
- 成本估算 (L673)
- 监控指标 (L730)
- 苏格拉底时刻 (L792)
- 常见问题 & 面试考点 (L804)
- 推荐资源 (L824)
distributed-hands-on.md — 分布式训练实操代码 (688 lines)
- 集合通信原语实战 (L19)
- 1.1 Broadcast — 一对多广播 (L23)
- 1.2 All-Reduce — 全局规约 (L70)
- 1.3 All-Gather — 全局收集 (L88)
- 1.4 Ring All-Reduce — 带宽最优的规约 (L106)
- DDP 数据并行实战 (L155)
- ZeRO 从零实现 (L230)
- 3.1 ZeRO-1:优化器状态分片 (L234)
- 3.2 ZeRO-2 与 ZeRO-3 的关键差异 (L291)
- 张量并行从零实现 (L344)
- 4.1 Column Parallel Linear(列并行) (L348)
- 4.2 Row Parallel Linear(行并行) (L382)
- 4.3 Transformer 中的组合方式 (L414)
- 流水线并行从零实现 (L438)
- 5.1 朴素版:逐 Stage 前向 + 反向 (L442)
- 5.2 GPipe:Micro-Batch 减少 Bubble (L502)
- Ring Attention / 序列并行 (L571)
- 6.1 核心思想 (L575)
- 6.2 简化实现 (L586)
- 面试高频考点 (L662)
- 推荐资源 (L676)
distributed.md — 分布式训练 (1610 lines)
- 在大模型体系中的位置 (L14)
- 为什么需要分布式? (L39)
- 一个具体的例子:训练 Llama 70B (L41)
- 显存占用的"四大金刚" (L71)
- 计算需求也很惊人 (L89)
- 数据并行 (Data Parallelism) (L113)
- 基本原理 (L115)
- DDP 实现 (L157)
- 数据并行的瓶颈 (L205)
- DeepSpeed ZeRO (L219)
- ZeRO Stage 1:优化器状态分片 (L223)
- ZeRO Stage 2:梯度分片 (L252)
- ZeRO Stage 3:参数分片 (L273)
- ZeRO-Offload & ZeRO-Infinity (L329)
- DeepSpeed 配置实战 (L346)
- 张量并行 (Tensor Parallelism) (L398)
- Megatron-LM 的列并行与行并行 (L402)
- Self-Attention 的张量并行 (L480)
- MLP 的张量并行 (L512)
- 张量并行核心代码 (L549)
- 流水线并行 (Pipeline Parallelism) (L648)
- 朴素流水线的气泡问题 (L652)
- GPipe:微批次流水线 (L691)
- 1F1B 调度策略 (L716)
- Interleaved 1F1B (L737)
- 3D 并行 (L767)
- DP + TP + PP 如何组合 (L769)
- 通信拓扑设计原则 (L815)
- Context Parallelism / Ring Attention (L836)
- Expert Parallelism (L930)
- 3D/4D/5D 并行实践 (L1031)
- FSDP (Fully Sharded Data Parallel) (L1136)
- FSDP 简介 (L1138)
- FSDP vs DeepSpeed ZeRO Stage 3 (L1171)
- 分布式训练中的通信原语 (L1194)
- AllReduce, AllGather, ReduceScatter (L1196)
- Ring AllReduce 算法详解 (L1251)
- 来自实际代码的通信原语示例 (L1293)
- 分布式训练系统实战:Ray 分布式架构 (L1343)
- 实战:常见配置方案 (L1411)
- 不同规模模型的推荐并行策略 (L1413)
- 常见框架选择 (L1424)
- 实用配置示例 (L1435)
- 苏格拉底时刻 (L1483)
- 常见问题 & 面试考点 (L1549)
- 高频面试题 (L1551)
- 推荐资源 (L1588)
- 论文 (L1590)
- 开源框架 (L1598)
- 教程与博客 (L1605)
evaluation.md — 评估 (553 lines)
- 为什么评估很难? (L13)
- 主流 Benchmark 详解 (L22)
- MMLU(Massive Multitask Language Understanding) (L24)
- HumanEval(代码生成) (L46)
- GSM8K(数学推理) (L76)
- 其他重要 Benchmark (L96)
- 排行榜 (L108)
- Open LLM Leaderboard(HuggingFace) (L110)
- Chatbot Arena(LMSYS) (L127)
- AlpacaEval (L150)
- LLM-as-a-Judge 深度解析 (L159)
- Direct Scoring(直接打分) (L163)
- Pairwise Comparison(成对比较) (L179)
- 常见偏差与缓解 (L196)
- MT-Bench 评测流程详解 (L206)
- 代码实现:构建一个简单的 LLM Judge (L231)
- 人类评估 (L308)
- 为什么仍然需要人类评估? (L310)
- Chatbot Arena 模式 (L317)
- 标注流程设计 (L326)
- 一致性指标:Cohen's Kappa (L353)
- 污染检测 (L371)
- 为什么需要关注污染? (L373)
- N-gram Overlap 检测 (L377)
- Benchmark 泄露的应对策略 (L401)
- 评估工具 (L411)
- lm-evaluation-harness (L413)
- Lighteval(HuggingFace) (L451)
- 面试考点 (L475)
- Benchmark 的局限性 (L477)
- 如何设计评估方案? (L488)
- 高频面试问答 (L516)
- 苏格拉底时刻 (L527)
inference.md — 推理优化 (2236 lines)
- 在大模型体系中的位置 (L14)
- LLM 推理的两个阶段 (L42)
- Prefill 阶段(计算密集) (L46)
- Decode 阶段(访存密集) (L57)
- 用 Roofline Model 分析为什么 Decode 是 Memory-Bound (L68)
- KV Cache (L100)
- 为什么需要 KV Cache (L102)
- KV Cache 的显存计算 (L121)
- PagedAttention (L151)
- 传统 KV Cache 的内存碎片问题 (L153)
- 虚拟内存的启发 (L162)
- 物理块与逻辑块 (L174)
- PagedAttention 内核实现 (L230)
- Copy-on-Write 优化(Beam Search 场景) (L316)
- Continuous Batching (L326)
- Static Batching 的低效 (L328)
- Continuous Batching 的调度策略 (L343)
- Chunked Prefill (L432)
- 长 Prefill 阻塞 Decode 的问题 (L434)
- 将 Prefill 拆分为 Chunks (L448)
- 投机采样 (Speculative Decoding) (L546)
- 核心思想:小模型草稿 + 大模型验证 (L548)
- 验证算法的数学保证(为什么输出分布不变) (L606)
- 接受率分析 (L658)
- EAGLE-3:基于特征层的树状投机采样 (L678)
- SpecExit:推理模型的思考早退 (L926)
- 投机采样方法对比 (L1006)
- Prefill-Decode 分离 (PD Disaggregation) (L1018)
- 为什么要分离? (L1020)
- 架构设计 (L1037)
- KV Cache 传输策略 (L1102)
- vLLM 架构深度解析 (L1199)
- vLLM V0 架构 (L1203)
- vLLM V1 架构演进 (L1286)
- 端侧推理引擎 (L1429)
- 端侧推理的挑战与动机 (L1435)
- 端侧推理引擎生态 (L1458)
- 端侧部署全景流程 (L1477)
- Step 1: 模型适配(Model Adaptation) (L1499)
- Step 2: AIMET 模型准备(Model Prepare) (L1726)
- Step 3: AIMET 量化 (L1777)
- Step 4: ONNX 导出与精度验证 (L1905)
- Step 5: QNN 编译流水线 (L1943)
- 多模态模型的端侧架构 (L2055)
- 端侧 vs 云端推理对比 (L2100)
- 实践要点总结 (L2121)
- 苏格拉底时刻 (L2136)
- 常见问题 & 面试考点 (L2177)
- 高频面试题 (L2179)
- 性能指标速查 (L2197)
- 推荐资源 (L2209)
- 必读论文 (L2211)
- 代码与工具 (L2221)
- 博客与视频 (L2231)
merging.md — 模型合并 (896 lines)
- 在大模型体系中的位置 (L13)
- 为什么要合并模型? (L30)
- 合并方法详解 (L48)
- Linear(线性插值) (L50)
- SLERP(球面线性插值) (L104)
- Task Arithmetic(任务算术) (L193)
- TIES(Trim, Elect Sign & Merge) (L241)
- DARE(Drop And REscale) (L318)
- 方法对比总结 (L372)
- mergekit 工具使用 (L384)
- 安装 (L388)
- 配置文件格式 (L399)
- 运行合并 (L466)
- 实战:合并 LoRA 适配器 (L488)
- 方法 1:先合并回基座再合并 (L492)
- 方法 2:直接合并 LoRA 权重 (L552)
- Frankenmerge(跨架构层拼接) (L597)
- MoE 合并 (L639)
- 合并后评估策略 (L687)
- 使用 lm-evaluation-harness (L749)
- 实战:完整合并流程 (L772)
- 苏格拉底时刻 (L853)
- 常见问题 & 面试考点 (L867)
- 推荐资源 (L887)
profiling.md — GPU 性能分析与调试 (461 lines)
- 在大模型体系中的位置 (L11)
- GPU 显存计算 (L25)
- 模型参数显存 (L27)
- 训练时的显存组成 (L44)
- 激活值显存 (L67)
- KV Cache 显存 (L93)
- 实用:快速估算脚本 (L107)
- torch.profiler 实战 (L156)
- 基础用法 (L158)
- 带 Warmup 的 Schedule Profiling (L199)
- 自定义标注 (L235)
- 常见性能瓶颈与优化 (L251)
- CPU-GPU 同步阻塞 (L253)
- 显存碎片化 (L276)
- 数据加载成为瓶颈 (L300)
- 矩阵维度不对齐 (L328)
- 实战:Profiling 一个 Transformer (L346)
- Roofline 模型:判断计算密集 vs 访存密集 (L405)
- 苏格拉底时刻 (L430)
- 常见问题 & 面试考点 (L440)
- 推荐资源 (L453)
quantization.md — 量化 (445 lines)
- 在大模型体系中的位置 (L14)
- 为什么需要量化? (L26)
- 显存计算 (L28)
- 推理延迟分析 (L49)
- 量化基础 (L63)
- 均匀量化 (L65)
- 量化粒度 (L104)
- 量化误差分析 (L116)
- INT8 量化 (L126)
- LLM.int8()(bitsandbytes) (L128)
- SmoothQuant (L157)
- INT4 量化 (L169)
- NormalFloat (NF4) (L173)
- bitsandbytes FP4 实现 (L190)
- GPTQ (L266)
- AWQ(Activation-aware Weight Quantization) (L300)
- GGUF 格式 (L317)
- 为什么需要 GGUF? (L319)
- 量化级别 (L327)
- llama.cpp 量化流程 (L342)
- PTQ vs QAT (L359)
- Post-Training Quantization (PTQ) (L361)
- Quantization-Aware Training (QAT) (L369)
- 选择指南 (L377)
- 各方案对比表格 (L386)
- 苏格拉底时刻 (L397)
- 常见问题 & 面试考点 (L421)
- 推荐资源 (L436)
ray-framework.md — Ray 分布式框架 (791 lines)
- 在大模型体系中的位置 (L13)
- Ray 核心概念 (L40)
- 1.1 四大组件 (L42)
- 1.2 执行模型 (L51)
- 1.3 为什么 vLLM 和 verl 都选择 Ray? (L71)
- Actor 编程模型 (L81)
- 2.1 远程函数(Task) (L83)
- 2.2 Actor(有状态远程对象) (L126)
- 2.3 异步执行模式 (L167)
- 分布式通信模式 (L212)
- 3.1 Actor 间直接通信 (L216)
- 3.2 多 Actor 并发通信 (L251)
- 3.3 Tensor 传输与共享对象 (L272)
- 3.4 共享队列模式 (L295)
- 3.5 Ray + PyTorch Distributed 集合通信 (L330)
- Ray 分布式推理 (L395)
- 4.1 基本思路 (L397)
- 4.2 用 Ray 实现 All-Reduce (L415)
- 4.3 vLLM 中的 Ray 使用 (L437)
- Ray 分布式训练:Coordinator 架构 (L472)
- 5.1 整体架构 (L476)
- 5.2 Coordinator(协调器) (L500)
- 5.3 GeneratorActor(生成节点) (L555)
- 5.4 TrainerActor(训练节点) (L600)
- 5.5 数据流全景 (L651)
- 在 vLLM 和 verl 中的应用 (L675)
- 6.1 vLLM:多卡 Tensor Parallel 调度 (L677)
- 6.2 verl:PPO 训练的 Rollout-Training 分离 (L704)
- 苏格拉底时刻 (L741)
- 面试考点 (L765)
- Q1: Ray 的 Actor 和 Erlang/Akka 的 Actor 有什么区别? (L767)
- Q2: 为什么 vLLM 用 NCCL 而不用 Ray Object Store 做 tensor parallel 通信? (L771)
- Q3: verl 中 rollout 和 training 共享 GPU 的技术挑战? (L775)
- 推荐资源 (L781)
safety.md — LLM 安全 (827 lines)
- 在大模型体系中的位置 (L13)
- 威胁全景:OWASP LLM Top 10 (L28)
- Prompt Injection(提示注入) (L49)
- 直接注入(Direct Prompt Injection) (L53)
- 间接注入(Indirect Prompt Injection) (L77)
- Prompt Injection 检测器实现 (L109)
- Jailbreaking(越狱攻击) (L268)
- 经典越狱手法 (L272)
- 为什么越狱难以根治? (L316)
- LLM 幻觉(Hallucination) (L330)
- 幻觉的分类 (L332)
- 幻觉的成因 (L340)
- 幻觉缓解策略 (L354)
- 数据投毒与后门攻击 (L412)
- 训练数据投毒 (L414)
- 供应链攻击 (L439)
- 防御体系 (L449)
- 输入过滤层 (L451)
- 输出安全过滤器 (L493)
- Guard Model(守卫模型) (L579)
- Red Teaming(红队测试) (L626)
- 安全评估工具 (L639)
- garak (L641)
- Rebuff (L669)
- 纵深防御架构 (L724)
- 苏格拉底时刻 (L785)
- 常见问题 & 面试考点 (L799)
- 推荐资源 (L819)