Как запустить контейнеры с поддержкой GPU в Proxmox

от virtualizationhowto
0 Комментарии 137 просмотров 12 мин на чтение

GPU уже определённо используются не только геймерами или майнерами криптовалюты. Они также стали ключевым оборудованием при работе с ИИ, кодированием медиа и задачами вроде машинного обучения. Даже в домашней лаборатории мы можем использовать GPU для ускорения окружения при выполнении многих новых и интересных рабочих нагрузок, таких как локально размещённый приватный ИИ. Это включает использование GPU-ускорения в таких вещах, как Kubernetes, LXC и Docker-контейнеры.

Контейнеры LXC и Docker с пробросом GPU в Proxmox

Контейнеры LXC и Docker с пробросом GPU в Proxmox

При работе с контейнерами вы можете настроить GPU-совместимые контейнеры в своей домашней лаборатории, чтобы использовать аппаратное GPU-ускорение. Давайте посмотрим, зачем это нужно и как это настроить.

Зачем беспокоиться о GPU-ускорении в домашней лаборатории?

Вы, конечно, можете выполнять многозадачность и запускать серьёзные рабочие нагрузки на современных процессорах. Однако GPU гораздо эффективнее справляются с задачами, выполняемыми параллельно. Модели ИИ опираются на тысячи потоков, которые выполняются одновременно, и только GPU способны обработать такую нагрузку с высокой производительностью. Большинство из нас испытывали это даже на очень быстром современном CPU. Если запускать модели ИИ только на CPU, ответы в чатах идут чрезвычайно медленно в терминах «токенов в секунду» по сравнению с использованием GPU для локального ИИ.

Обратите внимание на следующие рабочие нагрузки, которые выиграют от наличия GPU:

  • ИИ: Это, вероятно, главный сценарий сейчас. Самостоятельно размещённый ИИ — отличный способ гарантировать, что вы владеете и контролируете данные вашего ИИ-чата
  • Медиа-серверы: Решения вроде Jellyfin, Plex и HandBrake могут использовать GPU для кодирования H.264, H.265 и AV1
  • Эксперименты с машинным обучением: Вы можете использовать такие инструменты, как PyTorch и TensorFlow, чтобы перенести тяжёлые вычисления на GPU
  • Параллельная обработка данных: Вы можете использовать инструменты, такие как RAPIDS или базы данных с ускорением на CUDA, чтобы тестировать рабочие процессы данных без необходимости в облачных ресурсах

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

Шаг 1: Проверьте оборудование и драйверы

Первый шаг зависит от вашего оборудования. Прежде чем углубляться в настройки Docker или Kubernetes, убедитесь, что у вас есть оборудование, поддерживающее передачу (проброс) GPU (passthrough).

Обычно это включает следующее:

  1. GPU NVIDIA: Большинство карт GTX, RTX и дата-центровых карт (например, A2000 или A6000) поддерживают CUDA. Драйверы NVIDIA доступны для хостов на Linux и Windows.
  2. GPU AMD: Многие современные Radeon GPU поддерживают ROCm — открытую платформу вычислений от AMD. Поддержка контейнеров AMD улучшилась в 2025 году и теперь имеет официальную интеграцию с Docker.
  3. GPU Intel: Intel Arc и встроенная графика Iris Xe поддерживают ускорение GPU с помощью Intel GPU Tools и рантайма OneAPI

Далее проверьте, поддерживает ли ваш BIOS IOMMU и включены ли расширения виртуализации. Это гарантирует, что GPU можно изолировать для проброса или прямого доступа.

Iommu in the bios for GPU accelerated containers
IOMMU в BIOS для GPU-ускоренных контейнеров

Если вы хотите использовать командную строку, вы также можете проверить IOMMU и виртуализацию AMD для ввода-вывода таким образом. Ниже мы проверяем, включены ли IOMMU и AMD-Vi.

dmesg | grep -e IOMMU -e AMD-Vi
Checking iommu from the command line
Проверка IOMMU через командную строку

Шаг 2: Установите драйверы GPU и рантайм

Для большинства домашних лабораторий на базе Linux вам нужно установить правильные драйверы на хост-систему. Посмотрите обзор ниже, если вы запускаете Docker-контейнеры на «голом» железе с установленным Linux или на виртуальной машине с Linux поверх гипервизора.

Gpu acceleration with gpu driver and container toolkit
Ускорение GPU с помощью драйвера и контейнерного тулкита

NVIDIA:

Использование graphics-drivers/ppa с последующим указанием nvidia-driver-latest обычно обеспечивает установку последнего драйвера.

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install -y nvidia-driver-latest
sudo reboot

После установки драйверов вы можете проверить, что они установлены и оборудование работает, командой nvidia-smi:

