大模型工程实践,本质是算力、显存与通信的极限优化。其核心在于四大支柱:
- 高效计算(注意力机制) :通过 FlashAttention 优化计算图,解决显存瓶颈;利用 PagedAttention/RadixAttention 创新内存管理与缓存复用,支撑长文本、高并发及多轮会话。
- 规模扩展(并行策略) :单卡无法承载超大模型,需依赖 DP、TP、PP 等多维混合并行(3D并行),将计算任务拆分至集群。核心挑战在于平衡计算与通信开销。
- 资源解耦(PD/EPD分离) :针对 Prefill(算力密集)与 Decode(显存密集)的特性差异,实施 PD/EPD 分离架构,将不同阶段调度至专用硬件资源池,实现资源的极致利用与灵活伸缩。
- 显存命门(缓存管理) :KV Cache 占推理显存80%以上。工程上必须通过 KV缓存复用 (如共享前缀)、分页管理 (PagedAttention)甚至 CPU Offload,最大化显存利用率,支撑高并发会话。
总结 :现代大模型工程已进化为"算子+并行+调度+缓存"的综合体系,掌握这些核心技术,是构建高性能、低成本服务的关键。
一、注意力机制:模型的"思维引擎"
FlashAttention、PagedAttention 和 RadixAttention 都是为了解决大模型 "注意力机制" 效率问题而诞生的,但它们的切入点 和解决的问题完全不同。
这三者并不互斥,而是可以协同工作的:
- vLLM 的组合拳 :使用 PagedAttention 来管理显存(解决空间问题),在进行矩阵计算时调用 FlashAttention(解决速度问题)。
- SGLang 的组合拳 :使用 RadixAttention (基于 Radix Tree 的调度) 来管理复杂的缓存依赖(解决复用和调度问题),底层同样可以利用 FlashAttention 来加速计算。
1. FlashAttention:计算层的"涡轮增压"
关注的是"算得快"。
- 原理 :传统的注意力计算需要先生成一个巨大的 N×NN \times NN×N 矩阵(显存爆炸),然后再进行 Softmax 计算。FlashAttention 通过分块计算(Tiling) 和算子融合,直接在 GPU 的高速缓存(SRAM)里完成计算,避免了频繁读写慢速显存(HBM)。
- 效果 :显存占用从 O(N2)O(N^2)O(N2) 降到 O(N)O(N)O(N),速度提升 2-4 倍。
- 适用场景 :模型训练(最核心用途)、长序列的推理计算。
- 采用框架 :它是一个底层算子,PyTorch 原生支持,vLLM 和 SGLang 在底层计算时也都会调用它。
2. PagedAttention:显存层的"收纳大师"
关注的是"存得下"。
- 原理:受操作系统虚拟内存分页启发。它将 KV Cache 切分成固定大小的"块"(Block),每个请求的块可以分散在显存的任何角落,通过"页表"来映射。
- 效果:解决了"内存碎片"问题。显存利用率从不到 50% 提升到 90% 以上,使得在有限显存下能处理更长的上下文或更高的并发量。
- 适用场景 :高吞吐量的推理服务(如 API 服务),特别是显存受限、需要处理长文本的场景。
- 采用框架 :这是 vLLM 框架的核心专利技术。
3. RadixAttention:调度层的"智能目录"
关注的是"找得准"。
- 原理 :使用基数树(Radix Tree) 数据结构来组织 KV Cache。它将不同的请求(如多轮对话、推测解码的分支)组织成树状结构。
- 效果 :
- 前缀复用:在多轮对话中,如果新请求包含了旧的前缀(如系统提示词、历史对话),它能直接复用树中的节点,无需重新计算。
- 灵活调度:特别适合处理树状的推测解码(Tree Inference),能精确地驱逐不再需要的"叶子节点"。
- 适用场景 :多轮对话系统 、交互式应用、以及使用**推测解码(Speculative Decoding)**的极速推理场景。
- 采用框架 :这是 SGLang 框架的核心技术。
4. FlashAttention、PagedAttention、RadixAttention 区别
| 维度 | FlashAttention | PagedAttention | RadixAttention |
|---|---|---|---|
| 核心目标 | 加速计算,减少显存读写 | 管理显存,消除内存碎片 | 管理缓存,提升复用效率 |
| 解决痛点 | 计算慢、中间结果显存占用大 | 显存利用率低、无法处理长文本 | 多轮对话/推测解码时缓存难复用 |
| 作用阶段 | 训练 & 推理(计算时) | 推理(显存分配时) | 推理(调度KV Cache时) |
| 技术本质 | 算法/算子(分块计算+重计算) | 内存管理策略(分页机制) | 数据结构(基数树) |
| 典型框架 | PyTorch, Transformers | vLLM | SGLang |
5. Radix Cache vs. 传统 PagedAttention (vLLM)
SGLang 的 Radix Cache 主要为了解决多轮对话 、推测解码(Speculative Decoding) 以及高并发下的缓存复用问题
| 维度 | SGLang Radix Cache (Radix Tree) | 传统 PagedAttention (Hash Table) |
|---|---|---|
| 底层数据结构 | 基数树 (Radix Tree) | 哈希表 (Hash Table) |
| 核心逻辑 | 以 Token ID 序列 为路径构建树结构。 | 以 Block ID 为键,通过哈希映射到物理位置。 |
| 共享前缀处理 | 极强。多轮对话中,如果新的请求包含了旧的前缀(如系统提示词、历史对话),可以直接复用树中的节点。 | 较弱。通常需要完整的序列匹配或复杂的哈希计算才能复用,多轮对话往往需要重新计算 Prefill。 |
| 检索速度 | 相对较慢。需要逐层遍历树节点匹配 Token ID。 | 极快。哈希查找的时间复杂度接近 O(1) O(1) O(1) |
| 内存管理 | 灵活。节点大小可变,可以精确地驱逐"叶子节点"(即未被复用的部分)。 | 固定块。内存通常被划分为固定大小的块(Block),可能会有内部碎片。 |
| 适用场景 | 多轮对话、交互式场景、推测解码(树状思考)。 | 高吞吐、长文本生成(一次性生成,少交互)。 |
6. 适用场景
- 如果你要训练模型 :首选支持 FlashAttention 的框架(如 HuggingFace Transformers)。
- 如果你要部署高并发 API (如提供给大量用户聊天):首选 vLLM(利用 PagedAttention 省显存)。
- 如果你要做复杂的多轮对话或需要极速流式输出 :首选 SGLang(利用 Radix Cache 复用上下文)。
二、PD / EPD 分离:推理系统的"资源调度革命"
PD 分离和 EPD 分离都是大模型推理优化中的架构级解耦技术,它们的核心思想都是"让专业的人做专业的事"。
简单来说,PD 分离 是将推理过程按时间阶段 拆分,而EPD 分离是在 PD 分离的基础上,进一步结合了**模型结构(MoE 架构)**进行更细粒度的拆分。
1. 拆分维度
- Prefill 阶段(计算密集型) :需要极强的算力来并行处理用户的输入(Prompt),生成 KV Cache。它对计算能力(TFLOPS) 要求高,对显存带宽要求相对较低。
- 配备:高算力 GPU(如 H100),专注于处理新请求。
- Decode 阶段(访存密集型) :需要逐个生成 Token,频繁读写 KV Cache。它对显存容量和带宽(HBM) 要求极高,对峰值算力要求相对较低。
- 配备:高带宽/大显存 GPU,专注于维持长文本生成。
- MoE 中的 E 节点 :在 MoE 架构中,E 节点负责执行"专家"计算。P 节点在计算时,如果遇到需要"专家知识"的部分,会将数据路由给 E 节点。E 节点调用对应的专家模块进行计算,算完后把结果传回给 P 节点。
- CV模型的E节点 :负责特征提取的部分(如提取图像的边缘、纹理、语义)
2. PD 分离 vs. EPD 分离
| 维度 | PD 分离 | EPD 分离 |
|---|---|---|
| 全称 | Prefill-Decode Separation | Expert-Prefill-Decode Separation |
| 核心拆分维度 | 时间维度(推理流程的两个阶段) | 结构维度 (MoE) + 时间维度 |
| 主要解决痛点 | 消除计算密集型与访存密集型任务的干扰 | 解决 MoE 模型中专家模块过大、无法单卡部署的问题 |
| 涉及组件 | P 节点、D 节点 | E 节点、P 节点、D 节点 |
| 技术门槛 | 相对较低,主流框架支持 | 较高,需要框架对 MoE 有专门调度支持 |
| 典型配置 | P: 高算力卡, D: 高带宽卡 | E: 超大显存卡 (存专家), P/D: 通用卡 |
3. EPD分离中的E
E的含义取决于模型架构和应用场景:
- 在CV(计算机视觉)大模型的语境下,E 指 Encoder(编码器)
- 在LLM 及MOE模型框架的语境下,E指Expert
| 维度 | E = Expert (专家) | E = Encoder (编码器) |
|---|---|---|
| 所属领域 | NLP / 通用大模型推理 | CV (计算机视觉) / 多模态 / NLP |
| 对应架构 | MoE (混合专家) 架构 | CNN / Vision Transformer (ViT) / Transformer |
| E 的含义 | 模型中负责特定任务的子网络模块(如处理数学的专家、处理代码的专家)。 | 模型中负责特征提取的部分(如提取图像的边缘、纹理、语义)。 |
| 典型场景 | 推理服务的资源调度(如 EPD 分离)。 | 图像识别、目标检测、图像描述生成。 |
三、缓存:突破显存瓶颈的"空间魔术"
针对"同一个或相似的问题被很多人同时或陆续问"的场景,为了提高 QPS,工程实践时采用 "多级缓存 + 智能路由" 的策略。
1. 结果级缓存 ------ "答案复用"
这是最直接的缓存方式。
- 原理:系统将问答对(经过哈希或向量化处理)存储在高速缓存层(如 Redis)中。
- 命中逻辑 :后续用户再问相同或语义相似的问题时,网关层直接拦截请求,返回缓存中的答案,根本不经过大模型推理。
2. 推理级缓存 ------ "KV Cache 复用"
这是在模型推理引擎内部做的优化。
- 原理 :在 PD 分离架构中,如果很多用户问同一个问题,他们的输入 Token 序列是一样的。系统会缓存 Prefill 阶段生成的 KV Cache。
- 效果:当第二个用户问同样问题时,P 节点直接复用之前算好的 KV Cache,无需重新计算注意力矩阵,直接进入 Decode 阶段。
3. 专家级缓存 (MoE 架构特有) ------ "专家状态复用"
在 EPD 分离架构中,E 节点(专家节点)也有缓存机制。
- 原理:对于特定领域的问题(如数学、代码),模型激活的"专家"路径是固定的。
- 预热(Warmup):系统可以将高频问题对应的"专家权重"常驻在 E 节点的显存中,避免频繁的权重加载和卸载开销。
4. 针对"陆续问"的优化策略
对于不是同时发生,而是陆续发生的情况,系统如何处理?
- TTL (生存时间) 策略
- LRU (最近最少使用) 算法
- 分层存储 :根据数据的热度进行分层存储
- 热数据:放在 GPU 显存或内存(SRAM/DRAM)中,毫秒级响应。
- 温数据:放在 SSD 或远程高性能存储中。虽然比内存慢,但比重新计算一遍模型要快得多(英伟达 Dynamo 和百度百舸都支持将 KV Cache 卸载到 SSD)。
四、并行:训推中的"组合拳"
在大模型(LLM)的训练和推理中,并行计算是突破单卡显存和算力限制的核心技术。
基础并行策略
这是目前大模型分布式计算的五块"基石"。
1. 数据并行 (Data Parallelism, DP) ------ "人手一份,各算各的"
这是最简单、最常用的并行方式。
- 核心思想 :模型复制,数据切分 。
- 每张 GPU 都存有一份完整的模型副本。
- 将一个大批次(Batch)的数据切分成 N 份,分给 N 张 GPU 同时计算。
- 工作流程 :
- 各卡独立进行前向传播和反向传播,算出各自的梯度。
- 通过 All-Reduce 通信操作,将所有卡的梯度汇总(求和或平均)。
- 各卡用汇总后的梯度更新本地模型(保证各卡模型参数一致)。
- 优点:实现简单,收敛性好。
- 缺点 :显存浪费严重。因为每张卡都要存一整份模型,当模型超大时(如千亿参数),单卡显存根本存不下。
- 优化版 (ZeRO) :为了解决显存浪费,出现了 ZeRO (Zero Redundancy Optimizer) 技术。它把优化器状态、梯度和参数切分到不同的卡上,每张卡只存一部分,从而省出显存来放更多的数据。
2. 张量并行 (Tensor Parallelism, TP) ------ "手术式切分,协同计算"
当模型大到单卡放不下时(显存溢出),就必须用张量并行。
- 核心思想 :切分计算层 。
- 将模型中的一层(比如一个矩阵乘法 Y=X⋅WY=X⋅W )切分到多张卡上。
- 需要多张卡协作才能完成一次完整的矩阵运算。
- 切分方式 :
- 列切分 (Column Parallel):将权重矩阵按列切开,各卡计算一部分结果,最后拼接(All-Gather)。
- 行切分 (Row Parallel):将权重矩阵按行切开,各卡计算一部分中间结果,最后相加(All-Reduce)。
- 优点:成功将一个巨大的模型"掰开"塞进了多张卡里。
- 缺点 :通信开销极大。每次前向/反向传播,卡间都需要传输中间结果。如果网络带宽不够,卡再多也没用(都在等通信)。
3. 流水线并行 (Pipeline Parallelism, PP) ------ "接力赛跑"
张量并行是"横向切分"一层,流水线并行是"纵向切分"整个模型。
- 核心思想 :按层切分,流水处理 。
- 把模型的不同层(Layer)放到不同的 GPU 上。
- 数据像流水一样,流经第一张卡(算完前几层),再传给第二张卡(算后几层)。
- 工作模式 :
- 假设有 8 层模型,分给 4 张卡,每张卡负责 2 层。
- 卡1算完数据传给卡2,卡2算完传给卡3......
- 优点:进一步降低了单卡的显存压力(只需存部分层的参数)。
- 缺点 :气泡问题 (Bubble)。由于各卡任务长短不一,会出现"等前一棒"的空闲时间,导致 GPU 利用率下降。
4. 专家并行 (Expert Parallelism, EP) ------ "按需分配,各司其职"
这是专门为 MoE (Mixture of Experts) 架构模型设计的并行策略。
- 核心思想 :专家分家,路由计算 。
- 在 MoE 模型中,有多个"专家"子网络(Experts)。
- EP 将不同的专家分配到不同的 GPU 上。
- 工作流程 :
- 输入数据经过"门控网络"判断该找哪个专家。
- 数据通过 All-to-All 通信,被路由(发送)到负责该专家的 GPU 上进行计算。
- 计算结果再传回融合。
- 优点:对于超大规模 MoE 模型,EP 能有效利用算力,且通信模式比 TP 更灵活。
5. 序列并行 (Sequence Parallelism, SP) ------ "切分上下文"
这是较新的优化手段,主要针对长文本场景。
- 核心思想 :切分序列长度 。
- 将输入序列(Context Length)切分成多段,分给不同的卡处理。
- 优点:减少了单卡处理长文本时的显存占用(主要是激活值的显存)。
- 缺点:由于序列之间有依赖关系(如 Transformer 中的注意力机制),切分后需要复杂的通信来同步信息。
进阶/混合策略
| 组合策略 | 说明 |
|---|---|
| 3D 并行 | DP + TP + PP 的组合。训练超大规模模型的"标准答案"。 |
| EPD 混合 | EP + DP 或 EP + TP。在 MoE 模型推理中,用 EP 切分专家,用 DP 提高并发。 |
总结对比表
为了方便记忆,我为你整理了一个对比表:
| 并行类别 | 名称 | 缩写 | 核心逻辑 | 解决痛点 | 典型应用场景 |
|---|---|---|---|---|---|
| 基础切分 | 数据并行 | DP | 复制模型,切分数据 | 数据量大,单机跑不完 | 几乎所有训练任务 |
| 张量并行 | TP | 切分矩阵,协同运算 | 模型太大,单卡显存放不下 | 超大层(如FFN)的计算 | |
| 流水线并行 | PP | 按层切分,接力传递 | 模型层数太多,显存碎片化 | 层数极深的模型(如100+层) | |
| 专家并行 | EP | 分配专家,路由计算 | MoE模型中专家参数量过大 | DeepSeek-R1、Mixtral等MoE模型 | |
| 序列并行 | SP | 切分序列维度 | 长序列导致的激活值显存爆炸 | 中长文本训练 | |
| 进阶/特定 | 上下文并行 | CP | 切分上下文窗口 | 超长文本(如128K)的显存压力 | 处理整本书、超长代码文件 |
| 路由并行 | RP | 动态数据分发 | MoE中专家负载不均衡(热点) | MoE架构的动态调度 | |
| 自动并行 | Auto | 自动规划切分策略 | 手动配置并行组合太复杂 | 降低分布式训练门槛 | |
| 混合策略 | 3D并行 | 3D | DP + TP + PP 组合 | 单一并行无法满足极致显存/算力平衡 | 通用千亿级模型训练 |
| EPD分离 | EPD | E/P/D 节点物理隔离 | 推理时计算与访存资源争抢 | MoE模型的高并发推理服务 |
一句话总结:
- DP 是为了跑更多的数据;
- TP 是为了解决单层算力/显存不足;
- PP 是为了解决模型层数太多;
- EP 是为了服务 MoE 架构的特殊结构。
五、影响效率的"隐形"因素
在大模型工程实践中,除了核心的注意力机制、并行策略、PD/EPD分离及缓存管理外,还有多个关键因素深刻影响着系统效率。
-
通信开销:分布式系统的"隐形杀手"在分布式训练与推理中,通信往往成为瓶颈。All-Reduce(用于梯度同步)和 All-to-All(用于专家并行路由)操作若设计不当,会导致大量时间浪费在数据传输而非计算上。跨节点的网络延迟也直接影响推理服务的端到端响应速度。优化通信库(如NCCL)和采用通信压缩技术是关键。
-
量化技术:显存与速度的"平衡艺术"量化是工程落地的必选项。通过将模型权重从FP32转换为INT8或FP8,可显著降低显存占用并提升计算速度。这使得在有限硬件上部署更大模型或支持更高并发成为可能。但工程难点在于需精细平衡精度损失与性能提升,避免影响模型效果。
-
模型结构复杂性:调度的新挑战流行的 MoE(混合专家)架构虽能提升模型能力,但也带来了工程难题。其核心在于负载均衡:若路由机制不佳,会导致部分"专家"节点过载(热点),而其他节点空闲,造成严重的资源浪费。此外,其动态计算图也比传统静态图更难优化。
-
服务调度与批处理:用户体验的"守护者"在推理端,连续批处理技术能动态合并请求,极大提升吞吐量。但工程核心在于优化 Goodput(有效吞吐量),即在保证低延迟(如首字延迟<200ms)的前提下处理更多请求。此外,针对超长上下文的冷热数据分层策略,通过智能识别并卸载不活跃数据,能有效缓解显存压力。
综上所述,构建高效的大模型系统,需综合运用量化、通信优化、智能调度及缓存管理等多种手段,在算力、显存与通信间寻找最佳平衡点。
| 因素 | 核心问题 | 典型优化手段 |
|---|---|---|
| 通信开销 | 卡多了一起"堵车" | 通信压缩 (DisTrO)、拓扑感知调度、Zero-Redundancy |
| 量化 | 显存不够、带宽受限 | INT8/FP8 推理、AWQ/GPTQ 量化算法 |
| 模型结构 | MoE 路由不均、计算动态 | 负载均衡路由、专家分区优化 |
| 服务调度 | 空闲等待或请求超时 | 连续批处理、PagedAttention、SLO 感知调度 |
| 存储层级 | 长文本显存爆炸 | 冷热数据分层、CPU Offload |
附录
名词解释
- SRAM (Static Random-Access Memory) :
- 特点:极低延迟、高功耗、高成本。
- 对应 :GPU 卡的缓存大小 或片上内存。在计算中用于存放需要高速访问的数据。
- HBM (High Bandwidth Memory) :
- 特点:超高带宽、大容量、低功耗。
- 对应 :GPU 卡的显存。用于存放模型权重和大量中间数据。
SRAM 与 HBM 对比
| 特性 | SRAM | HBM |
|---|---|---|
| 核心优势 | 速度最快 (低延迟) | 带宽最高 (高吞吐) |
| 物理位置 | 通常集成在芯片内部 (缓存) | 堆叠在芯片外 (显存) |
| 成本 | 极高 | 较高 |
| 典型应用 | CPU/GPU 缓存 | AI 训练显卡显存 |
KV Cache:大模型的"备忘录"
在大模型生成文本时,通过"自注意力机制"决定下一个字。在这个过程中,每个字(Token)都会被转换成三个向量:
- Query (Q):当前要查询的需求("我现在想说什么?")。
- Key (K):历史信息的索引/标签("之前提到过哪些关键词?")。
- Value (V):历史信息的具体内容("之前具体说了什么内容?")。
KV Cache 就是专门用来存储历史 Token 的 Key 和 Value 向量的高速缓存区。