[Tutorial] Transcodage Nvidia, Intel dans docker

  • Vague de SPAM

    Suite à une vague de spam sur le forum, les inscriptions sont temporairement limitées.

    Après votre inscription, un membre de l'équipe devra valider votre compte avant qu'il ne soit activé. Nous sommes désolés pour la gêne occasionnée et vous remercions de votre patience.

Drthrax74

Maître Jedi
Membre Confirmé
1 Janvier 2021
556
125
118
Bonjour,

Ce tutorial à pour objectif de faire fonctionner le transcodage (Décodage/encodage) matériel en direct ou dans docker.

Etape 0: BIOS
Si vous utilisez de la virtualisation, il est nécessaire d'activer la virtualisation, le IOMMU.


Etape 1: Récupérer Information GPU
GPU=$(lspci -vnnk | grep VGA | grep -i "HD" | cut -d " " -f 1)
lspci -vnnk -s $GPU | grep "VGA\|Kernel"

Le pilote en cours d'utilisation est i915 (Kernel driver in use)
#00:02.0 VGA compatible controller [0300]: Intel Corporation HD Graphics 620 [8086:5916] (rev 02) (prog-if 00 [VGA controller])
# Kernel driver in use: i915
# Kernel modules: i91


Etape 2a: Installer les pilotes graphiques
Intel:
apt install -y intel-opencl-icd
Nvidia:
# Blacklist du pilote libre
cat > /etc/modprobe.d/blacklist-nouveau.conf << EOF
blacklist nouveau
options nouveau modeset=0
EOF

# Mise à jour des modules
update-initramfs -u

# Déchargement du pilote à chaud
modprobe -r nouveau
lsmod | grep nouveau

# Pilote Nvidia
VERSION="560.35.03"
wget https://fr.download.nvidia.com/XFree86/Linux-x86_64/$VERSION/NVIDIA-Linux-x86_64-$VERSION.run -O /tmp/NVIDIA-Linux-x86_64.run;
ls /tmp/NVIDIA-Linux-x86_64.run

# Désinstallation des anciens pilotes
bash /tmp/NVIDIA-Linux-x86_64.run --uninstall --silent
apt purge -y *nvidia*
apt autoremove -y

# Installation du pilote Nvidia
bash /tmp/NVIDIA-Linux-x86_64.run


Etape 2b: Nvidia Container ToolKit
Indispensable pour faire du GPU dans docker.
# Dépendance:
apt install -y curl
apt install -y gnupg2

# Clé GPG
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# Dépôt
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

# Rechercher les Mises à jours
apt update

# Installation de Nvidia Container ToolKit:
apt install -y nvidia-container-toolkit

Pour rendre persistent les /dev/nvidia :
# Cree groupe:
groupadd -g 143 nvidia-persistenced

# Creation User:
useradd -c 'NVIDIA Persistence Daemon' -u 143 -g nvidia-persistenced -d '/' -s /sbin/nologin nvidia-persistenced

# Creation d'un service:
cat > /etc/systemd/system/nvidia-persistenced.service << EOF
[Unit]
Description=NVIDIA Persistence Daemon
[Service]
Type=forking
PIDFile=/var/run/nvidia-persistenced/nvidia-persistenced.pid
Restart=always
ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced --persistence-mode --verbose
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced
[Install]
WantedBy=multi-user.target
EOF

# Création d'un fichier drop-in
cat > /etc/systemd/system/nvidia-persistenced.service.d/override.conf << EOF
[Unit]
After=sockets.target
EOF

systemctl daemon-reload
systemctl enable --now nvidia-persistenced.service
systemctl status nvidia-persistenced.service

# Vérification
ls /dev/nvi*

Etape 3: Moniteur de chage GPU
Paquet à installer sur la machine hôte et à taper sur l'hôte pour voir la charge.
Intel:
apt install -y intel-gpu-tools
intel_gpu_top
Nvidia:
watch -n 0.5 nvidia-smi


Etape 4: Docker + GPU
Intel:

1736059252374.png


###########
services: #
###########################################################
XXXXXXXX: #
# ----------------------------------------------------- #
image: 'XXXXXXXXXXXXXXXXXXXX' #
container_name: 'XXXXXXXX' #
network_mode: 'bridge' #
restart: 'unless-stopped' #
hostname: 'XXXXXXXX' #
# ----------------------------------------------------- #
group_add: #
- 44 # Video
- 105 # Render
# ----------------------------------------------------- #
environment: #
DOCKER_MODS: 'linuxserver/mods:jellyfin-opencl-intel' #
# ----------------------------------------------------- #
devices: #
- '/dev/dri:/dev/dri' #
###########################################################

Nvidia:
Sous Nvidia, un conteneur spécialement dédiée permet de vérifier son fonctionnement
# Test de fonctionnement
docker container rm -f NVIDIA
docker run --rm --name NVIDIA --gpus all nvidia/cuda:12.4.0-devel-ubi8 nvidia-smi
docker image rm -f nvidia/cuda:12.4.0-devel-ubi8

services:
XXXXXXXX:
image: 'XXXXXXXXXXXXXXXXXXXX'
container_name: 'XXXXXXXX'
network_mode: 'bridge'
restart: 'unless-stopped'
hostname: 'XXXXXXXX'
runtime: 'nvidia'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
devices:
- '/dev/dri:/dev/dri'
- '/dev/nvidia0:/dev/nvidia0'

Etape 5: Nvidia GPU Support Encode / Decode
 

Pièces jointes

  • 1736059211718.png
    1736059211718.png
    20.1 KB · Affichages: 0
Dernière édition:
Exemple de résultat avec un GPU Nvidia.

Mon conteneur Tdarr de conversion multimédias utilise le GPU et plus le CPU !

Charge CPU : Aucune activité !
1736060329046.png

Charge GPU:
1736060218861.png
 
Bonjour,
Merci pour ce tutoriel.

Avec cette méthode peu on partager le GPU sur 2 containers différents?
Genre Jellyfin + Frigate?

Merci de ta reponse