在本地大模型推理场景中,单个 Ollama 服务往往难以同时满足开发测试、业务接口和不同模型隔离等需求。借助 Docker Compose,可以将多个 Ollama 实例统一编排,并通过端口、存储卷和 GPU 设备映射实现资源隔离。本文以 NVIDIA GPU 为主线,介绍一套可直接调整的多实例部署方法,同时补充 AMD GPU 的配置思路。🚀
一、部署前的环境检查
宿主机需要先安装 Docker Engine、Docker Compose V2、正确版本的显卡驱动,以及 NVIDIA Container Toolkit。Ollama 官方容器文档给出了 NVIDIA 与 AMD GPU 的启动要求,可参考 Ollama Docker 官方文档。
建议依次执行以下检查,避免在 Compose 启动后才排查底层环境:
- nvidia-smi:确认宿主机能够识别 NVIDIA GPU。
- docker compose version:确认使用 Compose V2。
- docker run --rm --gpus all ubuntu nvidia-smi:验证容器能够访问 GPU。
- docker info:检查 Docker 服务及运行时状态。
如果第三项失败,应优先检查 NVIDIA Container Toolkit,而不是修改 Ollama 配置。Docker 官方说明中也明确指出,容器访问 NVIDIA GPU 的前提是驱动、Container Toolkit 与 Docker Daemon 均已正确配置,详见 Docker GPU 访问文档。
二、多实例编排的核心思路
多实例的关键不是简单复制服务,而是确保每个实例拥有独立的服务名、容器名、宿主机端口和数据卷。例如,实例一映射到 11434,实例二映射到 11435,但两个容器内部仍监听 Ollama 默认端口 11434。
下面是一份双实例 Compose 配置示意。由于文章使用简洁 HTML,配置以引用块展示,实际使用时请保存为 compose.yaml:
services:
ollama_gpu0:
image: ollama/ollama:latest
container_name: ollama_gpu0
restart: unless-stopped
ports:
- "127.0.0.1:11434:11434"
volumes:
- ollama_gpu0_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["0"]
capabilities: [gpu]
ollama_gpu1:
image: ollama/ollama:latest
container_name: ollama_gpu1
restart: unless-stopped
ports:
- "127.0.0.1:11435:11434"
volumes:
- ollama_gpu1_data:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
device_ids: ["1"]
capabilities: [gpu]
volumes:
ollama_gpu0_data:
ollama_gpu1_data:
这里使用 device_ids 将两个实例分别绑定到 GPU 0 和 GPU 1。Docker Compose 还支持通过 count 指定设备数量,但 count 与 device_ids 不能同时使用,并且 capabilities 是必填项,具体规则可查看 Docker Compose GPU 支持说明。
三、启动、拉取模型与接口验证
配置完成后,可以按以下顺序执行:
- 运行 docker compose config,检查 YAML 语法和最终合并结果。
- 运行 docker compose pull,拉取所需镜像。
- 运行 docker compose up -d,在后台启动全部实例。
- 运行 docker compose ps,确认两个容器均处于运行状态。
- 运行 docker compose logs ollama_gpu0,检查第一个实例的 GPU 发现日志。
模型需要分别下载到对应实例。例如执行 docker compose exec ollama_gpu0 ollama pull 模型名,模型会进入第一个数据卷;在第二个实例中执行同类命令,则会写入另一个数据卷。独立存储的优点是实例之间互不干扰,缺点是相同模型可能占用两份磁盘空间。若希望复用模型文件,可以考虑只读共享存储,但必须先验证并发访问和版本更新行为,生产环境不宜贸然共用可写目录。
接口验证可分别访问 来源链接 与 来源链接。将端口绑定到 127.0.0.1,可以避免服务直接暴露到外部网络;如需远程调用,建议在前方增加带身份认证、访问控制和 TLS 的反向代理。🔐
四、单卡多实例与资源竞争
只有一张 GPU 时,也可以让多个 Ollama 容器映射同一设备,但这并不等于显存被自动、严格地切分。多个实例加载模型后可能竞争显存,引发模型卸载、推理延迟波动或内存不足。因此,单卡部署更适合通过一个 Ollama 服务承载多个调用方,只有在配置隔离、版本隔离或故障域隔离确有必要时,才建议运行多个实例。
运维时可结合 nvidia-smi 观察显存、利用率和进程变化,并通过 docker stats 查看容器的 CPU 与内存消耗。对于长期运行的服务,还应设置合理的重启策略,固定经过验证的镜像标签,并记录每个实例对应的 GPU、端口、模型和业务用途。📊
五、AMD GPU 的映射差异
AMD GPU 通常使用 Ollama 的 ROCm 镜像,并向容器映射 /dev/kfd 与 /dev/dri,而不是使用 NVIDIA 驱动预留配置。示意写法为镜像 ollama/ollama:rocm,同时添加两个设备路径。实际兼容性与宿主机系统、GPU 型号和驱动环境有关,部署前应以 Ollama 官方容器说明及 ROCm 支持范围为准。
六、常见问题排查
- 容器启动但使用 CPU:检查 Toolkit 配置、设备预留层级以及 Ollama 启动日志。
- 提示无法选择 NVIDIA 驱动:确认容器 GPU 测试命令能够在宿主机成功运行。
- 端口冲突:修改宿主机侧端口,容器内部端口仍保持 11434。
- 模型重启后消失:确认数据卷已挂载到 /root/.ollama。
- 第二个实例无法启动:检查 device_ids 是否存在,并使用 nvidia-smi 核对设备编号。
- 显存持续不足:减少并发实例、选择更适合显存容量的模型,或将不同实例分配到不同 GPU。
总结
Ollama 多实例编排的重点可以归纳为四点:端口不能冲突、模型数据需要持久化、GPU 映射必须明确、外部访问必须受控。多卡服务器适合通过 device_ids 将实例与设备固定绑定;单卡环境则应谨慎评估并行实例带来的显存竞争。上线前完成配置校验、GPU 验证、接口测试和资源监控,才能让 Compose 编排从“能够运行”提升到“便于维护、稳定可控”。✅