post cover

技术热点落地:vLLM + Ollama 本地 LLM 生产级推理部署实战(2026-05-31)


适用场景与目标

适合的场景:

  • 日均请求量在 10k~500k 级别的 AI 应用(客服摘要、代码审查、内容生成等)
  • 对数据隐私有要求,不能将 Prompt 发送至第三方 API
  • 需要控制单次推理成本,尤其在并发量上来后 API 费用不堪重负
  • 团队已有 GPU 基础设施,希望复用自有算力

核心目标: 在有限 GPU 资源下,以最低工程成本搭建稳定、高吞吐的本地 LLM 推理服务;搞清楚 Ollama 和 vLLM 分别用在什么地方,避免”用 Ollama 做生产”或”用 vLLM 做原型”这类错位。


最小可行方案(MVP)步骤

阶段一:本地开发用 Ollama(Day 0~1)

Ollama 的价值是零门槛启动,3 分钟跑起来,不需要任何集群配置。

# macOS / Linux 安装
curl -fsSL https://ollama.ai/install.sh | sh

# 下载模型(以 Qwen2.5-7B-Instruct 为例)
ollama pull qwen2.5:7b

# 验证运行
ollama run qwen2.5:7b "用一句话解释为什么本地部署LLM越来越流行"

# 暴露 HTTP API(默认端口 11434)
ollama serve

调用方式与 OpenAI 兼容:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:11434/v1",
    api_key="ollama",  # OLLAMA 不验证 key,随便填
)
response = client.chat.completions.create(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "总结这段文字:..."}],
    temperature=0.7,
)
print(response.choices[0].message.content)

阶段二:生产用 vLLM(Day 2~5)

当并发用户超过 3~5 人时,Ollama 的串行请求处理会成为瓶颈。实测 50 并发下 Ollama 吞吐约 155 tok/s,而 vLLM 可达 920 tok/s(6 倍差距)。

安装 vLLM:

# 需要 NVIDIA GPU + CUDA 12.1+
pip install vllm

# 下载 HuggingFace 格式模型(首次需要科学上网或镜像)
# 推荐用 Qwen2.5-7B-Instruct 或 DeepSeek-R1-Distill-Qwen-7B
huggingface-cli download Qwen/Qwen2.5-7B-Instruct --local-dir ./models/Qwen2.5-7B-Instruct

启动 vLLM 服务:

python -m vllm.entrypoints.openai.api_server \
    --model ./models/Qwen2.5-7B-Instruct \
    --gpu-memory-utilization 0.85 \
    --max-model-len 8192 \
    --tensor-parallel-size 1 \
    --port 8000

阶段三:接入负载均衡(可选,Day 3~5)

用 LiteLLM Proxy 统一封装多个后端,实现自动路由和降级:

# litellm_config.yaml
model_list:
  - model_name: gpt-4
    litellm_params:
      model: openai/gpt-4
      api_key: os.environ/OPENAI_API_KEY

  - model_name: qwen-local
    litellm_params:
      model: openai/qwen2.5-7b
      api_base: http://localhost:8000/v1
      api_key: "local"
litellm --config litellm_config.yaml --port 4000

现在应用只需调用 http://localhost:4000,在本地模型崩溃时自动降级到云端 API。


关键实现细节

GPU 显存估算公式

所需 VRAM ≈ (模型参数总量 × 每个参数的字节数) + (KV Cache 上限 × 并发数 × 2)

# 示例:Qwen2.5-7B,FP16 加载,32 并发,context_len=8192
模型加载:7B × 2 bytes = 14 GB
KV Cache:7B × 2 × 32 × 8192 × 2 / (1024³) ≈ 6.3 GB
合计 ≈ 20.3 GB → 推荐单卡 24GB VRAM(RTX 4090 / A5000)

量化对照表(以 Qwen2.5-7B 为例):

格式精度VRAM 需求速度质量损失
FP1616位浮点~14 GB基准
Q4_K_M4位混合~4.9 GB+30%<2% benchmark
Q8_08位~9 GB+10%可忽略
AWQ4位激活~5.2 GB+35%<1%

Ollama 模型选择建议

# 优先用带 `:instruct` 后缀的指令微调版
ollama pull qwen2.5:7b-instruct-fp16  # 显式指定精度

# 查看已下载模型
ollama list

# 自定义 Modelfile(添加系统提示词)
cat > Modelfile << 'EOF'
FROM qwen2.5:7b
PARAMETER temperature 0.7
PARAMETER top_p 0.9
SYSTEM """
你是一个专业的技术文档助手,用简洁清晰的语言回答问题。
"""
EOF
ollama create tech-assistant -f Modelfile
ollama run tech-assistant "解释什么是 PagedAttention"

vLLM 关键参数说明

--gpu-memory-utilization 0.85   # GPU 显存使用比例,留 15% 给 CUDA 框架
--max-model-len 8192           # 最大上下文长度,需要和模型支持范围匹配
--tensor-parallel-size N       # 多卡并行(需要 N 张 GPU)
--enforce-eager                # 禁用 CUDA graph,加速但增加初始化时间
--enable-chunked-prefill      # 分块预填充,降低峰值显存,适合长上下文

