post cover

技术热点落地:本地 LLM 生产级部署用 vLLM 替代 Ollama(2026-05-21)


适用场景与目标

什么时候应该从 Ollama 迁移到 vLLM?

当你出现以下任一情况,vLLM 就是正确的选择:

  • 并发请求超过 3-5 QPS:Ollama 在多并发下吞吐严重不足,P99 延迟爆炸
  • 对 TTFT(首个 Token 生成时间)或 TPS(Token 每秒)有硬性要求:客服对话、数据提取、实时辅助等场景
  • 每日 token 消耗超过 1 亿:云 API 成本已高于自建 GPU 机器的 12-18 个月折算成本
  • 需要 OpenAI Compatible API:现有应用已对接 OpenAI SDK,不想改代码

继续用 Ollama 更合适的情况:

  • 个人开发机单用户场景
  • 快速原型验证(ollama run 3 秒启动)
  • macOS Apple Silicon 日常使用(Ollama 对 Metal GPU 优化成熟)
  • 团队内部工具,没有并发压力

本文目标: 把一个跑在 Ollama 上的本地 LLM 推理服务,无感迁移到 vLLM 生产级架构,保留 OpenAI Compatible API,对现有应用代码零改动。


最小可行方案(MVP)步骤

硬件与系统准备

# 最低推荐配置(7B 模型,Q4 量化)
# - NVIDIA GPU,VRAM ≥ 16GB(如 4090、A100 40GB)
# - CUDA ≥ 12.1
# - Linux(Ubuntu 22.04 LTS)

nvidia-smi  # 确认驱动和 CUDA 版本

第一步:安装 vLLM

pip install vllm

# 如果遇到 CUDA 版本问题,先装 CUDA toolkit
# CUDA_HOME=/usr/local/cuda-12.1 pip install vllm

第二步:获取模型(GGUF 或 Safetensors 格式)

# 下载 Qwen3-8B Q4 量化版本(推荐,国内可访问 HuggingFace 镜像)
huggingface-cli download --resume-download Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B.gguf

# 也可以用魔搭社区镜像(国内推荐)
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B.gguf

第三步:启动 vLLM 服务(OpenAI Compatible API)

python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B \
  --served-model-name qwen3-8b \
  --port 8000 \
  --host 0.0.0.0 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 8192 \
  --tensor-parallel-size 1 \
  --enforce-eager

第四步:验证 API 可用性

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen3-8b",
    "messages": [{"role": "user", "content": "用一句话解释为什么 vLLM 比 Ollama 吞吐更高"}],
    "max_tokens": 100,
    "temperature": 0.7
  }'

第五步:现有应用零改动接入

如果原应用用的是 OpenAI SDK:

from openai import OpenAI

client = OpenAI(
    base_url="http://<vllm-host>:8000/v1",   # 替换原 OpenAI base_url
    api_key="EMPTY"                           # vLLM 默认不需要 key
)

response = client.chat.completions.create(
    model="qwen3-8b",
    messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)

如果用的是 LangChain:

from langchain_community.llms import VLLMOpenAI

llm = VLLMOpenAI(
    vllm_server_url="http://localhost:8000",
    model_name="qwen3-8b",
    temperature=0.7,
    max_tokens=512
)

关键实现细节

1. 多 GPU 横向扩展(tensor-parallel-size)

单卡 4090 不够用时(70B 模型),多卡并行:

python -m vllm.entrypoints.openapi.api_server \
  --model meta-llama/Llama-3.1-70B-Instruct \
  --served-model-name llama-70b \
  --port 8000 \
  --tensor-parallel-size 2 \    # 2 张 GPU 并行推理
  --gpu-memory-utilization 0.85

要求 NVIDIA NVLink 或 NVSwitch 连接,否则跨卡带宽成为瓶颈。

2. 自动扩展前缀缓存(prefix caching)

vLLM 支持 KV-cache 重用,相同 system prompt 的请求可复用缓存:

python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B \
  --port 8000 \
  --enable-prefix-caching \    # 开启前缀缓存,重复 system prompt 场景下 TTFT 降低 50%+
  --gpu-memory-utilization 0.90

3. 量化配置(AWQ / GPTQ / GGUF)

# AWQ 量化(推荐,精度损失最小)
python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-8B-Instruct-AWQ

AWQ(Activation-aware Weight Quantization)在 4-bit 量化下,困惑度(perplexity)损失比 naive INT8 低 15-20%,是 2026 年生产首选格式。

4. 健康检查与优雅重启

# 配合 systemd 做进程管理
sudo tee /etc/systemd/system/vllm.service << 'EOF'
[Unit]
Description=vLLM OpenAI API Server
After=network.target

[Service]
Type=simple
User=ubuntu
ExecStart=/home/ubuntu/miniconda3/envs/llm/bin/python -m vllm.entrypoints.openai.api_server \
  --model Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B \
  --served-model-name qwen3-8b \
  --port 8000 \
  --host 0.0.0.0 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 8192
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable vllm
sudo systemctl start vllm

5. 负载均衡(多实例 + Nginx)

# 启动多个 vLLM 实例(8001, 8002, 8003)
for port in 8001 8002 8003; do
  python -m vllm.entrypoints.openai.api_server \
    --model Qwen/Qwen2.5-8B-Instruct-GQPT4-K-M-0.4B \
    --port $port \
    --host 0.0.0.0 &
done

# Nginx 负载均衡配置
upstream vllm_backend {
  least_conn;   # 最少连接优先,解决 vLLM 处理速度波动
  server 127.0.0.1:8001;
  server 127.0.0.1:8002;
  server 127.0.0.1:8003;
}

