张芷铭的个人博客

vLLM是UC Berkeley LMSYS团队开源的大模型推理框架,核心创新是PagedAttention分页注意力机制,将显存利用率提升至90%以上,在相同硬件下实现数倍至数十倍的吞吐提升。

vLLM概述

vLLM是专为大语言模型/多模态大模型设计的高吞吐、低延迟推理与服务框架

核心能力

  • 支持自回归语言模型、多模态大模型、MoE模型推理
  • 兼容OpenAI API协议,可无缝替换现有OpenAI接口应用
  • 支持主流量化方案、分布式推理、动态LoRA加载、超长上下文推理

发展历程

时间里程碑
2023年4月首次发布,PagedAttention落地,吞吐达HF Transformers 20倍以上
2023年9月PagedAttention论文发布
2024年支持GPTQ/AWQ/FP8量化、多模态、MoE、分布式并行
2025-2026年支持10M+ token超长上下文、端侧适配、RDMA多节点缓存共享

核心优势

特性核心价值
极致显存利用率PagedAttention消除内存碎片,KV缓存利用率90%+
超高吞吐连续批处理+分页内存管理,吞吐提升5-20倍
极低部署门槛开箱即用,一行命令启动OpenAI兼容服务
全场景适配离线批量推理、在线服务、多租户SaaS、长上下文RAG

核心原理

Transformer推理与KV缓存

自回归生成模式下,每步生成都依赖之前所有token的上下文信息。

KV缓存机制

  • Prefill阶段:一次性计算所有prompt token的$K,V$并缓存
  • Decode阶段:每步仅计算当前token的$K,V$,追加到缓存后计算注意力

传统KV缓存痛点

  1. 严重内存碎片化,显存利用率低(20%-30%)
  2. 静态批处理效率差,长序列拖慢整个批次
  3. 无法高效共享缓存,RAG场景显存冗余

PagedAttention核心设计

将KV缓存切分为固定大小的物理块(Block),每个块存储固定数量token的$K,V$向量。为每个序列维护逻辑块-物理块映射表

核心收益

  • 消除内存碎片:固定大小块可任意复用,显存利用率90%+
  • 灵活动态扩缩容:长度增长只需分配新物理块
  • 高效缓存共享:多序列可映射到同一物理块,实现零拷贝共享

连续批处理

以token生成step为最小调度单元,每step结束后立即移出已完成序列、加入新序列,批次大小动态调整,GPU始终满负荷。

配套核心技术

技术说明
分布式推理支持张量并行、流水线并行、专家并行
异构内存管理CPU-GPU异构调度,支持超长上下文
量化支持FP8/INT8/AWQ/GPTQ等
多租户LoRA动态加载多个LoRA适配器

快速上手

安装

1
pip install vllm

离线批量推理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from vllm import LLM, SamplingParams

sampling_params = SamplingParams(
    temperature=0.7, top_p=0.9, max_tokens=1024
)

llm = LLM(
    model="Qwen/Qwen2-7B-Instruct",
    tensor_parallel_size=1,
    gpu_memory_utilization=0.9
)

prompts = ["请解释PagedAttention的核心优势?", "用Python写快速排序"]
outputs = llm.generate(prompts, sampling_params=sampling_params)

OpenAI兼容服务

1
2
3
4
vllm serve Qwen/Qwen2-7B-Instruct \
    --port 8000 \
    --tensor-parallel-size 1 \
    --gpu-memory-utilization 0.9
1
2
3
4
5
6
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
    model="Qwen/Qwen2-7B-Instruct",
    messages=[{"role": "user", "content": "什么是vLLM?"}]
)

动态LoRA推理

1
2
3
4
5
6
7
llm = LLM(
    model="Qwen/Qwen2-7B-Instruct",
    enable_lora=True,
    max_loras=4
)
llm.load_lora(lora_name="customer_service", lora_path="./lora/customer_service")
outputs = llm.generate(prompts, lora_request=["customer_service"])

生产环境最佳实践

核心参数调优

参数调优建议
gpu_memory_utilizationA100推荐0.9-0.95;RTX消费级卡推荐0.85-0.9
block_size长上下文调大至32/64;高并发短序列调小至8
max_num_batched_tokens高吞吐离线场景调大;低延迟在线场景调小
quantizationHopper架构优先FP8;Ampere优先AWQ

常见问题解决

问题解决方案
OOM降低gpu_memory_utilization;开启量化;开启CPU offload
延迟过高减小max_num_batched_tokens;开启张量并行
精度下降更换高精度量化方案(FP8/AWQ);检查权重加载

适用场景

  • 高吞吐在线API服务
  • 长上下文RAG与文档处理
  • 多租户企业级大模型平台
  • 离线批量推理
  • 多模态大模型部署

竞品对比

框架吞吐易用性量化支持
vLLM顶级极高全方案
TensorRT-LLM顶级较低全方案
TGI中等主流方案
HF Transformers极高主流方案

学习资源

Comments