1. 架构背景与核心痛点

在群晖 RS4826xs+(DSM 7.4)上通过 PCIe 扩展 RTX 4000 Pro (Blackwell) 显卡后,面临“宿主机识别正常,但 Docker 容器无法调用 GPU”的困境。

1.1 为什么常规 Docker 命令会失效?

在标准 Linux 发行版中,我们习惯使用 --gpus all--runtime=nvidia 来调用显卡。但在群晖 DSM 环境下,这两条命令通常会报错或静默回退至 CPU,原因如下:

  1. Runtime 路径隔离:群晖的 NVIDIA 运行时二进制文件(nvidia-container-runtime)安装在套件私有目录(如 /var/packages/NVIDIA/Runtime/target/...),而非系统标准路径 /usr/bin/。Docker 守护进程默认在 $PATH 中找不到该程序,导致 --runtime=nvidia 失败。
  2. 设备节点权限:DSM 的 Container Manager 对 /dev/nvidia* 设备节点进行了严格的权限隔离,默认不向第三方容器暴露,导致 --gpus all 无法完成设备握手。
  3. 驱动版本滞后:Blackwell 架构(RTX 4000 Pro)较新,若群晖套件未及时更新,可能导致容器内 CUDA 库与宿主机驱动版本不匹配,引发 CUDA_ERROR

1.2 建议

鉴于群晖 DSM 的封闭性,不建议强行修改系统级 Docker 配置或安装社区版 nvidia-container-toolkit,这极易在 DSM 更新后导致 Docker 服务崩溃。

最佳实践是采用**底层设备直透传(Device Passthrough)**方案。该方案绕过 Docker 的 GPU 插件机制,直接将物理设备映射给容器,兼容性最高,且不依赖群晖的运行时配置。


2. 环境准备与驱动确认

在操作前,请通过 SSH 登录群晖并获取 root 权限:

sudo -i

2.1 确认宿主机驱动状态

运行以下命令,确保宿主机能正确识别 RTX 4000 Pro:

nvidia-smi

预期结果

  • 显示 NVIDIA RTX 4000 Pro 或类似型号。
  • 显存总量为 24GB。
  • 驱动版本与 CUDA 版本正常显示。

2.2 确认设备节点

检查 /dev/ 目录下是否存在以下 NVIDIA 核心设备文件:

ls -l /dev/nvidia*

必须包含以下节点

  • /dev/nvidia0:GPU 计算核心设备。
  • /dev/nvidiactl:GPU 控制接口。
  • /dev/nvidia-uvm:统一内存管理设备(关键,缺失会导致 Ollama 无法分配显存)。
  • /dev/nvidia-uvm-tools:UVM 工具设备(增强兼容性)。

3. 核心解决方案:设备直透传

3.1 方案对比

方案 命令参数 群晖 DSM 7.4 兼容性 推荐度 原因
标准 GPU 调用 --gpus all ❌ 极差 依赖 nvidia-container-toolkit,群晖默认缺失且路径不对。
指定运行时 --runtime=nvidia ⚠️ 需修复 ⭐⭐ 需手动建立软链接,DSM 更新后可能失效。
设备直透传 --device /dev/nvidia... 完美 ⭐⭐⭐⭐⭐ 绕过 Runtime,直接映射物理设备,Ollama 原生支持。

3.2 为什么 --device 优于 --gpus all

  1. 零依赖:不需要宿主机安装或配置 nvidia-container-runtime,完全规避了群晖的路径隔离问题。
  2. 高稳定性:不修改 Docker 守护进程配置(daemon.json),DSM 系统更新或 Docker 套件升级不会破坏配置。
  3. Ollama 原生支持:Ollama 内部集成了 CUDA 库,只要容器内存在 /dev/nvidia0 等节点,它会自动检测并初始化 CUDA,无需外部 Runtime 介入。

4. 完整启动命令详解

请复制以下命令在 SSH 终端执行。该命令已针对 RS4826xs+ 和 RTX 4000 Pro 进行了参数调优:

sudo docker run -d \
  --name ollama \
  --restart unless-stopped \
  --device /dev/nvidia0:/dev/nvidia0 \
  --device /dev/nvidiactl:/dev/nvidiactl \
  --device /dev/nvidia-uvm:/dev/nvidia-uvm \
  --device /dev/nvidia-uvm-tools:/dev/nvidia-uvm-tools \
  -p 11434:11434 \
  -v /volume1/docker/ollama:/root/.ollama \
  -e TZ=Asia/Shanghai \
  -e OLLAMA_HOST=0.0.0.0 \
  -e OLLAMA_NUM_PARALLEL=4 \
  -e OLLAMA_MAX_LOADED_MODELS=2 \
  -e NVIDIA_VISIBLE_DEVICES=all \
  -e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
  ollama/ollama:latest

