Skip to content

vLLM 推理加速

vLLM 是一个快速、易于使用的 LLM 推理和服务库,显著提升推理吞吐量和延迟。

为什么需要 vLLM

直接用 Transformers 部署模型的问题:

问题 1:显存占用高(KV Cache 重复分配)
问题 2:吞吐量低(Batch 处理效率低)
问题 3:请求排队(无法连续 Batch)

vLLM 的解决方案:PagedAttention

原理类似操作系统的虚拟内存:
- KV Cache 按需分配(不浪费显存)
- 连续 Batch(请求完成一个就补一个新的)
- 吞吐量提升 2-4 倍

安装

bash
pip install vllm

# 需要 CUDA 12.1+
# GPU 必须是 NVIDIA,且计算能力 >= 7.0(V100 及以上)

快速启动服务

bash
# 启动 API 服务(兼容 OpenAI API)
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --port 8000

# 访问(和 OpenAI API 完全一样)
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama/Llama-3.1-8B-Instruct",
    "messages": [{"role": "user", "content": "你好"}]
  }'

Python 代码中使用

python
from vllm import LLM, SamplingParams

# 加载模型
llm = LLM(
    model="meta-llama/Llama-3.1-8B-Instruct",
    tensor_parallel_size=1,  # GPU 数量
    gpu_memory_utilization=0.9
)

# 设置采样参数
sampling_params = SamplingParams(
    temperature=0.7,
    top_p=0.95,
    max_tokens=512
)

# 批量推理
prompts = [
    "解释什么是 RAG",
    "写一个快速排序",
    "Spring Boot 怎么集成 JPA"
]

outputs = llm.generate(prompts, sampling_params)

for output in outputs:
    print(output.prompt)
    print(output.outputs[0].text)

关键参数

python
LLM(
    model="...",
    tensor_parallel_size=2,     # 多 GPU 并行(模型并行)
    pipeline_parallel_size=1,   # 流水线并行
    gpu_memory_utilization=0.9, # GPU 显存利用率
    max_num_seqs=256,           # 最大并发序列数
    max_num_batched_tokens=8192 # 最大 Batch Token 数
)

与 OpenAI API 兼容

vLLM 的 API 服务和 OpenAI 完全兼容,可以直接替换:

python
from openai import OpenAI

# 原来用 OpenAI
# client = OpenAI(api_key="sk-...")

# 现在用本地 vLLM
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="vllm"
)

response = client.chat.completions.create(
    model="meta-llama/Llama-3.1-8B-Instruct",
    messages=[{"role": "user", "content": "你好"}]
)

性能对比

部署方式:Llama 3.1 8B,1 张 A100

Transformers(直接部署):
- 吞吐量:~2000 tokens/s
- 最大并发:~32

vLLM:
- 吞吐量:~8000 tokens/s(4x)
- 最大并发:~256

量化(进一步降低显存)

bash
# 使用 4-bit 量化(需要 bitsandbytes)
python -m vllm.entrypoints.openai.api_server \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --quantization awq \
  --dtype half

相关资源