目录

vLLM 实战:如何在 GPU 服务器上高效跑起开源 LLM

为什么需要 vLLM

跑过开源 LLM 的人都遇到过这个问题:模型加载到 GPU 后,显存占用高得离谱,但 GPU 利用率却上不去。

传统 LLM serving 的问题:

输入: "Hello, how are"
Token: [0, 1, 2, 3, ...] → [0, 1, 2, 3, 4, 5, ...]
     ↓
Attention 计算
     ↓
每个 token 都需要访问完整的 KV cache
     ↓
KV cache 按 request 预分配固定大小
     ↓
大量显存碎片 + GPU 利用率低

原因:传统方案把 KV cache 按 request 预分配固定长度的连续显存。但实际生成时,request 长度差异很大,导致大量显存浪费。

vLLM 的核心:PagedAttention

vLLM 来自 UC Berkeley 的研究团队,2023 年 6 月发布。他们的核心创新是 PagedAttention——受操作系统分页内存管理启发。

原理

传统方案:

Request 1: [Token 1][Token 2][Token 3][Empty...Empty]  (预分配 512 slots)
Request 2: [Token 1][Token 2][Empty...Empty...Empty]    (预分配 512 slots)

PagedAttention:

KV Cache: [Block 0][Block 1][Block 2][Block 3][Block 4][Block 5][Block 6][Block 7]
          ───────────────────────────────────────────────────────────────
Request 1: P1    | P1    | P1    | P1    |
Request 2: P2    | P2    |       |       |

每个 request 的 KV cache 不再是连续的大块,而是分散在多个小块(block)中,按需分配。就像操作系统的虚拟内存分页。

实际效果

根据 vLLM 论文和我们的测试:

指标 传统方案 vLLM 提升
Throughput (tokens/s) 基准 +24x 24倍
显存占用 100% ~60% 省 40%
支持并发 request 1-2 10-20 10倍

部署实战

环境准备

# 需要 CUDA 12.1+
nvidia-smi  # 确认 GPU 可用

# 推荐 Docker 部署
docker pull nvidia/cuda:12.1.0-runtime-ubuntu22.04

安装 vLLM

# 方式 1: pip 直接装
pip install vllm

# 方式 2: 从源码编译(需要更多时间,但能用到最新的优化)
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .

启动 API Server

# 最简启动
vllm serve meta-llama/Llama-2-7b-chat-hf \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 2  # 如果有多 GPU
# 生产级配置
vllm serve meta-llama/Llama-2-70b-chat-hf \
    --host 0.0.0.0 \
    --port 8000 \
    --tensor-parallel-size 4 \
    --gpu-memory-utilization 0.92 \
    --max-model-len 8192 \
    --enforce-eager \
    --trust-remote-code

调用示例

# OpenAI-compatible API
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "meta-llama/Llama-2-7b-chat-hf",
    "messages": [{"role": "user", "content": "Explain PagedAttention in one sentence."}],
    "max_tokens": 100
  }'

Python client:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"  # vLLM 默认不需要 API key
)

response = client.chat.completions.create(
    model="meta-llama/Llama-2-7b-chat-hf",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is vLLM?"}
    ],
    max_tokens=200,
    temperature=0.7
)

print(response.choices[0].message.content)

硬件配置建议

单卡配置(7B 模型)

# 7B 模型单卡完全够用
vllm serve llama-2-7b \
    --gpu-memory-utilization 0.9 \
    --max-model-len 4096

硬件推荐:RTX 4090 (24GB) 或 A10G (24GB)

多卡配置(13B+ 模型)

# 13B 模型建议 2 卡
vllm serve llama-2-13b-chat-hf \
    --tensor-parallel-size 2 \
    --gpu-memory-utilization 0.85

# 70B 模型需要 4 卡
vllm serve llama-2-70b-chat-hf \
    --tensor-parallel-size 4 \
    --gpu-memory-utilization 0.8

70B 模型的最低配置

# 4 x A100 40GB 或等效
# 注意: 70B 模型 fp16 精度需要 ~140GB 显存
# 需要 4 卡 tensor parallel 或 quantization

量化:在消费级 GPU 上跑大模型

没有 4 卡 A100?用量化。

# GPTQ 量化 (Q4)
vllm serve meta-llama/Llama-2-70b-chat-hf-gptq \
    --quantization gptq \
    --dtype half
#AWQ 量化效果更好,但需要额外工具预处理
#使用 llm-awq 先量化
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

# 量化后的模型加载
vllm serve my-quantized-70b-model \
    --quantization awq

实测 70B 模型量化到 4-bit 后,2 x A100 80GB 可以跑起来。

常见问题

1. CUDA out of memory

# 降低 gpu-memory-utilization
vllm serve model --gpu-memory-utilization 0.8

# 或者降低 max-model-len
vllm serve model --max-model-len 2048

2. 首次加载慢

vLLM 首次启动会把模型切成小块按需加载,后续 request 会快很多。但如果经常重启,用 python -m vllm.entrypoints.openai.api_server 并加 --enable-prefix-caching 加速重复加载。

3. 多并发时性能下降

# 调整 block size
vllm serve model --block-size 32

# 或者调整 max-num-batched-tokens
vllm serve model --max-num-batched-tokens 8192

vLLM vs 其他方案对比

vLLM Text Generation Inference (TGI) llama.cpp
开发方 UC Berkeley HuggingFace Georgi Gerganov
优化方向 PagedAttention 多种优化 CPU+GPU 混合
多卡支持 好 (TP)
量化支持 GPTQ/AWQ GPTQ/AWQ/GGUF GGUF (原生)
消费级 GPU 需量化 需量化 强 (CPU 可跑)
上手难度
活跃度

什么时候用 vLLM

适合

  • 有 GPU 服务器,需要高并发推理
  • 需要 self-host 避免数据外传
  • 对 latency 和 throughput 有要求

不适合

  • 没有 GPU,只有 CPU → 用 llama.cpp
  • 只是简单跑一下模型 → 直接用 transformers pipeline
  • 追求最快首次推理 → vLLM 加载有冷启动时间

总结

vLLM 是开源 LLM serving 的当前最优解之一。PagedAttention 让显存利用率和吞吐量都有本质提升。

部署建议:

  • 7B 模型:单卡 RTX 4090 + vLLM
  • 13B 模型:2 卡 A10G 或量化后单卡
  • 70B 模型:4 卡 A100 或量化到 4-bit 后 2 卡

项目地址:github.com/vllm-project/vllm