香港GPU服务器部署vLLM:高吞吐大模型推理服务 + OpenAI兼容API完整方案
Ollama 适合个人/小团队的交互式对话,但当需要同时服务多个并发请求(如 API 服务、批量推理)时,Ollama 的性能有明显瓶颈。vLLM 由 UC Berkeley 开发,引入了 PagedAttention 显存管理技术,将 LLM 推理吞吐量提升 24 倍,同时完全兼容 OpenAI API 格式,是企业级 LLM 推理服务的首选方案。
一、vLLM vs Ollama 性能对比
| 指标 | Ollama | vLLM |
|---|---|---|
| 单请求吞吐量(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 调用费。