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.
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.
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.
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.