Diffusers documentation

Lumina-T2X

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

Lumina-T2X

concepts

Lumina-Next: Làm cho Lumina-T2X mạnh hơn và nhanh hơn với Next-DiT từ Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory.

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

Lumina-T2X là một gia đình các mô hình mới nổi thuộc dòng Flow-based Large Diffusion Transformers (Flag-DiT), thiết lập một khung thống nhất để biến nhiễu thành các phương thức khác nhau, chẳng hạn như hình ảnh và video, dựa trên các chỉ dẫn văn bản. Mặc dù có tiềm năng lớn, Lumina-T2X vẫn gặp phải các thách thức như sự bất ổn trong huấn luyện, suy luận chậm và các hiện tượng ngoại suy sai lệch. Trong bài báo này, chúng tôi giới thiệu Lumina-Next, một phiên bản cải tiến của Lumina-T2X, thể hiện hiệu suất tạo ra mạnh mẽ hơn với hiệu quả huấn luyện và suy luận cao hơn. Chúng tôi bắt đầu bằng một phân tích toàn diện về kiến trúc Flag-DiT và xác định một số thành phần chưa tối ưu, sau đó giải quyết chúng bằng cách giới thiệu kiến trúc Next-DiT với 3D RoPE và các phép chuẩn hóa dạng sandwich. Để cho phép ngoại suy độ phân giải tốt hơn, chúng tôi so sánh kỹ lưỡng các phương pháp ngoại suy ngữ cảnh khác nhau được áp dụng cho việc tạo hình ảnh từ văn bản với 3D RoPE, và đề xuất Frequency- and Time-Aware Scaled RoPE được thiết kế riêng cho các diffusion transformer. Ngoài ra, chúng tôi giới thiệu lịch rời rạc hóa thời gian dạng sigmoid để giảm số bước lấy mẫu khi giải Flow ODE và phương pháp Context Drop để gộp các token thị giác dư thừa nhằm đánh giá mạng nhanh hơn, từ đó tăng tốc độ lấy mẫu tổng thể một cách hiệu quả. Nhờ những cải tiến này, Lumina-Next không chỉ nâng cao chất lượng và hiệu quả của việc tạo hình ảnh từ văn bản cơ bản mà còn thể hiện khả năng ngoại suy độ phân giải vượt trội và khả năng tạo đa ngôn ngữ bằng cách sử dụng các LLM dựa trên decoder làm bộ mã hóa văn bản, tất cả đều theo cách zero-shot. Để xác nhận thêm Lumina-Next như một khung tạo ra đa năng, chúng tôi triển khai nó trên nhiều nhiệm vụ khác nhau bao gồm nhận diện thị giác, đa góc nhìn, âm thanh, nhạc và tạo đám mây điểm, thể hiện hiệu suất mạnh mẽ trên các lĩnh vực này. Bằng cách phát hành toàn bộ mã nguồn và trọng số mô hình tại https://github.com/Alpha-VLLM/Lumina-T2X, chúng tôi hướng tới việc thúc đẩy sự phát triển của AI tạo thế hệ tiếp theo có khả năng mô hình hóa phổ quát.

Những điểm nổi bật: Lumina-Next là một Diffusion Transformer thế hệ tiếp theo, nâng cao đáng kể khả năng tạo ảnh từ văn bản, tạo đa ngôn ngữ và hiệu suất đa nhiệm bằng cách giới thiệu kiến trúc Next-DiT, 3D RoPE, và RoPE nhận thức tần số và thời gian, cùng nhiều cải tiến khác.

Lumina-Next có các thành phần sau:

  • Nó cải thiện hiệu quả lấy mẫu với ít Bước hơn và nhanh hơn.
  • Nó sử dụng Next-DiT làm xương sống transformer với Sandwichnorm 3D RoPE và Grouped-Query Attention.
  • Nó sử dụng Scaled RoPE nhận thức về Tần số và Thời gian.

Lumina-T2X: Chuyển đổi văn bản sang bất kỳ phương thức, độ phân giải và thời lượng nào thông qua các Transformer khuếch tán lớn dựa trên luồng từ Alpha-VLLM, OpenGVLab, Shanghai AI Laboratory.

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

Sora hé lộ tiềm năng của việc mở rộng Diffusion Transformer để tạo ra các hình ảnh và video chân thực như thật ở các độ phân giải, tỷ lệ khung hình và thời lượng tùy ý, nhưng vẫn còn thiếu các chi tiết triển khai đầy đủ. Trong báo cáo kỹ thuật này, chúng tôi giới thiệu dòng Lumina-T2X - một loạt các Flow-based Large Diffusion Transformers (Flag-DiT) được trang bị zero-initialized attention, như một khung thống nhất được thiết kế để biến nhiễu thành hình ảnh, video, các đối tượng 3D đa góc nhìn và các đoạn âm thanh dựa trên các chỉ dẫn bằng văn bản. Bằng cách mã hóa không gian không gian-thời gian tiềm ẩn và tích hợp các placeholder có thể học được như các token [nextline] và [nextframe], Lumina-T2X thống nhất liền mạch các biểu diễn của các chế độ khác nhau trên các độ phân giải không gian-thời gian khác nhau. Cách tiếp cận thống nhất này cho phép huấn luyện trong một khung duy nhất cho các chế độ khác nhau và cho phép tạo ra dữ liệu đa chế độ một cách linh hoạt ở bất kỳ độ phân giải, tỷ lệ khung hình và độ dài nào trong quá trình suy luận. Các kỹ thuật tiên tiến như RoPE, RMSNorm và flow matching tăng cường tính ổn định, tính linh hoạt và khả năng mở rộng của Flag-DiT, cho phép các mô hình của Lumina-T2X mở rộng lên đến 7 tỷ tham số và mở rộng cửa sổ ngữ cảnh lên 128K token. Điều này đặc biệt hữu ích cho việc tạo ra các hình ảnh siêu nét với mô hình Lumina-T2I của chúng tôi và các video 720p dài với mô hình Lumina-T2V của chúng tôi. Đáng chú ý, Lumina-T2I, được hỗ trợ bởi Flag-DiT 5 tỷ tham số, chỉ cần 35% chi phí tính toán huấn luyện so với DiT ngây thơ 600 triệu tham số. Phân tích toàn diện hơn của chúng tôi nhấn mạnh khả năng sơ bộ của Lumina-T2X trong ngoại suy độ phân giải, chỉnh sửa độ phân giải cao, tạo ra các góc nhìn 3D nhất quán và tổng hợp các video với các chuyển cảnh liền mạch. Chúng tôi kỳ vọng việc mã nguồn mở Lumina-T2X sẽ thúc đẩy thêm sự sáng tạo, minh bạch và đa dạng trong cộng đồng AI tạo sinh.

