GPU-Zugriff in Docker-Containern - NVIDIA und Intel einrichten

GPU-Zugriff in Docker-Containern - NVIDIA und Intel einrichten

GPU-Zugriff in Docker ermöglicht KI-Inferenz, Video-Transcodierung und Grafikverarbeitung direkt im Container – ohne die GPU manuell zu verwalten.

NVIDIA GPUs

Voraussetzungen

  1. NVIDIA-Treiber auf dem Host installiert (nvidia-smi muss funktionieren)
  2. NVIDIA Container Toolkit installieren:
# Ubuntu/Debian
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
  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' | \
  tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

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

GPU nutzen

# Alle GPUs zugänglich machen
docker run --rm --gpus all nvidia/cuda:12.3.1-base-ubuntu22.04 nvidia-smi

# Nur GPU 0 nutzen
docker run --gpus '"device=0"' myimage

# Zwei GPUs
docker run --gpus 2 myimage

In Compose

services:
  ai:
    image: pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

Verifizieren

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

Intel integrierte GPU (iGPU)

Für Video-Transcodierung mit Intel Quick Sync (z.B. in Jellyfin):

# Render-Device dem Container übergeben
docker run \
  --device /dev/dri/renderD128:/dev/dri/renderD128 \
  jellyfin/jellyfin
# In Compose
services:
  jellyfin:
    image: jellyfin/jellyfin
    devices:
      - /dev/dri/renderD128:/dev/dri/renderD128

Der Benutzer, der den Container ausführt, muss der Gruppe render angehören:

usermod -aG render $USER
ls -la /dev/dri/

Anwendungsfälle

KI/ML mit PyTorch oder TensorFlow:

docker run --gpus all \
  -v $(pwd):/workspace \
  pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime \
  python train.py

Stable Diffusion:

docker run --gpus all \
  -p 7860:7860 \
  -v $(pwd)/models:/app/models \
  ghcr.io/automatic1111/stable-diffusion-webui

Video-Transcodierung mit FFmpeg (NVIDIA NVENC):

docker run --gpus all \
  -v $(pwd):/video \
  nvcr.io/nvidia/cuda:12.3.1-base-ubuntu22.04 \
  ffmpeg -hwaccel cuda -i /video/input.mp4 -c:v h264_nvenc /video/output.mp4

Häufige Probleme

could not select device driver "nvidia": NVIDIA Container Toolkit nicht installiert oder Docker-Daemon nicht neu gestartet.

failed to initialize NVML: NVIDIA-Treiber auf dem Host fehlt oder ist nicht kompatibel mit CUDA-Version im Image.

Intel iGPU: Permission denied: Benutzer ist nicht in der render-Gruppe oder renderD128 hat falsche Rechte.

# Verfügbare Render-Devices anzeigen
ls -la /dev/dri/
# crw-rw---- 1 root render 226, 128 Nov 25 18:00 renderD128