Diffusers documentation

Latte

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Latte

latte text-to-video

Latte: Latent Diffusion Transformer for Video Generation от Университета Монаш, Шанхайской лаборатории искусственного интеллекта, Нанкинского университета и Наньянского технологического университета.

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

Мы предлагаем новый Latent Diffusion Transformer, а именно Latte, для генерации видео. Latte сначала извлекает пространственно-временные токены из входных видео, а затем использует серию блоков Transformer для моделирования распределения видео в латентном пространстве. Чтобы смоделировать значительное количество токенов, извлечённых из видео, с точки зрения разложения пространственных и временных измерений входных видео введены четыре эффективных варианта. Для повышения качества генерируемых видео мы определяем лучшие практики для Latte с помощью тщательного экспериментального анализа, включая встраивание патчей видеоклипов, варианты моделей, инъекцию информации о временных шагах и классах, временное позиционное встраивание и стратегии обучения. Наша комплексная оценка демонстрирует, что Latte достигает передовых результатов на четырёх стандартных наборах данных для генерации видео, а именно FaceForensics, SkyTimelapse, UCF101 и Taichi-HD. Кроме того, мы расширяем Latte для задачи генерации видео по тексту (T2V), где Latte показывает результаты, сопоставимые с результатами последних T2V-моделей. Мы твёрдо верим, что Latte предоставляет ценные идеи для будущих исследований по интеграции Transformer в диффузионные модели для генерации видео.

Ключевые особенности: Latte — это трансформер латентной диффузии, предложенный в качестве базовой архитектуры для моделирования различных модальностей (здесь обучен для генерации видео по тексту). Он демонстрирует наилучшие результаты на четырёх стандартных видео-бенчмарках — FaceForensics, SkyTimelapse, UCF101 и Taichi-HD. Для подготовки и загрузки наборов данных для оценки см. этот URL.

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

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

Вывод

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

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

import torch
from diffusers import LattePipeline

pipeline = LattePipeline.from_pretrained(
	"maxin-cn/Latte-1", dtype=torch.float16
).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)
pipeline.vae.decode = torch.compile(pipeline.vae.decode)

video = pipeline(prompt="A dog wearing sunglasses floating in space, surreal, nebulae in background").frames[0]

Результаты бенчмарка на машине с 80 ГБ A100:

Without torch.compile(): Average inference time: 16.246 seconds.
With torch.compile(): Average inference time: 14.573 seconds.

Квантование

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

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

import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, LatteTransformer3DModel, LattePipeline
from diffusers.utils import export_to_gif
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel

quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
    "maxin-cn/Latte-1",
    subfolder="text_encoder",
    quantization_config=quant_config,
    dtype=torch.float16,
)

quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = LatteTransformer3DModel.from_pretrained(
    "maxin-cn/Latte-1",
    subfolder="transformer",
    quantization_config=quant_config,
    dtype=torch.float16,
)

pipeline = LattePipeline.from_pretrained(
    "maxin-cn/Latte-1",
    text_encoder=text_encoder_8bit,
    transformer=transformer_8bit,
    dtype=torch.float16,
    device_map="balanced",
)

prompt = "A small cactus with a happy face in the Sahara desert."
video = pipeline(prompt).frames[0]
export_to_gif(video, "latte.gif")

LattePipeline

класс diffusers.LattePipeline

< >

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

Параметры

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

Pipeline для генерации видео из текста с использованием Latte.

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

__call__

< >

( prompt: str | list[str] = Nonenegative_prompt: str = ''num_inference_steps: int = 50timesteps: list[int] | None = Noneguidance_scale: float = 7.5num_images_per_prompt: int = 1video_length: int = 16height: int = 512width: int = 512eta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.FloatTensor] = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneoutput_type: str = 'pil'return_dict: bool = 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']clean_caption: bool = Truemask_feature: bool = Trueenable_temporal_attentions: bool = Truedecode_chunk_size: int = 14 ) → LattePipelineOutput 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 для процесса денойзинга. Если не заданы, используются равноотстоящие num_inference_steps timesteps. Должны быть в порядке убывания.
  • guidance_scale (float, необязательный, по умолчанию 7.0) — Масштаб руководства, как определено в Classifier-Free Diffusion Guidance. guidance_scale определяется как w из уравнения 2 статьи Imagen Paper. Масштаб руководства включается при установке guidance_scale > 1. Более высокий масштаб руководства способствует генерации видео, тесно связанных с текстовым prompt, обычно за счёт снижения качества видео.
  • video_length (int, необязательный, по умолчанию 16) — Количество генерируемых кадров видео. По умолчанию 16 кадров, что при 8 кадрах в секунду
  • 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.FloatTensor, необязательный) — Предварительно сгенерированные зашумлённые латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации видео. Можно использовать, чтобы скорректировать одну и ту же генерацию с помощью разных промптов. Если не заданы, тензор латентов будет сгенерирован путём выборки с использованием переданного случайного generator.
  • prompt_embeds (torch.FloatTensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргумента prompt.
  • negative_prompt_embeds (torch.FloatTensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Для Latte этот отрицательный промпт должен быть "". Если не указан, negative_prompt_embeds будет сгенерирован из входного аргумента negative_prompt.
  • output_type (str, необязательный, по умолчанию "pil") — Формат вывода для генерации видео. Выберите один из вариантов: PIL: PIL.Image.Image или np.array.
  • return_dict (bool, необязательный, по умолчанию True) — Определяет, следует ли возвращать ~pipelines.stable_diffusion.IFPipelineOutput вместо обычного кортежа.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, необязательный) — Функция обратного вызова или список функций обратного вызова, которые вызываются в конце каждого шага удаления шума.
  • callback_on_step_end_tensor_inputs (list[str], необязательный) — Список тензорных входных данных, которые должны передаваться в функцию обратного вызова. Если не определено, будут переданы все тензорные входные данные.
  • clean_caption (bool, необязательный, по умолчанию True) — Определяет, нужно ли очищать подпись перед созданием эмбеддингов. Требует установки beautifulsoup4 и ftfy. Если зависимости не установлены, эмбеддинги будут созданы из исходного промпта.
  • mask_feature (bool, по умолчанию True) — если установлено в True, текстовые эмбеддинги будут замаскированы.
  • enable_temporal_attentions (bool, необязательный, по умолчанию True) — Включает ли временные внимания
  • decode_chunk_size (int, необязательный) — Количество кадров, декодируемых за один раз. Увеличение размера блока повышает временную согласованность ценой роста потребления памяти. По умолчанию декодер обрабатывает все кадры сразу для достижения максимального качества. Для снижения потребления памяти уменьшите decode_chunk_size.

Возвращает

LattePipelineOutput или tuple

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

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

Примеры:

>>> import torch
>>> from diffusers import LattePipeline
>>> from diffusers.utils import export_to_gif

>>> # You can replace the checkpoint id with "maxin-cn/Latte-1" too.
>>> pipe = LattePipeline.from_pretrained("maxin-cn/Latte-1", torch_dtype=torch.float16)
>>> # Enable memory optimizations.
>>> pipe.enable_model_cpu_offload()

>>> prompt = "A small cactus with a happy face in the Sahara desert."
>>> videos = pipe(prompt).frames[0]
>>> export_to_gif(videos, "latte.gif")

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.FloatTensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneclean_caption: bool = Falsemask_feature: bool = Truedtype = None )

Параметры

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

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

Update on GitHub