server {
  listen 8000;
  location / {
    proxy_pass http://vllm_backend;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Connection "keep-alive";
    proxy_read_timeout 300s;
    proxy_connect_timeout 10s;
  }
}

常见坑与规避清单

现象规避方法
VRAM OOM加载模型时直接报 CUDA OOMgpu-memory-utilization 设为 0.85-0.90,不要贪心给 0.95+
TTFT 慢(首 token 延迟高)并发高时首个 token 要等 10s+开启 --enable-prefix-caching,重复 system prompt 可复用 KV-cache
Ollama 模型无法直接用Ollama 的 .bin(完整模型)vLLM 不认llama.cpp 转换:llama.cpp/convert.py OllamaModel --outfile model/,或直接从 HuggingFace 下载 GGUF
量化模型精度差输出乱码、逻辑错误优先用 AWQ/Q4_K_M 量化,不要用老旧的 Q4_0
并发时 P99 爆炸5 QPS 以内正常,超过就卡死vLLM 本身已优化并发,如仍不够,上多实例 + Nginx 负载均衡
CUDA 版本不兼容CUDA error: no kernel image is available确认 vLLM 版本对应的 CUDA 版本,v0.3.x 需要 CUDA ≥ 12.4
容器内 GPU 穿透失败Docker 启动报 GPU not found启动参数加 --gpus all,驱动版本 ≥ 525
模型加载巨慢每次重启要等 5-10 分钟将模型放在 SSD(而非 HDD),用 --download-retry 和本地模型缓存
长对话 OOM对话超过 N 轮后显存爆炸--max-model-len 根据显存设上限(如 4090 8B 模型建议 16K);超过自动截断
没有认证服务暴露在公网vLLM 支持 --allowed-origin--jwt-secret;生产务必加一层 Nginx 鉴权或网络层隔离

成本/性能/维护权衡

成本对比(以 70B 模型为例)

方案硬件成本适用规模优点缺点
Ollama 单机1× RTX 4090(24GB)约 ¥12,0001-3 QPS部署快、上手简单并发差、无生产级监控
vLLM 单机1× A100 40GB 或 2× 4090,约 ¥30,0005-20 QPSP99 低、吞吐高运维需一定经验
vLLM 多机集群多卡服务器,¥80,000+50+ QPS横向扩展成本高、NVLink 依赖
云 API(OpenAI/Claude)按 token 计费任意规模零运维日均 >1 亿 token 成本超自建

决策公式: 若日均 token 消耗 > 5 亿(约 70B 模型),自建 vLLM 在 12 个月内比云 API 便宜。

性能基准参考

测试条件:Qwen2.5-8B-Instruct-Q4_K_M,Ubuntu 22.04,RTX 4090 24GB

指标OllamavLLM(单实例)
TTFT(P50)180ms45ms
TPS(端到端)~18 tokens/s~65 tokens/s
5 QPS 并发 P99 延迟~8,000ms~350ms
10 QPS 并发失败(OOM)~800ms

维护注意事项

  • 每周检查:GPU 利用率、VRAM 使用率、API 错误率
  • 模型更新:用 python -m vllm.entrypoints.openai.api_server --model <new-version> 滚动重启
  • 日志:vLLM 默认输出到 stdout,配合 journalctl -u vllm -f 收集
  • 监控:推荐 Prometheus + Grafana,vLLM 支持 /metrics 端点
# 查看 vLLM metrics
curl http://localhost:8000/metrics

一周内可执行行动清单

Day 1:环境确认

  • 确认 GPU 型号和 CUDA 版本:nvidia-smi
  • 申请或准备一台带 NVIDIA GPU 的 Linux 机器(Ubuntu 22.04)
  • 安装 vLLM:pip install vllm

Day 2:跑通 MVP

  • 下载一个 8B Q4 量化模型(如 Qwen2.5-8B-Instruct-Q4_K_M)
  • 启动 vLLM 服务:python -m vllm.entrypoints.openai.api_server ...
  • 本地 curl 测试,确认 API 返回正常

Day 3:迁移接入

  • 选一个现有应用,更改 base_url 指向 vLLM 地址
  • 运行应用的完整测试集,验证输出质量
  • 记录 TTFT/TPS/P99 延迟基线数据

Day 4:生产加固

  • 配置 systemd 服务,注册开机自启
  • 配置 Nginx 负载均衡(单实例跳过)
  • 开启 --enable-prefix-caching,验证重复 prompt 场景下 TTFT 改善

Day 5:监控与压测

  • 配置 Prometheus metrics 采集
  • 压测:ab -n 1000 -c 10 http://localhost:8000/v1/chat/completions(模拟)
  • 检查 GPU 利用率是否 ≥ 85%,VRAM 是否在安全水位
  • 如有多并发需求,上多实例 + Nginx

Day 6-7:成本核算与决策

  • 统计当前应用每日 token 消耗(从 vLLM logs 提取)
  • 对比云 API 成本:估算 30 天云 API 花费 vs 自建机器摊销
  • 决定是继续自建还是保留云 API 作为 fallback

一句话总结: vLLM 是 2026 年本地 LLM 生产推理的事实标准。对大多数团队,Day 1 就能从 Ollama 迁移过来,现有代码零改动,性能提升 3-5 倍。本文覆盖了从安装、API 验证、多实例扩容、生产加固到成本决策的完整路径,按清单执行,一周内可上线。