Diffusers documentation

PixArt-Σ

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

PixArt-Σ

PixArt-Σ: Weak-to-Strong Training of Diffusion Transformer for 4K Text-to-Image Generation — это работа Junsong Chen, Jincheng Yu, Chongjian Ge, Lewei Yao, Enze Xie, Yue Wu, Zhongdao Wang, James Kwok, Ping Luo, Huchuan Lu и Zhenguo Li.

Аннотация из статьи:

В данной статье мы представляем PixArt-Σ — модель Diffusion Transformer (DiT), способную напрямую генерировать изображения в разрешении 4K. PixArt-Σ представляет собой значительный шаг вперёд по сравнению со своим предшественником, PixArt-α, обеспечивая изображения с заметно более высокой детализацией и улучшенным соответствием текстовым запросам. Ключевой особенностью PixArt-Σ является эффективность обучения. Опираясь на базовое предварительное обучение PixArt-α, модель эволюционирует от «более слабого» базового варианта к «более сильной» модели за счёт включения данных более высокого качества — процесс, который мы называем «обучением от слабого к сильному». Прогресс в PixArt-Σ двояк: (1) Данные обучения высокого качества: PixArt-Σ использует изображения более высокого качества, дополненные более точными и подробными описаниями. (2) Эффективное сжатие токенов: мы предлагаем новый модуль внимания в рамках архитектуры DiT, который сжимает как ключи, так и значения, что значительно повышает эффективность и позволяет генерировать изображения сверхвысокого разрешения. Благодаря этим улучшениям PixArt-Σ обеспечивает превосходное качество изображений и точное следование пользовательским запросам при значительно меньшем размере модели (0,6 млрд параметров) по сравнению с существующими моделями диффузии «текст в изображение», такими как SDXL (2,6 млрд параметров) и SD Cascade (5,1 млрд параметров). Кроме того, способность PixArt-Σ генерировать изображения в 4K поддерживает создание высококачественных постеров и обоев, эффективно ускоряя производство визуального контента высокого разрешения в таких отраслях, как кино и игровая индустрия.

Исходный код можно найти в PixArt-alpha/PixArt-sigma, а все доступные контрольные точки — в PixArt-alpha.

Некоторые замечания по этому конвейеру:

  • Для шумоподавления используется базовая архитектура Transformer (вместо UNet). В связи с этим её архитектура похожа на архитектуру DiT.
  • Модель обучалась с использованием текстовых условий, вычисленных с помощью T5. Это позволяет пайплайну лучше следовать сложным текстовым промптам с детализированными описаниями.
  • Модель хорошо генерирует изображения высокого разрешения с различными соотношениями сторон. Для получения наилучших результатов авторы рекомендуют использовать определённые диапазоны размеров, которые можно найти здесь.
  • По качеству он не уступает передовым системам генерации изображений по тексту (на момент написания этой статьи), таким как PixArt-α, Stable Diffusion XL, Playground V2.0 и DALL-E 3, при этом он более эффективен, чем они.
  • Демонстрирует способность генерировать изображения сверхвысокого разрешения, например, 2048 пикселей или даже 4K.
  • Это показывает, что модели «текст в изображение» могут развиваться от слабой модели к более сильной за счёт нескольких улучшений (VAE, наборы данных и т. д.).

Обязательно ознакомьтесь с руководством по планировщикам, чтобы узнать, как исследовать баланс между скоростью и качеством планировщика, а также с разделом повторное использование компонентов в разных конвейерах, чтобы узнать, как эффективно загружать одни и те же компоненты в несколько конвейеров.

Вы можете дополнительно повысить качество генерации, передав изображение, полученное из PixArtSigmaPipeline, в модель SDXL refiner.

Вывод на GPU с менее чем 8 ГБ видеопамяти

Запустите PixArtSigmaPipeline на GPU с менее чем 8 ГБ видеопамяти, загрузив текстовый энкодер в 8-битной точности. Разберём полноценный пример.

Сначала установите библиотеку bitsandbytes:

pip install -U bitsandbytes

Затем загрузите текстовый энкодер в 8-битном формате:

from transformers import T5EncoderModel
from diffusers import PixArtSigmaPipeline
import torch

text_encoder = T5EncoderModel.from_pretrained(
    "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
    subfolder="text_encoder",
    load_in_8bit=True,
    device_map="auto",
)
pipe = PixArtSigmaPipeline.from_pretrained(
    "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
    text_encoder=text_encoder,
    transformer=None,
    device_map="balanced"
)

Теперь используйте pipe, чтобы закодировать промпт:

with torch.no_grad():
    prompt = "cute cat"
    prompt_embeds, prompt_attention_mask, negative_embeds, negative_prompt_attention_mask = pipe.encode_prompt(prompt)

Поскольку текстовые эмбеддинги уже вычислены, удалите text_encoder и pipe из памяти, чтобы освободить часть VRAM на GPU:

import gc

def flush():
    gc.collect()
    torch.cuda.empty_cache()

del text_encoder
del pipe
flush()