Bạn có thể tìm thấy mã nguồn gốc tại Alpha-VLLM và tất cả các checkpoint khả dụng tại Alpha-VLLM Lumina Family.

Điểm nổi bật: Lumina-T2X hỗ trợ mọi chế độ, độ phân giải và thời lượng.

Lumina-T2X có các thành phần sau:

  • Nó sử dụng Large Diffusion Transformer dựa trên Flow làm khung xương
  • Nó hỗ trợ các chế độ dữ liệu khác nhau với một backbone duy nhất cùng bộ mã hóa và bộ giải mã tương ứng.

Pipeline này được đóng góp bởi PommesPeter. 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/Alpha-VLLM.

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 (Văn bản sang Hình ảnh)

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

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

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"

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, 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]

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 LuminaPipeline đã được lượng tử hóa để suy luận bằng 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

lớp diffusers.LuminaPipeline

< >

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

Tham số

  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.
  • text_encoder (GemmaPreTrainedModel) — Bộ mã hóa văn bản Gemma đã đóng băng.
  • tokenizer (GemmaTokenizer hoặc GemmaTokenizerFast) — Tokenizer của Gemma.
  • transformer (Transformer2DModel) — Một Transformer2DModel có điều kiện văn bản để khử nhiễu các latents ảnh đã 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 của ảnh đã mã hóa.

Pipeline để tạo ảnh từ văn bản sử dụng Lumina-T2I.

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] = Nonewidth: int | None = Noneheight: int | None = Nonenum_inference_steps: int = 30guidance_scale: float = 4.0negative_prompt: str | list[str] = Nonesigmas: list = 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 = ['latents'] ) → ImagePipelineOutput 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 ảnh. 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 ảnh. 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à 30) — Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn với chi phí là suy luận chậm hơn.
  • sigmas (list[float], tùy chọn) — Các sigma tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ đối số sigmas trong phương thức set_timesteps của chúng. Nếu không được định nghĩa, hành vi mặc định khi num_inference_steps được truyền sẽ được sử dụng.
  • guidance_scale (float, tùy chọn, mặc định là 4.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 hình ảnh 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 hình ảnh thấp hơn.
  • num_images_per_prompt (int, tùy chọn, mặc định là 1) — Số lượng hình ảnh 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 hình ảnh đượ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 hình ảnh được tạo ra, tính bằng pixel.
  • 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.Tensor, 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 ảnh. 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.Tensor, 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.
  • prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) được tạo sẵn cho các vector nhúng văn bản.
  • negative_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với Lumina-T2I, 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.
  • negative_prompt_attention_mask (torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) được tạo sẵn cho các vector nhúng văn bản âm (negative text embeddings).
  • output_type (str, tùy chọn, mặc định là "pil") — Định dạng đầu ra của hình ảnh đượ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.
  • 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ô.
  • max_sequence_length (int, mặc định là 120) — Chiều dài tối đa của chuỗi để sử dụng với prompt.
  • scaling_watershed (float, tùy chọn, mặc định là 1.0) — Ngưỡng tỷ lệ phân giải được Lumina sử dụng để chuyển đổi giữa chú ý ngữ cảnh tiêu chuẩn và chú ý ngữ cảnh mở rộng.
  • proportional_attn (bool, tùy chọn, mặc định là True) — Có nên tỷ lệ hóa attention cho việc tạo nội dung độ phân giải cao hay không.
  • callback_on_step_end (Callable, tùy chọn) — Một hàm được gọi vào cuối mỗi bước khử nhiễu trong quá trình suy luận. Hàm này được gọi với các đối số sau: callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict). callback_kwargs sẽ bao gồm danh sách tất cả các tensor như được chỉ định bởi callback_on_step_end_tensor_inputs.
  • callback_on_step_end_tensor_inputs (list, optional) — Danh sách các tensor đầu vào cho hàm callback_on_step_end. Các tensor được chỉ định trong danh sách sẽ được truyền dưới dạng tham số callback_kwargs. Bạn chỉ có thể bao gồm các biến được liệt kê trong thuộc tính ._callback_tensor_inputs của lớp pipeline của bạn.

Trả về

ImagePipelineOutput hoặc tuple

Nếu return_dict là True, ImagePipelineOutput sẽ được trả về, ngược lại 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 đã được tạo

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

Ví dụ:

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

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 ảnh. 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 Lumina-T2I, 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 hình ảnh 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.Tensor, 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.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với Lumina-T2I, đâ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.
  • max_sequence_length (int, mặc định là 256) — Độ dài tối đa của chuỗi được sử dụng cho prompt.

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

Update on GitHub