Diffusers documentation

Latte

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
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 da Monash University, Shanghai AI Lab, Nanjing University e Nanyang Technological University.

O resumo do artigo é:

Propomos um novo Latent Diffusion Transformer, o Latte, para geração de vídeo. O Latte primeiro extrai tokens espaço-temporais dos vídeos de entrada e, em seguida, adota uma série de blocos Transformer para modelar a distribuição de vídeo no espaço latente. A fim de modelar um número substancial de tokens extraídos de vídeos, são introduzidas quatro variantes eficientes a partir da perspectiva de decompor as dimensões espacial e temporal dos vídeos de entrada. Para melhorar a qualidade dos vídeos gerados, determinamos as melhores práticas do Latte por meio de uma análise experimental rigorosa, incluindo incorporação de patches de clipes de vídeo, variantes de modelo, injeção de informação de classe de passo de tempo, incorporação posicional temporal e estratégias de aprendizado. Nossa avaliação abrangente demonstra que o Latte atinge desempenho de estado da arte em quatro conjuntos de dados padrão de geração de vídeo, a saber, FaceForensics, SkyTimelapse, UCF101 e Taichi-HD. Além disso, estendemos o Latte para a tarefa de geração de vídeo a partir de texto (T2V), na qual o Latte atinge resultados comparáveis aos de modelos T2V recentes. Acreditamos fortemente que o Latte fornece insights valiosos para pesquisas futuras sobre a incorporação de Transformers em modelos de difusão para geração de vídeo.

Destaques: Latte é um transformer de difusão latente proposto como espinha dorsal para modelar diferentes modalidades (treinado aqui para geração de vídeo a partir de texto). Ele atinge desempenho de estado da arte em quatro benchmarks padrão de vídeo - FaceForensics, SkyTimelapse, UCF101 e Taichi-HD. Para preparar e baixar os conjuntos de dados para avaliação, consulte este URL.

Este pipeline foi contribuído por maxin-cn. A base de código original pode ser encontrada aqui. Os pesos originais podem ser encontrados em hf.co/maxin-cn.

Certifique-se de consultar o guia de Schedulers para aprender a explorar o compromisso entre a velocidade e a qualidade do scheduler, e veja a seção reutilização de componentes entre pipelines para aprender a carregar eficientemente os mesmos componentes em vários pipelines.

Inferência

Use torch.compile para reduzir a latência de inferência.

Primeiro, carregue o pipeline:

import torch
from diffusers import LattePipeline

pipeline = LattePipeline.from_pretrained(
	"maxin-cn/Latte-1", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

Em seguida, altere o layout de memória dos componentes transformer e vae dos pipelines para torch.channels-last:

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

Por fim, compile os componentes e execute a inferência:

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]

Os resultados do benchmark em uma máquina A100 de 80GB são:

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

Quantização

A quantização ajuda a reduzir os requisitos de memória de modelos muito grandes armazenando os pesos do modelo em um tipo de dados de menor precisão. No entanto, a quantização pode ter um impacto variável na qualidade do vídeo, dependendo do modelo de vídeo.

Consulte a visão geral de Quantization para saber mais sobre os backends de quantização suportados e sobre como selecionar um backend de quantização que atenda ao seu caso de uso. O exemplo abaixo demonstra como carregar um LattePipeline quantizado para inferência com 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

classe diffusers.LattePipeline

< >

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

Parâmetros

  • vae (AutoencoderKL) — Modelo de Variational Auto-Encoder (VAE) para codificar e decodificar vídeos para e a partir de representações latentes.
  • text_encoder (T5EncoderModel) — Codificador de texto congelado. O Latte usa T5, especificamente a variante t5-v1_1-xxl.
  • tokenizer (T5Tokenizer) — Tokenizer da classe T5Tokenizer.
  • transformer (LatteTransformer3DModel) — Um LatteTransformer3DModel condicionado por texto para desruidar os latentes de vídeo codificados.
  • scheduler (SchedulerMixin) — Um scheduler a ser usado em combinação com transformer para desruidar os latentes de vídeo codificados.

Pipeline para geração de texto para vídeo usando Latte.

Este modelo herda de DiffusionPipeline. Consulte a documentação da superclasse para os métodos genéricos que a biblioteca implementa para todos os pipelines (como download ou salvamento, execução em um dispositivo específico, etc.)

__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 = ['latents']clean_caption: bool = Truemask_feature: bool = Trueenable_temporal_attentions: bool = Truedecode_chunk_size: int = 14 ) → LattePipelineOutput or tuple

