5月28日 07:01

如何在 Ollama 中实现多模型并发运行和资源管理?

Ollama 支持两级并发:多模型同时加载和单模型并行处理请求。核心配置通过环境变量控制,资源管理由内存驱动,空闲模型自动卸载。

两级并发机制

Ollama 的并发能力分两层:

  • 多模型并发加载:系统内存充足时,多个模型可同时驻留在 RAM/VRAM 中,各自独立处理请求
  • 单模型并行推理:单个模型为多个请求分配并行 KV-cache 槽位,共享模型权重,吞吐量成倍提升

两者可以组合使用:2 个模型各开 4 个并行槽位,总共可同时处理 8 个请求。

核心环境变量配置

三个关键变量控制并发行为:

变量作用默认值
OLLAMA_NUM_PARALLEL单模型并行处理请求数1(内存充足时自动设为 4)
OLLAMA_MAX_LOADED_MODELS同时加载的最大模型数3 × GPU 数量,CPU 推理为 3
OLLAMA_MAX_QUEUE繁忙时排队等待的最大请求数512

systemd 部署配置

bash
sudo mkdir -p /etc/systemd/system/ollama.service.d sudo tee /etc/systemd/system/ollama.service.d/parallel.conf > /dev/null <<EOF [Service] Environment="OLLAMA_NUM_PARALLEL=4" Environment="OLLAMA_MAX_LOADED_MODELS=3" Environment="OLLAMA_MAX_QUEUE=256" EOF sudo systemctl daemon-reload && sudo systemctl restart ollama

Docker 部署配置

bash
docker run -d --gpus=all --network=host -v ollama_data:/root/.ollama -e OLLAMA_NUM_PARALLEL=4 -e OLLAMA_MAX_LOADED_MODELS=3 -e OLLAMA_MAX_QUEUE=256 ollama/ollama

内存驱动的资源管理

Ollama 的资源管理核心原则:内存决定一切

加载与卸载策略

新请求到达时,Ollama 检查可用内存是否足够加载目标模型:

  • 内存充足:模型加载到 RAM(CPU 推理)或 VRAM(GPU 推理),请求立即处理
  • 内存不足:请求进入队列,等待已加载模型空闲后被卸载释放空间
  • 空闲模型在超时后自动卸载,释放的资源按需分配给新模型

并行推理的内存开销

并行推理的 KV-cache 按并行数线性增长:

shell
实际内存需求 ≈ 模型权重 + OLLAMA_NUM_PARALLEL × OLLAMA_CONTEXT_LENGTH × 每token内存

例如:2K 上下文开 4 并行 = 8K 上下文的 KV-cache 开销。设置并行数前务必评估可用 VRAM。

GPU 约束

GPU 推理时,新模型必须完整装入 VRAM 才能并发加载。如果 VRAM 装不下第二个模型,Ollama 会排队等待。Windows Radeon GPU 因 ROCm VRAM 上报限制,默认最多加载 1 个模型。

查看运行状态

bash
# 查看当前加载的模型、大小和运行位置 ollama ps

输出示例:

shell
NAME ID SIZE PROCESSOR UNTIL deepseek-r1:32b abc123def456 19.2GB 100% GPU 4 minutes from now qwen3:8b 789ghi012jkl 4.7GB 100% GPU 2 minutes from now

PROCESSOR 列显示模型运行在 GPU 还是 CPU 上,UNTIL 显示空闲超时时间。

模型卸载与切换

bash
# 手动卸载模型释放内存 ollama stop deepseek-r1:32b # 加载新模型(内存不足时自动排队等待) ollama run llama3.3:70b

手动卸载适用于需要立即腾出空间加载更大模型的场景。

Modelfile 中的并行参数

Modelfile 的 PARAMETER num_parallel 与环境变量 OLLAMA_NUM_PARALLEL 不同:

  • OLLAMA_NUM_PARALLEL:全局设置,作用于整个 Ollama 实例
  • PARAMETER num_parallel:模型级设置,仅对该模型生效,可覆盖全局值
dockerfile
FROM deepseek-r1:32b # 该模型允许 2 个并行请求 PARAMETER num_parallel 2 # 批处理大小 PARAMETER num_batch 512

如果不同模型需要不同的并行度,可在各自 Modelfile 中单独配置,无需运行多个 Ollama 实例。

多 GPU 支持

Ollama 支持两种多 GPU 使用方式:

  • 模型分片:超大模型(如 70B)自动拆分到多块 GPU 上运行
  • 多模型分配:不同模型分别加载到不同 GPU,各自独立推理

多模型并发时,Ollama 根据 VRAM 情况自动将模型分配到不同 GPU。

队列管理与过载保护

OLLAMA_MAX_QUEUE 控制排队上限。队列满时,新请求返回 HTTP 503:

json
{"error": "server busy, please try again"}

客户端应实现指数退避重试:

python
import ollama import time def generate_with_retry(model, prompt, max_retries=3): for attempt in range(max_retries): try: return ollama.generate(model=model, prompt=prompt) except Exception as e: if "busy" in str(e) and attempt < max_retries - 1: time.sleep(2 ** attempt) continue raise

低延迟 API 场景可将队列设为 64-128,快速失败而非长时间排队。

生产环境最佳实践

并行数设置:不要盲目拉满。4 并行已能覆盖多数场景,8 以上需要充足 VRAM 支撑。先用 ollama ps 观察实际内存占用再调整。

模型选择:选择能完整装入 VRAM 的量化模型(Q4/Q5),比勉强加载大模型再降级到 CPU 推理更高效。8GB VRAM 适合 7B 模型,24GB VRAM 适合 32B 模型。

监控指标:关注 GPU 利用率和请求延迟。并行推理下 GPU 利用率应稳定在 75% 以上,总耗时约为单请求的 2-4 倍而非线性增长,说明并行生效。

多实例方案OLLAMA_NUM_PARALLEL 是实例级全局设置。如果不同模型需要不同并行度且 Modelfile 配置无法满足,可在不同端口运行多个 Ollama 实例,各自独立配置。

标签:Ollama