如何在 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 部署配置
bashsudo 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 部署配置
bashdocker 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
输出示例:
shellNAME 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:模型级设置,仅对该模型生效,可覆盖全局值
dockerfileFROM 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"}
客户端应实现指数退避重试:
pythonimport 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 实例,各自独立配置。