Diffusers documentation

Performances de base

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.bfloat16 pour 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_steps sur 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