Diffusers documentation
Latte
Latte

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
< source >( 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__
< source >( 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 (
strorlist[str], необязательный) — Промпт или промпты, которые не должны направлять генерацию видео. Если не задан, необходимо передатьnegative_prompt_embeds. Игнорируется, если не используется направляющее поле (то есть игнорируется, еслиguidance_scaleменьше1). - num_inference_steps (
int, необязательный, по умолчанию 100) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к более высокому качеству видео, но замедляет инференс. - timesteps (
list[int], необязательный) — Пользовательские timesteps для процесса денойзинга. Если не заданы, используются равноотстоящиеnum_inference_stepstimesteps. Должны быть в порядке убывания. - 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
< source >( 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 (
strorlist[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, функция маскирует текстовые эмбеддинги.
Кодирует промпт в скрытые состояния текстового энкодера.