Module L33 · Partie K · Ingénierie de l’IA
Les infrastructures de l’IA : ce qui fait tourner les modèles, et ce que ça coûte.
Un modèle est un programme qui multiplie des matrices ; l’infrastructure décide s’il tourne en 10 ms ou 10 s, pour 1 € ou 1 000 €. Ce chapitre explique le matériel (CPU, GPU, TPU, NPU, mémoire, interconnexions), le logiciel (CUDA, noyaux, compilateurs, frameworks), les parallélismes d’entraînement (données, tenseurs, pipeline, ZeRO/FSDP), le service d’inférence (lots, cache KV paginé, quantification, serveurs), le stockage et les pipelines de données, l’observabilité, et l’arbitrage cloud / local / edge — avec les mathématiques du roofline et les coûts réels.
Durée : 3 séances · Prérequis : L18, L22, L25, L27. Objectifs : lire une fiche de GPU et prédire le débit d’un modèle (roofline) ; expliquer les parallélismes et leurs coûts de communication ; dimensionner un service d’inférence ; comparer cloud, on-premise et edge sur un cas chiffré ; mettre en place l’observabilité minimale.
Ce que vous saurez faire à la fin
- Calculer l’intensité arithmétique d’un calcul et savoir s’il est limité par le calcul ou la mémoire.
- Choisir et combiner les parallélismes pour entraîner un modèle qui ne tient pas sur un GPU.
- Dimensionner un serveur d’inférence (débit, latence, lot, mémoire) et chiffrer les alternatives.
- Décrire une plateforme ML complète : données, entraînement, registre, service, monitoring.
Fiche de cours · Définitions
Définitions
Fiche de cours · Formules
Formules à connaître
Fiche de cours · Théorèmes et démonstrations
Démonstrations à savoir refaire
01 / Matériel
Lire une fiche technique et prédire les performances avec le roofline
02 / Entraîner à plusieurs
Parallélismes : simuler les coûts de communication et la bulle du pipeline
Retenir : le calcul tient dans le GPU, la communication entre GPU est le goulot ; les collectives s’organisent pour être recouvertes par le calcul ; et un « petit » détail série (lecture des données depuis un stockage lent, un print synchronisé) peut diviser l’efficacité par deux à 64 GPU.
03 / Servir
Dimensionner un service d’inférence : lots, cache KV, latence, coût
04 / Plateforme
Vue informatique : l’architecture d’une plateforme ML complète
| Couche | Rôle | Outils (libres / cloud) | Point d’attention |
|---|---|---|---|
| Stockage objet | Données brutes, jeux versionnés, artefacts, checkpoints | MinIO, S3, GCS ; formats Parquet/Arrow, WebDataset, Zarr | Débit de lecture pour l’entraînement (≥ 1 Go/s par GPU) ; cycle de vie et coût |
| Versionnage des données | Reproductibilité, lignage | DVC, LakeFS, Delta Lake, catalogues (DataHub) | Hash des jeux ; qui a le droit de lire quoi |
| Orchestration | Pipelines (ingestion → features → entraînement → évaluation → déploiement) | Airflow, Dagster, Kubeflow, Prefect, Argo | Idempotence, reprise sur erreur, planification |
| Calcul | Cluster GPU, files d’attente, isolation | Kubernetes + opérateurs, Slurm (HPC), Ray | Utilisation réelle des GPU (souvent < 30 %) ; quotas |
| Entraînement | Frameworks, précision mixte, parallélismes | PyTorch (FSDP, DDP), DeepSpeed, Megatron, JAX ; HF Accelerate/TRL | Checkpoints fréquents ; reprise ; déterminisme |
| Suivi d’expériences | Hyperparamètres, métriques, artefacts | MLflow, Weights & Biases, TensorBoard | Tout journaliser (L24) ; lien commit ↔ modèle |
| Registre de modèles | Versions, métadonnées, stades (staging/prod), cartes de modèle | MLflow Registry, HF Hub, Vertex/SageMaker Registry | Signature des artefacts ; provenance |
| Service | API, lots, autoscaling, canary | vLLM, TGI, Triton, TorchServe, BentoML, KServe ; ONNX Runtime, TensorRT | SLO p95 ; repli ; versions A/B |
| Compilation / optimisation | Fusion de noyaux, graphes, quantification | torch.compile, TensorRT-LLM, ONNX, OpenVINO, TVM ; llama.cpp (edge) | Gains 1,5–4× ; vérifier l’exactitude après |
| Observabilité | Métriques système et modèle, traces, journaux | Prometheus, Grafana, OpenTelemetry ; Evidently, Arize, Langfuse (LLM) | Dérive des données et des sorties (L35) ; coût par requête |
| Sécurité | Secrets, accès, réseau, conformité | Vault, IAM, VPC ; chiffrement au repos et en transit | Données personnelles, RGPD ; modèles = actifs à protéger |
05 / Choisir
Cloud, on-premise, edge : un arbitrage chiffré
06 / Articles
Les articles et documents à lire
| Référence | Contribution | À retenir |
|---|---|---|
| Williams, Waterman & Patterson, Roofline: An Insightful Visual Performance Model, CACM 2009 | Le modèle roofline | Théorème 1 ; première question à se poser devant un noyau lent |
| Micikevicius et al., Mixed Precision Training, ICLR 2018 — 1710.03740 | fp16 avec poids maîtres fp32 et mise à l’échelle de la perte | bf16 a rendu la mise à l’échelle inutile ; fp8 est l’étape suivante |
| Shoeybi et al., Megatron-LM, 2019 — 1909.08053 ; Narayanan et al., Efficient Large-Scale Language Model Training on GPU Clusters, SC 2021 — 2104.04473 | Parallélisme de tenseurs ; 3D parallelism | Tenseurs intra-nœud, pipeline/données inter-nœuds |
| Rajbhandari et al., ZeRO, SC 2020 — 1910.02054 ; Zhao et al., PyTorch FSDP, 2023 — 2304.11277 | Partitionner états, gradients, paramètres | 16 octets/paramètre divisés par n GPU |
| Huang et al., GPipe, NeurIPS 2019 — 1811.06965 | Pipeline avec micro-lots | Théorème 3 (bulle) |
| Kwon et al., vLLM / PagedAttention, SOSP 2023 — 2309.06180 ; Yu et al., Orca (continuous batching), OSDI 2022 | Cache KV paginé ; lots dynamiques | Théorème 4 : remplir la mémoire sans gaspillage |
| Pope et al., Efficiently Scaling Transformer Inference, 2022 — 2211.05102 | Analyse complète latence/débit/coût du service de grands modèles | Les formules de TTFT/TPOT et leurs régimes |
| Dao et al., FlashAttention, 2022 (L25) | Noyau IO-aware | Exemple canonique d’optimisation guidée par le roofline |
| Patterson et al., Carbon Emissions and Large Neural Network Training, 2021 — 2104.10350 | Empreinte énergétique et carbone | Le mix électrique et l’efficacité matérielle comptent plus que le modèle |
| Sculley et al., Hidden Technical Debt in Machine Learning Systems, NeurIPS 2015 | Le modèle est 5 % du système | Lire avant de construire une plateforme (L38) |
| Documentation NVIDIA (CUDA, NCCL, TensorRT-LLM), PyTorch (FSDP, torch.compile), vLLM | Références pratiques | Les chiffres changent chaque année : re-mesurer |
TP guidé
TP — Mesurer, puis optimiser un service (5 h)
- Roofline de votre machine. Mesurer le pic de
torch.matmulen fp32/bf16 pour des tailles 128 → 8 192 (TFLOP/s) et la bande passante (copie de tenseurs de 1 Go) ; tracer le roofline ; placer dessus une couche dense, une convolution, une attention, le décodage d’un LLM. - Profiler.
torch.profilersur un pas d’entraînement d’un petit transformer : temps par noyau, transferts hôte↔GPU, utilisation ; identifier les 3 postes principaux ; appliquertorch.compileet la précision mixte ; re-mesurer. - Servir. vLLM avec un modèle 1–8B : mesurer TTFT, TPOT, débit pour des lots 1, 8, 32, 64 et des prompts de 500/2 000 tokens ; comparer à Ollama ; vérifier les formules du Théorème 4 ; tester la quantification (AWQ) et le cache de préfixe.
- Parallélisme (si 2 GPU ou Colab multi-GPU). DDP puis FSDP sur un modèle qui ne tient pas sur un GPU ; mesurer l’efficacité ; observer l’effet de la taille des buckets.
- Observabilité. Exposer les métriques (Prometheus) du serveur : latence p50/p95, débit, mémoire GPU, coût estimé ; un tableau de bord Grafana ; une alerte sur p95.
- Livrable. Roofline annoté, profil avant/après, tableau de service, et une recommandation cloud/local chiffrée pour votre cas.
Exercices
Exercices auto-corrigés
Exercice 1 — Roofline
Écrivez temps_noyau(flops, octets, pic, bw) (borne du Théorème 1) et regime(flops, octets, pic, bw) renvoyant "mémoire" ou "calcul". Vérifiez sur : décodage lot 1 d’un 7B, produit 4096³, et une convolution 3×3 sur 224×224×64→64.
Correction
def temps_noyau(flops, octets, pic, bw): return max(flops / pic, octets / bw)
def regime(flops, octets, pic, bw): return "mémoire" if octets / bw > flops / pic else "calcul"Exercice 2 — Mémoire d’entraînement et nombre de GPU
Écrivez memoire_entrainement(N, n_gpu, strategie, activ_go) renvoyant la mémoire par GPU en Go : "ddp" (16N octets par GPU + activations), "fsdp" (16N/n_gpu + activations), "lora" (2N poids gelés en bf16 + 16·r_params pour les adaptateurs, r_params = 1 % de N, + activations). Puis gpus_necessaires(N, strategie, mem_gpu, activ_go) (plus petit n_gpu ∈ {1, 2, 4, 8, 16, 32, 64} qui tient, ou None).
Correction
def memoire_entrainement(N, n_gpu, strategie, activ_go=10):
if strategie == "ddp": return 16 * N / 1e9 + activ_go
if strategie == "fsdp": return 16 * N / n_gpu / 1e9 + activ_go
if strategie == "lora": return 2 * N / 1e9 + 16 * 0.01 * N / 1e9 + activ_go
def gpus_necessaires(N, strategie, mem_gpu=80, activ_go=10):
for n in (1, 2, 4, 8, 16, 32, 64):
if memoire_entrainement(N, n, strategie, activ_go) <= mem_gpu: return n
return NoneExercices
Exercices auto-corrigés (suite)
Exercice 3 — All-reduce en anneau et bulle de pipeline
Écrivez temps_allreduce(S, n, bw, latence) = 2(n−1)·(S/n/bw + latence) et bulle(p, m) ; vérifiez la borne asymptotique 2S/bw, l’effet de la latence sur les petits messages, et trouvez le plus petit m tel que bulle(8, m) < 0,1.
Correction
def temps_allreduce(S, n, bw, latence=10e-6): return 2 * (n - 1) * (S / n / bw + latence)
def bulle(p, m): return (p - 1) / (m + p - 1)Exercice 4 — Capacité d’un service sous SLO
Écrivez capacite(B, ttft, tpot, n_out) = requêtes/s servies par un GPU à lot B (latence = ttft + n_out·tpot) et gpus_pour(req_s, slo_s, options) qui, parmi une liste d’options (B, ttft, tpot), choisit celle qui respecte latence ≤ slo et minimise le nombre de GPU (arrondi supérieur, marge 30 %) ; renvoie (n_gpu, B) ou None.
Correction
def capacite(B, ttft, tpot, n_out=300): return B / (ttft + n_out * tpot)
def gpus_pour(req_s, slo_s, options, n_out=300):
ok = [(math.ceil(req_s * 1.3 / capacite(B, t1, t2, n_out)), B) for B, t1, t2 in options if t1 + n_out * t2 <= slo_s]
return min(ok) if ok else NoneFiche de cours · Exercices corrigés
Exercices corrigés (rédaction)
Vérification
Un GPU de 1 PFLOP/s décode un LLM 7B en bf16 à ~240 tokens/s en lot 1. Quelle est la ressource saturée ?
Deux questions supplémentaires
1. Pourquoi le lot est-il « gratuit » jusqu’à un certain point ? Les poids sont lus une fois par étape quel que soit B ; le temps ne change pas tant que le calcul 2NB reste sous le temps de lecture (Théorème 4).
2. Pourquoi 16 octets par paramètre à l’entraînement ? Poids bf16 + copie fp32 + deux moments d’Adam fp32 + gradient bf16.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Roofline | Débit ≤ min(pic, intensité × bande passante). |
| Intensité arithmétique | FLOPs par octet transféré ; décodage ≈ 1, matmul ≈ 1 000. |
| Précision mixte | bf16 pour le calcul, fp32 pour les poids maîtres et l’accumulation. |
| DDP / FSDP / tenseurs / pipeline | Répliquer / partitionner / découper les couches / étager les couches. |
| All-reduce en anneau | 2(n−1)/n × S octets par nœud ; optimal en bande passante. |
| TTFT / TPOT | Temps au premier token (calcul) / par token (mémoire). |
| Continuous batching, PagedAttention | Lots dynamiques ; cache KV paginé. |
| MFU | Fraction du pic réellement utilisée (40–60 % en bon entraînement). |
Suite
Vous savez ce que coûte un modèle. Lequel choisir ?
Chapitre suivant : la méthode de sélection d’un modèle — besoins, contraintes, candidats, évaluation comparative, coût total, et les pièges.