Ubuntu 服务器安装 Nvidia Container Toolkit 使 Docker 支持 Cuda

为了能够在 Docker 中使用 GPU 进行加速,Nvidia 开发了 nvidia-docker 对 Container 进行封装,使得 Docker 容器可以调用 GPU 进行加速。现在 nvidia-docker 已被归档,官方推荐使用 nvidia-container-toolkit

本文将介绍如何在 Linux 中安装 nvidia-container-toolkit。

注:本文所使用的显卡为 RTX4080

安装 Nvidia 驱动

  1. 查看驱动版本

    1
    cat /proc/driver/nvidia/version

    若提示没有该文件,则说明没有驱动。否则会显示驱动版本:

    1
    2
    NVRM version: NVIDIA UNIX x86_64 Kernel Module  535.129.03  Thu Oct 19 18:56:32 UTC 2023
    GCC version: gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
  2. 安装驱动

    由于 4080 不支 --gpgpu 驱动,因此此处安装通用驱动

    查看可安装驱动:

    1
    sudo ubuntu-drivers list

    使用推荐方式安装:

    1
    sudo ubuntu-drivers install

    若显卡支持,可以添加 --gpgpu 参数即可

    安装工具包:

    1
    2
    3
    4
    5
    # 查看驱动版本
    cat /proc/driver/nvidia/version

    # 若是 --gpgpu 版本,还需要根据驱动版本安装工具包,下面的 535 为主版本号
    # sudo apt install nvidia-utils-535-server

输入 nvidia-smi 来查看显卡状态,正常显示如下:

image-20231227172857700

若要卸载驱动,执行:

1
2
sudo apt --purge remove '*nvidia*${DRIVER_BRANCH}*'
sudo apt autoremove

安装 NVIDIA Container Toolkit

  1. 宿主机更新 NVIDIA driver

    1
    2
    3
    4
    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

    请注意,该步骤会从 nvidia.github.io 上下载文件,可能需要配置代理

  2. 更新包列表

    1
    sudo apt-get update

  3. 安装 NVIDIA Container Toolkit

    1
    sudo apt-get install -y nvidia-container-toolkit

配置 Docker

  1. 通过 navidia-ctk 配置 docker 容器

    1
    sudo nvidia-ctk runtime configure --runtime=docker
  2. 重启容器

    1
    sudo systemctl restart docker

配置 Containerd

containerd 是一个开源的容器运行时,它是 Docker 的一个核心组件,负责管理容器的生命周期,包括镜像管理、容器执行、进程监控、网络管理等。

1
2
sudo nvidia-ctk runtime configure --runtime=containerd
sudo systemctl restart containerd

测试

使用下列代码测试是否可以在 docker 容器中使用 gpu

1
sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

--gpus all:表示在 docker 中使用 GPU,若容器需要使用 GPU,都需要添加这个参数

当输出如下内容时,说明安装成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4080 Off | 00000000:65:00.0 Off | N/A |
| 0% 33C P8 7W / 320W | 2MiB / 16376MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| No running processes found |
+---------------------------------------------------------------------------------------+

docker compose 配置 GPU

在配置中加入如下设置,允许 docker 使用 gpu

1
2
3
4
5
6
7
8
9
10
services:
ollma:
...
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1 # 使用一块 GPU
capabilities: [gpu]

测试 Docker 容器 GPU 状态

进入到容器后,执行 nvidia-smi,若成功显示 GPU 信息,则说明 docker 容器成功访问到了 GPU。

参考

本文参考以下文章,在此致以诚挚谢意!

NVIDIA drivers installation | Ubuntu

NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs (github.com)

NVIDIA/nvidia-container-toolkit: Build and run containers leveraging NVIDIA GPUs (github.com)

Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.14.3 documentation

Running a Sample Workload — NVIDIA Container Toolkit 1.14.3 documentation