Formation MLOps · Dotika · Bonus · 2 h · optionnel

Pour aller plus loin :
le GPU

L'usine à calcul — comprendre quand elle sert, quand elle ne sert à rien, et comment la brancher à vos conteneurs.

L'objectif du bonus

Savoir quand un GPU sert — et quand il ne sert à rien — et savoir en donner un à un conteneur

Deux heures, hors fil rouge, ton détendu. À la fin : vous expliquez CPU vs GPU à n'importe qui, vous lisez nvidia-smi comme un tableau de bord, et vos conteneurs voient la carte avec --gpus.

Bonus · 2 h · théo 0h40 / prat 1h20

Deux heures, trois temps

0h40
GPU vs CPU & écosystème CUDA / cuDNNL'usine et l'artisan, pourquoi le ML adore les GPU — et pourquoi notre fraude s'en moque.
théorie
0h50
NVIDIA Container Toolkit : conteneurs avec accès GPU (--gpus, nvidia-smi)Installer le pont, ouvrir l'usine au conteneur, lire le tableau de bord.
pratique
0h30
Images de base CUDA & comparaison CPU vs GPUChoisir sa base -runtime, puis chronométrer la course sur un vrai entraînement.
pratique
Acte 1 · théo 0h40

L'usine
et l'artisan

Feynman · 3 minutes

Quelques artisans, ou dix mille ouvriers

Le CPU — l'artisan
Quelques cœurs très rapides et très malins : ils font tout — le système, le navigateur, pandas — et improvisent à chaque instruction.
8–16 cœurs, polyvalents
Le GPU — l'usine
Des milliers d'ouvriers simples qui font tous le même geste, en même temps, sur des données différentes. Nuls pour improviser, imbattables pour répéter.
10 000+ cœurs, spécialisés
Toute la question du bonus tient là : votre calcul est-il un travail d'artisan ou un travail d'usine ?
Sous le capot

Trois choses à savoir sur la carte

Des milliers de cœurs
Groupés en unités qui exécutent la même instruction sur des données différentes. Un chef d'orchestre, dix mille exécutants synchrones.
Sa propre mémoire
La VRAM : 8 à 80 Go collés au calcul, avec un débit énorme. Si le modèle ne tient pas dedans, l'usine tourne à vide.
Un bus d'accès
Le PCIe : la navette entre CPU et GPU. Chaque aller-retour coûte cher — c'est souvent lui, le vrai goulot d'étranglement.

Première leçon d'honnêteté : copier les données vers l'usine coûte parfois plus cher que le calcul lui-même. Petit calcul = le voyage n'en vaut pas la peine.

Le mariage parfait

Le même geste,
des millions de fois

Un réseau de neurones, sous le capot, c'est presque uniquement des multiplications de matrices : la même opération, répétée sur des millions de nombres indépendants. Exactement le travail d'usine — chaque ouvrier prend sa case, personne n'attend personne.

Le deep learning n'a pas rencontré le GPU par hasard : il a explosé le jour où l'usine a ouvert.

A × B : chaque case se calcule seule × = 1 case = 1 ouvrier des millions de cases indépendantes → toutes en parallèle
La multiplication de matrices : le travail d'usine par excellence.
L'honnêteté d'ingénieur

Notre détecteur de fraude n'en veut pas

Notre régression logistique s'entraîne en 2 secondes sur CPU. Un GPU n'y changerait rien — sauf la facture.

Données tabulaires modestes, modèle linéaire, scikit-learn : le CPU suffit très largement. Réclamer un GPU ici, c'est acheter une usine pour visser une étagère. L'honnêteté d'ingénieur commence par savoir dire « je n'en ai pas besoin ».

scikit-learn · CPU2 s d'entraînementGPU : 0 € économisé, 0 s gagnée
L'autre côté de la balance

Quatre situations où l'usine s'impose

