Перейти к содержанию

On this page Современная генерация изображений по текстовому описанию с помощью моделей Stable Diffusion через библиотеку HuggingFace Diffusers. Используйте, когда нужно генерировать изображения из текстовых запросов, выполнять трансформацию «изображение-в-изображение», инпейнтинг или создавать собственные пайплайны диффузии.

Skill metadata

|---|---
|Source| Optional — install with hermes skills install official/mlops/stable-diffusion
|Path| optional-skills/mlops/stable-diffusion
|Version| 1.0.0
|Author| Orchestra Research
|License| MIT
|Dependencies| diffusers>=0.30.0, transformers>=4.41.0, accelerate>=0.31.0, torch>=2.0.0
|Tags| Image Generation, Stable Diffusion, Diffusers, Text-to-Image, Multimodal, Computer Vision

Reference: full SKILL.md

info Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Это то, что агент видит в качестве инструкций, когда навык активен.

Stable Diffusion Image Generation

Комплексное руководство по генерации изображений с помощью Stable Diffusion и библиотеки HuggingFace Diffusers.

When to use Stable Diffusion

Используйте Stable Diffusion когда: * Нужно генерировать изображения из текстовых описаний * Нужно выполнять трансформацию «изображение-в-изображение» (перенос стиля, улучшение) * Нужен инпейнтинг (заполнение замаскированных областей) * Нужен аутпейнтинг (расширение изображений за границы) * Нужно создавать вариации существующих изображений * Нужно строить собственные рабочие процессы генерации изображений

Ключевые возможности: * Text-to-Image : Генерация изображений из текстовых запросов на естественном языке * Image-to-Image : Преобразование существующих изображений по текстовой инструкции * Inpainting : Заполнение замаскированных областей с учётом контекста * ControlNet : Пространственное управление (контуры, позы, глубина) * LoRA Support : Эффективная донастройка и адаптация стиля * Multiple Models : Поддержка SD 1.5, SDXL, SD 3.0, Flux

Используйте альтернативы вместо этого: * DALL-E 3 : Для API-генерации без GPU * Midjourney : Для художественных, стилизованных результатов * Imagen : Для интеграции с Google Cloud * Leonardo.ai : Для веб-ориентированных творческих рабочих процессов

Quick start

Installation

[code] pip install diffusers transformers accelerate torch
pip install xformers # Опционально: энергоэффективное внимание

[/code]

Basic text-to-image

[code] from diffusers import DiffusionPipeline
import torch

# Загрузка пайплайна (автоопределение типа модели)  
pipe = DiffusionPipeline.from_pretrained(  
    "stable-diffusion-v1-5/stable-diffusion-v1-5",  
    torch_dtype=torch.float16  
)  
pipe.to("cuda")

# Генерация изображения  
image = pipe(  
    "A serene mountain landscape at sunset, highly detailed",  
    num_inference_steps=50,  
    guidance_scale=7.5  
).images[0]

image.save("output.png")

[/code]

Using SDXL (higher quality)

[code] from diffusers import AutoPipelineForText2Image
import torch

pipe = AutoPipelineForText2Image.from_pretrained(  
    "stabilityai/stable-diffusion-xl-base-1.0",  
    torch_dtype=torch.float16,  
    variant="fp16"  
)  
pipe.to("cuda")

# Включение оптимизации памяти  
pipe.enable_model_cpu_offload()

image = pipe(  
    prompt="A futuristic city with flying cars, cinematic lighting",  
    height=1024,  
    width=1024,  
    num_inference_steps=30  
).images[0]

[/code]

Architecture overview

Three-pillar design

Diffusers построен на трёх ключевых компонентах: [code] Pipeline (оркестрация)
├── Model (нейронные сети)
│ ├── UNet / Transformer (предсказание шума)
│ ├── VAE (кодирование/декодирование латентного пространства)
│ └── Text Encoder (CLIP/T5)
└── Scheduler (алгоритм денойзинга)

[/code]

Pipeline inference flow

[code] Text Prompt → Text Encoder → Text Embeddings

Random Noise → [Denoising Loop] ← Scheduler

Predicted Noise

VAE Decoder → Final Image

[/code]

Core concepts

Pipelines

Пайплайны оркестрируют полные рабочие процессы: Pipeline| Purpose
---|---
StableDiffusionPipeline| Text-to-image (SD 1.x/2.x)
StableDiffusionXLPipeline| Text-to-image (SDXL)
StableDiffusion3Pipeline| Text-to-image (SD 3.0)
FluxPipeline| Text-to-image (Flux models)
StableDiffusionImg2ImgPipeline| Image-to-image
StableDiffusionInpaintPipeline| Inpainting

Schedulers

