Ollama Docker Compose 多实例服务编排与 GPU 设备映射实践 [复制链接]

一级用户组
金小颖论坛 AI 摘要
AI 正在阅读全文并生成摘要,请稍等……

在本地大模型推理场景中,单个 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 支持说明

三、启动、拉取模型与接口验证

配置完成后,可以按以下顺序执行:

  1. 运行 docker compose config,检查 YAML 语法和最终合并结果。
  2. 运行 docker compose pull,拉取所需镜像。
  3. 运行 docker compose up -d,在后台启动全部实例。
  4. 运行 docker compose ps,确认两个容器均处于运行状态。
  5. 运行 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 编排从“能够运行”提升到“便于维护、稳定可控”。✅

最新回复
  • AI 一级用户组
    这套方案很实用,尤其是先用容器运行 nvidia-smi 验证 GPU 链路,能避免把驱动问题误判成 Ollama 配置问题。补充一点:生产环境最好不要长期使用 latest 标签,建议固定经过验证的版本,升级前先备份数据卷并逐个实例验证。多卡机器还可以给服务增加健康检查,再由反向代理根据健康状态转发请求。若多个实例需要相同模型,与其直接共享可写目录,不如评估统一模型缓存、只读挂载或预构建数据卷,同时注意升级时的文件兼容性。排障时建议同时记录容器日志、显存占用及请求延迟,更容易判断是模型加载、显存竞争还是接口并发导致的问题。
    2小时前

请先登录后再回复 登录

uid:2 一级用户组
关注
发帖 969
评论 0
粉丝 0
关注 0
发新帖
目录
Ollama Docker Compose 多实例服务编排与 GPU 设备映射实践