NVIDIA Container Toolkit

Docker运行NVIDIA容器 已经被 NVIDIA Container Toolkit 取代,用于构建和运行GPU加速的 ContainerNVIDIA Container Toolkit 包含了一个容器运行库 libnvidia-container

备注

在Host主机上只需要 安装NVIDIA Linux驱动(Ubuntu) ,不需要完整安装 NVIDIA CUDA

NVIDIA Container Toolkit概要

NVIDIA Container Toolkit是一系列拥有构建和运行GPU加速容器的库和工具包括:

  • The NVIDIA Container Runtime (nvidia-container-runtime)

  • The NVIDIA Container Toolkit CLI (nvidia-ctk)

  • The NVIDIA CDI Hooks (nvidia-cdi-hook)

  • The NVIDIA Container Runtime Hook (nvidia-container-runtime-hook)

    • NVIDIA的 经典方案 ,基于 OCI(Open Container Initative,开放容器倡议)规范中的 prestart (预启动)阶段工作

  • The NVIDIA Container CLI (nvidia-container-cli)

  • The NVIDIA Container Library (libnvidia-container1)

Ubuntu/Debian系统安装

  • 首先安装必要的工具:

安装工具
sudo apt-get update && sudo apt-get install -y --no-install-recommends \
   ca-certificates \
   curl \
   gnupg2
  • 配置仓库:

仓库
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

备注

配置仓库时 curl 很可能被防火墙阻挡无法下载,首先设置 SSH Tunneling: 动态端口转发 :

配置动态端口转发的 ~/.ssh/config
Host *
  ServerAliveInterval 60
  ControlMaster auto
  ControlPath ~/.ssh/%h-%p-%r
  ControlPersist yes
  StrictHostKeyChecking no
  Compression yes

Host MyProxy
  HostName <SERVER_IP>
  User admin
  DynamicForward 1080
  IdentitiesOnly yes
  IdentityFile ~/.ssh/proxy/id_rsa

则只需要执行 ssh MyProxy 就立即建立起动态端口转发

需要配置 curl代理 :

配置curl的socks5代理环境变量
export ALL_PROXY=socks5h://localhost:1080

备注

另外可选配置使用测试性软件包:

可选的测试性配置(我没有使用)
sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
  • 更新仓库:

更新仓库
sudo apt-get update

备注

在添加NVIDIA仓库之后,也同样需要配置 APT代理 :

配置APT代理 /etc/apt/apt.conf.d/proxy.conf
Acquire::http::Proxy "socks5h://127.0.0.1:1080";
Acquire::https::Proxy "socks5h://127.0.0.1:1080";
Acquire::socks::Proxy "socks5h://127.0.0.1:1080";
  • 安装 NVIDIA Container Toolkit 软件包:

安装 NVIDIA Container Toolkit
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.19.1-1
sudo apt-get install -y \
    nvidia-container-toolkit=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    nvidia-container-toolkit-base=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    libnvidia-container-tools=${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
    libnvidia-container1=${NVIDIA_CONTAINER_TOOLKIT_VERSION}

配置

根据NVIDIA官方文档 Installing the NVIDIA Container Toolkit ,NVIDIA Container Toolkit支持4种 容器运行时(Container Runtimes) :

容器引擎对比

特性

Docker (Moby)

Containerd

Podman

CRI-O

定位

全栈容器平台

工业级标准运行时

红帽系、无守护进程

纯粹为 K8s 设计

GPU 支持

最成熟,插件化自动配置

需手动配置 OCI Runtime

需配合 NVIDIA CDI

需配合 NVIDIA CDI

复杂度

低(一键式体验)

中(需理解底层调用)

中(Rootless 特性)

高(依赖 K8s 生态)

架构

Daemon 模式

Daemon 模式

Daemonless (更安全)

Daemonless

适用场景

本地开发、单机 AI 实验

生产环境、K8s 节点

高安全性、替代 Docker

大规模 K8s 集群

考虑到我的HomeLab需要灵活构建镜像以及方便维护,我选择"开箱即用"的 Docker ,这样能够灵活使用 Docker Compose 快速构建多容器组合运行。当然,如果在生产环境使用 Kubernetes ,精简工作节点的架构,则推荐采用 containerd运行时(runtime)

安装 Docker CE

为了能够灵活和强大配置,我选择安装Docker官方提供的Docker CE:

  • 设置Docker官方apt仓库:

设置Docker apt仓库
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
  • 安装Docker软件包

安装Docker官方软件包
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • 启动docker服务:

启动docker服务
sudo systemctl start docker
  • 将当前用户加入 docker 组,这样后续就无需 sudo 就可以管理

将当前用户添加到 docker 用户组
sudo usermod -aG docker $USER

配置 Docker

  • 使用 nvidia-ctk 命令来配置容器运行时:

配置容器运行时
sudo nvidia-ctk runtime configure --runtime=docker

输出显示

配置容器运行时的输出信息
INFO[0000] Config file does not exist; using empty config 
INFO[0000] Wrote updated config to /etc/docker/daemon.json 
INFO[0000] It is recommended that docker daemon be restarted. 
  • 然后重启Docker服务:

重启docker服务
sudo systemctl restart docker

参考