Diffusers documentation
Performances de base
Performances de base
La diffusion est un processus aléatoire qui est coûteux en calculs. Il se peut que vous deviez exécuter le DiffusionPipeline plusieurs fois avant d’obtenir la sortie souhaitée. C’est pourquoi il est important d’équilibrer soigneusement la vitesse de génération et l’utilisation de la mémoire afin d’itérer plus rapidement,
Ce guide propose quelques conseils de performance de base pour l’utilisation de DiffusionPipeline. Consultez les sections de documentation sur l’optimisation de l’inférence, telles que Accelerate inference ou Reduce memory usage, pour des guides de performance plus détaillés.
Utilisation de la mémoire
Réduire la quantité de mémoire utilisée accélère indirectement la génération et peut aider un modèle à tenir sur l’appareil.
La méthode enable_model_cpu_offload() déplace le modèle sur le CPU lorsqu'il n'est pas utilisé afin d'économiser la mémoire GPU.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.enable_model_cpu_offload()
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")Vitesse d'inférence
Le débruitage est l'étape la plus coûteuse en calcul lors de la diffusion. Les méthodes qui optimisent ce processus accélèrent la vitesse d'inférence. Essayez les méthodes suivantes pour gagner en rapidité.
- Ajoutez
device_map="cuda"pour placer le pipeline sur un GPU. Placer un modèle sur un accélérateur, comme un GPU, augmente la vitesse car il effectue les calculs en parallèle. - Définissez
dtype=torch.bfloat16pour exécuter le pipeline en demi-précision. Réduire la précision du type de données augmente la vitesse, car les calculs en précision inférieure prennent moins de temps.
import torch
import time
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda
)- Utilisez un planificateur plus rapide, tel que DPMSolverMultistepScheduler, qui ne nécessite que ~20-25 étapes.
- Définissez
num_inference_stepssur une valeur plus basse. Réduire le nombre d'étapes d'inférence diminue le nombre total de calculs. Toutefois, cela peut entraîner une baisse de la qualité de la génération.
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
start_time = time.perf_counter()
image = pipeline(prompt).images[0]
end_time = time.perf_counter()
print(f"Image generation took {end_time - start_time:.3f} seconds")Qualité de génération
De nombreux modèles de diffusion modernes produisent des images de haute qualité dès leur utilisation initiale. Toutefois, vous pouvez encore améliorer la qualité de génération en essayant ce qui suit.
Essayez un prompt plus détaillé et descriptif. Incluez des détails tels que le support de l’image, le sujet, le style et l’esthétique. Un prompt négatif peut également aider à orienter le modèle loin des caractéristiques indésirables en utilisant des mots comme low quality ou blurry.
import torch from diffusers import DiffusionPipeline pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu" ) prompt = """ cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]Pour plus de détails sur la création de meilleurs prompts, consultez le document Prompt techniques.
Essayez un autre planificateur, comme HeunDiscreteScheduler ou LMSDiscreteScheduler, qui sacrifie la vitesse de génération au profit de la qualité.
import torch from diffusers import DiffusionPipeline, HeunDiscreteScheduler pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu" ) pipeline.scheduler = HeunDiscreteScheduler.from_config(pipeline.scheduler.config) prompt = """ cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]
Étapes suivantes
Diffusers propose des optimisations plus avancées et puissantes, telles que le group-offloading et la compilation régionale. Pour en savoir plus sur la manière de maximiser les performances, consultez la section Optimisation de l'inférence.
Update on GitHub