常见坑与规避清单

坑 1:Ollama 直接跑生产流量

现象: 单用户测试响应正常,5 个并发用户 P95 延迟从 0.8s 飙升到 45s。

原因: Ollama 使用 llama.cpp 内核,本质是单请求串行处理,无连续批处理(continuous batching)。

规避: 确认并发需求 > 5 用户/秒时,坚决换 vLLM。Ollama 定位是开发/个人工具,不是服务。


坑 2:GPU 显存估算不足导致 OOM

现象: 服务启动时或高负载时进程被 kill,显示 CUDA out of memory

原因: 没算 KV cache 增长空间。实测当 max-model-len=16384 时,32 并发 KV cache 可占 12GB+。

规避:

# 监控启动时的显存占用
nvidia-smi --query-gpu=memory.used,memory.total --format=csv

# 用 --gpu-memory-utilization 留足余量,首 次部署用 0.75
python -m vllm.entrypoints.openai.api_server \
    --gpu-memory-utilization 0.75  # 先保守

坑 3:模型下载慢或中断

现象: huggingface-cli download 速度极慢,或断连。

规避:

# 方案1:设置镜像站
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download ...

# 方案2:用 Ollama 的模型库代替(社区模型多,下载速度快)
ollama pull mistral:7b-instruct-v0.2

坑 4:vLLM 冷启动时间过长

现象: 第一次请求 TTFT(首个 Token 生成时间)高达 20s+。

原因: vLLM 首次推理会做 CUDA graph 编译和 KV cache 预分配。

规避: 开启 enforce-eager 或在服务启动后发一条暖身请求:

# 服务启动脚本后加
import requests
requests.post("http://localhost:8000/v1/chat/completions", json={
    "model": "qwen2.5-7b",
    "messages": [{"role": "user", "content": "hi"}],
    "max_tokens": 2
}, timeout=60)

坑 5:多卡部署时张量并行效率

现象: 2 卡部署吞吐量不是单卡的 2 倍,只有 1.3 倍。

原因: 张量并行需要 AllReduce 跨卡同步,有通信开销;小 batch size 时尤其明显。

规避: tensor-parallel-size 只在 batch 够大(并发请求多)时使用。单卡 4090 够用就别上多卡。


成本/性能/维护权衡

硬件选型矩阵

GPUVRAM典型用例性价比
RTX 4090 24GB24GB单模型 7B FP16,13B Q4⭐⭐⭐⭐ 最推荐
A100 40GB40GB13B FP16 或 70B Q4⭐⭐⭐ 贵但稳
A5000 24GB24GB性价比替代 4090⭐⭐⭐⭐
Mac M3/M4 Pro集成Ollama 本地开发⭐⭐⭐⭐⭐ 开发专用

成本对比(估算,月度)

方案场景月成本估算
OpenAI GPT-4o Mini100k 请求/月~$150(输入+输出)
Anthropic Claude 3.5100k 请求/月~$300
Ollama + RTX 4090 自托管100k 请求/月电费~$30(4090 满载 ~400W)
vLLM + RTX 4090100k 请求/月同上,省去 API 费

结论: 请求量 > 30k/月 时,本地部署的 API 费用节省即可覆盖 GPU 硬件折旧。

维护成本

维度OllamavLLM
更新模型ollama pull 一行手动替换模型目录
监控基础日志需要接入 Prometheus+Grafana
多模型切换支持需要重启 Pod 或配置多模型
自动扩缩容不支持K8s + KServe 支持
MLOps 生态成熟(HuggingFace TGI 兼容)

一周内可执行行动清单

Day 1(今天):

  • 在开发机器上安装 Ollama,运行 ollama pull qwen2.5:7b
  • 用 Python 调用 Ollama 的 OpenAI 兼容 API,实现一个最小原型
  • 记录:首次加载时间、显存占用、响应延迟

Day 2~3:

  • 在 GPU 服务器(24GB+ VRAM)安装 vLLM
  • 参考上述参数启动 vLLM 服务
  • abwrk 做简单并发压测(10/30/50 并发),记录吞吐曲线

Day 4:

  • 对比 Ollama vs vLLM 在目标并发下的 P95 延迟
  • 确定生产选型:Ollama(< 5 并发)还是 vLLM(≥ 5 并发)
  • 整理 VRAM 使用基线,形成运维文档

Day 5:

  • (可选)部署 LiteLLM Proxy,实现 API 统一入口
  • 配置健康检查和告警(内存、GPU 利用率、请求错误率)
  • 估算月度推理成本,和当前 API 费用做对比

Day 6~7:

  • 将推理服务接入真实业务流(先灰度 5% 流量)
  • 设置每日 cost dashboard
  • 记录第一周运营数据,决定是否需要扩 GPU 或切多卡

一句话总结: Ollama 是本地开发的瑞士军刀,vLLM 是生产推理的工业母机。搞清楚自己站在哪个阶段,用对的工具,不要让开发工具干生产的活。