Diffusers documentation

Rendimiento básico

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

Rendimiento básico

La difusión es un proceso aleatorio que exige muchos recursos computacionales. Es posible que tengas que ejecutar el DiffusionPipeline varias veces antes de obtener la salida deseada. Por eso es importante equilibrar cuidadosamente la velocidad de generación y el uso de memoria para iterar más rápido,

Esta guía recomienda algunos consejos básicos de rendimiento para el uso de DiffusionPipeline. Consulte la documentación de la sección de Optimización de inferencia, como Acelerar la inferencia o Reducir el uso de memoria, para obtener guías de rendimiento más detalladas.

Uso de memoria

Reducir la cantidad de memoria utilizada acelera indirectamente la generación y puede ayudar a que un modelo quepa en el dispositivo.

El método enable_model_cpu_offload() mueve un modelo a la CPU cuando no está en uso para ahorrar memoria de 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")

Velocidad de inferencia

El desruido es el proceso más exigente en términos de cómputo durante la difusión. Los métodos que optimizan este proceso aceleran la velocidad de inferencia. Pruebe los siguientes métodos para obtener una aceleración.

  • Agregue device_map="cuda" para colocar el pipeline en una GPU. Colocar un modelo en un acelerador, como una GPU, aumenta la velocidad porque realiza los cálculos en paralelo.
  • Establezca dtype=torch.bfloat16 para ejecutar el pipeline en media precisión. Reducir la precisión del tipo de datos aumenta la velocidad, ya que se tarda menos tiempo en realizar cálculos con una precisión inferior.
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
)
  • Utilice un programador más rápido, como DPMSolverMultistepScheduler, que solo requiere ~20-25 pasos.
  • Establezca num_inference_steps en un valor más bajo. Reducir el número de pasos de inferencia disminuye el número total de cálculos. Sin embargo, esto puede resultar en una menor calidad de generación.
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")

Calidad de generación

Muchos modelos de difusión modernos generan imágenes de alta calidad sin necesidad de ajustes adicionales. Sin embargo, aún puedes mejorar la calidad de la generación probando lo siguiente.

  • Prueba un prompt más detallado y descriptivo. Incluye detalles como el medio de la imagen, el sujeto, el estilo y la estética. Un prompt negativo también puede ayudar a guiar al modelo alejándolo de características no deseadas mediante el uso de palabras como low quality o 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]

    Para más detalles sobre la creación de mejores prompts, consulta el documento Técnicas de prompts.

  • Prueba un programador diferente, como HeunDiscreteScheduler o LMSDiscreteScheduler, que sacrifica la velocidad de generación a cambio de calidad.

    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]

Próximos pasos

Diffusers ofrece optimizaciones más avanzadas y potentes, como group-offloading y regional compilation. Para saber más sobre cómo maximizar el rendimiento, consulta la sección de Optimización de Inferencia.

Update on GitHub