sudo nvidia-smi
Running the nvidia smi command
Выполнение команды nvidia-smi

Важно: NVIDIA Container Toolkit устанавливается только на хост-систему (то есть на Docker-хост), а не внутри ваших контейнеров. Этот пакет действует как мост между Docker и драйверами NVIDIA. Он позволяет контейнерам получить доступ к GPU-оборудованию. Контейнеры будут автоматически использовать драйверы хоста, поэтому вам не нужно устанавливать драйверы внутри контейнера. Если вашему приложению нужны библиотеки CUDA, вы можете использовать предсобранные базовые образы NVIDIA (например, nvidia/cuda), которые уже включают их.

Далее установите NVIDIA Container Toolkit, который позволяет Docker взаимодействовать с GPU:

# Добавить репозиторий NVIDIA Container Toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.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

sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

Вы можете убедиться в доступе к GPU внутри контейнеров с помощью:

docker run --rm --gpus all nvidia/cuda:12.5.0-base-ubuntu22.04 nvidia-smi

AMD

Установите ROCm и пакеты поддержки контейнеров:

sudo apt install -y rocm-dkms

Для интеграции с Docker AMD предоставляет образ рантайма ROCm, который вы можете протестировать:

docker run --device=/dev/kfd --device=/dev/dri --group-add video \
  rocm/pytorch:latest rocm-smi

Intel

Для Intel Arc и встраиваемой графики необходимо установить рантайм Intel GPU:

sudo apt install -y intel-opencl-icd intel-level-zero-gpu level-zero

Вы можете проверить доступ к GPU с помощью:

docker run --device /dev/dri intel/oneapi-basekit

А что насчёт LXC-контейнеров?

Для LXC-контейнеров всё зависит от того, что вы запускаете внутри LXC. Если вы запускаете приложения непосредственно внутри LXC (без Docker), вам нужно установить драйверы NVIDIA внутри самого LXC-контейнера, но вам НЕ нужно устанавливать container toolkit.

Lxc containers without docker for gpu enabled containers
LXC-контейнеры без Docker для GPU-ускорения
sudo apt update
sudo apt install -y nvidia-driver-latest

Если вы запускаете Docker внутри LXC-контейнера, тогда вам нужно установить и драйвер NVIDIA, и Container Toolkit.

Lxc container running docker for gpu acceleration
LXC-контейнер с Docker для GPU-ускорения

Команды для выполнения в этом случае:

# Установить драйверы
sudo apt update
sudo apt install -y nvidia-driver-latest

# Установить Docker (если не установлен)
curl -fsSL https://get.docker.com | sh

# Установить Container Toolkit
sudo add-apt-repository ppa:graphics-drivers/ppa
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
# ... (остальная часть установки Container Toolkit)

Шаг 3: Запуск GPU-рабочих нагрузок

После того как вы пройдёте этапы с оборудованием и драйверами, мы можем настроить Docker для использования вашего GPU в качестве устройства рантайма. Эта часть довольно проста — нужно передать флаги в команду Docker для обнаружения всех доступных GPU или добавить это в Docker Compose.

1. Ollama или OpenWebUI для локального ИИ

Если вы экспериментируете с локальными LLM, такими как Llama 3 или Mistral, вы можете запускать их прямо в Docker с GPU-ускорением:

docker run -d --gpus all -p 3000:3000 \
  -v /opt/openwebui:/data \
  ghcr.io/open-webui/open-webui:latest
Running docker container with gpus all command
Запуск Docker-контейнера с флагом —gpus all

Вы также можете указать доступ к GPU в вашем файле Docker Compose:

services:
  ollama:
    image: ollama/ollama
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    volumes:
      - /opt/ollama:/root/.ollama
    ports:
      - 11434:11434

2. Plex или Jellyfin для GPU-транскодирования

Если вы используете домашнюю лабораторию как медиа-сервер, GPU-ускорение существенно улучшает производительность стриминга и энергоэффективность. Примечание: Plex требует подписки Plex Pass для аппаратного транскодирования.

services:
  plex:
    image: linuxserver/plex
    container_name: plex
    runtime: nvidia
    environment:
      - PUID=1000
      - PGID=1000
      - VERSION=docker
      - NVIDIA_VISIBLE_DEVICES=all
      - NVIDIA_DRIVER_CAPABILITIES=all
    volumes:
      - /opt/plex/config:/config
      - /media:/media
    ports:
      - 32400:32400
    restart: unless-stopped

Вот пример Plex с Intel QuickSync:

services:
  plex:
    image: linuxserver/plex
    container_name: plex
    devices:
      - /dev/dri:/dev/dri  # Intel QuickSync
    environment:
      - PUID=1000
      - PGID=1000
      - VERSION=docker
    volumes:
      - /opt/plex/config:/config
      - /media:/media
    ports:
      - 32400:32400
    restart: unless-stopped

