Diffusers documentation

Lumina-T2X

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Lumina-T2X

concepts

Lumina-Next: Улучшение Lumina-T2X с помощью Next-DiT от Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory.

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

Lumina-T2X — это зарождающееся семейство Flow-based Large Diffusion Transformers (Flag-DiT), которое устанавливает единый фреймворк для преобразования шума в различные модальности, такие как изображения и видео, с условием на текстовые инструкции. Несмотря на перспективные возможности, Lumina-T2X по-прежнему сталкивается с проблемами, включая нестабильность обучения, медленный инференс и артефакты экстраполяции. В данной статье мы представляем Lumina-Next, улучшенную версию Lumina-T2X, демонстрирующую более высокую производительность генерации при увеличенной эффективности обучения и инференса. Мы начинаем с комплексного анализа архитектуры Flag-DiT и выявляем несколько неоптимальных компонентов, которые устраняем, вводя архитектуру Next-DiT с 3D RoPE и sandwich normalizations. Для обеспечения лучшей экстраполяции разрешения мы тщательно сравниваем различные методы экстраполяции контекста, применяемые к генерации изображений по тексту с 3D RoPE, и предлагаем Frequency- and Time-Aware Scaled RoPE, адаптированный для диффузионных трансформеров. Кроме того, мы вводим расписание дискретизации времени на основе сигмоиды для сокращения количества шагов сэмплирования при решении Flow ODE и метод Context Drop для слияния избыточных визуальных токенов ради более быстрой оценки сети, что эффективно повышает общую скорость сэмплирования. Благодаря этим улучшениям Lumina-Next не только повышает качество и эффективность базовой генерации изображений по тексту, но и демонстрирует превосходные возможности экстраполяции разрешения и многоязычной генерации с использованием decoder-based LLM в качестве текстового энкодера, все это в режиме zero-shot. Для дальнейшей валидации Lumina-Next как универсального генеративного фреймворка мы применяем его к разнообразным задачам, включая визуальное распознавание, генерацию мультивью, аудио, музыки и облаков точек, демонстрируя высокую производительность во всех этих областях. Публикуя весь код и веса моделей по адресу https://github.com/Alpha-VLLM/Lumina-T2X, мы стремимся продвинуть развитие генеративного ИИ следующего поколения, способного к универсальному моделированию.

Ключевые особенности: Lumina-Next — это диффузионный трансформер нового поколения, который значительно улучшает генерацию изображений по тексту, многоязычную генерацию и производительность в многозадачном режиме за счёт внедрения архитектуры Next-DiT, 3D RoPE, а также RoPE с учётом частоты и времени и других улучшений.

Lumina-Next включает следующие компоненты:

  • Это повышает эффективность выборки за счёт меньшего количества и более быстрых шагов.
  • Он использует Next-DiT в качестве трансформерного каркаса с Sandwichnorm 3D RoPE и Grouped-Query Attention.
  • Он использует масштабированный RoPE с учётом частоты и времени.

Lumina-T2X: преобразование текста в любую модальность, разрешение и длительность с помощью потоковых больших диффузионных трансформеров от Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory.

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