Cas 1
Deep learning
Des millions de poids à ajuster : des jours de calcul sur CPU deviennent des heures sur GPU. Là, l'usine se rentabilise.
Cas 2
Images & vision
Des convolutions sur des millions de pixels — le même geste sur chaque pixel. Le travail d'usine par définition.
Cas 3
LLM
Des dizaines de milliards de paramètres, à l'entraînement comme à l'inférence. Sans GPU, chaque réponse prendrait des minutes.
Cas 4
Gros volumes, réentraînements fréquents
Quand l'entraînement se compte en heures et revient chaque semaine — le continuous training du bloc 8 — chaque accélération paie.
L'écosystème NVIDIA

CUDA, cuDNN, driver : qui fait quoi

CUDA — le langage de l'usine
Le dialecte NVIDIA pour programmer le GPU. Vous ne l'écrirez sans doute jamais : PyTorch et TensorFlow le parlent pour vous.
cuDNN — les gestes optimisés
Les opérations de deep learning pré-réglées à la perfection : convolutions, attention… Des années d'optimisation, gratuites.
Le driver — le contremaître
Le seul qui parle vraiment à la carte. Il vit sur la machine hôte — et uniquement là. Retenez-le pour l'acte 2.

Vous n'écrirez jamais de CUDA — mais savoir qui fait quoi évite 90 % des pannes d'installation.

Qui parle à qui

Votre code ne touche
jamais la carte

PyTorch appelle cuDNN, qui parle CUDA, que le driver traduit pour le silicium. Chaque couche a sa version — et les versions doivent s'aimer entre voisines. La quasi-totalité des « ça ne marche pas » GPU vient de là.

Une installation GPU qui rate, c'est presque toujours deux couches voisines qui ne parlent pas la même version.

votre code Python PyTorch / TensorFlow cuDNN CUDA toolkit driver NVIDIA — sur l'hôte GPU — le silicium
Six couches — chacune ne parle qu'à ses voisines directes.
Acte 2 · prat

Le GPU
en conteneur

Le problème

Le conteneur
ne voit pas la carte

Par défaut, Docker isole — c'est son métier, c'est ce qu'on a appris à aimer au bloc 4. Mais le GPU est un périphérique de l'hôte : sans pont explicite, le conteneur n'en soupçonne même pas l'existence.

L'isolation est une qualité — jusqu'au jour où l'on veut partager la carte graphique.

$ docker run pytorch/pytorch python -c \
  "import torch; print(torch.cuda.is_available())"
False  # le conteneur est aveugle

$ nvidia-smi
# … la carte est pourtant bien là, sur l'hôte
Même machine, deux mondes : l'hôte voit la carte, le conteneur non.
La solution

NVIDIA Container Toolkit, le pont officiel

Le toolkit monte le driver de l'hôte dans le conteneur — la carte devient visible, sans rien installer dans l'image.

Il s'installe une fois sur la machine hôte, se déclare auprès de Docker, puis dort jusqu'à ce qu'un conteneur demande un GPU. Souvenez-vous de la pile : le driver reste sur l'hôte, le toolkit se charge de le prêter proprement.

apt install nvidia-container-toolkitnvidia-ctk runtime configureune fois par machine, pas par image
Le geste

Un flag, et l'usine s'ouvre

Une fois le toolkit en place, tout tient dans un drapeau au moment du docker run.

$ docker run --gpus all nvidia/cuda:12.4.1-runtime-ubuntu22.04 nvidia-smi
# la carte apparaît DANS le conteneur

$ docker run --gpus '"device=0"' …  # ou une carte précise

--gpus all prête toutes les cartes ; device=0 en choisit une — le bon réflexe quand la machine est partagée entre binômes, comme cet après-midi.

Le tableau de bord de l'usine

nvidia-smi :
trois chiffres à lire

L'utilisation — l'usine tourne-t-elle, ou dort-elle pendant que vous payez ? La mémoire — le modèle tient-il dans la VRAM, ou va-t-il déborder ? La température — l'usine chauffe, c'est normal ; elle brûle, ça ne l'est pas.

Le réflexe : nvidia-smi avant d'accuser le code. Une usine à 0 % pendant l'entraînement, c'est un calcul resté chez l'artisan.