Вот пример Jellyfin, который является open-source и использует NVIDIA-устройства:

services:
  jellyfin:
    image: jellyfin/jellyfin
    container_name: jellyfin
    # Для NVIDIA:
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    # Для Intel/AMD:
    devices:
      - /dev/dri:/dev/dri
    volumes:
      - /opt/jellyfin/config:/config
      - /opt/jellyfin/cache:/cache
      - /media:/media
    ports:
      - 8096:8096
    restart: unless-stopped

Вы можете включить аппаратное ускорение в настройках Plex в разделе Transcoder. Включите «Использовать аппаратное ускорение, когда доступно». В Jellyfin перейдите в Dashboard > Playback > Transcoding. Там установите аппаратное ускорение на NVIDIA, Intel QuickSync или VAAPI и т.д.

3. Машинное обучение с TensorFlow или PyTorch

Если вы экспериментируете с ML-моделями локально, использование GPU-совместимых контейнеров даёт огромный прирост производительности.

Быстрый тест TensorFlow на GPU:

docker run --gpus all -it --rm tensorflow/tensorflow:latest-gpu bash
python -c "import tensorflow as tf; print('GPUs Available:', tf.config.list_physical_devices('GPU'))"

PyTorch с NVIDIA:

# Тест доступа PyTorch к GPU:
docker run --gpus all -it --rm pytorch/pytorch:latest bash
python -c "import torch; print('CUDA Available:', torch.cuda.is_available()); print('GPU Count:', torch.cuda.device_count())"

PyTorch с AMD ROCm:

# Для Radeon RX 7000/9000 серии AMD:
docker run -it --rm \
  --device=/dev/kfd --device=/dev/dri \
  --group-add video \
  rocm/pytorch:latest bash

python -c "import torch; print('ROCm Available:', torch.cuda.is_available())"

Шаг 4: GPU в Kubernetes или MicroK8s

Если вы перешли на Kubernetes в вашей домашней лаборатории, вы можете использовать планирование GPU для ваших рабочих нагрузок. Предварительные требования: Убедитесь, что драйверы NVIDIA и Container Toolkit установлены на всех узлах, которые будут запускать GPU-рабочие нагрузки (см. Шаг 2 выше).

NVIDIA

# Использование kubectl (проверьте последнюю версию)
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.16.2/deployments/static/nvidia-device-plugin.yml

Или вы можете сделать это с помощью Helm:

helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
helm repo update
helm install nvidia-device-plugin nvdp/nvidia-device-plugin \
  --namespace kube-system \
  --create-namespace

Затем вы можете проверить обнаружение GPU с помощью:

kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.capacity.'nvidia\.com/gpu'

Затем вы можете добавить запросы на GPU в спецификацию Pod:

apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: gpu-test
      image: nvidia/cuda:12.5.0-base-ubuntu22.04
      resources:
        limits:
          nvidia.com/gpu: 1  # Запрос 1 GPU
      command: ["nvidia-smi"]
      args: ["-L"]  # Перечислить GPU и выйти (для тестирования)

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

resources:
  limits:
    nvidia.com/gpu: 1  # Или "2" для нескольких GPU

MicroK8s также включает встроенный аддон GPU, который автоматически настраивает драйверы для поддерживаемого оборудования, что делает процесс очень простым. Примечание: Это предполагает, что вы уже установили драйверы NVIDIA и Container Toolkit на хост MicroK8s. Аддон развёртывает только device plugin, а не сами драйверы.

microk8s enable gpu

AMD

AMD имеет плагин устройства для Kubernetes через ROCm:

kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/master/k8s-ds-amd-gpu-dp.yaml

Затем вы можете планировать GPU-рабочие нагрузки аналогичным образом:

resources:
  limits:
    amd.com/gpu: 1

Шаг 5: Устранение неполадок

Если контейнеры «не видят» GPU, вы можете пройти базовую диагностику с помощью нескольких команд на уровне хоста.

# Для NVIDIA:
nvidia-smi

# Для AMD:
rocm-smi

# Проверьте наличие устройств:
ls -la /dev/nvidia* /dev/dri/

Если nvidia-smi не работает на хосте, значит, проблема с установкой драйвера. После проверки уровня хоста, если нужно протестировать доступ к GPU внутри контейнера, выполните следующее:

# Для NVIDIA:
docker run --rm --gpus all nvidia/cuda:12.5.0-base-ubuntu22.04 nvidia-smi

# Проверить, что устройства примонтированы:
docker run --rm --gpus all nvidia/cuda:12.5.0-base-ubuntu22.04 ls -la /dev/nvidia*

