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 từ Đại học Monash, Shanghai AI Lab, Đại học Nam Kinh và Đại học Công nghệ Nanyang.

Tóm tắt từ bài báo là:

Chúng tôi đề xuất một Latent Diffusion Transformer mới, có tên là Latte, cho việc tạo video. Latte trước tiên trích xuất các token không gian-thời gian từ video đầu vào, sau đó áp dụng một loạt các khối Transformer để mô hình hóa phân phối video trong không gian ẩn. Để mô hình hóa một số lượng lớn token được trích xuất từ video, bốn biến thể hiệu quả được giới thiệu từ góc nhìn phân rã các chiều không gian và thời gian của video đầu vào. Để nâng cao chất lượng video được tạo ra, chúng tôi xác định các thực hành tốt nhất của Latte thông qua phân tích thực nghiệm nghiêm ngặt, bao gồm nhúng patch cho đoạn video, các biến thể mô hình, tiêm thông tin lớp theo bước thời gian, nhúng vị trí thời gian và các chiến lược học. Đánh giá toàn diện của chúng tôi cho thấy Latte đạt hiệu suất tiên tiến trên bốn bộ dữ liệu tạo video tiêu chuẩn, cụ thể là FaceForensics, SkyTimelapse, UCF101 và Taichi-HD. Ngoài ra, chúng tôi mở rộng Latte sang nhiệm vụ tạo video từ văn bản (T2V), trong đó Latte đạt kết quả tương đương so với các mô hình T2V gần đây. Chúng tôi tin chắc rằng Latte cung cấp những hiểu biết quý giá cho nghiên cứu tương lai về việc tích hợp Transformer vào các mô hình khuếch tán cho việc tạo video.

Những điểm nổi bật: Latte là một latent diffusion transformer được đề xuất làm backbone để mô hình hóa các modalities khác nhau (được huấn luyện cho việc tạo video từ văn bản ở đây). Nó đạt hiệu suất state-of-the-art trên bốn benchmark video tiêu chuẩn - FaceForensics, SkyTimelapse, UCF101 và Taichi-HD. Để chuẩn bị và tải xuống các dataset phục vụ đánh giá, vui lòng tham khảo đường dẫn này.

Pipeline này được đóng góp bởi maxin-cn. Mã nguồn gốc có thể được tìm thấy tại đây. Trọng số gốc có thể được tìm thấy tại hf.co/maxin-cn.

Hãy chắc chắn xem qua hướng dẫn về Schedulers để tìm hiểu cách khám phá sự đánh đổi giữa tốc độ và chất lượng của scheduler, và xem phần tái sử dụng các thành phần giữa các pipeline để tìm hiểu cách nạp các thành phần giống nhau vào nhiều pipeline một cách hiệu quả.

Suy luận

Sử dụng torch.compile để giảm độ trễ suy luận.

Đầu tiên, tải pipeline:

import torch
from diffusers import LattePipeline

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

Sau đó, thay đổi bố trí bộ nhớ của các thành phần transformer và vae trong pipeline thành torch.channels-last:

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

Cuối cùng, biên dịch các thành phần và chạy suy luận:

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]

Kết quả benchmark trên máy A100 80GB là:

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

Lượng tử hóa

Quantization giúp giảm yêu cầu về bộ nhớ của các mô hình rất lớn bằng cách lưu trữ trọng số mô hình trong kiểu dữ liệu có độ chính xác thấp hơn. Tuy nhiên, lượng tử hóa có thể ảnh hưởng khác nhau đến chất lượng video tùy thuộc vào mô hình video.

Tham khảo phần tổng quan Lượng tử hóa để tìm hiểu thêm về các backend lượng tử hóa được hỗ trợ và cách chọn một backend lượng tử hóa phù hợp với trường hợp sử dụng của bạn. Ví dụ bên dưới minh họa cách tải một LattePipeline đã được lượng tử hóa để suy luận bằng 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

lớp diffusers.LattePipeline

< >

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

Tham số

  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã video từ và sang các biểu diễn ẩn (latent representations).
  • text_encoder (T5EncoderModel) — Bộ mã hóa văn bản đóng băng. Latte sử dụng T5, cụ thể là biến thể t5-v1_1-xxl.
  • tokenizer (T5Tokenizer) — Tokenizer của lớp T5Tokenizer.
  • transformer (LatteTransformer3DModel) — Một LatteTransformer3DModel có điều kiện văn bản để khử nhiễu các latents video đã mã hóa.
  • scheduler (SchedulerMixin) — Một scheduler được sử dụng kết hợp với transformer để khử nhiễu các latents video đã mã hóa.

Pipeline để tạo video từ văn bản sử dụng Latte.

Mô hình này kế thừa từ DiffusionPipeline. Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các pipeline (chẳng hạn như tải xuống hoặc lưu, chạy trên một thiết bị cụ thể, v.v.)

__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

