Привет! Если вы когда-либо хотели использовать мощь вашей видеокарты Nvidia внутри непривилегированных LXC-контейнеров и Docker, вы попали по адресу. Я недавно прошёл через этот процесс сам и хотел бы поделиться с вами, как это сделать. Давайте разберёмся, как настроить проброс Nvidia GPU в непривилегированные LXC-контейнеры и Docker.

Зачем Настраивать Nvidia GPU Passthrough в Непривилегированных LXC Контейнерах?

Использование проброса Nvidia GPU в непривилегированных LXC-контейнерах позволяет запускать приложения с ускорением на GPU безопасно и эффективно. Если вы занимаетесь машинным обучением, обработкой данных или высокопроизводительными вычислениями, такая настройка может значительно повысить производительность ваших контейнеризированных приложений.

Предварительные Требования

Перед началом убедитесь, что у вас есть следующее:

  • Видеокарта Nvidia, установленная на вашем хостовом компьютере.
  • Настроенные непривилегированные LXC-контейнеры.
  • Установленный Docker как на хосте, так и внутри LXC-контейнера.
  • Базовые знания работы с командной строкой Linux.

Шаг 1: Проверка Текущих Устройств GPU

Для начала давайте убедимся, что ваш хост распознаёт устройства Nvidia GPU. Откройте терминал и выполните:

sudo ls -al /dev/nvidia*

Вы должны увидеть вывод, похожий на этот:

# Пример вывода
# crw-rw-rw- 1 root root 195,   0 Sep  6 21:23 /dev/nvidia0
# crw-rw-rw- 1 root root 195, 255 Sep  6 21:23 /dev/nvidiactl
# crw-rw-rw- 1 root root 508,   0 Sep  6 21:23 /dev/nvidia-uvm
# crw-rw-rw- 1 root root 508,   1 Sep  6 21:23 /dev/nvidia-uvm-tools

Это подтверждает, что ваши устройства Nvidia GPU корректно распознаны системой хоста.

Шаг 2: Настройка Непривилегированного LXC-Контейнера для Nvidia GPU

Теперь настроим непривилегированный LXC-контейнер для разрешения проброса GPU. Отредактируйте файл конфигурации контейнера, обычно расположенный по пути /var/lib/lxc/<имя_вашего_контейнера>/config, и добавьте следующие строки:

lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 508:* 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-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
💡
Убедитесь, что заменили <имя_вашего_контейнера> на фактическое имя вашего контейнера.

Эти настройки позволяют контейнеру получить доступ к устройствам Nvidia на хосте, сохраняя при этом ограничения безопасности непривилегированного контейнера.

Шаг 3: Установка Драйвера Nvidia в Непривилегированном LXC-Контейнере

Далее установим драйвер Nvidia внутри непривилегированного LXC-контейнера. Вот как это сделал я:

# Установка GnuPG
apt install gnupg -y

# Создание каталога для ключей
mkdir -p /etc/apt/keyrings

# Добавление ключа репозитория Nvidia
curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/3bf863cc.pub | gpg --dearmor -o /etc/apt/keyrings/nvidia-archive-keyring.gpg

# Добавление репозитория Nvidia
echo "deb [signed-by=/etc/apt/keyrings/nvidia-archive-keyring.gpg] https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/ /" | tee /etc/apt/sources.list.d/nvidia-cuda-debian12.list

# Обновление списков пакетов
apt update

# Установка драйвера Nvidia
apt install nvidia-driver
💪
Если вы используете другую версию Debian или Ubuntu, обязательно скорректируйте URL репозитория соответствующим образом.

Шаг 4: Удаление Модулей Ядра Nvidia

Чтобы избежать конфликтов, необходимо удалить модули ядра Nvidia, которые не требуются внутри контейнера:

# Удаление модулей ядра Nvidia
apt remove --purge nvidia-kernel-dkms nvidia-kernel-source

Шаг 5: Добавление Модулей Nvidia в Чёрный Список

Далее добавим модули ядра Nvidia в чёрный список, чтобы предотвратить их загрузку внутри контейнера:

nano /etc/modprobe.d/blacklist-nvidia.conf

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

