Skip to content

来源:微信公众号「CV技术笔记」
原文链接:https://mp.weixin.qq.com/s/U1qMgvgg97CE8mMdw6xIPg
代码仓库:https://gitee.com/genesisesNoun/llm-local-deploy-tutorial
整理:红龙 🐉

vLLM 高性能部署:打造生产级大模型推理服务完全指南

当并发用户从 1 个变成 100 个,你的模型服务还能扛住吗?vLLM 的 PagedAttention 技术让显存利用率从 30% 提升到 90%+,是生产环境部署大模型的首选方案。

一、为什么需要 vLLM?

传统推理的三大痛点

  1. 显存浪费:传统方式为每个请求预分配固定显存,实际利用率仅 30-50%
  2. 并发瓶颈:显存不够 → 请求排队 → 超时 → 体验差
  3. 吞吐量低:同样硬件下,vLLM 吞吐量是传统方案的 2-4 倍

vLLM 的解决方案

vLLM 由 UC Berkeley 开发,核心创新是 PagedAttention——像操作系统管理虚拟内存一样分页管理显存,按需分配。

效果:

  • 显存利用率:30% → 90%+
  • 并发能力:提升 2-4 倍
  • 延迟稳定性:显著改善

二、PagedAttention 技术详解

KV Cache 问题

推理过程中,KV Cache 存储注意力计算的中间结果,随生成内容增加而增长,占用大量显存且大小不固定。

传统方案的缺陷

每个请求预分配最大 KV Cache(如 4096 tokens),即使只生成 100 tokens 也占满空间。24GB 显存的 GPU 只能同时处理 5-10 个请求。

PagedAttention 原理

借鉴操作系统虚拟内存管理:

  • Block(类比内存页):固定大小的显存块(如 16 tokens)
  • Block Table(类比页表):逻辑到物理 block 的映射
  • KV Cache Manager(类比内存管理器):统一分配和回收

按需分配、无预分配浪费、显存碎片少、支持内存共享。

性能对比(A100 80GB,Llama 2 13B)

  • 吞吐量:HuggingFace 10 req/s → Ollama 15 → vLLM 35 req/s
  • 显存利用率:35% → 45% → 92%
  • 延迟 P99:8s → 5s → 2s

三、安装

环境要求

  • Python 3.8+、CUDA 11.8+、NVIDIA GPU(推荐 8GB+)、Linux

安装方式

bash
# pip 安装(推荐)
pip install vllm

# Docker
docker pull vllm/vllm-openai:latest
docker run --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    -p 8000:8000 --ipc=host \
    vllm/vllm-openai:latest \
    --model meta-llama/Llama-3-8b-hf

四、快速开始

命令行启动

bash
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3-8b-hf \
    --host 0.0.0.0 --port 8000

OpenAI SDK 调用

python
from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="dummy"
)

response = client.chat.completions.create(
    model="meta-llama/Llama-3-8b-hf",
    messages=[{"role": "user", "content": "你好,请介绍一下自己"}]
)
print(response.choices[0].message.content)

流式输出

python
stream = client.chat.completions.create(
    model="meta-llama/Llama-3-8b-hf",
    messages=[{"role": "user", "content": "写一首诗"}],
    stream=True
)
for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

五、Python API 详解

基础使用

python
from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-3-8b-hf")

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

prompts = ["你好", "请写一首诗", "解释一下量子计算"]
outputs = llm.generate(prompts, sampling_params)

批量生成

vLLM 的强项——300 个提示词自动优化调度:

python
prompts = ["翻译成英文:人工智能正在改变世界"] * 100
outputs = llm.generate(prompts, sampling_params)

自定义参数

python
llm = LLM(
    model="meta-llama/Llama-3-8b-hf",
    tensor_parallel_size=1,       # GPU 数量
    gpu_memory_utilization=0.9,   # 显存利用率
    max_model_len=4096,           # 最大上下文
    trust_remote_code=True,
)

sampling_params = SamplingParams(
    temperature=0.7, top_p=0.9, top_k=50,
    max_tokens=256,
    repetition_penalty=1.1,
    stop=["</s>", "\n\n"],
)

六、生产部署配置

启动参数

bash
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3-8b-hf \
    --host 0.0.0.0 --port 8000 \
    --tensor-parallel-size 1 \
    --gpu-memory-utilization 0.9 \
    --max-model-len 4096 \
    --max-num-seqs 256

关键参数:

  • --gpu-memory-utilization:推荐 0.85-0.95
  • --max-model-len:按需设置,越小越省显存
  • --max-num-seqs:最大并发序列数,推荐 128-256

多 GPU 部署

bash
python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-3-70b-hf \
    --tensor-parallel-size 2 \
    --gpu-memory-utilization 0.9

量化模型支持

python
# AWQ 量化
llm = LLM(model="TheBloke/Llama-3-8B-AWQ", quantization="awq")

# GPTQ 量化
llm = LLM(model="TheBloke/Llama-3-8B-GPTQ", quantization="gptq")

七、性能调优

显存优化

python
llm = LLM(
    model="meta-llama/Llama-3-8b-hf",
    gpu_memory_utilization=0.85,
    enforce_eager=True,     # 禁用 CUDA graph,节省显存
    max_model_len=2048,     # 减少上下文长度
)

吞吐量优化

python
llm = LLM(
    model="meta-llama/Llama-3-8b-hf",
    max_num_seqs=512,
    max_num_batched_tokens=16384,
    enforce_eager=False,    # 启用 CUDA graph 加速
)

八、Nginx 集成与负载均衡

单实例反向代理

nginx
upstream vllm_backend {
    server 127.0.0.1:8000;
    keepalive 64;
}

server {
    listen 80;
    location / {
        proxy_pass http://vllm_backend;
        proxy_http_version 1.1;
        proxy_buffering off;
        proxy_read_timeout 300s;
    }
}

多实例负载均衡

nginx
upstream vllm_backend {
    least_conn;
    server 127.0.0.1:8000;
    server 127.0.0.1:8001;
    server 127.0.0.1:8002;
    keepalive 64;
}

九、常见问题

  • 显存不足:降低 gpu_memory_utilization 到 0.8,减少 max_model_len
  • 首次启动慢:正常现象(需编译),后续会快
  • 模型下载失败:设置 HF_ENDPOINT=https://hf-mirror.com 或用本地路径
  • 端口被占用:换端口 --port 8001

十、总结

vLLM 是生产环境部署大模型的最优选择:

优点:PagedAttention 显存利用率 90%+、吞吐量 2-4 倍提升、OpenAI 兼容 API、支持多 GPU 和量化

适合场景:高并发 API 服务、企业生产环境、多租户模型服务

版权声明:本文内容整理自微信公众号「CV技术笔记」,仅做排版整理,主体内容未做篡改。