Parâmetros

  • prompt (str ou list[str], opcional) — O prompt ou os prompts para orientar a geração do vídeo. Se não definido, é necessário passar prompt_embeds em vez disso.
  • negative_prompt (str ou list[str], opcional) — O prompt ou os prompts que não devem orientar a geração do vídeo. Se não for definido, é necessário passar negative_prompt_embeds em vez disso. Ignorado quando não se usa orientação (ou seja, ignorado se guidance_scale for menor que 1).
  • num_inference_steps (int, opcional, padrão 100) — O número de etapas de remoção de ruído. Mais etapas de remoção de ruído geralmente resultam em um vídeo de maior qualidade, à custa de uma inferência mais lenta.
  • timesteps (list[int], opcional) — Timesteps personalizados para usar no processo de remoção de ruído. Se não definidos, são usados num_inference_steps timesteps igualmente espaçados. Devem estar em ordem decrescente.
  • guidance_scale (float, opcional, padrão 7.0) — Escala de orientação definida em Classifier-Free Diffusion Guidance. guidance_scale é definido como w da equação 2 do Imagen Paper. A escala de orientação é ativada ao definir guidance_scale > 1. Uma escala de orientação maior incentiva a geração de vídeos que estão intimamente ligados ao prompt de texto, geralmente em detrimento de uma menor qualidade do vídeo.
  • video_length (int, opcional, padrão 16) — O número de quadros de vídeo que são gerados. O padrão é 16 quadros, que a 8 quadros por segundo
  • num_images_per_prompt (int, opcional, padrão 1) — O número de vídeos a serem gerados por prompt.
  • height (int, opcional, padrão é self.unet.config.sample_size) — A altura em pixels do vídeo gerado.
  • width (int, opcional, padrão é self.unet.config.sample_size) — A largura em pixels do vídeo gerado.
  • eta (float, opcional, padrão 0.0) — Corresponde ao parâmetro eta (η) no paper do DDIM: https://huggingface.co/papers/2010.02502. Aplica-se apenas a schedulers.DDIMScheduler, será ignorado para os demais.
  • generator (torch.Generator ou list[torch.Generator], opcional) — Um ou uma lista de geradores do torch para tornar a geração determinística.
  • latents (torch.FloatTensor, opcional) — Latentes ruidosos pré-gerados, amostrados de uma distribuição gaussiana, a serem usados como entradas para a geração de vídeo. Pode ser usado para ajustar a mesma geração com diferentes prompts. Se não for fornecido, um tensor de latentes será gerado por amostragem usando o generator aleatório fornecido.
  • prompt_embeds (torch.FloatTensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não forem fornecidas, as incorporações de texto serão geradas a partir do argumento de entrada prompt.
  • negative_prompt_embeds (torch.FloatTensor, opcional) — Incorporações de texto negativo pré-geradas. Para o Latte, este prompt negativo deve ser "". Se não for fornecido, negative_prompt_embeds será gerado a partir do argumento de entrada negative_prompt.
  • output_type (str, opcional, padrão "pil") — O formato de saída do vídeo gerado. Escolha entre PIL: PIL.Image.Image ou np.array.
  • return_dict (bool, opcional, padrão True) — Se deve ou não retornar um ~pipelines.stable_diffusion.IFPipelineOutput em vez de uma tupla simples.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, opcional) — Uma função de callback ou uma lista de funções de callback a serem chamadas no final de cada etapa de remoção de ruído.
  • callback_on_step_end_tensor_inputs (list[str], opcional) — Uma lista de entradas de tensor que devem ser passadas para a função de callback. Se não for definida, todas as entradas de tensor serão passadas.
  • clean_caption (bool, opcional, padrão True) — Indica se a legenda deve ser limpa antes de criar os embeddings. Exige que beautifulsoup4 e ftfy estejam instalados. Se as dependências não estiverem instaladas, os embeddings serão criados a partir do prompt bruto.
  • mask_feature (bool padrão True) — Se definido como True, os embeddings de texto serão mascarados.
  • enable_temporal_attentions (bool, opcional, padrão True) — Se as atenções temporais devem ser habilitadas
  • decode_chunk_size (int, opcional) — O número de quadros a decodificar por vez. Um tamanho de bloco maior resulta em melhor consistência temporal às custas de maior uso de memória. Por padrão, o decodificador decodifica todos os quadros de uma vez para qualidade máxima. Para reduzir o uso de memória, diminua decode_chunk_size.

Retorna

LattePipelineOutput ou tuple

Se return_dict for True, LattePipelineOutput é retornado, caso contrário, uma tuple é retornada, onde o primeiro elemento é uma lista com as imagens geradas

Função invocada ao chamar o pipeline para geração.

Exemplos:

>>> 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 )

Parâmetros

  • prompt (str ou list[str], opcional) — prompt a ser codificado
  • negative_prompt (str ou list[str], opcional) — O prompt que não deve orientar a geração do vídeo. Se não for definido, é necessário passar negative_prompt_embeds em vez disso. Ignorado quando não se usa orientação (ou seja, ignorado se guidance_scale for menor que 1). Para Latte, isso deve ser "".
  • do_classifier_free_guidance (bool, opcional, padrão True) — se deve ou não usar classifier free guidance
  • num_images_per_prompt (int, opcional, padrão 1) — número de vídeos que devem ser gerados por prompt
  • device — (torch.device, opcional): dispositivo torch em que os embeddings resultantes serão colocados
  • prompt_embeds (torch.FloatTensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não forem fornecidas, as incorporações de texto serão geradas a partir do argumento de entrada prompt.
  • negative_prompt_embeds (torch.FloatTensor, opcional) — Incorporações de texto negativo pré-geradas. Para o Latte, deve ser as incorporações da string "".
  • clean_caption (bool, padrão False) — Se True, a função pré-processa e limpa a legenda fornecida antes de codificá-la.
  • mask_feature — (bool, padrão True): Se True, a função irá mascarar os embeddings de texto.

Codifica o prompt em estados ocultos do codificador de texto.

Update on GitHub