Diffusers documentation

Базовая производительность

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Базовая производительность

Диффузия — это стохастический процесс, требующий значительных вычислительных ресурсов. Возможно, вам придётся запустить 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