1、推理引擎如 sglang,它的前缀缓存的作用是什么?
Prefix Cache 的本质是缓存共享 Prompt 的 KV Cache,通过最长公共前缀匹配直接复用已经 Prefill 的 Attention 状态,将 Prefill 的计算复杂度从 O(n²) 降低到只对新增 Token 计算,从而显著降低 TTFT、提升吞吐并减少 GPU FLOPs 和显存带宽消耗。
2、张量并行是模型全部要切吗?
张量并行并不会切分整个模型,而是优先切分参数量和计算量最大的矩阵乘法,例如 Attention 的 QKV Projection、Output Projection 和 MLP 的 Linear 层;而 LayerNorm、RoPE、Dropout 等计算和参数占比很小的模块通常直接复制。张量并行的本质是用通信换显存和算力扩展,因此只有当切分收益大于通信开销时才值得做。
3、介绍一下分布式大模型训练引擎的流程
分布式大模型训练引擎本质上是一个计算和通信编排系统。首先初始化 NCCL 和各种并行组,然后通过 TP、PP、DP、ZeRO/FSDP 对模型和状态进行切分。训练时 DataLoader 将数据分发到各个 DP Rank,每个 micro-batch 经过流水线执行 Forward 和 Backward。过程中 TP 会进行矩阵并行通信,PP 会传递激活和梯度,DP 会同步梯度或参数分片。最后 Optimizer 更新参数并进行分布式 Checkpoint 保存。整个训练引擎的目标就是在有限 GPU 显存和带宽下,最大化 MFU(Model FLOPs Utilization)和训练吞吐。
4、介绍一下整个推理引擎的流程,分别介绍sglang 和 vllm 然后对比一下?
vLLM 和 SGLang 本质上都是围绕两件事优化:一是通过 Continuous Batching 提高 GPU 利用率,二是通过高效的 KV Cache 管理提升吞吐。区别在于,vLLM 的核心创新是 PagedAttention,把 KV Cache 像操作系统页表一样管理,解决显存碎片问题;而 SGLang 更进一步,引入 RadixAttention 和 Prefix Cache,通过共享公共前缀的 KV,大幅减少重复 Prefill 计算。因此,vLLM 更偏向通用高吞吐推理引擎,而 SGLang 在 Agent、RAG 和长上下文场景下往往能获得更低的 TTFT 和更高的资源利用率。
5、Data parallel是什么?它解决了什么?它不能解决什么?(NV)
Data Parallel 的核心思想是模型复制、数据切分、梯度同步。每张 GPU 保存完整模型参数,处理不同的数据 Batch,反向传播后通过 AllReduce 同步梯度,并在每张 GPU 上执行相同的参数更新。它主要解决的是训练吞吐和 GPU 利用率问题,可以近似线性扩展 Global Batch Size。但它不能降低模型显存占用,因为每张 GPU 都保存完整模型;也不能加速单个样本的计算,无法解决超大模型和超长序列的问题。因此,大模型训练通常需要结合 Tensor Parallel、Pipeline Parallel、Context Parallel 和 ZeRO/FSDP 一起使用。
6、Zero/FSDP的核心思想是什么?
ZeRO/FSDP 的核心思想是:不再让每张 GPU 保存完整的模型状态,而是把模型状态(Parameters、Gradients、Optimizer States)切分到多张 GPU 上,需要时再通信聚合,从而用通信换显存。
ZeRO/FSDP 的核心思想是状态分片(State Sharding)。传统 Data Parallel 中,每张 GPU 都保存完整的 Parameters、Gradients 和 Optimizer States,导致显存线性复制。ZeRO/FSDP 将这些状态按 GPU 数量进行切分,每张卡只保存自己的 Shard,需要计算时通过 AllGather 临时恢复完整参数,反向传播后再通过 ReduceScatter 分发梯度。因此,它本质上是用通信换显存,使模型显存占用从 O(Model Size) 降低到 O(Model Size / N),从而能够训练数十亿甚至上千亿参数的大模型。
7、如何理解TP,列并行,行并行?
Tensor Parallel 的本质是把大矩阵乘法拆到多张 GPU 上并行执行。列并行是沿输出维度切分权重矩阵,每张 GPU 计算部分输出,Forward 基本不需要通信;行并行是沿输入维度切分权重矩阵和输入,每张 GPU 得到部分结果,最后通过 AllReduce 求和得到完整输出。Megatron 会交替使用 Column Parallel 和 Row Parallel,使中间激活一直保持分片状态,从而把两层 Linear 的通信从两次降低到一次,提高训练效率。
8、sequence parallel是什么?为什么经常和TP一起出现?
Sequence Parallel 的核心思想是沿 Sequence 维度切分激活,让不同 GPU 只保存部分 Token 的 Activation,从而把 Activation Memory 从 O(B×S×H) 降低到 O(B×S×H/TP)。它主要用于 LayerNorm、Dropout、Residual 等 Token 之间相互独立的算子。之所以经常和 Tensor Parallel 一起出现,是因为 TP 已经引入了 AllGather 和 ReduceScatter 等通信,SP 可以利用这些通信结果直接把 Activation 保持为 Sequence Shard 状态,以几乎零额外通信成本换取显著的激活显存下降。因此可以理解为:TP 解决参数显存问题,而 SP 解决长序列训练中的 Activation 显存问题,两者天然互补,所以在 Megatron 和 DeepSpeed 中几乎总是一起使用。
9、pipeline parallel是什么?和tensor parallel的区别是什么?
Pipeline Parallel 的核心思想是沿模型深度(Transformer Layer)切分模型,不同 GPU 负责不同的 Layer,通过 Micro-Batch 流水执行 Forward 和 Backward,从而降低单卡参数显存并提升 GPU 利用率。它和 Tensor Parallel 的区别在于:TP 是切矩阵,让所有 GPU 共同计算同一层,因此通信频繁但能加速单层计算;PP 是切 Layer,每张 GPU 负责不同层,通信只发生在 Stage 边界,因此扩展性更好,但会引入 Pipeline Bubble 和调度复杂度。可以简单理解为:TP 是横向切一个 Layer,PP 是纵向切整个网络深度。
10、context parallel是什么,他和sequence parallel有什么不同?
Context Parallel 和 Sequence Parallel 都沿 Sequence 维度切分 Token,但目标完全不同。Sequence Parallel 是为了降低 Activation Memory,只作用于 LayerNorm、Dropout、Residual 等 Token 独立算子,Attention 前需要 AllGather 恢复完整序列,因此并没有降低 Attention 的 O(S²) 开销。而 Context Parallel 的目标是并行化 Attention 本身,每张 GPU 只负责部分 Query Token,通过 AllGather 或 Ring Attention 获取全局 K/V,从而把单卡 Attention 的计算和显存开销降低到大约 O(S²/CP)。因此可以简单理解为:SP 是 Activation Parallel,CP 是 Attention Parallel;SP 解决长序列激活显存问题,CP 解决超长上下文 Attention 无法放进单卡的问题。
11、expert parallel是什么?moe为什么需要它?
Expert Parallel 的核心思想是沿 Expert 维度切分 MoE 层,不同 GPU 保存不同的 Experts。MoE 的特点是参数规模非常大,但每个 Token 只激活 TopK 个 Experts,因此如果采用普通 Data Parallel,每张 GPU 都复制全部 Experts,会导致显存无法承受。EP 将 Experts 分片存储,每张 GPU 只负责部分 Experts。Forward 时先由 Router 决定每个 Token 的 TopK Experts,然后通过 AllToAll 将 Token Dispatch 到对应 Expert 所在 GPU,本地完成 Expert MLP 计算后,再通过 AllToAll 返回结果并完成 Combine。和 Tensor Parallel 不同,TP 是多个 GPU 协同计算同一个矩阵,而 EP 是不同 GPU 分别计算不同 Experts。因此可以理解为:TP 是矩阵切分,EP 是 Expert 切分;TP 的核心通信是 AllReduce,而 EP 的核心通信是 AllToAll。
12、pipeline bubble为什么产生?
Pipeline Bubble 的根本原因是 Pipeline Parallel 将模型按 Layer 切成多个 Stage 后,Stage 之间存在严格的数据依赖,下游 Stage 必须等待上游 Stage 产生 Activation 才能开始计算。因此在流水线启动阶段(Warmup)和结束阶段(Cooldown),部分 GPU 必然处于空闲状态,这些 Idle Time 就称为 Pipeline Bubble。Bubble 的大小大约与 (PP - 1) / MicroBatch 成正比,所以通常会增加 Micro Batch 数量并采用 1F1B 调度来降低 Bubble,提高 GPU 利用率。
13、为什么micro-batch能够减少bubble?
因为 Warmup 和 Cooldown 的空闲时间(Bubble)基本是固定的,而增加 Micro-Batch 后,流水线稳定工作的时间变长,所以 Bubble 在总执行时间中的占比下降了。
Micro-Batch 能减少 Pipeline Bubble,并不是因为它减少了 Warmup 和 Cooldown 的绝对时间,而是因为这些 Bubble 基本是固定成本。增加 Micro-Batch 后,流水线完全填满并稳定运行的时间会变长,因此 Bubble 在总执行时间中的占比下降。从公式上看,Bubble Ratio 大约是 (PP-1)/MicroBatch,所以当 Micro-Batch 远大于 Pipeline Stage 数时,流水线利用率会显著提升。本质上,这是用更多的工作量去摊薄固定的流水线启动和排空成本。
14、Gpipe和1F1B有什么区别?
GPipe:先全部 Forward,再全部 Backward(F...F B...B)
1F1B:Forward 和 Backward 交替执行(1 Forward + 1 Backward)
GPipe 显存占用高,调度简单;1F1B 显存占用低,工程上更常用。
GPipe 和 1F1B 都是 Pipeline Parallel 的调度方式。GPipe 采用 Flush Schedule,即先完成所有 MicroBatch 的 Forward,再统一执行 Backward,因此需要保存所有 MicroBatch 的 Activation,Activation Memory 大约与 MicroBatch 数量成正比。1F1B 则采用交替调度,当流水线填满后,每执行一次 Forward 就执行一次 Backward,使 Activation 能够尽早释放,因此 Activation Memory 大约与 Pipeline Stage 数量成正比。二者在 Bubble 比例上理论接近,但在显存占用上差异巨大。因此现代大模型训练系统,如 Megatron-LM 和 DeepSpeed,几乎都采用 1F1B 调度,因为它能显著降低 Activation 显存压力。
15、为什么同一个micro batch不能再第一个stage forward完后马上backward?
同一个 micro-batch 在第一个 stage forward 完之后,不能立刻 backward,是因为它还没有完成完整 forward(没有 loss),梯度无法计算,而且 backward 需要"全模型的 forward 激活路径"。
同一个 micro-batch 在第一个 pipeline stage forward 完之后不能立即 backward,本质原因是反向传播依赖完整的计算图和 loss,而 loss 只有在最后一个 stage 完成 forward 后才能计算得到。因此 Stage0 仅完成局部 forward 时,无法获得 dL/dh0 这样的梯度信号。此外,pipeline 的 backward 必须沿着完整的 forward path 反向传播,梯度需要从后续所有 stage 逐级传回。因此只有当 micro-batch 完成完整 forward 后,才具备执行 backward 的条件。1F1B 的优化点在于不同 micro-batch 的交错执行,而不是同一个 micro-batch 在局部 stage 上立即 backward。
16、interleaved pipeline parallelisim为什么能够减少bubble?
Interleaved Pipeline Parallelism 通过"把一个大 stage 切成多个 micro-stage(virtual stages)并交错执行",让不同 micro-batch 在同一时间占用不同计算资源,从而把原本连续的空闲时间(bubble)打散并填充掉。
Interleaved Pipeline Parallelism 通过将每个 pipeline stage 进一步划分为多个 virtual stages,并在同一个 GPU 上交错执行不同 micro-batch 的不同 stage 计算,从而提高调度粒度。传统 pipeline 的 bubble 主要来自 stage 间的严格依赖和粗粒度划分,导致 GPU 在等待 upstream activation 时空闲。Interleaved PP 将这些等待时间拆分成更细粒度的计算单元,使得不同 micro-batch 可以填充原本的空闲 slot,从而减少 pipeline bubble,提高 GPU utilization。本质上,它通过"增加执行粒度 + 交错调度"来提升 pipeline 的并行效率。
17,介绍一下vLLM 的 continuous batching
vLLM 的 continuous batching 是在 token 级别动态维护 running batch,通过不断替换完成的 request 来保持 GPU full utilization,从而避免静态 batch 中的空洞和 head-of-line blocking。
18,讲一下PD分离
LLM 推理由 Prefill 和 Decode 两阶段组成。Prefill 是计算密集型,主要消耗 Tensor Core 算力;Decode 是访存密集型,主要受 KV Cache 带宽限制。两者混部会产生资源争用和 Head-of-Line Blocking,导致 TTFT 和 TPOT 恶化。PD 分离通过独立的 Prefill Cluster 和 Decode Cluster,使两阶段分别优化和弹性扩容。但核心挑战在于大规模 KV Cache 的跨 GPU 搬运,因此通常需要 NVLink、RDMA、Paged KV 等技术配合实现。
19,为什么KV cache会带来显存碎片问题?PagedAttention是如何解决这个问题的?
KV Cache 会产生显存碎片,是因为不同请求的上下文长度和生成长度动态变化,导致 KV Cache 的大小和生命周期高度不规则。在 Continuous Batching 下,请求持续进入和退出,GPU 会频繁进行不同大小的显存分配和释放,从而产生严重的外部碎片;而为避免频繁扩容而预留的大块连续空间又会产生内部碎片。
PagedAttention 借鉴操作系统虚拟内存的思想,将 KV Cache 切分为固定大小的 Block(Page),并通过页表维护逻辑 Block 到物理 Block 的映射。请求不再需要连续的大块显存,只需足够数量的空闲 Block 即可,因此几乎消除了外部碎片。同时每个请求最多只会浪费一个 Block 的空间,使内部碎片上界变为 O(BlockSize)。此外,分页机制还天然支持 Prefix KV Sharing 和高效的 Continuous Batching 调度。