Skip to content

第四章:工程化

从"能跑"到"能用",工程化是大模型落地的最后一公里。

本章聚焦大模型从研究到生产的关键工程实践,涵盖推理优化、模型压缩、分布式训练和系统评估四大核心主题。掌握这些技术,你就能真正将大模型部署到真实业务场景中。

本章内容

页面主题核心内容
推理优化加速模型推理KV Cache、PagedAttention、Continuous Batching、vLLM
量化模型压缩INT8/INT4 量化、GPTQ、AWQ、GGUF 格式
分布式训练多卡/多机训练数据并行、模型并行、DeepSpeed ZeRO、FSDP
评估模型能力评测基准测试、LLM-as-a-Judge、人类评估

学习路线建议

  1. 推理优化:理解从 naive inference 到生产级推理引擎的完整优化链路
  2. 量化:掌握用更少显存跑更大模型的核心技巧
  3. 分布式训练:当一张卡装不下模型时,如何扩展到多卡多机
  4. 评估:训练完了怎么知道好不好?系统化评估方法论

前置知识

  • 理解 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)

    1. 集合通信原语实战 (L19)
    • 1.1 Broadcast — 一对多广播 (L23)
    • 1.2 All-Reduce — 全局规约 (L70)
    • 1.3 All-Gather — 全局收集 (L88)
    • 1.4 Ring All-Reduce — 带宽最优的规约 (L106)
    1. DDP 数据并行实战 (L155)
    1. ZeRO 从零实现 (L230)
    • 3.1 ZeRO-1:优化器状态分片 (L234)
    • 3.2 ZeRO-2 与 ZeRO-3 的关键差异 (L291)
    1. 张量并行从零实现 (L344)
    • 4.1 Column Parallel Linear(列并行) (L348)
    • 4.2 Row Parallel Linear(行并行) (L382)
    • 4.3 Transformer 中的组合方式 (L414)
    1. 流水线并行从零实现 (L438)
    • 5.1 朴素版:逐 Stage 前向 + 反向 (L442)
    • 5.2 GPipe:Micro-Batch 减少 Bubble (L502)
    1. 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)
      1. Linear(线性插值) (L50)
      1. SLERP(球面线性插值) (L104)
      1. Task Arithmetic(任务算术) (L193)
      1. TIES(Trim, Elect Sign & Merge) (L241)
      1. 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)
      1. CPU-GPU 同步阻塞 (L253)
      1. 显存碎片化 (L276)
      1. 数据加载成为瓶颈 (L300)
      1. 矩阵维度不对齐 (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)
    1. Ray 核心概念 (L40)
    • 1.1 四大组件 (L42)
    • 1.2 执行模型 (L51)
    • 1.3 为什么 vLLM 和 verl 都选择 Ray? (L71)
    1. Actor 编程模型 (L81)
    • 2.1 远程函数(Task) (L83)
    • 2.2 Actor(有状态远程对象) (L126)
    • 2.3 异步执行模式 (L167)
    1. 分布式通信模式 (L212)
    • 3.1 Actor 间直接通信 (L216)
    • 3.2 多 Actor 并发通信 (L251)
    • 3.3 Tensor 传输与共享对象 (L272)
    • 3.4 共享队列模式 (L295)
    • 3.5 Ray + PyTorch Distributed 集合通信 (L330)
    1. Ray 分布式推理 (L395)
    • 4.1 基本思路 (L397)
    • 4.2 用 Ray 实现 All-Reduce (L415)
    • 4.3 vLLM 中的 Ray 使用 (L437)
    1. Ray 分布式训练:Coordinator 架构 (L472)
    • 5.1 整体架构 (L476)
    • 5.2 Coordinator(协调器) (L500)
    • 5.3 GeneratorActor(生成节点) (L555)
    • 5.4 TrainerActor(训练节点) (L600)
    • 5.5 数据流全景 (L651)
    1. 在 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)