为什么需要 Ollama 与 vLLM 混合部署
大模型部署面临一个核心矛盾:开发调试阶段需要快速切换不同模型验证效果,而生产环境对吞吐量和延迟有苛刻要求。Ollama 以其一行命令拉取模型的便捷性,成为本地开发的首选工具;vLLM 凭借 PagedAttention 和连续批处理技术,在生产推理场景下吞吐量可达传统框架的 3-5 倍。将两者混合部署,开发用 Ollama 快速迭代,生产用 vLLM 承接流量,是目前大模型部署性价比最高的方案之一。
Ollama 环境搭建与模型管理
安装 Ollama 非常直接,macOS 和 Linux 均有官方安装脚本:
# Linux 安装
curl -fsSL https://ollama.com/install.sh | sh
# 拉取模型(以 Qwen2.5-7B 为例)
ollama pull qwen2.5:7b
# 启动推理服务,监听所有网卡
OLLAMA_HOST=0.0.0.0 ollama serve
Ollama 默认将模型存储在 ~/.ollama/models,可以通过环境变量 OLLAMA_MODELS 修改存储路径。对于磁盘空间紧张的服务器,挂载一块大容量 NVMe 到该目录是常见做法。
模型管理的关键操作:
# 查看已下载模型
ollama list
# 删除模型释放空间
ollama rm qwen2.5:7b
# 从 GGUF 文件导入自定义模型
# 先创建 Modelfile
echo "FROM ./my-model.gguf" > Modelfile
ollama create my-custom -f Modelfile
开发阶段频繁切换模型时,Ollama 的自动卸载机制值得注意:默认 5 分钟无请求会自动卸载模型释放显存。如果需要模型常驻显存,设置 OLLAMA_KEEP_ALIVE=24h。
vLLM 高性能推理服务配置
vLLM 的核心优势在于 PagedAttention,它将 KV Cache 分页管理,避免了传统方案中因预分配固定长度显存造成的浪费。配置 vLLM 服务:
# 安装 vLLM
pip install vllm
# 启动 OpenAI 兼容 API 服务
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--served-model-name qwen2.5-7b \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--tensor-parallel-size 2
关键参数说明:
--gpu-memory-utilization:GPU 显存使用比例,0.9 表示预留 10% 给系统开销。A100 80G 实际可用约 72G。--tensor-parallel-size:张量并行度,跨多卡切分模型。7B 模型单卡即可,70B 模型至少需要 4 卡。--max-model-len:最大上下文长度,直接影响 KV Cache 预分配量。生产环境按业务实际需求设置,不要盲目拉满。
混合部署架构设计
混合架构的核心是用 Nginx 做流量分发:
# Nginx 配置片段
upstream ollama_backend {
server 127.0.0.1:11434; # Ollama 开发环境
}
upstream vllm_backend {
server 127.0.0.1:8000; # vLLM 生产环境
}
# 开发流量走 Ollama
location /dev/v1/ {
proxy_pass http://ollama_backend/v1/;
proxy_set_header Host $host;
}
# 生产流量走 vLLM
location /prod/v1/ {
proxy_pass http://vllm_backend/v1/;
proxy_set_header Host $host;
}
应用层通过不同的 URL 前缀自动路由。SDK 调用时只需切换 base_url:
from openai import OpenAI
# 开发环境
dev_client = OpenAI(base_url="http://api.example.com/dev/v1", api_key="unused")
# 生产环境
prod_client = OpenAI(base_url="http://api.example.com/prod/v1", api_key="unused")
# 统一调用方式
response = prod_client.chat.completions.create(
model="qwen2.5-7b",
messages=[{"role": "user", "content": "你好"}],
max_tokens=512
)
显存分配与并发调优
同一台机器上同时运行 Ollama 和 vLLM 时,显存分配是首要问题。推荐做法:
- 为 vLLM 指定专用 GPU:
CUDA_VISIBLE_DEVICES=0,1 - Ollama 使用剩余 GPU:
CUDA_VISIBLE_DEVICES=2,3 - 如果 GPU 数量有限,Ollama 用 CPU 模式跑轻量模型:
OLLAMA_NUM_GPU=0
vLLM 并发参数调整:
# 查看当前并发配置
curl http://localhost:8000/config
# 调整最大并发批次数
python -m vllm.entrypoints.openai.api_server \
--model Qwen/Qwen2.5-7B-Instruct \
--max-num-seqs 64 \
--max-num-batched-tokens 16384
--max-num-seqs 控制单批次最大请求数,--max-num-batched-tokens 控制单批次最大 token 数。两者配合使用,在请求量大的场景下显著提升吞吐。实际调优时建议从默认值开始,通过压测工具逐步推高,观察延迟 P99 是否可接受。
常见问题诊断
问题1:vLLM 启动报 OOM
降低 --gpu-memory-utilization 至 0.85,或减小 --max-model-len。70B 模型在 A100 80G 上若设 max-model-len 为 32768,基本必然 OOM,降到 8192 即可启动。
问题2:Ollama 响应极慢
检查模型是否被卸载:长时间无请求后首次调用需要重新加载模型权重。设置 OLLAMA_KEEP_ALIVE 为更长时长,或用 cron 定时发一个健康检查请求保持模型常驻。
问题3:混合部署时端口冲突
Ollama 默认端口 11434,vLLM 默认 8000,不会冲突。但需注意 vLLM 的 metrics 端口(默认同服务端口),多个 vLLM 实例并行时用 --port 显式指定。
监控与可观测性
vLLM 内置 Prometheus metrics 端点,接入 Grafana 监控:
# vLLM 暴露的指标
curl http://localhost:8000/metrics
# 关键指标
# vllm:num_requests_running 当前运行请求数
# vllm:num_requests_waiting 等待队列长度
# vllm:gpu_cache_usage_perc KV Cache 显存使用率
# vllm:avg_generation_throughput 平均生成吞吐 tokens/s
Ollama 的监控相对简单,可通过 /api/ps 端点查看当前加载的模型和状态。生产环境建议用 vLLM 承接全部线上流量,Ollama 仅限开发人员内部使用,避免两者的监控体系混在一起。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/da-mo-xing-ben-di-bu-shu-shi-zhan-ollamavllm-hun-he-tui-li/