欢迎光临
我们一直在努力

Docker 容器中使用宿主机 GPU 资源的两种主流方式

在 Docker 容器中使用宿主机 GPU 资源,主要有两种主流方式:NVIDIA Docker(适用于 NVIDIA GPU)和更通用的 Docker 19.03+ 的 –gpus 选项。下面我将详细说明两种方法的步骤。


方法一:使用 NVIDIA Docker (旧版方式,但仍广泛使用)

这是 NVIDIA 官方提供的方案,需要安装 nvidia-docker 工具包。

步骤 1:确保宿主机环境正确
  • 安装 NVIDIA 驱动: 确保宿主机上已安装了正确版本的 NVIDIA 显卡驱动。可以通过 nvidia-smi 命令来验证驱动和 GPU 是否正常工作。

    nvidia-smi

    如果该命令能正确输出 GPU 状态信息,说明驱动安装成功。

  • 安装 NVIDIA Container Toolkit: nvidia-docker2 包已被 nvidia-container-toolkit 取代。你需要添加 NVIDIA 的软件源并安装它。

    对于 Ubuntu/Debian 系统:

    # 添加包仓库和GPG密钥
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

    sudo apt-get update
    sudo apt-get install -y nvidia-container-toolkit
    # 对于较旧的系统,你可能需要安装 nvidia-docker2
    # sudo apt-get install -y nvidia-docker2

    # 重启 Docker 守护进程
    sudo systemctl restart docker

    对于 CentOS/RHEL 系统: 请参考 NVIDIA 官方文档:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

  • 步骤 2:运行容器时挂载 GPU

    安装成功后,你可以使用 –runtime=nvidia 或 nvidia-container-cli 来运行容器。但最直接的方法是使用 docker run 的 –gpus 选项(这其实是方法二的延伸,但需要 NVIDIA Container Toolkit 的支持)。

    • 使用 –gpus all 挂载所有 GPU:

      docker run -it –rm –gpus all nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi

      这个命令会:

    • 从 NVIDIA 提供的容器镜像 nvidia/cuda:11.8.0-base-ubuntu20.04 启动一个容器。
    • –gpus all 表示将宿主机所有可用的 GPU 设备挂载到容器中。
    • 在容器内执行 nvidia-smi 命令,你应该会看到和在宿主机上执行类似的输出。
    • 挂载特定数量的 GPU:

      docker run -it –rm –gpus 2 nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi

    • 挂载特定设备号的 GPU:

      # 挂载设备号为0的GPU
      docker run -it –rm –gpus '"device=0"' nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi
      # 挂载设备号为0和1的GPU
      docker run -it –rm –gpus '"device=0,1"' nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi


    方法二:使用 Docker 19.03+ 原生 –gpus 支持

    从 Docker 19.03 版本开始,Docker 原生支持了 –gpus 选项来管理 GPU 资源。这种方式仍然需要先安装 NVIDIA Container Toolkit(即方法一的步骤1),因为它提供了 Docker 与 NVIDIA 驱动交互所需的底层支持。

    安装好 NVIDIA Container Toolkit 后,使用方法就和方法一中的示例完全一样了:

    # 使用所有GPU
    docker run -it –rm –gpus all ubuntu nvidia-smi

    # 使用特定GPU
    docker run -it –rm –gpus '"device=1,2"' ubuntu nvidia-smi

    关键点:Docker 原生的 –gpus 选项是一个更统一、更标准的接口,但它的后端实现依赖于 NVIDIA Container Toolkit 来提供 NVIDIA GPU 的支持。


    方法三:直接挂载设备(不推荐,适用于特殊场景或非NVIDIA GPU)

    对于某些非 NVIDIA GPU 或者非常特殊的需求,你可以尝试手动挂载设备文件和所需的库文件。这种方式很繁琐且容易出错,一般不推荐用于 NVIDIA GPU。

    docker run -it –rm \\
    –device /dev/nvidia0:/dev/nvidia0 \\ # 挂载GPU设备
    –device /dev/nvidiactl:/dev/nvidiactl \\ # 挂载控制设备
    –device /dev/nvidia-uvm:/dev/nvidia-uvm \\ # 挂载UVM设备(用于CUDA)
    -v /usr/lib/x86_64-linux-gnu/libcuda.so.1:/usr/lib/x86_64-linux-gnu/libcuda.so.1 \\ # 挂载库文件
    -v /usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.1:/usr/lib/x86_64-linux-gnu/libnvidia-ptxjitcompiler.so.1 \\
    ... # 需要挂载很多其他的库文件,非常麻烦
    nvidia/cuda:11.8.0-base-ubuntu20.04 nvidia-smi


    总结与实践建议

    方法优点缺点适用场景
    NVIDIA Container Toolkit + –gpus 官方推荐,自动化程度高,简单可靠,无需手动挂载设备和库 需要额外安装工具包 绝大多数使用 NVIDIA GPU 的场景
    Docker 原生 –gpus Docker 原生命令,标准化 同样需要 NVIDIA Container Toolkit 作为后端 Docker 19.03+ 版本,追求命令标准化
    手动挂载设备 不需要安装额外工具,可控性高 极其繁琐,易出错,不易维护 调试、特殊需求或非 NVIDIA GPU

    最佳实践步骤:

  • 在宿主机上:

    • 安装正确的 NVIDIA 驱动(使用 nvidia-smi 验证)。
    • 安装 Docker Engine。
    • 安装 NVIDIA Container Toolkit(这是关键)。
    • 重启 Docker 服务 (sudo systemctl restart docker)。
  • 运行容器时:

    • 使用 –gpus all 来简单快速地挂载所有 GPU。
    • 使用 nvidia/cuda 等官方镜像或基于它构建的镜像,以确保容器内已安装 CUDA 驱动和工具。
    • 在 Dockerfile 中,你的应用同样需要依赖 CUDA 环境。
  • 示例:运行一个 PyTorch 训练容器

    # 挂载所有GPU,并挂载本地代码目录到容器中
    docker run -it –rm –gpus all \\
    -v /path/to/your/code:/workspace \\
    pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime \\
    python /workspace/train.py

    对于 AMD GPU 或其他厂商的 GPU,Docker 也正在逐步增加原生支持(如使用 –device 和 –group-add 参数),但成熟度和易用性目前不如 NVIDIA 的方案。具体请参考对应硬件厂商的文档。

    赞(0)
    未经允许不得转载:171主机测评 » Docker 容器中使用宿主机 GPU 资源的两种主流方式
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址