Diffusers documentation
Базовая производительность
Базовая производительность
Диффузия — это стохастический процесс, требующий значительных вычислительных ресурсов. Возможно, вам придётся запустить DiffusionPipeline несколько раз, прежде чем получить желаемый результат. Именно поэтому важно тщательно балансировать между скоростью генерации и использованием памяти, чтобы ускорить итерации,
В этом руководстве приведены основные рекомендации по оптимизации производительности при использовании DiffusionPipeline. Более подробные руководства по оптимизации производительности см. в разделе документации «Оптимизация инференса», например Accelerate inference или Reduce memory usage.
Использование памяти
Сокращение объёма используемой памяти косвенно ускоряет генерацию и позволяет разместить модель на устройстве.
Метод enable_model_cpu_offload() перемещает модель на CPU, когда она не используется, чтобы сэкономить память 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")Скорость инференса
Денойзинг — это наиболее вычислительно затратный процесс в диффузии. Методы, оптимизирующие этот процесс, ускоряют инференс. Попробуйте следующие методы для ускорения.
- Добавьте
device_map="cuda", чтобы разместить пайплайн на GPU. Размещение модели на ускорителе, например на GPU, повышает скорость, поскольку вычисления выполняются параллельно. - Установите
dtype=torch.bfloat16, чтобы выполнить конвейер в половинной точности. Снижение точности типа данных повышает скорость, так как вычисления в меньшей точности занимают меньше времени.
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
)- Используйте более быстрый планировщик, например DPMSolverMultistepScheduler, которому требуется всего ~20-25 шагов.
- Установите
num_inference_stepsв меньшее значение. Уменьшение количества шагов инференса снижает общее число вычислений. Однако это может привести к ухудшению качества генерации.
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")Качество генерации
Многие современные диффузионные модели обеспечивают высокое качество изображений «из коробки». Тем не менее, вы можете进一步提升 качество генерации, попробовав следующее.
Попробуйте более подробный и описательный промпт. Включите такие детали, как тип изображения, объект, стиль и эстетика. Также может помочь негативный промпт, который направляет модель в сторону от нежелательных характеристик с помощью слов, таких как low quality или 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]Для получения подробной информации о создании более эффективных промптов ознакомьтесь с документацией Prompt techniques.
Попробуйте другой планировщик, например HeunDiscreteScheduler или LMSDiscreteScheduler, который жертвует скоростью генерации ради качества.
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]
Дальнейшие шаги
Diffusers предлагает более продвинутые и мощные оптимизации, такие как group-offloading и regional compilation. Чтобы узнать, как максимально повысить производительность, обратитесь к разделу Inference Optimization.
Update on GitHub