Sora демонстрирует потенциал масштабирования Diffusion Transformer для генерации фотореалистичных изображений и видео с произвольным разрешением, соотношением сторон и длительностью, однако в нём по-прежнему не хватает достаточных деталей реализации. В данном техническом отчёте мы представляем семейство Lumina-T2X — серию Flow-based Large Diffusion Transformers (Flag-DiT) с нулевой инициализацией внимания, — в качестве единого фреймворка, предназначенного для преобразования шума в изображения, видео, многовидовые 3D-объекты и аудиоклипы на основе текстовых инструкций. За счёт токенизации латентного пространственно-временного пространства и включения обучаемых плейсхолдеров, таких как токены [nextline] и [nextframe], Lumina-T2X бесшовно объединяет представления различных модальностей при разных пространственно-временных разрешениях. Этот единый подход позволяет обучать модели для различных модальностей в рамках одного фреймворка и обеспечивает гибкую генерацию мультимодальных данных с любым разрешением, соотношением сторон и длиной на этапе инференса. Продвинутые техники, такие как RoPE, RMSNorm и flow matching, повышают стабильность, гибкость и масштабируемость Flag-DiT, что позволяет моделям Lumina-T2X масштабироваться до 7 миллиардов параметров и расширять контекстное окно до 128K токенов. Это особенно полезно для создания сверхвысококачественных изображений с помощью нашей модели Lumina-T2I и длинных видео в разрешении 720p с помощью нашей модели Lumina-T2V. Примечательно, что Lumina-T2I, работающая на базе Flag-DiT с 5 миллиардами параметров, требует лишь 35% вычислительных затрат на обучение по сравнению с наивным DiT на 600 миллионов параметров. Наш дальнейший комплексный анализ подчёркивает предварительную способность Lumina-T2X к экстраполяции разрешения, редактированию в высоком разрешении, генерации согласованных 3D-видов и синтезу видео с бесшовными переходами. Мы ожидаем, что открытое распространение Lumina-T2X将进一步 будет способствовать развитию креативности, прозрачности и разнообразия в сообществе генеративного ИИ.

Исходный код можно найти в Alpha-VLLM, а все доступные контрольные точки — в Alpha-VLLM Lumina Family.

Ключевые особенности: Lumina-T2X поддерживает любые модальности, разрешение и длительность.

Lumina-T2X включает следующие компоненты:

  • В качестве основы используется Flow-based Large Diffusion Transformer
  • Он поддерживает различные модальности с единым базовым блоком и соответствующими кодировщиком и декодером.

Этот конвейер был предложен пользователем PommesPeter. Исходная кодовая база доступна здесь. Исходные веса можно найти по адресу hf.co/Alpha-VLLM.

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

Вывод (Текст в изображение)

Используйте torch.compile для снижения задержки при выводе.

Сначала загрузите конвейер:

from diffusers import LuminaPipeline
import torch

pipeline = LuminaPipeline.from_pretrained(
	"Alpha-VLLM/Lumina-Next-SFT-diffusers", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

Затем измените раскладку памяти компонентов transformer и vae на torch.channels-last:

pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.vae.to(memory_format=torch.channels_last)

Наконец, скомпилируйте компоненты и запустите инференс:

pipeline.transformer = torch.compile(pipeline.transformer, mode="max-autotune", fullgraph=True)
pipeline.vae.decode = torch.compile(pipeline.vae.decode, mode="max-autotune", fullgraph=True)

image = pipeline(prompt="Upper body of a young woman in a Victorian-era outfit with brass goggles and leather straps. Background shows an industrial revolution cityscape with smoky skies and tall, metal structures").images[0]

Квантование

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

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

import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, Transformer2DModel, LuminaPipeline
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel

quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
    "Alpha-VLLM/Lumina-Next-SFT-diffusers",
    subfolder="text_encoder",
    quantization_config=quant_config,
    dtype=torch.float16,
)

quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = Transformer2DModel.from_pretrained(
    "Alpha-VLLM/Lumina-Next-SFT-diffusers",
    subfolder="transformer",
    quantization_config=quant_config,
    dtype=torch.float16,
)

pipeline = LuminaPipeline.from_pretrained(
    "Alpha-VLLM/Lumina-Next-SFT-diffusers",
    text_encoder=text_encoder_8bit,
    transformer=transformer_8bit,
    dtype=torch.float16,
    device_map="balanced",
)

prompt = "a tiny astronaut hatching from an egg on the moon"
image = pipeline(prompt).images[0]
image.save("lumina.png")

LuminaPipeline

класс diffusers.LuminaPipeline

< >

( transformer: LuminaNextDiT2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: GemmaPreTrainedModeltokenizer: GemmaTokenizer )

Параметры

  • vae (AutoencoderKL) — Модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них.
  • text_encoder (GemmaPreTrainedModel) — Замороженный текстовый энкодер Gemma.
  • tokenizer (GemmaTokenizer или GemmaTokenizerFast) — токенизатор Gemma.
  • transformer (Transformer2DModel) — Модель Transformer2DModel с текстовым условием для удаления шума из закодированных латентов изображения.
  • scheduler (SchedulerMixin) — планировщик, используемый в связке с transformer для удаления шума из закодированных латентов изображения.

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

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

