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

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

1) Осуществите базовую настройку Ubuntu 18.04.

2) Обновите ядро системы до версии 5.3, согласно инструкции.

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

aptitude install lxc

Установите права доступа, чтобы корректно запускались контейнеры:

chown lxc-root:root /var/lib/lxc
chmod 755 /var/lib/lxc

4) Настройте сеть LXC

Рекомендуется использовать сеть 172.30.0.1/24. Более подробный список указан в списке сетей.

В файле /etc/default/lxc-net пропишите

USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxcbr0"
LXC_ADDR="172.30.0.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="172.30.0.0/24"
LXC_DHCP_RANGE="172.30.0.2,172.30.0.254"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
#LXC_DOMAIN="lxc"

Создайте файл /etc/lxc/dnsmasq.conf и пропишите в нем:

port=53
listen-address=172.30.0.1

5) Пропишите хосты

В /etc/hosts добавьте строчки

172.30.0.25 nvidia

6) Включите драйвера br_netfilter

echo overlay >> /etc/modules-load.d/docker.conf
echo br_netfilter >> /etc/modules-load.d/docker.conf

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

1) В файле /etc/lxc/default.conf проверьте и закоментируйте строчки:

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

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

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

3) Внесите изменения в файл /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.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

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

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 0 * * * yes | docker container prune > /dev/null

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

aptitude install nvidia-driver-515

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 /usr/share/keyrings/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"

sed -i 's|deb https://|deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://|g' /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