Шедулеры управляют процессом денойзинга: Scheduler| Steps| Quality| Use Case
---|---|---|---|---
EulerDiscreteScheduler| 20-50| Хорошее| Выбор по умолчанию
EulerAncestralDiscreteScheduler| 20-50| Хорошее| Больше вариаций
DPMSolverMultistepScheduler| 15-25| Отличное| Быстро, высокое качество
DDIMScheduler| 50-100| Хорошее| Детерминированный
LCMScheduler| 4-8| Хорошее| Очень быстро
UniPCMultistepScheduler| 15-25| Отличное| Быстрая сходимость

Swapping schedulers

[code] from diffusers import DPMSolverMultistepScheduler

# Смена для более быстрой генерации  
pipe.scheduler = DPMSolverMultistepScheduler.from_config(  
    pipe.scheduler.config  
)

# Теперь генерация с меньшим числом шагов  
image = pipe(prompt, num_inference_steps=20).images[0]

[/code]

Generation parameters

Key parameters

Parameter| Default| Description
---|---|---|---
prompt| Обязательный| Текстовое описание желаемого изображения
negative_prompt| None| Чего следует избегать на изображении
num_inference_steps| 50| Шаги денойзинга (больше = выше качество)
guidance_scale| 7.5| Степень следования запросу (обычно 7-12)
height, width| 512/1024| Размеры вывода (кратные 8)
generator| None| Генератор torch для воспроизводимости
num_images_per_prompt| 1| Размер батча

Reproducible generation

[code] import torch

generator = torch.Generator(device="cuda").manual_seed(42)

image = pipe(  
    prompt="A cat wearing a top hat",  
    generator=generator,  
    num_inference_steps=50  
).images[0]

[/code]

Negative prompts

[code] image = pipe(
prompt="Professional photo of a dog in a garden",
negative_prompt="blurry, low quality, distorted, ugly, bad anatomy",
guidance_scale=7.5
).images[0]

[/code]

Image-to-image

Преобразование существующих изображений с помощью текстовой инструкции: [code] from diffusers import AutoPipelineForImage2Image
from PIL import Image

pipe = AutoPipelineForImage2Image.from_pretrained(  
    "stable-diffusion-v1-5/stable-diffusion-v1-5",  
    torch_dtype=torch.float16  
).to("cuda")

init_image = Image.open("input.jpg").resize((512, 512))

image = pipe(  
    prompt="A watercolor painting of the scene",  
    image=init_image,  
    strength=0.75,  # Степень трансформации (0-1)  
    num_inference_steps=50  
).images[0]

[/code]

Inpainting

Заполнение замаскированных областей: [code] from diffusers import AutoPipelineForInpainting
from PIL import Image

pipe = AutoPipelineForInpainting.from_pretrained(  
    "runwayml/stable-diffusion-inpainting",  
    torch_dtype=torch.float16  
).to("cuda")

image = Image.open("photo.jpg")  
mask = Image.open("mask.png")  # Белый = область инпейнтинга

result = pipe(  
    prompt="A red car parked on the street",  
    image=image,  
    mask_image=mask,  
    num_inference_steps=50  
).images[0]

[/code]

ControlNet

Добавление пространственного управления для точного контроля: [code] from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch

# Загрузка ControlNet для управления по контурам  
controlnet = ControlNetModel.from_pretrained(  
    "lllyasviel/control_v11p_sd15_canny",  
    torch_dtype=torch.float16  
)

pipe = StableDiffusionControlNetPipeline.from_pretrained(  
    "stable-diffusion-v1-5/stable-diffusion-v1-5",  
    controlnet=controlnet,  
    torch_dtype=torch.float16  
).to("cuda")

# Использование Canny-изображения контуров для управления  
control_image = get_canny_image(input_image)

image = pipe(  
    prompt="A beautiful house in the style of Van Gogh",  
    image=control_image,  
    num_inference_steps=30  
).images[0]

[/code]

Available ControlNets

ControlNet| Input Type| Use Case
---|---|---|---
canny| Карты контуров| Сохранение структуры
openpose| Скелеты поз| Позы человека
depth| Карты глубины| 3D-ориентированная генерация
normal| Карты нормалей| Детали поверхности
mlsd| Сегменты линий| Архитектурные линии
scribble| Грубые наброски| Из наброска в изображение

LoRA adapters

Загрузка донастроенных адаптеров стиля: [code] from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(  
    "stable-diffusion-v1-5/stable-diffusion-v1-5",  
    torch_dtype=torch.float16  
).to("cuda")

# Загрузка весов LoRA  
pipe.load_lora_weights("path/to/lora", weight_name="style.safetensors")

# Генерация с LoRA-стилем  
image = pipe("A portrait in the trained style").images[0]

# Настройка силы LoRA  
pipe.fuse_lora(lora_scale=0.8)

# Выгрузка LoRA  
pipe.unload_lora_weights()

[/code]

Multiple LoRAs

