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 — 分布式训练 (1707 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) (L1222)
    • FSDP 简介 (L1224)
    • FSDP vs DeepSpeed ZeRO Stage 3 (L1257)
  • 分布式训练中的通信原语 (L1280)
    • AllReduce, AllGather, ReduceScatter (L1282)
    • Ring AllReduce 算法详解 (L1337)
    • Ray 上的 AllReduce 示意 (L1379)
  • 分布式训练系统实战:verl 的 Single-Controller 架构 (L1427)
  • 实战:常见配置方案 (L1508)
    • 不同规模模型的推荐并行策略 (L1510)
    • 常见框架选择 (L1521)
    • 实用配置示例 (L1532)
  • 苏格拉底时刻 (L1580)
  • 常见问题 & 面试考点 (L1646)
    • 高频面试题 (L1648)
  • 推荐资源 (L1685)
    • 论文 (L1687)
    • 开源框架 (L1695)
    • 教程与博客 (L1702)

evaluation.md — 评估 (614 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)
    • Rubric Evaluation 与 HealthBench (L196)
    • 常见偏差与缓解 (L248)
    • MT-Bench 评测流程详解 (L267)
    • 代码实现:构建一个简单的 LLM Judge (L292)
  • 人类评估 (L369)
    • 为什么仍然需要人类评估? (L371)
    • Chatbot Arena 模式 (L378)
    • 标注流程设计 (L387)
    • 一致性指标:Cohen's Kappa (L414)
  • 污染检测 (L432)
    • 为什么需要关注污染? (L434)
    • N-gram Overlap 检测 (L438)
    • Benchmark 泄露的应对策略 (L462)
  • 评估工具 (L472)
    • lm-evaluation-harness (L474)
    • Lighteval(HuggingFace) (L512)
  • 面试考点 (L536)
    • Benchmark 的局限性 (L538)
    • 如何设计评估方案? (L549)
    • 高频面试问答 (L577)
  • 苏格拉底时刻 (L588)

inference.md — 推理优化 (1699 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 场景) (L304)
  • Continuous Batching (L314)
    • Static Batching 的低效 (L316)
    • Continuous Batching 的调度策略 (L331)
  • Chunked Prefill (L453)
    • 长 Prefill 阻塞 Decode 的问题 (L455)
    • 将 Prefill 拆分为 Chunks (L469)
  • 投机采样 (Speculative Decoding) (L569)
    • 核心思想:小模型草稿 + 大模型验证 (L571)
    • 验证算法的数学保证(为什么输出分布不变) (L629)
    • 接受率分析 (L681)
    • EAGLE-3:基于特征层的树状投机采样 (L701)
    • SpecExit:推理模型的思考早退 (L949)
    • 投机采样方法对比 (L1029)
  • Prefill-Decode 分离 (PD Disaggregation) (L1041)
    • 为什么要分离? (L1043)
    • 架构设计 (L1060)
    • 关键组件职责 (L1083)
    • KV Cache 传输策略 (L1091)
  • vLLM 架构深度解析 (L1111)
    • vLLM V0 架构 (L1115)
    • vLLM V1 架构演进 (L1198)
  • 端侧推理引擎 (L1352)
    • 端侧推理的约束与机会 (L1363)
    • 主流开源端侧引擎 (L1380)
    • llama.cpp 的实现解读 (L1392)
    • MLC LLM 的实现解读 (L1473)
    • 移动端实战:Android 跑通最小例子 (L1524)
    • 端侧 vs 云端推理对比 (L1560)
    • 选型建议与常见坑 (L1580)
  • 苏格拉底时刻 (L1600)
  • 常见问题 & 面试考点 (L1641)
    • 高频面试题 (L1643)
    • 性能指标速查 (L1661)
  • 推荐资源 (L1673)
    • 必读论文 (L1675)
    • 代码与工具 (L1685)
    • 博客与视频 (L1694)

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 — 量化 (583 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)
    • Absmax 量化:对称量化的最简版本 (L401)
    • Zero-point 量化:非对称量化的标准实现 (L425)
    • 把整个模型量化掉:deepcopy + 原地替换 (L452)
    • 用困惑度量化「量化的代价」 (L478)
    • LLM.int8():交给 bitsandbytes 处理离群值 (L503)
    • 跑通建议 (L527)
  • 苏格拉底时刻 (L535)
  • 常见问题 & 面试考点 (L559)
  • 推荐资源 (L574)

ray-framework.md — Ray 分布式框架 (889 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. 分布式通信模式 (L214)
    • 3.1 Actor 间直接通信 (L218)
    • 3.2 多 Actor 并发通信 (L253)
    • 3.3 Tensor 传输与共享对象 (L274)
    • 3.4 Actor Group + 数据切片下发模式 (L297)
    • 3.5 Ray + PyTorch Distributed 集合通信 (L354)
    1. Ray 分布式推理 (L442)
    • 4.1 基本思路 (L444)
    • 4.2 用 Ray 实现 All-Reduce (L462)
    • 4.3 vLLM 中的 Ray 使用 (L479)
    1. verl 的 Single-Controller + Multi-Worker 架构 (L514)
    • 5.1 设计哲学:把分布式藏在装饰器里 (L520)
    • 5.2 启动一个 Worker Group (L555)
    • 5.3 Dispatch 装饰器:把通信策略写进函数签名 (L588)
    • 5.4 Hybrid Engine:让多个角色挤进同一个 Worker (L628)
    • 5.5 PPO 主循环:Driver 视角的五步 (L659)
    1. 在 vLLM 和 verl 中的应用 (L701)
    • 6.1 vLLM:多卡 Tensor Parallel 调度 (L703)
    • 6.2 OpenRLHF:vLLM 权重热更新的两条通路 (L730)
  • 苏格拉底时刻 (L830)
  • 面试考点 (L854)
    • Q1: Ray 的 Actor 和 Erlang/Akka 的 Actor 有什么区别? (L856)
    • Q2: 为什么 vLLM 用 NCCL 而不用 Ray Object Store 做 tensor parallel 通信? (L860)
    • Q3: verl Hybrid Engine 中 rollout 和 training 共享 GPU 的技术挑战? (L864)
    • Q4: verl 的 @register(dispatch_mode=Dispatch.DP_COMPUTE_PROTO) 装饰器到底做了什么? (L868)
    • Q5: OpenRLHF 为什么要支持 NCCL 和 CUDA IPC 两种权重同步通路? (L872)
  • 推荐资源 (L878)

safety.md — LLM 安全 (1028 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)
  • 实战复现:abliteration——把 refusal 从权重里减掉 (L785)
    • 数据准备:harmful vs harmless 对照(Cell 1) (L797)
    • 采集 residual stream 激活(Cell 4) (L823)
    • 计算每一层的 refusal direction(Cell 5) (L859)
    • 推理时验证:方向消融 hook(Cell 6 节选) (L891)
    • 把方向"焊死"进权重(Cell 8) (L919)
    • 跑通建议 (L949)
    • 这告诉我们什么 (L971)
  • 苏格拉底时刻 (L986)
  • 常见问题 & 面试考点 (L1000)
  • 推荐资源 (L1020)