Затем вычислите латенты, используя эмбеддинги промпта в качестве входных данных:

pipe = PixArtSigmaPipeline.from_pretrained(
    "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
    text_encoder=None,
    dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"

latents = pipe(
    negative_prompt=None,
    prompt_embeds=prompt_embeds,
    negative_prompt_embeds=negative_embeds,
    prompt_attention_mask=prompt_attention_mask,
    negative_prompt_attention_mask=negative_prompt_attention_mask,
    num_images_per_prompt=1,
    output_type="latent",
).images

del pipe.transformer
flush()

Обратите внимание, что при инициализации pipe вы устанавливаете text_encoder в None, чтобы он не загружался.

После вычисления латентов передайте их в VAE для декодирования в реальное изображение:

with torch.no_grad():
    image = pipe.vae.decode(latents / pipe.vae.config.scaling_factor, return_dict=False)[0]
image = pipe.image_processor.postprocess(image, output_type="pil")[0]
image.save("cat.png")

Удалив неиспользуемые компоненты и очистив видеопамять GPU, вы сможете запустить PixArtSigmaPipeline с видеопамятью менее 8 ГБ.

Если вам нужен отчёт об использовании памяти, выполните этот скрипт.

Текстовые эмбеддинги, вычисленные в 8-битном формате, могут влиять на качество генерируемых изображений из-за потери информации в пространстве представлений, вызванной снижением точности. Рекомендуется сравнивать результаты с использованием 8-битного формата и без него.

При загрузке text_encoder вы установили load_in_8bit в True. Вы также можете указать load_in_4bit, чтобы ещё больше снизить требования к памяти — до менее чем 7 ГБ.

PixArtSigmaPipeline

класс diffusers.PixArtSigmaPipeline

< >

( tokenizer: T5Tokenizertext_encoder: T5EncoderModelvae: AutoencoderKLtransformer: PixArtTransformer2DModelscheduler: KarrasDiffusionSchedulers )

Параметры

  • vae (AutoencoderKL) — Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.
  • text_encoder (T5EncoderModel) — Замороженный текстовый энкодер. PixArt-Alpha использует T5, а именно вариант t5-v1_1-xxl.
  • tokenizer (T5Tokenizer) — токенизатор класса T5Tokenizer.
  • transformer (PixArtTransformer2DModel) — Модель PixArtTransformer2DModel, управляемая текстом, для удаления шума из закодированных латентов изображения. Изначально в конфигурации публиковалась как Transformer2DModel, но это несоответствие можно игнорировать.
  • scheduler (SchedulerMixin) — планировщик, используемый в связке с transformer для удаления шума из закодированных латентов изображения.

Pipeline для генерации изображений по тексту с использованием PixArt-Sigma.

Эта модель наследуется от DiffusionPipeline. См. документацию родительского класса для общих методов, которые библиотека реализует для всех пайплайнов (например, загрузка или сохранение, запуск на конкретном устройстве и т. д.)

__call__

< >

( prompt: str | list[str] = Nonenegative_prompt: str = ''num_inference_steps: int = 20timesteps: list[int] = Nonesigmas: list[float] = Noneguidance_scale: float = 4.5num_images_per_prompt: int | None = 1height: int | None = Nonewidth: int | None = Noneeta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1clean_caption: bool = Trueuse_resolution_binning: bool = Truemax_sequence_length: int = 300**kwargs ) → ImagePipelineOutput or tuple

Параметры

  • prompt (str или list[str], необязательный) — Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать prompt_embeds вместо него.
  • negative_prompt (str or list[str], необязательный) — Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать negative_prompt_embeds. Игнорируется, если не используется направляющее поле (то есть игнорируется, если guidance_scale меньше 1).
  • num_inference_steps (int, необязательный, по умолчанию 100) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счет более медленного вывода.
  • timesteps (list[int], необязательный) — Пользовательские шаги для процесса удаления шума в планировщиках, поддерживающих аргумент timesteps в методе set_timesteps. Если не задан, будет использоваться поведение по умолчанию при передаче num_inference_steps. Значения должны быть в порядке убывания.
  • sigmas (list[float], необязательный) — Пользовательские сигмы для процесса удаления шума в планировщиках, поддерживающих аргумент sigmas в их методе set_timesteps. Если не задано, будет использоваться поведение по умолчанию при передаче num_inference_steps.
  • guidance_scale (float, необязательный, по умолчанию 4.5) — Масштаб руководства, как определено в Classifier-Free Diffusion Guidance. guidance_scale определяется как w из уравнения 2 статьи Imagen Paper. Масштаб руководства включается при установке guidance_scale > 1. Более высокий масштаб руководства способствует генерации изображений, тесно связанных с текстом prompt, обычно за счёт снижения качества изображения.
  • num_images_per_prompt (int, необязательный, по умолчанию 1) — Количество изображений, генерируемых для каждого промпта.
  • height (int, необязательный, по умолчанию self.unet.config.sample_size) — Высота генерируемого изображения в пикселях.
  • width (int, необязательный, по умолчанию self.unet.config.sample_size) — Ширина генерируемого изображения в пикселях.
  • eta (float, необязательный, по умолчанию 0.0) — Соответствует параметру eta (η) в статье DDIM: https://huggingface.co/papers/2010.02502. Применяется только к schedulers.DDIMScheduler, для остальных игнорируется.
  • generator (torch.Generator или list[torch.Generator], необязательный) — Один или список генераторов torch для обеспечения детерминированности генерации.
  • latents (torch.Tensor, необязательный) — Предварительно сгенерированные зашумлённые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации изображений. Позволяет корректировать один и тот же процесс генерации с помощью различных промптов. Если не заданы, тензор латентов будет сгенерирован путём выборки с использованием переданного случайного generator.
  • prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргумента prompt.
  • prompt_attention_mask (torch.Tensor, необязательный) — Предварительно сгенерированная маска внимания для текстовых эмбеддингов.
  • negative_prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для PixArt-Sigma этот отрицательный промпт должен быть "". Если не предоставлен, negative_prompt_embeds будет сгенерирован из входного аргумента negative_prompt.
  • negative_prompt_attention_mask (torch.Tensor, необязательный) — Предварительно сгенерированная маска внимания для отрицательных текстовых эмбеддингов.
  • output_type (str, необязательный, по умолчанию "pil") — Формат вывода сгенерированного изображения. Выберите один из вариантов: PIL: PIL.Image.Image или np.array.
  • return_dict (bool, необязательный, по умолчанию True) — Определяет, следует ли возвращать ~pipelines.stable_diffusion.IFPipelineOutput вместо обычного кортежа.
  • callback (Callable, необязательный) — Функция, которая будет вызываться каждые callback_steps шагов во время инференса. Функция будет вызываться со следующими аргументами: callback(step: int, timestep: int, latents: torch.Tensor).
  • callback_steps (int, необязательный, по умолчанию 1) — Частота вызова функции callback. Если не указано, callback будет вызываться на каждом шаге.
  • clean_caption (bool, необязательный, по умолчанию True) — Определяет, нужно ли очищать подпись перед созданием эмбеддингов. Требует установки beautifulsoup4 и ftfy. Если зависимости не установлены, эмбеддинги будут созданы из исходного промпта.
  • use_resolution_binning (bool, по умолчанию True) — Если установлено в True, запрашиваемые высота и ширина сначала сопоставляются с ближайшими разрешениями с помощью ASPECT_RATIO_1024_BIN. После декодирования полученных латентов в изображения они масштабируются обратно до запрошенного разрешения. Полезно для генерации изображений, не являющихся квадратными.
  • max_sequence_length (int, по умолчанию 300) — максимальная длина последовательности, используемая с prompt.

Возвращает

ImagePipelineOutput или tuple

Если return_dict равно True, возвращается ImagePipelineOutput, иначе возвращается tuple, где первый элемент — это список с сгенерированными изображениями

Функция, вызываемая при обращении к конвейеру для генерации.

Примеры:

>>> import torch
>>> from diffusers import PixArtSigmaPipeline

>>> # You can replace the checkpoint id with "PixArt-alpha/PixArt-Sigma-XL-2-512-MS" too.
>>> pipe = PixArtSigmaPipeline.from_pretrained(
...     "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", torch_dtype=torch.float16
... )
>>> # Enable memory optimizations.
>>> # pipe.enable_model_cpu_offload()

>>> prompt = "A small cactus with a happy face in the Sahara desert."
>>> image = pipe(prompt).images[0]

encode_prompt

< >

( prompt: str | list[str]do_classifier_free_guidance: bool = Truenegative_prompt: str = ''num_images_per_prompt: int = 1device: typing.Optional[torch.device] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneclean_caption: bool = Falsemax_sequence_length: int = 300**kwargs )

Параметры

  • prompt (str или list[str], необязательный) — промпт для кодирования
  • negative_prompt (str or list[str], необязательный) — Промпт, который не должен направлять генерацию изображения. Если не задан, необходимо передать negative_prompt_embeds вместо него. Игнорируется, если не используется направляющий сигнал (т. е. игнорируется, если guidance_scale меньше 1). Для PixArt-Alpha это должно быть "".
  • do_classifier_free_guidance (bool, необязательный, по умолчанию True) — использовать ли classifier free guidance
  • num_images_per_prompt (int, необязательный, по умолчанию 1) — количество изображений, которые должны быть сгенерированы для каждого промпта
  • device — (torch.device, необязательный): устройство torch, на котором будут размещены полученные эмбеддинги
  • prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргумента prompt.
  • negative_prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для PixArt-Alpha это должны быть эмбеддинги строки "".
  • clean_caption (bool, по умолчанию False) — Если True, функция выполнит предобработку и очистку переданного описания перед кодированием.
  • max_sequence_length (int, по умолчанию 300) — Максимальная длина последовательности, используемая для промпта.

Кодирует промпт в скрытые состояния текстового энкодера.

Update on GitHub