[code] # Загрузка нескольких LoRA
pipe.load_lora_weights("lora1", adapter_name="style")
pipe.load_lora_weights("lora2", adapter_name="character")

# Установка весов для каждой  
pipe.set_adapters(["style", "character"], adapter_weights=[0.7, 0.5])

image = pipe("A portrait").images[0]

[/code]

Memory optimization

Enable CPU offloading

[code] # Выгрузка модели на CPU — перемещает модели на CPU, когда они не используются
pipe.enable_model_cpu_offload()

# Последовательная выгрузка на CPU — более агрессивно, медленнее  
pipe.enable_sequential_cpu_offload()

[/code]

Attention slicing

[code] # Снижение потребления памяти за счёт вычисления attention по частям
pipe.enable_attention_slicing()

# Или указание конкретного размера чанка  
pipe.enable_attention_slicing("max")

[/code]

xFormers memory-efficient attention

[code] # Требуется пакет xformers
pipe.enable_xformers_memory_efficient_attention()

[/code]

VAE slicing for large images

[code] # Декодирование латентного пространства тайлами для больших изображений
pipe.enable_vae_slicing()
pipe.enable_vae_tiling()

[/code]

Model variants

Loading different precisions

[code] # FP16 (рекомендуется для GPU)
pipe = DiffusionPipeline.from_pretrained(
"model-id",
torch_dtype=torch.float16,
variant="fp16"
)

# BF16 (лучшая точность, требует GPU Ampere+)  
pipe = DiffusionPipeline.from_pretrained(  
    "model-id",  
    torch_dtype=torch.bfloat16  
)

[/code]

Loading specific components

[code] from diffusers import UNet2DConditionModel, AutoencoderKL

# Загрузка кастомной VAE  
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-mse")

# Использование с пайплайном  
pipe = DiffusionPipeline.from_pretrained(  
    "stable-diffusion-v1-5/stable-diffusion-v1-5",  
    vae=vae,  
    torch_dtype=torch.float16  
)

[/code]

Batch generation

Эффективная генерация нескольких изображений: [code] # Несколько запросов
prompts = [
"A cat playing piano",
"A dog reading a book",
"A bird painting a picture"
]

images = pipe(prompts, num_inference_steps=30).images

# Несколько изображений на запрос  
images = pipe(  
    "A beautiful sunset",  
    num_images_per_prompt=4,  
    num_inference_steps=30  
).images

[/code]

Common workflows

Workflow 1: High-quality generation

[code] from diffusers import StableDiffusionXLPipeline, DPMSolverMultistepScheduler
import torch

# 1. Загрузка SDXL с оптимизациями  
pipe = StableDiffusionXLPipeline.from_pretrained(  
    "stabilityai/stable-diffusion-xl-base-1.0",  
    torch_dtype=torch.float16,  
    variant="fp16"  
)  
pipe.to("cuda")  
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)  
pipe.enable_model_cpu_offload()

# 2. Генерация с настройками качества  
image = pipe(  
    prompt="A majestic lion in the savanna, golden hour lighting, 8k, detailed fur",  
    negative_prompt="blurry, low quality, cartoon, anime, sketch",  
    num_inference_steps=30,  
    guidance_scale=7.5,  
    height=1024,  
    width=1024  
).images[0]

[/code]

Workflow 2: Fast prototyping

[code] from diffusers import AutoPipelineForText2Image, LCMScheduler
import torch

# Использование LCM для генерации за 4-8 шагов  
pipe = AutoPipelineForText2Image.from_pretrained(  
    "stabilityai/stable-diffusion-xl-base-1.0",  
    torch_dtype=torch.float16  
).to("cuda")

# Загрузка LCM LoRA для быстрой генерации  
pipe.load_lora_weights("latent-consistency/lcm-lora-sdxl")  
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)  
pipe.fuse_lora()

# Генерация за ~1 секунду  
image = pipe(  
    "A beautiful landscape",  
    num_inference_steps=4,  
    guidance_scale=1.0  
).images[0]

[/code]

Common issues

CUDA out of memory: [code] # Включение оптимизаций памяти
pipe.enable_model_cpu_offload()
pipe.enable_attention_slicing()
pipe.enable_vae_slicing()

# Или использование меньшей точности  
pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)

[/code] Black/noise images: [code] # Проверка конфигурации VAE
# При необходимости отключение проверки безопасности
pipe.safety_checker = None

# Обеспечение согласованности dtype  
pipe = pipe.to(dtype=torch.float16)

[/code] Slow generation: [code] # Использование более быстрого шедулера
from diffusers import DPMSolverMultistepScheduler
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

# Уменьшение числа шагов  
image = pipe(prompt, num_inference_steps=20).images[0]

[/code]

References

  • Advanced Usage - Кастомные пайплайны, донастройка, развёртывание
  • Troubleshooting - Частые проблемы и решения

Resources