香港GPU服务器部署vLLM:高吞吐大模型推理服务 + OpenAI兼容API完整方案

香港GPU服务器部署vLLM:高吞吐大模型推理服务 + OpenAI兼容API完整方案

Ollama 适合个人/小团队的交互式对话,但当需要同时服务多个并发请求(如 API 服务、批量推理)时,Ollama 的性能有明显瓶颈。vLLM 由 UC Berkeley 开发,引入了 PagedAttention 显存管理技术,将 LLM 推理吞吐量提升 24 倍,同时完全兼容 OpenAI API 格式,是企业级 LLM 推理服务的首选方案。


一、vLLM vs Ollama 性能对比

指标OllamavLLM
单请求吞吐量(tokens/s)约 50~80约 120~200
并发 10 请求吞吐量约 50(排队)约 800~1200(批处理)
显存利用率中等极高(PagedAttention)
多模型加载✅ 简单切换❌(每次启动一个模型)
OpenAI API 兼容✅✅(更完整)
流式输出✅✅
适合场景个人/小团队,多模型企业 API 服务,高并发

二、PagedAttention 原理简述

<code">
传统 KV Cache(Ollama等):
每个请求预分配固定的连续显存空间
→ 即使请求只用了一半显存,另一半也被占用(碎片化)
→ 最多支持约 N 个并发请求

vLLM PagedAttention:
将 KV Cache 分成固定大小的"页面"(类似操作系统分页内存)
→ 按需分配,不提前预占
→ 多个请求的 KV Cache 可以交错存储
→ 支持的并发请求数提升 3~5 倍
→ 支持 Prefix Caching(相同 System Prompt 共享 KV Cache)

三、安装 vLLM

<code"># 系统要求:NVIDIA GPU(10GB+ VRAM),CUDA 12.1+
# 验证 GPU 环境
nvidia-smi
nvcc --version

# 安装(建议使用独立虚拟环境)
python3 -m venv /opt/vllm-env
source /opt/vllm-env/bin/activate

# 安装 vLLM(自动匹配 CUDA 版本)
pip install vllm

# 验证安装
python -c "import vllm; print(vllm.__version__)"

四、启动 vLLM 推理服务

<code"># 方式一:直接启动(OpenAI 兼容 API)
python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-7B-Instruct \
  --host 0.0.0.0 \
  --port 8000 \
  --tensor-parallel-size 1 \   # 单 GPU(多 GPU 设置为 GPU 数量)
  --max-model-len 8192 \       # 最大上下文长度
  --gpu-memory-utilization 0.90 \  # 使用 90% 显存
  --served-model-name qwen2.5-7b \
  --dtype auto \               # 自动选择数据类型(float16 / bfloat16)
  --api-key your_api_key_here  # 设置 API Key
<code"># 方式二:Docker 启动(推荐生产环境)
docker run -d \
  --name vllm \
  --restart unless-stopped \
  --gpus all \
  -p 127.0.0.1:8000:8000 \
  -v /opt/models:/root/.cache/huggingface \
  -e HF_TOKEN=your_huggingface_token \
  vllm/vllm-openai:latest \
  --model Qwen/Qwen2.5-7B-Instruct \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90
<code"># 方式三:不同模型的启动参数示例

# Qwen2.5-72B(需要多 GPU 或量化)
python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-72B-Instruct-AWQ \  # AWQ 4bit 量化版本
  --quantization awq \
  --tensor-parallel-size 2 \              # 双卡并行
  --max-model-len 32768

# DeepSeek-R1-Distill-Qwen-7B(推理模型)
python -m vllm.entrypoints.openai.api_server \
  --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
  --max-model-len 16384 \
  --reasoning-parser deepseek_r1    # 解析 thinking 标签

# 本地已下载的模型
python -m vllm.entrypoints.openai.api_server \
  --model /opt/models/Qwen2.5-7B-Instruct \  # 本地路径
  --tokenizer /opt/models/Qwen2.5-7B-Instruct

五、客户端调用(OpenAI SDK,零代码改动)

<code">from openai import OpenAI

# 只需修改 base_url,其余与 OpenAI API 完全相同
client = OpenAI(
    api_key="your_api_key_here",
    base_url="http://localhost:8000/v1",
)

# 普通对话
response = client.chat.completions.create(
    model="qwen2.5-7b",
    messages=[
        {"role": "system", "content": "你是一个专业的客服助手"},
        {"role": "user", "content": "香港CN2 GIA服务器和普通BGP有什么区别?"},
    ],
    temperature=0.7,
    max_tokens=1024,
)
print(response.choices[0].message.content)

# 流式输出
stream = client.chat.completions.create(
    model="qwen2.5-7b",
    messages=[{"role": "user", "content": "写一首关于香港的诗"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

# 批量推理(高吞吐场景)
import asyncio
from openai import AsyncOpenAI

async_client = AsyncOpenAI(
    api_key="your_api_key_here",
    base_url="http://localhost:8000/v1",
)

async def batch_inference(prompts: list[str]) -> list[str]:
    tasks = [
        async_client.chat.completions.create(
            model="qwen2.5-7b",
            messages=[{"role": "user", "content": p}],
            max_tokens=512,
        )
        for p in prompts
    ]
    results = await asyncio.gather(*tasks)
    return [r.choices[0].message.content for r in results]

# 同时处理100个请求(vLLM 自动批处理,显著提升吞吐量)
prompts = ["翻译:" + text for text in product_descriptions]
translations = asyncio.run(batch_inference(prompts))

六、Prefix Caching(System Prompt 共享)

<code"># 启用 Prefix Caching(相同前缀复用 KV Cache)
python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-7B-Instruct \
  --enable-prefix-caching \   # 启用前缀缓存
  --max-model-len 8192

# 效果:
# 第一个用户请求(含完整 System Prompt):正常速度
# 后续请求(相同 System Prompt):System Prompt 部分从缓存读取,
# 速度提升 30~50%,尤其对长 System Prompt 效果显著

# 适合场景:
# - 所有请求使用相同的 System Prompt(如客服机器人)
# - RAG 系统中的固定上下文
# - 知识库问答中的参考文档

七、vLLM 监控指标

<code"># vLLM 内置 Prometheus 指标
# 访问 http://localhost:8000/metrics 查看

# 关键指标:
# vllm:num_requests_running    # 当前正在处理的请求数
# vllm:num_requests_waiting    # 等待队列中的请求数
# vllm:gpu_cache_usage_perc    # KV Cache 使用率(接近100%时性能下降)
# vllm:generation_tokens_total # 总 token 生成量
# vllm:time_to_first_token_seconds  # 首 token 延迟

# 用 Grafana 可视化(导入 vLLM Grafana Dashboard)

八、总结

vLLM 是生产级 LLM API 服务的最佳选择:PagedAttention 技术将并发请求处理能力提升数倍,Prefix Caching 降低重复上下文的推理开销,完整的 OpenAI API 兼容让现有代码无需修改。香港 GPU 服务器(RTX 3090/4090)部署 vLLM 后,可以支撑小型 SaaS 产品的 AI 功能,月服务数十万次推理请求,成本远低于 OpenAI API 调用费。

Telegram