Post

GPU Passthrough в LXC контейнер с docker для видеокарт Nvidia

Уcтановим зависимости

1
apt update && apt install build-essential software-properties-common make pve-headers-$(uname -r) sudo -y

Для начала скачиваем драйвера c сайта nvidia.com/drivers

Устанавливаем их на proxmox сервер.

1
2
chmod +x NVIDIA-Linux-x86_64-***.run
./NVIDIA-Linux-x86_64-***.run

Рекомендую создать пользователя nvidia-persistenced

1
useradd -r -s /usr/sbin/nologin -M nvidia-persistenced

Мне потребовалось создать сервис в systemd, чтобы у меня драйвер нормально запускался при запуске

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat<<EOF > /etc/systemd/system/nv-persistenced.service
[Unit]
Description=NVIDIA Persistence Daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced
ExecStop=/usr/bin/nvidia-persistenced --terminate
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable nv-persistenced.service
systemctl start nv-persistenced.service

Далее создаем по гайду docker lxc

После создания и перезагрузки proxmox нода проверим какие устройства nvidia появились в системе

1
ls -la /dev/nvidia*

``

1
2
3
4
5
6
7
8
9
10
11
crw-rw-rw- 1 root root 195,   0 Feb 18 19:51 /dev/nvidia0
crw-rw-rw- 1 root root 195, 255 Feb 18 19:51 /dev/nvidiactl
crw-rw-rw- 1 root root 509,   0 Feb 18 19:51 /dev/nvidia-uvm
crw-rw-rw- 1 root root 509,   1 Feb 18 19:51 /dev/nvidia-uvm-tools

/dev/nvidia-caps:
total 0
drwxr-xr-x  2 root root     80 Feb 18 19:51 .
drwxr-xr-x 22 root root   5740 Feb 18 19:51 ..
cr--------  1 root root 234, 1 Feb 18 19:51 nvidia-cap1
cr--r--r--  1 root root 234, 2 Feb 18 19:51 nvidia-cap2

Нам нужно пропустить все устройства в lxc и дать больше чем 1024 мб памяти (Не сможет установщик разархивировать)

1
pct set 112 --memory 2048 --dev0 /dev/nvidia0 --dev1 /dev/nvidiactl --dev2 /dev/nvidia-uvm --dev3 /dev/nvidia-uvm-tools --dev4 /dev/nvidia-caps/nvidia-cap1 --dev5 /dev/nvidia-caps/nvidia-cap2

В proxmox ноде записываем драйвер в lxc

1
pct push 112 NVIDIA-Linux-x86_64-580.126.18.run /root/NVIDIA-Linux-x86_64-580.126.18.run

Подключаемся в lxc и установим драйвера

1
2
3
chmod +x /root/NVIDIA-Linux-x86_64-580.126.18.run
/root/NVIDIA-Linux-x86_64-580.126.18.run --no-kernel-modules
reboot

Проверим установку

1
nvidia-smi

Если все ок, то увидите такую картину. К сожалению она не будет показывать запущенные процессы в lxc, но покажет все, если запустить на proxmox ноде.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.18             Driver Version: 580.126.18     CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| 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 GTX 1070        Off |   00000000:05:00.0 Off |                  N/A |
|  0%   51C    P0             32W /  151W |       0MiB /   8192MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

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

Теперь установим nvidia container toolkit (нужно только для использования nvidia видеокарты в docker)

1
apt install gnupg2 -y

Добавим репозиторий nvidia-container-toolkit

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

apt-get update

Установим nvidia-container-toolkit

1
2
3
4
5
6
export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.18.2-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}

создать в /etc/docker/daemon.json

1
2
3
4
5
6
7
8
9
10
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    },
    "storage-driver": "fuse-overlayfs"
}

Теперь при деплое сервиса, нужно просто в docker-compose.yml добавить

1
2
3
4
5
deploy:
      resources:
        reservations:
          devices:
          - capabilities: [gpu]

Все, готово

P.S. Многие рекомендую установить nvidia-cuda-toolkit https://developer.nvidia.com/cuda-downloads для работы с cuda. Мне не потребовалось.

This post is licensed under CC BY 4.0 by the author.