Вы также можете использовать инструменты вроде watch nvidia-smi, чтобы отслеживать активные процессы на GPU, когда контейнеры запускаются, чтобы увидеть, используют ли они GPU.

Шаг 6: Мониторинг

Когда ваши GPU-рабочие нагрузки работают, мониторинг помогает оптимизировать распределение ресурсов и раннее обнаружение проблем. Вы можете использовать открытое решение с Prometheus и NVIDIA DCGM Exporter, которое рекомендуется для сбора статистики и метрик:

NVIDIA

Вы можете развернуть DCGM Exporter на каждом GPU-узле для экспорта метрик.

docker run -d --restart=unless-stopped \
  --gpus all \
  --name dcgm-exporter \
  -p 9400:9400 \
  nvcr.io/nvidia/k8s/dcgm-exporter:3.3.5-3.4.0-ubuntu22.04

# Kubernetes
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm install dcgm-exporter gpu-helm-charts/dcgm-exporter --namespace gpu-monitoring

Затем вы можете настроить Prometheus для скрапинга метрик:

scrape_configs:
  - job_name: 'dcgm'
    static_configs:
      - targets: ['localhost:9400']

AMD

Используйте экспортер ROCm SMI:

git clone https://github.com/platina-systems/rocm_smi_exporter
cd rocm_smi_exporter
python3 rocm_smi_exporter.py

Рекомендуемые модели GPU

Обратите внимание на несколько рекомендаций по GPU для различных рабочих нагрузок и задач на 2025–2026 годы с моделями, которые нам известны на текущий момент.

Для задач AI/ML

GPU VRAM TDP Прибл. цена Лучше всего для Доступность
NVIDIA RTX 5070 12GB GDDR7 250W 60 000 руб Начальный уровень для ИИ, заявляет производительность RTX 4090 с DLSS 4 Доступна сейчас
NVIDIA RTX 5080 16GB GDDR7 360W 120 000 руб Серьёзные ИИ-задачи, 4K-гейминг Доступна сейчас
NVIDIA RTX Pro 4000 SFF 20GB GDDR6 70W 170 000 руб Компактные серверы, низкое энергопотребление Доступна сейчас
AMD Radeon RX 9070 XT 16GB 300W 75 000 руб ROCm-совместимые ИИ-задачи, дружелюбна к open-source Доступна сейчас
AMD Radeon RX 9070 (желательно модель 48GB) 48GB 350W 150 000 руб Большие языковые модели, огромные датасеты В России практически недоступна сейчас
Intel Arc B770 16GB GDDR6 225W 36 000 руб Бюджетный ИИ, медиа-транскодирование Доступна сейчас

Для медиатранскодирования (Plex/Jellyfin и т.д.)

GPU VRAM TDP Прибл. цена Лучше всего для Доступность
Intel Arc B580 12GB 190W 32 000 руб Самая выгодная, справляется с 10+ потоками, AV1-кодирование Доступна сейчас
Intel Arc Pro B50 16GB 70W 32 000 руб Низкопрофильные, компактные сборки Доступна сейчас
Intel Arc A770 16GB 225W 45 000 руб Зрелые драйверы, проверенная производительность Доступна сейчас
NVIDIA RTX 5050 8GB 130W 27 000 руб NVENC-кодирование, компактна Доступна сейчас

Для бюджетных домашних лабораторий

GPU VRAM TDP Прибл. цена Лучше всего для Доступность
Intel Arc B580 12GB 190W 32 000 руб Лучшая общая ценность для ИИ + транскодирования Доступна сейчас
AMD Radeon RX 7700 XT 12GB 245W 50 000 руб Надёжная поддержка ROCm, игровая карта Доступна сейчас
Intel Arc A380 6GB 75W 14 000 руб Ультра-бюджетное транскодирование Доступна сейчас

В заключение

Нет сомнений, что GPU-совместимые контейнеры — одна из крупнейших эволюций в современной домашней лаборатории. С учётом растущих требований к рабочим нагрузкам, таких как ИИ, машинное обучение и обработка медиа, нам всё чаще потребуется такая конфигурация. Процесс настройки стал значительно проще благодаря NVIDIA Container Toolkit и интеграции ROCm от AMD, а также растущей поддержке со стороны Intel.

С одним GPU и небольшими настройками вы можете открыть новый уровень производительности для задач ИИ и медиа. Напишите в комментариях — используете ли вы GPU-совместимые контейнеры?

Источник на английском языке

Читайте про умный дом:
Даже просто подбор, перевод и оформление статей требуют времени. А самостоятельный обзор устройств требует еще и финансовых вложений. Если Вы хотите больше обзоров, Вы можете помочь автору.

Вам может понравиться

Оставить комментарий