Tham số

  • prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt để định hướng việc tạo video. Nếu không được định nghĩa, bạn phải truyền prompt_embeds thay thế.
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng việc tạo video. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1).
  • num_inference_steps (int, tùy chọn, mặc định là 100) — Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến video có chất lượng cao hơn, với cái giá là suy luận chậm hơn.
  • timesteps (list[int], tùy chọn) — Các bước thời gian tùy chỉnh để sử dụng cho quá trình khử nhiễu. Nếu không được định nghĩa, các bước thời gian num_inference_steps cách đều sẽ được sử dụng. Phải được sắp xếp theo thứ tự giảm dần.
  • guidance_scale (float, tùy chọn, mặc định là 7.0) — Thang độ dẫn hướng như được định nghĩa trong Classifier-Free Diffusion Guidance. guidance_scale được định nghĩa là w của phương trình 2. trong Imagen Paper. Thang độ dẫn hướng được kích hoạt bằng cách đặt guidance_scale > 1. Thang độ dẫn hướng cao hơn khuyến khích tạo ra các video gắn kết chặt chẽ với prompt văn bản, thường phải đánh đổi bằng chất lượng video thấp hơn.
  • video_length (int, tùy chọn, mặc định là 16) — Số lượng khung hình video được tạo ra. Mặc định là 16 khung hình, tương đương 8 khung hình mỗi giây
  • num_images_per_prompt (int, tùy chọn, mặc định là 1) — Số lượng video cần tạo cho mỗi prompt.
  • height (int, tùy chọn, mặc định là self.unet.config.sample_size) — Chiều cao của video được tạo ra, tính bằng pixel.
  • width (int, tùy chọn, mặc định là self.unet.config.sample_size) — Chiều rộng của video được tạo ra, tính bằng pixel.
  • eta (float, tùy chọn, mặc định là 0.0) — Tương ứng với tham số eta (η) trong bài báo DDIM: https://huggingface.co/papers/2010.02502. Chỉ áp dụng cho schedulers.DDIMScheduler, sẽ bị bỏ qua với các scheduler khác.
  • generator (torch.Generator hoặc list[torch.Generator], tuỳ chọn) — Một hoặc một danh sách torch generator để đảm bảo quá trình sinh là tất định.
  • latents (torch.FloatTensor, tùy chọn) — Các latents nhiễu đã được tạo trước, lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo video. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo bằng cách lấy mẫu sử dụng generator ngẫu nhiên được cung cấp.
  • prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với Latte, prompt âm này nên là "". Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • output_type (str, tùy chọn, mặc định là "pil") — Định dạng đầu ra của video được tạo. Chọn giữa PIL: PIL.Image.Image hoặc np.array.
  • return_dict (bool, tùy chọn, mặc định là True) — Có nên trả về một ~pipelines.stable_diffusion.IFPipelineOutput thay vì một tuple thông thường hay không.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, tùy chọn) — Một hàm callback hoặc danh sách các hàm callback sẽ được gọi vào cuối mỗi bước khử nhiễu.
  • callback_on_step_end_tensor_inputs (list[str], tùy chọn) — Danh sách các đầu vào tensor cần được truyền đến hàm callback. Nếu không được định nghĩa, tất cả các đầu vào tensor sẽ được truyền.
  • clean_caption (bool, tùy chọn, mặc định là True) — Có nên làm sạch caption trước khi tạo embeddings hay không. Yêu cầu beautifulsoup4 và ftfy phải được cài đặt. Nếu các phụ thuộc này không được cài đặt, embeddings sẽ được tạo từ prompt thô.
  • mask_feature (bool mặc định là True) — Nếu được đặt thành True, các embedding văn bản sẽ bị che (masked).
  • enable_temporal_attentions (bool, tùy chọn, mặc định là True) — Có bật temporal attentions hay không
  • decode_chunk_size (int, tùy chọn) — Số lượng khung hình được giải mã mỗi lần. Kích thước chunk lớn hơn giúp tăng tính nhất quán theo thời gian nhưng đổi lại là mức sử dụng bộ nhớ cao hơn. Mặc định, trình giải mã sẽ giải mã tất cả các khung hình cùng lúc để đạt chất lượng tối đa. Để giảm mức sử dụng bộ nhớ, hãy giảm decode_chunk_size.

Trả về

LattePipelineOutput hoặc tuple

Nếu return_dict là True, LattePipelineOutput sẽ được trả về, ngoài ra một tuple sẽ được trả về trong đó phần tử đầu tiên là một danh sách chứa các hình ảnh đã tạo

Hàm được gọi khi gọi pipeline cho việc sinh.

Ví dụ:

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

Tham số

  • prompt (str hoặc list[str], tùy chọn) — prompt cần được mã hóa
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt không dùng để định hướng việc tạo video. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1). Đối với Latte, giá trị này nên là "".
  • do_classifier_free_guidance (bool, tùy chọn, mặc định là True) — có sử dụng classifier free guidance hay không
  • num_images_per_prompt (int, tùy chọn, mặc định là 1) — số lượng video cần được tạo cho mỗi prompt
  • device — (torch.device, tùy chọn): thiết bị torch để đặt các embedding kết quả lên
  • prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với Latte, đây nên là các embedding của chuỗi "".
  • clean_caption (bool, mặc định là False) — Nếu True, hàm sẽ tiền xử lý và làm sạch chú thích được cung cấp trước khi mã hóa.
  • mask_feature — (bool, mặc định là True): Nếu True, hàm sẽ che các nhúng văn bản.

Mã hóa prompt thành các trạng thái ẩn của text encoder.

Update on GitHub