大模型在推理部署时,往往存在显存瓶颈:
- 模型参数(Parameters, P)动辄上百 GB,需要长期驻留显存。
- 输入/输出数据(Data, D)则随请求动态变化,但往往和参数耦合在同一设备上,导致显存占用不均衡,扩展性受限。
为了解决这一问题,可以借助 vLLM 框架实现参数 / 数据(P/D)分离,提升推理系统的灵活性和吞吐。
大模型推理的资源瓶颈
以一个 70B 规模的 Transformer 模型为例:
- 参数权重(FP16 存储)约需 140GB 显存;
- 每次请求输入的序列数据、KV Cache 会消耗额外显存,并随 batch size 增长而急剧膨胀。
如果不加区分地将 P 与 D 放在同一块 GPU:
- 参数长期驻留,挤压了用于动态数据的显存;
- 多实例并发时,数据显存不足,限制了吞吐。
因此,在分布式推理系统中,业界逐渐采用 参数与数据分离(P/D Separation) 的架构思路。
vLLM 简介
vLLM 是一个高性能的大模型推理引擎,核心优势包括:
- PagedAttention:高效管理 KV Cache,支持大批量并发;
- 高吞吐率:相较于 Hugging Face Transformers 推理,吞吐提升数倍;
- 灵活的分布式支持:可结合 DeepSpeed、Megatron 等方案,支持参数/数据分布式存储与调度。
vLLM 的模块化架构,使其天然适合实现 P/D 分离。
P/D 分离的实现思路
在 vLLM 中,推理流程大致分为两个部分:
参数侧(P)
- 模型权重加载与存放;
- 可通过 ZeRO-3 / Tensor Parallel 等策略将参数分布在多 GPU 节点上;
- 参数在整个推理生命周期中保持常驻,不随请求波动。
数据侧(D)
- 动态输入序列、KV Cache、采样状态等;
- 可使用 PagedAttention 管理显存分页;
- 支持把部分 KV Cache 放到 CPU/Host 内存,再动态迁移到 GPU。
核心机制
其核心机制是显存资源隔离:
- 权重(P) 固定驻留在专门的 GPU(参数节点);
- 数据(D) 可以按需分配到其他 GPU(数据节点),甚至利用 CPU 内存 / NVMe。
这样:
- 参数显存不与动态数据抢占空间;
- 数据可以根据请求动态扩展,提升并发能力。
在 vLLM 中的实现路径
实现 P/D 分离的常见方法:
参数分片(Parameter Sharding)
- 借助 vLLM 对 Megatron-LM / DeepSpeed 的支持,将模型参数按张量维度切分到多 GPU;
- 仅在推理计算时聚合,不需要在每个设备上完整存放参数。
KV Cache 分离(Data Sharding)
- 通过 vLLM 的 PagedAttention,可以把 KV Cache 存在独立的 GPU 或 Host 内存;
- 在推理过程中按需调页,类似操作系统的虚拟内存机制。
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 分离架构将逐渐成为大模型推理的主流范式。