Установка и настройка драйверов nvidia в LXC контейнере

Установка и настройка LXC

1) Установите программу LXC

2) Установите Nvidia драйвера для Tensorflow и PyTorch для Ubuntu

Установка Nvidia LXC контейнера

1) Установите контейнер docker0. Создавать будем контейнер с названием nvidia

lxc-create -t download -n nvidia -- --dist ubuntu --release jammy --arch amd64

2) Внесите изменения в файл /var/lib/lxc/nvidia/config

Раскоментируйте строку

lxc.include = /usr/share/lxc/config/nesting.conf

Это позволит создать Nested контейнер — возможность запустить контейнер в контейнере (вложенные контейнеры).

Добавьте в файл следующие строки

lxc.net.0.ipv4.address = 172.30.0.25/24
lxc.net.0.ipv4.gateway = 172.30.0.1
lxc.mount.auto = cgroup-full:rw
lxc.apparmor.profile = unconfined
lxc.cgroup.devices.allow = a
lxc.cap.drop =

# nvidia driver
lxc.cgroup.devices.allow = c 195:* rwm
lxc.cgroup.devices.allow = c 243:* rwm
lxc.cgroup.devices.allow = c 510:* rwm
lxc.cgroup2.devices.allow = c 195:* rwm
lxc.cgroup2.devices.allow = c 243:* rwm
lxc.cgroup2.devices.allow = c 510:* rwm
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,optional,create=file
lxc.mount.entry = /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file

Если будете настраивать Docker Swarm, то закоментируйте строки

#lxc.idmap = u 0 100000 65536
#lxc.idmap = g 0 100000 65536

Настройка контейнера

1) Установка docker:

curl -sSL https://get.docker.com | sh
systemctl enable docker
systemctl start docker
apt-get install docker-compose

2) В крон через команду sudo crontab -e пропишите команду, которая будет автоматически очищать контейнеры

0 */2 * * * docker system prune --filter "until=24h" -f > /dev/null

3) Установите драйвер в LXC контейнер. Драйвер должен быть той же версии, что и на хосте. Ниже команда устанавливает драйвер версии 515. Если у вас новее драйвер, поставьте другую версию.

Версия драйвера в LXC должна совпадать с версией драйвера на хост системе.

aptitude install nvidia-driver-525

4) Установите плагин libnvidia-containuer.

Определите версию Убунту

export distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

Установите ключ nvidia:

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/nvidia-container-toolkit-keyring.gpg

Добавьте репозиторий:

wget https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list -O "/etc/apt/sources.list.d/nvidia-container-toolkit.list"

Установите Docker плагин:

apt-get update
apt-get install -y nvidia-docker2

5) Добавьте строчки в /etc/docker/daemon.json

{
  "log-driver": "journald",
  "log-opts": {
    "labels":"com.docker.swarm.service.name"
  },
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": []
    }
  }
}

6) Перезапустите Docker:

systemctl restart docker

7) Выполните команду:

docker run --rm --gpus all nvidia/cuda:11.7.1-base-ubuntu20.04 nvidia-smi

Если команда выполнилась успешно и указала версию драйвера, значит все установлено корректно.

Источники

  1. libnvidia-container
  2. NVIDIA cloud-native install-guide
  3. NVIDIA Driver & CUDA inside an LXC container