blacklist nvidia
blacklist nvidia_uvm
blacklist nvidia_modeset
blacklist nvidia_drm
💪
Этот шаг важен для предотвращения конфликтов между драйверами Nvidia контейнера и хоста.

Шаг 6: Проверка Установки Драйвера Nvidia

После перезагрузки контейнера проверьте, работает ли драйвер Nvidia внутри вашего непривилегированного LXC-контейнера:

# Проверка драйвера Nvidia
nvidia-smi

Вы должны увидеть таблицу с деталями вашей видеокарты, что подтверждает корректную работу драйвера.

Шаг 7: Настройка Docker для Использования GPU внутри Непривилегированного LXC-Контейнера

Чтобы использовать GPU внутри Docker в непривилегированном LXC-контейнере, установите Nvidia Container Toolkit:

# Установка Nvidia Container Toolkit
apt install nvidia-container-toolkit

Отредактируйте файл конфигурации демона Docker:

nano /etc/docker/daemon.json

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

{
  "default-runtime": "nvidia",
  "runtimes": {
  "nvidia": {
    "path": "nvidia-container-runtime",
    "runtimeArgs": []
  }
  }
}

Перезапустите службу Docker, чтобы применить изменения:

systemctl restart docker

Затем отредактируйте конфигурацию Nvidia Container Runtime:

nano /etc/nvidia-container-runtime/config.toml

Установите no-cgroups = true в файле конфигурации:

# Установка no-cgroups в true
no-cgroups = true
💡
Установка no-cgroups = true необходима для работы Docker с поддержкой GPU внутри непривилегированного LXC-контейнера.

Шаг 8: Запуск Тестового Docker-Контейнера

Теперь запустим тестовый Docker-контейнер, чтобы убедиться, что всё работает как ожидается:

# Запуск тестового Docker-контейнера для проверки использования GPU
docker run --gpus all nvidia/cuda:12.6.1-base-ubuntu24.04 nvidia-smi

Если всё настроено правильно, вы увидите детали GPU внутри Docker-контейнера, работающего внутри вашего непривилегированного LXC-контейнера.

✔️
Отлично! Вы настроили проброс Nvidia GPU в непривилегированном LXC-контейнере и Docker.

Устранение Общих Проблем

Диаграмма, показывающая поток ресурсов GPU
Диаграмма, показывающая поток ресурсов GPU от хост-машины в непривилегированные LXC-контейнеры.

Ошибки «Permission Denied»

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

Несоответствие Версий Драйверов

Убедитесь, что версии драйверов Nvidia на хосте и внутри контейнера совместимы. Несовпадение версий может привести к непредвиденным ошибкам.

Ошибки Runtime Docker

Если Docker сообщает об ошибках runtime, перепроверьте daemon.json и убедитесь, что runtime Nvidia настроен правильно.

Лучшие Практики для Непривилегированных LXC-Контейнеров

Соображения Безопасности

Непривилегированные LXC-контейнеры разработаны для повышения безопасности. Тщательно настраивая доступ к устройствам, вы сохраняете преимущества безопасности, позволяя при этом проброс GPU.

Управление Ресурсами

Вы можете ограничить доступные контейнеру ресурсы GPU, настроив параметры cgroup, обеспечивая справедливое распределение ресурсов между несколькими контейнерами.

Дополнительные Советы

Обновление Драйверов Nvidia

Если вам нужно обновить драйверы Nvidia внутри вашего непривилегированного LXC-контейнера, убедитесь, что версии синхронизированы с хостом, чтобы избежать проблем совместимости.

Мониторинг Использования GPU

Инструменты, такие как nvidia-smi, помогут вам мониторить использование GPU внутри ваших контейнеров. Я часто использую его, чтобы убедиться, что мои приложения эффективно используют GPU.

Заключение

Настройка проброса Nvidia GPU в непривилегированных LXC-контейнерах и Docker может показаться сложной на первый взгляд, но с правильными шагами это вполне достижимо. Я нашёл эту настройку невероятно полезной для своих проектов и надеюсь, что она пригодится и вам. Не стесняйтесь обращаться, если у вас есть вопросы или возникнут проблемы!

Дополнительные Ресурсы