大模型在推理部署时,往往存在显存瓶颈

  • 模型参数(Parameters, P)动辄上百 GB,需要长期驻留显存。
  • 输入/输出数据(Data, D)则随请求动态变化,但往往和参数耦合在同一设备上,导致显存占用不均衡,扩展性受限。

为了解决这一问题,可以借助 vLLM 框架实现参数 / 数据(P/D)分离,提升推理系统的灵活性和吞吐。

大模型推理的资源瓶颈

以一个 70B 规模的 Transformer 模型为例:

  • 参数权重(FP16 存储)约需 140GB 显存
  • 每次请求输入的序列数据、KV Cache 会消耗额外显存,并随 batch size 增长而急剧膨胀。

如果不加区分地将 P 与 D 放在同一块 GPU:

  1. 参数长期驻留,挤压了用于动态数据的显存;
  2. 多实例并发时,数据显存不足,限制了吞吐。

因此,在分布式推理系统中,业界逐渐采用 参数与数据分离(P/D Separation) 的架构思路。

vLLM 简介

vLLM 是一个高性能的大模型推理引擎,核心优势包括:

  • PagedAttention:高效管理 KV Cache,支持大批量并发;
  • 高吞吐率:相较于 Hugging Face Transformers 推理,吞吐提升数倍;
  • 灵活的分布式支持:可结合 DeepSpeed、Megatron 等方案,支持参数/数据分布式存储与调度。

vLLM 的模块化架构,使其天然适合实现 P/D 分离

P/D 分离的实现思路

在 vLLM 中,推理流程大致分为两个部分:

  1. 参数侧(P)

    • 模型权重加载与存放;
    • 可通过 ZeRO-3 / Tensor Parallel 等策略将参数分布在多 GPU 节点上;
    • 参数在整个推理生命周期中保持常驻,不随请求波动。
  2. 数据侧(D)

    • 动态输入序列、KV Cache、采样状态等;
    • 可使用 PagedAttention 管理显存分页;
    • 支持把部分 KV Cache 放到 CPU/Host 内存,再动态迁移到 GPU。

核心机制

其核心机制是显存资源隔离:

  • 权重(P) 固定驻留在专门的 GPU(参数节点);
  • 数据(D) 可以按需分配到其他 GPU(数据节点),甚至利用 CPU 内存 / NVMe。

这样:

  • 参数显存不与动态数据抢占空间;
  • 数据可以根据请求动态扩展,提升并发能力。

在 vLLM 中的实现路径

实现 P/D 分离的常见方法:

  1. 参数分片(Parameter Sharding)

    • 借助 vLLM 对 Megatron-LM / DeepSpeed 的支持,将模型参数按张量维度切分到多 GPU;
    • 仅在推理计算时聚合,不需要在每个设备上完整存放参数。
  2. KV Cache 分离(Data Sharding)

    • 通过 vLLM 的 PagedAttention,可以把 KV Cache 存在独立的 GPU 或 Host 内存;
    • 在推理过程中按需调页,类似操作系统的虚拟内存机制。
  3. Pipeline 并行化

    • 将模型计算划分为不同阶段,前几层专门占用参数节点,后几层在数据节点完成;
    • 在流水线中,数据逐层传递,而参数保持分片驻留。

基于 vLLM 的 P/D 分离实战

下面给出两部分内容:

  • 配置示例:如何在多 GPU 环境下指定参数和数据分布;
  • 代码示例:如何加载模型并运行推理,展示参数常驻、数据动态分配。

配置示例

假设我们有 4 张 GPU:

  • GPU 0,1:专门存放模型参数(P);
  • GPU 2,3:主要承载 KV Cache 等动态数据(D)。

我们可以在启动 vLLM 时设置:

CUDA_VISIBLE_DEVICES=0,1,2,3 \
python -m vllm.entrypoints.api_server \
    --model /path/to/llama-2-70b \
    --tensor-parallel-size 2 \
    --gpu-memory-utilization 0.85 \
    --enable-chunked-prefill \
    --enforce-eager \
    --kv-cache-dtype fp16 \
    --max-num-batched-tokens 4096

这里的关键点:

  • --tensor-parallel-size 2:只在 GPU 0,1 上做参数分片存放;
  • --gpu-memory-utilization:控制参数占用的比例,留出余量给数据;
  • --kv-cache-dtype fp16:降低 KV Cache 精度,减少数据显存占用;
  • vLLM 内部的 PagedAttention 会自动把 KV Cache 分配到 GPU 2,3,如果溢出则回退到 CPU 内存。

代码示例

下面是一个 Python 调用示例:

from vllm import LLM, SamplingParams

# -------- 参数(P)分离 --------
# tensor_parallel_size=2 表示参数分布在前两张 GPU(0,1)
llm = LLM(
    model="/path/to/llama-2-70b",
    tensor_parallel_size=2,
    gpu_memory_utilization=0.85,
    enforce_eager=True,       # 避免显存碎片
    enable_chunked_prefill=True,
    kv_cache_dtype="fp16"     # 数据(D)使用更轻量的缓存精度
)

# -------- 数据(D)分离 --------
# PagedAttention 会自动管理 KV Cache 的存放位置(GPU2, 3, 甚至 CPU 内存)
sampling_params = SamplingParams(
    temperature=0.8,
    top_p=0.95,
    max_tokens=256
)

prompt = "解释一下通过 vLLM 实现 P/D 分离的好处。"

# 运行推理
outputs = llm.generate([prompt], sampling_params)

print("模型输出:")
for output in outputs:
    print(output.outputs[0].text)

验证方式

运行时可以用 nvidia-smi 观察:

  • GPU 0,1 显存几乎恒定,主要承载参数;
  • GPU 2,3 的显存随请求数量/序列长度波动,主要承载 KV Cache;
  • 如果输入过大,KV Cache 会溢出到 CPU 内存,但仍可继续推理。

实际效果与收益

通过 P/D 分离,可以得到以下好处:

  • 提升 GPU 利用率:参数和数据分工明确,避免显存冲突;
  • 支持更大 batch size:数据显存可扩展,吞吐率提升显著;
  • 降低成本:参数可驻留在高端 GPU,而数据可放到中低端 GPU 或 CPU 内存,形成分层存储;
  • 灵活性:适配多种硬件资源组合(A100 + H100, GPU + CPU, GPU + NVMe)。

在实践中,结合 vLLM 的 PagedAttention,P/D 分离的效果尤为明显,可让大模型推理在同样硬件下实现 数倍并发提升

总结

vLLM 框架凭借其高效的 KV Cache 管理和分布式能力,为 大模型推理的 P/D 分离 提供了坚实基础。 通过将 参数(P)数据(D) 解耦,可以更好地利用硬件资源,提升推理性能与扩展性。

未来,随着 混合精度存储、分层缓存(GPU+CPU+NVMe) 的发展,P/D 分离架构将逐渐成为大模型推理的主流范式。