Buckets:

hf-doc-build/doc / diffusers /v0.43.0 /ru /stable_diffusion.md
mishig's picture
|
download
raw
8.07 kB
# Базовая производительность
Диффузия — это стохастический процесс, требующий значительных вычислительных ресурсов. Возможно, вам придётся запустить [DiffusionPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline) несколько раз, прежде чем получить желаемый результат. Именно поэтому важно тщательно балансировать между скоростью генерации и использованием памяти, чтобы ускорить итерации,
В этом руководстве приведены основные рекомендации по оптимизации производительности при использовании [DiffusionPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline). Более подробные руководства по оптимизации производительности см. в разделе документации «Оптимизация инференса», например [Accelerate inference](./optimization/fp16) или [Reduce memory usage](./optimization/memory).
## Использование памяти
Сокращение объёма используемой памяти косвенно ускоряет генерацию и позволяет разместить модель на устройстве.
Метод [enable_model_cpu_offload()](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline.enable_model_cpu_offload) перемещает модель на CPU, когда она не используется, чтобы сэкономить память GPU.
```py
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`, чтобы выполнить конвейер в половинной точности. Снижение точности типа данных повышает скорость, так как вычисления в меньшей точности занимают меньше времени.
```py
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](/docs/diffusers/v0.43.0/ru/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler), которому требуется всего ~20-25 шагов.
- Установите `num_inference_steps` в меньшее значение. Уменьшение количества шагов инференса снижает общее число вычислений. Однако это может привести к ухудшению качества генерации.
```py
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.
```py
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](./using-diffusers/weighted_prompts).
- Попробуйте другой планировщик, например [HeunDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/heun#diffusers.HeunDiscreteScheduler) или [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler), который жертвует скоростью генерации ради качества.
```py
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](./optimization/memory#group-offloading) и [regional compilation](./optimization/fp16#regional-compilation). Чтобы узнать, как максимально повысить производительность, обратитесь к разделу Inference Optimization.

Xet Storage Details

Size:
8.07 kB
·
Xet hash:
b185a93b679611662f2f86c132bcb0ae4272c69c9a6bc4d4649fb83ce9568e9e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.