$ nvidia-smi
+-----------------------------------------------+
| NVIDIA-SMI 550.54       CUDA Version: 12.4 |
|-----------------------------------------------|
| GPU  Name        Temp  Util   Memory      |
| 0    RTX 4090    62C   97%    18.4/24 GiB |
+-----------------------------------------------+
# util 97 % : l'usine travaille vraiment
Le même outil, sur l'hôte ou dans le conteneur — c'est ça, la preuve du pont.
Le choix de la base

nvidia/cuda : -runtime ou -devel ?

nvidia/cuda:…-runtime
Pour exécuter
  • Les bibliothèques CUDA prêtes à l'emploi — de quoi faire tourner PyTorch
  • ~2 à 3 Go : la bonne base pour servir et entraîner
  • Votre choix par défaut — celui du lab
nvidia/cuda:…-devel
Pour compiler
  • Le compilateur nvcc, les headers, tout l'atelier
  • ~7 à 8 Go : le double ou le triple, pour rien si vous ne compilez pas
  • Réservée à qui écrit ou compile du CUDA

Il existe aussi -base, minimale. La règle du bloc 4 s'applique : la plus petite image qui fait le travail.

Le piège

Des images qui pèsent
des gigaoctets

Base CUDA + PyTorch GPU : on dépasse vite plusieurs Go. Conséquences très concrètes : premiers pulls interminables, registry qui déborde, déploiements qui traînent. Les réflexes du bloc 4 — couches stables en premier, .dockerignore, multi-stage — valent triple ici.

Votre image CPU pèse quelques centaines de Mo. Sa cousine GPU en pèse dix fois plus — ne la tirez pas pour rien.

python:3.11-slim           ~150 Mo
votre API fraude (CPU)     ~600 Mo
nvidia/cuda:…-runtime      ~2,5 Go
+ PyTorch GPU             ~7 Go
L'ordre de grandeur à garder en tête avant chaque docker pull.
Démo live · à vous de jouer

La course : CPU contre GPU

CPU
0,0 s
GPU
0,0 s

chronos simulés — vous referez la vraie mesure au lab, mission 2

Ce qu'on retient

Le GPU est un outil,
pas un trophée

Mesurez avant de payer : un chrono CPU, un chrono GPU, et la décision se prend en euros — comme toutes les décisions de la semaine. L'ingénieur qui sait dire « pas besoin de GPU » vaut plus cher que celui qui en réclame un par réflexe.

Acte 3 · lab

À vous :
1h20 au clavier

Mission 1 / 2 · 0h50 · pratique

Brancher l'usine

Sur la machine GPU partagée : installer le NVIDIA Container Toolkit, déclarer le runtime auprès de Docker, puis prouver que le conteneur voit la carte — nvidia-smi depuis l'intérieur, et torch.cuda.is_available() qui répond enfin True.

Livrable : la sortie de nvidia-smi exécuté dans un conteneur, commitée — la preuve que le pont tient.

nvidia-container-toolkitdocker run --gpus allnvidia-smitorch.cuda.is_available()

Machine partagée : --gpus '"device=0"' et on se répartit les cartes entre binômes.

Mission 2 / 2 · 0h30 · pratique

La course, en vrai

Construire une image sur base nvidia/cuda:…-runtime, puis entraîner le petit réseau fourni deux fois — device cpu, device cuda — et chronométrer. Refaire enfin la mesure sur la régression logistique de la fraude : constater, chiffres à l'appui, quand l'usine sert et quand elle ne sert à rien.

Livrable : un tableau de temps CPU vs GPU commité — et votre conclusion, en une phrase honnête.

nvidia/cuda:…-runtimedevice="cuda"timetableau comparatif

Attendu : ~20× sur le réseau, quasi rien sur la fraude. Si vous trouvez autre chose — encore mieux, expliquez pourquoi.

Le mot de la fin

C'était la formation.
À vous de jouer

Quarante heures, huit blocs, un système vivant — et un GPU dans la poche pour le jour où les matrices grossiront. AI Driven. Human Approved.

Pas à pas ↗