__call__

< >

( prompt: str | list[str] = Nonewidth: int | None = Noneheight: int | None = Nonenum_inference_steps: int = 30guidance_scale: float = 4.0negative_prompt: str | list[str] = Nonesigmas: list[float] = Nonenum_images_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = 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] = Noneoutput_type: str | None = 'pil'return_dict: bool = Trueclean_caption: bool = Truemax_sequence_length: int = 256scaling_watershed: float | None = 1.0proportional_attn: bool | None = Truecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list[str] = ['latents'] ) → 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, необязательный, по умолчанию 30) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода.
  • sigmas (list[float], необязательный) — Пользовательские сигмы для процесса удаления шума в планировщиках, поддерживающих аргумент sigmas в их методе set_timesteps. Если не задано, будет использоваться поведение по умолчанию при передаче num_inference_steps.
  • guidance_scale (float, необязательный, по умолчанию 4.0) — Масштаб руководства, как определено в 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) — Ширина генерируемого изображения в пикселях.
  • 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, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для Lumina-T2I этот отрицательный промпт должен быть "". Если не предоставлен, 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 вместо обычного кортежа.
  • clean_caption (bool, необязательный, по умолчанию True) — Определяет, нужно ли очищать подпись перед созданием эмбеддингов. Требует установки beautifulsoup4 и ftfy. Если зависимости не установлены, эмбеддинги будут созданы из исходного промпта.
  • max_sequence_length (int, по умолчанию 120) — Максимальная длина последовательности, используемая с prompt.
  • scaling_watershed (float, необязательный, по умолчанию 1.0) — Порог масштабирования разрешения, используемый Lumina для переключения между стандартным и расширенным контекстным вниманием.
  • proportional_attn (bool, необязательный, по умолчанию True) — Определяет, следует ли масштабировать внимание пропорционально для генерации в высоком разрешении.
  • callback_on_step_end (Callable, необязательный) — Функция, вызываемая в конце каждого шага денойзинга во время инференса. Функция вызывается со следующими аргументами: callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict). callback_kwargs будет содержать список всех тензоров, как указано в callback_on_step_end_tensor_inputs.
  • callback_on_step_end_tensor_inputs (list, необязательный) — Список тензорных входных данных для функции callback_on_step_end. Тензоры, указанные в списке, будут переданы в качестве аргумента callback_kwargs. Вы сможете включать только переменные, перечисленные в атрибуте ._callback_tensor_inputs вашего класса пайплайна.

Возвращает

ImagePipelineOutput или tuple

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

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

Примеры:

>>> import torch
>>> from diffusers import LuminaPipeline

>>> pipe = LuminaPipeline.from_pretrained("Alpha-VLLM/Lumina-Next-SFT-diffusers", torch_dtype=torch.bfloat16)
>>> # Enable memory optimizations.
>>> pipe.enable_model_cpu_offload()

>>> prompt = "Upper body of a young woman in a Victorian-era outfit with brass goggles and leather straps. Background shows an industrial revolution cityscape with smoky skies and tall, metal structures"
>>> image = pipe(prompt).images[0]

encode_prompt

< >

( prompt: str | list[str]do_classifier_free_guidance: bool = Truenegative_prompt: str | list[str] = Nonenum_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 = False**kwargs )

Параметры

  • prompt (str или list[str], необязательный) — промпт для кодирования
  • negative_prompt (str or list[str], необязательный) — Промпт, который не должен направлять генерацию изображения. Если не задан, необходимо передать negative_prompt_embeds вместо него. Игнорируется, если не используется guidance (то есть игнорируется, если guidance_scale меньше 1). Для Lumina-T2I это должно быть "".
  • 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, необязательный) — Предварительно сгенерированные отрицательные текстовые эмбеддинги. Для Lumina-T2I это должны быть эмбеддинги строки "".
  • clean_caption (bool, по умолчанию False) — Если True, функция выполнит предобработку и очистку переданного описания перед кодированием.
  • max_sequence_length (int, по умолчанию 256) — Максимальная длина последовательности, используемая для промпта.

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

Update on GitHub