Diffusers documentation

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

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

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

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