# PixArt-Σ

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/pixart/header_collage_sigma.jpg)

[PixArt-Σ: Weak-to-Strong Training of Diffusion Transformer for 4K Text-to-Image Generation](https://huggingface.co/papers/2403.04692) — это работа 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](https://github.com/PixArt-alpha/PixArt-sigma), а все доступные контрольные точки — в [PixArt-alpha](https://huggingface.co/PixArt-alpha).

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

* Для шумоподавления используется базовая архитектура Transformer (вместо UNet). В связи с этим её архитектура похожа на архитектуру [DiT](https://hf.co/docs/transformers/model_doc/dit).
* Модель обучалась с использованием текстовых условий, вычисленных с помощью T5. Это позволяет пайплайну лучше следовать сложным текстовым промптам с детализированными описаниями.
* Модель хорошо генерирует изображения высокого разрешения с различными соотношениями сторон. Для получения наилучших результатов авторы рекомендуют использовать определённые диапазоны размеров, которые можно найти [здесь](https://github.com/PixArt-alpha/PixArt-sigma/blob/master/diffusion/data/datasets/utils.py).
* По качеству он не уступает передовым системам генерации изображений по тексту (на момент написания этой статьи), таким как PixArt-α, Stable Diffusion XL, Playground V2.0 и DALL-E 3, при этом он более эффективен, чем они.
* Демонстрирует способность генерировать изображения сверхвысокого разрешения, например, 2048 пикселей или даже 4K.
* Это показывает, что модели «текст в изображение» могут развиваться от слабой модели к более сильной за счёт нескольких улучшений (VAE, наборы данных и т. д.).

> [!TIP]
> Обязательно ознакомьтесь с [руководством по планировщикам](../../using-diffusers/schedulers), чтобы узнать, как исследовать баланс между скоростью и качеством планировщика, а также с разделом [повторное использование компонентов в разных конвейерах](../../using-diffusers/loading#reusing-models-in-multiple-pipelines), чтобы узнать, как эффективно загружать одни и те же компоненты в несколько конвейеров.

> [!TIP]
> Вы можете дополнительно повысить качество генерации, передав изображение, полученное из [PixArtSigmaPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/pixart_sigma#diffusers.PixArtSigmaPipeline), в модель [SDXL refiner](./stable_diffusion/stable_diffusion_xl#base-to-refiner-model).

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

Запустите [PixArtSigmaPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/pixart_sigma#diffusers.PixArtSigmaPipeline) на GPU с менее чем 8 ГБ видеопамяти, загрузив текстовый энкодер в 8-битной точности. Разберём полноценный пример.

Сначала установите библиотеку [bitsandbytes](https://github.com/TimDettmers/bitsandbytes):

```bash
pip install -U bitsandbytes
```

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

```python
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`, чтобы закодировать промпт:

```python
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:

```python
import gc

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

del text_encoder
del pipe
flush()
```

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

```python
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()
```

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

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

```python
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](/docs/diffusers/v0.43.0/ru/api/pipelines/pixart_sigma#diffusers.PixArtSigmaPipeline) с видеопамятью менее 8 ГБ.

![](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/pixart/8bits_cat.png)

Если вам нужен отчёт об использовании памяти, выполните этот [скрипт](https://gist.github.com/sayakpaul/3ae0f847001d342af27018a96f467e4e).

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

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

## PixArtSigmaPipeline[[diffusers.PixArtSigmaPipeline]]

#### diffusers.PixArtSigmaPipeline[[diffusers.PixArtSigmaPipeline]]

```python
diffusers.PixArtSigmaPipeline(tokenizer: T5Tokenizer, text_encoder: T5EncoderModel, vae: AutoencoderKL, transformer: PixArtTransformer2DModel, scheduler: KarrasDiffusionSchedulers)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py#L185)

**Параметры:**

vae ([AutoencoderKL](/docs/diffusers/v0.43.0/ru/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.

text_encoder (`T5EncoderModel`) : Замороженный текстовый энкодер. PixArt-Alpha использует [T5](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5EncoderModel), а именно вариант [t5-v1_1-xxl](https://huggingface.co/PixArt-alpha/PixArt-alpha/tree/main/t5-v1_1-xxl).

tokenizer (`T5Tokenizer`) : Токенизатор класса [T5Tokenizer](https://huggingface.co/docs/transformers/model_doc/t5#transformers.T5Tokenizer).

transformer ([PixArtTransformer2DModel](/docs/diffusers/v0.43.0/ru/api/models/pixart_transformer2d#diffusers.PixArtTransformer2DModel)) : модель `PixArtTransformer2DModel` с текстовым условием для удаления шума из закодированных латентов изображения. Изначально в конфигурации публиковалась как [`Transformer2DModel`](https://huggingface.co/PixArt-alpha/PixArt-Sigma-XL-2-1024-MS/blob/main/transformer/config.json#L2), но это несоответствие можно игнорировать.

scheduler ([SchedulerMixin](/docs/diffusers/v0.43.0/ru/api/schedulers/overview#diffusers.SchedulerMixin)) : планировщик, используемый в сочетании с `transformer` для удаления шума из закодированных латентов изображения.

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

Эта модель наследуется от [DiffusionPipeline](/docs/diffusers/v0.43.0/ru/api/pipelines/overview#diffusers.DiffusionPipeline). См. документацию родительского класса для общих методов, которые библиотека реализует для всех пайплайнов (например, загрузка или сохранение, запуск на конкретном устройстве и т. д.)

#### __call__[[diffusers.PixArtSigmaPipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, negative_prompt: str = '', num_inference_steps: int = 20, timesteps: list[int] = None, sigmas: list[float] = None, guidance_scale: float = 4.5, num_images_per_prompt: int | None = 1, height: int | None = None, width: int | None = None, eta: float = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = None, callback_steps: int = 1, clean_caption: bool = True, use_resolution_binning: bool = True, max_sequence_length: int = 300, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py#L631)

**Параметры:**

prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать `prompt_embeds` вместо него.

negative_prompt (`str` или `list[str]`, *необязательный*) : Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать `negative_prompt_embeds`. Игнорируется, если не используется направляющее влияние (то есть игнорируется, если `guidance_scale` меньше `1`).

num_inference_steps (`int`, *optional*, по умолчанию 100) : Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода.

timesteps (`list[int]`, *optional*) : Пользовательские шаги для процесса денойзинга с планировщиками, поддерживающими аргумент `timesteps` в их методе `set_timesteps`. Если не определено, будет использоваться поведение по умолчанию при передаче `num_inference_steps`. Должны быть в порядке убывания.

sigmas (`list[float]`, *optional*) : Пользовательские сигмы для процесса денойзинга в планировщиках, поддерживающих аргумент `sigmas` в методе `set_timesteps`. Если не задано, будет использовано поведение по умолчанию при передаче `num_inference_steps`.

guidance_scale (`float`, *optional*, по умолчанию 4.5) : Масштаб руководства, как определено в [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` определяется как `w` из уравнения 2 в [Imagen Paper](https://huggingface.co/papers/2205.11487). Масштаб руководства активируется при установке `guidance_scale > 1`. Более высокий масштаб руководства способствует генерации изображений, тесно связанных с текстовым `prompt`, обычно за счёт снижения качества изображения.

num_images_per_prompt (`int`, *необязательный*, по умолчанию 1) : Количество изображений, генерируемых на один запрос.

height (`int`, *optional*, по умолчанию self.unet.config.sample_size) : Высота генерируемого изображения в пикселях.

width (`int`, *optional*, по умолчанию self.unet.config.sample_size) : Ширина генерируемого изображения в пикселях.

eta (`float`, *optional*, по умолчанию 0.0) : Соответствует параметру eta (η) в статье DDIM: https://huggingface.co/papers/2010.02502. Применяется только к [schedulers.DDIMScheduler](/docs/diffusers/v0.43.0/ru/api/schedulers/ddim#diffusers.DDIMScheduler), для остальных игнорируется.

generator (`torch.Generator` или `list[torch.Generator]`, *необязательный*) : Один или список [генераторов torch](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации.

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](https://pillow.readthedocs.io/en/stable/): `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`, *optional*, по умолчанию 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](/docs/diffusers/v0.43.0/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) или `tuple`

Если `return_dict` равно `True`, возвращается [ImagePipelineOutput](/docs/diffusers/v0.43.0/ru/api/pipelines/consistency_models#diffusers.ImagePipelineOutput), иначе возвращается `tuple`, где первый элемент — это список с сгенерированными изображениями

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

Примеры:
```py
>>> 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[[diffusers.PixArtSigmaPipeline.encode_prompt]]

```python
encode_prompt(prompt: str | list[str], do_classifier_free_guidance: bool = True, negative_prompt: str = '', num_images_per_prompt: int = 1, device: typing.Optional[torch.device] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, clean_caption: bool = False, max_sequence_length: int = 300, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/pixart_alpha/pipeline_pixart_sigma.py#L247)

**Параметры:**

prompt (`str` или `list[str]`, *необязательный*) : промпт для кодирования

negative_prompt (`str` или `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) : Максимальная длина последовательности, используемая для промпта.

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

