大模型本地部署实战:Ollama + vLLM 混合推理方案配置指南

为什么需要 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/

(0)
小编小编
上一篇 7小时前
下一篇 7小时前

相关推荐