4.1 关键参数解析

  • --device ...:将宿主机的 4 个核心 NVIDIA 设备文件强制挂载到容器内。这是绕过群晖限制、实现 GPU 调用的核心步骤
  • NVIDIA_VISIBLE_DEVICES=all:告知容器内的 CUDA 运行时可以使用所有可见的 GPU。虽然 --device 已映射设备,但此环境变量能确保 CUDA 库正确初始化。
  • NVIDIA_DRIVER_CAPABILITIES=compute,utility
    • compute:允许容器进行 AI 推理计算。
    • utility:允许调用 nvidia-smi 等工具(虽然 Ollama 镜像内无此工具,但部分 CUDA 初始化流程需要此权限)。
  • OLLAMA_HOST=0.0.0.0:强制 Ollama 监听所有网络接口,确保局域网内其他设备可通过 NAS_IP:11434 访问 API。
  • OLLAMA_NUM_PARALLEL=4:利用 RTX 4000 Pro 的 24G 大显存,允许 Ollama 并行处理 4 个请求,显著提升多用户并发体验。
  • OLLAMA_MAX_LOADED_MODELS=2:允许同时驻留 2 个模型在显存中,避免频繁换入换出导致的延迟。

5. 验证 GPU 加速是否生效

5.1 日志验证法(推荐)

Ollama 官方镜像为精简生产环境,不包含 nvidia-smi,请勿在容器内运行该命令。

# 查看容器启动日志,过滤 GPU/CUDA 关键词
sudo docker logs ollama | grep -i "cuda\|gpu"

成功标志
日志中应出现类似以下字样:

  • msg="CUDA device detected"
  • msg="offloading layers to GPU"
  • msg="using CUDA"

若日志显示 CPU only 或无任何 CUDA 相关信息,则 GPU 未被调用。

5.2 模型运行测试

# 进入容器
sudo docker exec -it ollama /bin/bash

# 运行一个 7B 模型(RTX 4000 Pro 24G 可轻松驾驭)
ollama run qwen2:7b

观察指标

  • 首字生成时间(TTFT)应在 1 秒以内。
  • 生成速度(Tokens/s)应显著高于纯 CPU 推理(7B 模型在 RTX 4000 Pro 上通常可达 40-80 tokens/s)。

5.3 宿主机资源监控

在另一个 SSH 窗口执行:

watch -n 1 nvidia-smi

在模型推理时,观察:

  • 显存占用Memory-Usage 应显著增加(7B Q4 模型约占 4-5GB)。
  • GPU 利用率GPU-Util 应出现波动,而非持续 0%。

6. 常见问题与进阶优化

6.1 模型拉取极慢

Ollama 默认从海外源拉取模型,国内网络环境下极易超时。

解决方案:在启动命令中增加代理环境变量(需确保 NAS 可访问代理):

-e HTTP_PROXY=http://你的代理IP:端口 \
-e HTTPS_PROXY=http://你的代理IP:端口 \

或手动下载 GGUF 文件后导入:

  1. 从 ModelScope 或 HuggingFace 镜像下载 .gguf 文件。
  2. 上传至 /volume1/docker/ollama
  3. 进入容器执行:ollama create mymodel -f /root/.ollama/模型文件.gguf

6.2 显存溢出 (OOM)

RTX 4000 Pro 拥有 24G 显存,但加载 70B 模型或超长上下文时仍可能溢出。

优化策略

  1. 开启 Flash Attention:在启动命令中增加 -e OLLAMA_FLASH_ATTENTION=1,可降低 KV Cache 显存占用约 30-50%。
  2. 限制上下文窗口:在 API 请求中设置 num_ctx: 4096(默认 2048,但部分模型默认 8192),显存占用与上下文长度呈线性关系。
  3. CPU 卸载:若显存不足,可设置 -e OLLAMA_NUM_GPU=30(以 35 层模型为例),让 Ollama 自动将剩余层卸载至 CPU 内存,以空间换时间。

6.3 Blackwell 架构兼容性

RTX 4000 Pro 属于 Blackwell 架构,若 Ollama 启动时报 CUDA_ERRORunsupported GPU architecture

  1. 确保 Ollama 镜像为最新版:sudo docker pull ollama/ollama:latest
  2. 确认群晖 NVIDIA Runtime Library 套件已更新至支持 Blackwell 的版本。
  3. 若仍报错,可能是 Ollama 内置 CUDA 库版本滞后,需等待官方镜像更新。

7. 总结

在群晖 RS4826xs+ 上部署 Ollama GPU 加速,设备直透传(--device 是目前最稳健、最符合 DSM 架构特性的方案。它规避了 Runtime 路径问题,充分利用了 RTX 4000 Pro 的 24G 显存,且无需修改系统底层配置。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