GPU requis pour ce tuto. Stable Diffusion peut techniquement tourner sur CPU, mais c'est 10 à 100× plus lent (plusieurs minutes par image). Pour une expérience correcte, il faut une carte graphique NVIDIA avec au moins 6 Go de VRAM (RTX 3060, 4060, ou mieux). Pourquoi le GPU ?
Pourquoi le GPU est indispensable ici 01
Un modèle de diffusion comme Stable Diffusion effectue des dizaines d'étapes de calcul matriciel pour chaque image. Chaque étape implique des milliards d'opérations mathématiques sur des tenseurs (tableaux multidimensionnels).
Un GPU (carte graphique) est conçu exactement pour ça : faire des milliers d'opérations parallèles simultanément. Un CPU fait les calculs en séquence — c'est très lent pour ce type de tâche. Sur GPU, une image prend 2 à 10 secondes. Sur CPU, plusieurs minutes.
- NVIDIA recommandé : la bibliothèque CUDA d'NVIDIA est la plus supportée par l'écosystème IA Python
- AMD : possible via ROCm sur Linux, mais moins bien supporté
- Apple Silicon (M1/M2/M3) : fonctionne via MPS (Metal Performance Shaders), performances correctes
Pour vérifier ta carte NVIDIA et ta VRAM disponible : nvidia-smi dans le terminal. La colonne "Memory-Usage" te montre l'utilisation actuelle.
Installation 02
On utilise la bibliothèque diffusers de HuggingFace — c'est la référence Python pour les modèles de diffusion. Le modèle qu'on télécharge est Stable Diffusion 1.5, léger et compatible avec 6 Go de VRAM.
mkdir stable-diffusion-tuto
cd stable-diffusion-tuto
python -m venv venv
venv\Scripts\activate # Windows
# ou
source venv/bin/activate # macOS / Linux
# PyTorch avec support CUDA (NVIDIA) — choisir la bonne version sur pytorch.org
# Pour CUDA 12.1 :
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
# Pour Apple Silicon (MPS) :
# pip install torch torchvision
# diffusers, transformers, accelerate
pip install diffusers transformers accelerate pillow
L'installation de PyTorch avec CUDA est volumineuse (~3 Go). Prévois du temps et une bonne connexion. Pour trouver la commande exacte pour ta version de CUDA, va sur pytorch.org/get-started/locally.
Vérifie que PyTorch détecte bien ton GPU :
python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"
Tu dois voir True suivi du nom de ta carte graphique. Si tu vois False, PyTorch ne détecte pas ton GPU — vérifie que les drivers NVIDIA sont à jour et que tu as installé la bonne version de PyTorch.
Générer ta première image 03
Crée generate.py :
import torch
from diffusers import StableDiffusionPipeline
# ── Charger le modèle ─────────────────────────────────────────────────────────
# La première exécution télécharge le modèle (~4 Go) depuis HuggingFace.
# Les fois suivantes, il est en cache local.
print("Chargement du modèle... (peut prendre quelques minutes la première fois)")
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", # identifiant du modèle sur HuggingFace
torch_dtype=torch.float16, # float16 utilise moitié moins de VRAM que float32
)
# Envoyer le modèle sur le GPU
# "cuda" = NVIDIA, "mps" = Apple Silicon, "cpu" = CPU (lent)
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
pipe = pipe.to(device)
print(f"Modèle chargé sur : {device}")
# ── Paramètres de génération ──────────────────────────────────────────────────
# Le PROMPT décrit ce qu'on veut générer.
# Les prompts en anglais donnent de meilleurs résultats (le modèle est entraîné en anglais).
prompt = (
"a serene forest at golden hour, moss-covered ancient stones, "
"volumetric light rays, photorealistic, 8k, detailed"
)
# Le NEGATIVE PROMPT décrit ce qu'on NE veut PAS.
# Très utile pour éviter les défauts communs des modèles de diffusion.
negative_prompt = (
"blurry, low quality, distorted, ugly, deformed, "
"watermark, text, extra limbs, bad anatomy"
)
print("Génération en cours...")
# ── Générer ───────────────────────────────────────────────────────────────────
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=30, # nombre d'étapes de débruitage (plus = meilleure qualité, plus lent)
guidance_scale=7.5, # CFG scale : à quel point suivre le prompt (7-12 typiquement)
width=512, # largeur en pixels
height=512, # hauteur en pixels
generator=torch.Generator(device).manual_seed(42), # seed pour reproduire le résultat
).images[0]
# ── Sauvegarder ───────────────────────────────────────────────────────────────
image.save("output.png")
print("Image sauvegardée : output.png")
python generate.py
Comprendre les paramètres 04
num_inference_steps — le nombre d'étapes de débruitage. Plus c'est élevé, plus l'image est détaillée et cohérente, mais plus c'est lent. Entre 20 et 50 est un bon compromis. Au-delà de 50, le gain est marginal.
guidance_scale (CFG scale) — contrôle à quel point le modèle suit ton prompt. Une valeur basse (1-5) donne des images plus "créatives" mais moins fidèles au prompt. Une valeur haute (10-20) colle plus au prompt mais peut générer des images trop saturées ou artificielles. La valeur 7.5 est un bon défaut.
seed — fixe l'aléatoire. Avec le même seed et les mêmes paramètres, tu obtiendras toujours la même image. Pratique pour reproduire un résultat ou faire varier un seul paramètre à la fois. Mets -1 pour un seed aléatoire.
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
prompt = "a cyberpunk city at night, neon lights, rain reflections, cinematic"
negative_prompt = "blurry, low quality, daytime, sunny"
# Générer 4 images avec des seeds différents
for seed in [42, 123, 456, 789]:
generator = torch.Generator("cuda").manual_seed(seed)
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
num_inference_steps=25,
guidance_scale=8.0,
generator=generator,
).images[0]
image.save(f"output_seed_{seed}.png")
print(f"Image seed {seed} générée.")
print("Terminé !")
Optimiser la VRAM 05
Si tu as peu de VRAM (6-8 Go), quelques optimisations permettent de générer des images sans manquer de mémoire :
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16,
).to("cuda")
# Option 1 : attention slicing — réduit la VRAM nécessaire pour l'attention
pipe.enable_attention_slicing()
# Option 2 : si tu as vraiment peu de VRAM, le modèle se charge par morceaux
# pipe.enable_sequential_cpu_offload() # plus lent mais très économe en VRAM
# Option 3 : xformers (si installé) — plus rapide ET moins de VRAM
# pip install xformers
# pipe.enable_xformers_memory_efficient_attention()
Pour aller plus loin : explore SDXL (Stable Diffusion XL) pour des images 1024×1024, ou ControlNet pour guider la génération avec des images de référence. L'écosystème HuggingFace Diffusers est très riche.