Diffusers documentation
Rendimiento básico
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.bfloat16para 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_stepsen 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