Diffusers documentation
Hunyuan-DiT
Hunyuan-DiT
Hunyuan-DiT: Một Diffusion Transformer đa độ phân giải mạnh mẽ với khả năng hiểu tiếng Trung chi tiết từ Tencent Hunyuan.
Tóm tắt từ bài báo là:
Chúng tôi giới thiệu Hunyuan-DiT, một diffusion transformer tạo ảnh từ văn bản với khả năng hiểu chi tiết cả tiếng Anh và tiếng Trung. Để xây dựng Hunyuan-DiT, chúng tôi thiết kế cẩn thận cấu trúc transformer, text encoder và positional encoding. Chúng tôi cũng xây dựng từ đầu một pipeline dữ liệu hoàn chỉnh để cập nhật và đánh giá dữ liệu cho việc tối ưu hóa mô hình lặp lại. Để hiểu ngôn ngữ chi tiết, chúng tôi huấn luyện một Multimodal Large Language Model để tinh chỉnh các caption của ảnh. Cuối cùng, Hunyuan-DiT có thể thực hiện hội thoại đa vòng đa phương thức với người dùng, tạo và tinh chỉnh ảnh theo ngữ cảnh. Thông qua giao thức đánh giá con người toàn diện của chúng tôi với hơn 50 người đánh giá chuyên nghiệp, Hunyuan-DiT thiết lập một state-of-the-art mới trong việc tạo ảnh từ tiếng Trung so với các mô hình mã nguồn mở khác.
Bạn có thể tìm thấy mã nguồn gốc tại Tencent/HunyuanDiT và tất cả các checkpoint khả dụng tại Tencent-Hunyuan.
Điểm nổi bật: HunyuanDiT hỗ trợ tạo ảnh từ tiếng Trung/tiếng Anh, tạo ảnh ở nhiều độ phân giải.
HunyuanDiT có các thành phần sau:
- Nó sử dụng diffusion transformer làm khung xương
- Nó kết hợp hai bộ mã hóa văn bản, một CLIP song ngữ và một bộ mã hóa T5 đa ngôn ngữ
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ả.
Bạn có thể cải thiện chất lượng tạo ảnh hơn nữa bằng cách truyền ảnh đã tạo từ
HungyuanDiTPipelinesang mô hình SDXL refiner.
Tối ưu hóa
Bạn có thể tối ưu hóa thời gian chạy và mức tiêu thụ bộ nhớ của pipeline bằng torch.compile và feed-forward chunking. Để tìm hiểu về các phương pháp tối ưu hóa khác, hãy xem các hướng dẫn Tăng tốc suy luận và Giảm mức sử dụng bộ nhớ.
Suy luận
Sử dụng torch.compile để giảm độ trễ suy luận.
Đầu tiên, tải pipeline:
from diffusers import HunyuanDiTPipeline
import torch
pipeline = HunyuanDiTPipeline.from_pretrained(
"Tencent-Hunyuan/HunyuanDiT-Diffusers", 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, mode="max-autotune", fullgraph=True)
pipeline.vae.decode = torch.compile(pipeline.vae.decode, mode="max-autotune", fullgraph=True)
image = pipeline(prompt="一个宇航员在骑马").images[0]Kết quả benchmark trên máy A100 80GB là:
With torch.compile(): Average inference time: 12.470 seconds.
Without torch.compile(): Average inference time: 20.570 seconds.Tối ưu hóa bộ nhớ
Bằng cách nạp text encoder T5 ở 8 bit, bạn có thể chạy pipeline với chỉ dưới 6 GB VRAM GPU. Xem script này để biết thêm chi tiết.
Hơn nữa, bạn có thể sử dụng phương thức enable_forward_chunking() để giảm mức sử dụng bộ nhớ. Feed-forward chunking chạy các lớp feed-forward trong một khối transformer theo vòng lặp thay vì chạy tất cả cùng lúc. Điều này cho phép bạn đánh đổi giữa mức tiêu thụ bộ nhớ và thời gian suy luận.
+ pipeline.transformer.enable_forward_chunking(chunk_size=1, dim=1)HunyuanDiTPipeline
lớp diffusers.HunyuanDiTPipeline
< source >( vae: AutoencoderKLtext_encoder: BertModeltokenizer: BertTokenizertransformer: HunyuanDiT2DModelscheduler: DDPMSchedulersafety_checker: StableDiffusionSafetyCheckerfeature_extractor: CLIPImageProcessorPilrequires_safety_checker: bool = Truetext_encoder_2: transformers.models.t5.modeling_t5.T5EncoderModel | None = Nonetokenizer_2: transformers.models.t5.tokenization_t5.T5Tokenizer | None = None )
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. Chúng tôi sử dụng
sdxl-vae-fp16-fix. - text_encoder (
~transformers.BertModel,~transformers.CLIPTextModel| None) — Bộ mã hóa văn bản đóng băng (clip-vit-large-patch14). HunyuanDiT sử dụng [CLIP song ngữ] được tinh chỉnh. - tokenizer (
~transformers.BertTokenizer,~transformers.CLIPTokenizer| None) — MộtBertTokenizerhoặcCLIPTokenizerđể phân tách văn bản. - transformer (HunyuanDiT2DModel) — Mô hình HunyuanDiT do Tencent Hunyuan thiết kế.
- text_encoder_2 (
T5EncoderModel) — Bộ nhúng mT5. Cụ thể, nó là ‘t5-v1_1-xxl’. - tokenizer_2 (
T5Tokenizer) — Tokenizer cho bộ nhúng mT5. - scheduler (DDPMScheduler) — Một scheduler được sử dụng kết hợp với HunyuanDiT để khử nhiễu các latents ảnh đã mã hóa.
Pipeline để tạo ảnh từ tiếng Anh/tiếng Trung sử dụng HunyuanDiT.
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.)
HunyuanDiT sử dụng hai bộ mã hóa văn bản: mT5 và [CLIP song ngữ](được chúng tôi tinh chỉnh)
__call__
< source >( prompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int | None = 50guidance_scale: float | None = 5.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float | None = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_2: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Noneprompt_attention_mask_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask_2: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = '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']guidance_rescale: float = 0.0original_size: tuple[int, int] | None = (1024, 1024)target_size: tuple[int, int] | None = Nonecrops_coords_top_left: tuple = (0, 0)use_resolution_binning: bool = True ) → StableDiffusionPipelineOutput or tuple
Tham số
- prompt (
strhoặclist[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 cần truyềnprompt_embeds. - height (
int) — Chiều cao của hình ảnh được tạo ra, tính bằng pixel. - width (
int) — Chiều rộng của hình ảnh được tạo ra, tính bằng pixel. - num_inference_steps (
int, tùy chọn, mặc định là 50) — 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. Tham số này được điều chỉnh bởistrength. - guidance_scale (
float, tùy chọn, mặc định là 7.5) — Giá trị guidance scale cao hơn khuyến khích mô hình tạo ra các hình ảnh gắn kết chặt chẽ vớipromptvăn bản, với cái giá là chất lượng hình ảnh thấp hơn. Guidance scale được kích hoạt khiguidance_scale > 1. - negative_prompt (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt để hướng dẫn những gì không nên bao gồm trong quá trình tạo ảnh. Nếu không được định nghĩa, bạn cần truyềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (guidance_scale < 1). - 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. - 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. Chỉ áp dụng cho DDIMScheduler và bị bỏ qua ở các scheduler khác. - generator (
torch.Generatorhoặclist[torch.Generator], tùy chọn) — Mộttorch.Generatorđể làm cho quá trình sinh ra kết quả xác đị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ụnggeneratorngẫ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 (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àoprompt. - prompt_embeds_2 (
torch.Tensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (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àoprompt. - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (trọng số prompt). Nếu không được cung cấp,negative_prompt_embedssẽ được tạo từ đối số đầu vàonegative_prompt. - negative_prompt_embeds_2 (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (trọng số prompt). Nếu không được cung cấp,negative_prompt_embedssẽ được tạo từ đối số đầu vàonegative_prompt. - prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khiprompt_embedsđược truyền trực tiếp. - prompt_attention_mask_2 (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khiprompt_embeds_2được truyền trực tiếp. - negative_prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt âm. Bắt buộc khinegative_prompt_embedsđược truyền trực tiếp. - negative_prompt_attention_mask_2 (
torch.Tensor, tùy chọn) — Attention mask cho negative prompt. Bắt buộc khinegative_prompt_embeds_2được truyền trực tiếp. - 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 ra. Chọn giữaPIL.Imagehoặcnp.array. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một StableDiffusionPipelineOutput 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. - guidance_rescale (
float, tùy chọn, mặc định là 0.0) — Tái chuẩn hóa noise_cfg theoguidance_rescale. Dựa trên kết quả của Common Diffusion Noise Schedules and Sample Steps are Flawed. Xem Mục 3.4 - original_size (
tuple[int, int], tuỳ chọn, mặc định là(1024, 1024)) — Kích thước gốc của hình ảnh. Được dùng để tính toán các time ids. - target_size (
tuple[int, int], tuỳ chọn) — Kích thước đích của hình ảnh. Được dùng để tính toán các id thời gian. - crops_coords_top_left (
tuple[int, int], tùy chọn, mặc định là(0, 0)) — Tọa độ góc trên bên trái của vùng cắt. Được sử dụng để tính toán các id thời gian. - use_resolution_binning (
bool, tùy chọn, mặc định làTrue) — Có sử dụng phân loại độ phân giải hay không. NếuTrue, độ phân giải đầu vào sẽ được ánh xạ đến độ phân giải chuẩn gần nhất. Các độ phân giải được hỗ trợ là 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 và 768x1280. Khuyến nghị đặt giá trị này thànhTrue.
Trả về
StableDiffusionPipelineOutput hoặc tuple
Nếu return_dict là True, StableDiffusionPipelineOutput 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 được tạo và phần tử
thứ hai là một danh sách các bool cho biết hình ảnh được tạo tương ứng có chứa nội dung
“không an toàn” (nsfw) hay không.
Hàm gọi pipeline để tạo nội dung với HunyuanDiT.
Ví dụ:
>>> import torch
>>> from diffusers import HunyuanDiTPipeline
>>> pipe = HunyuanDiTPipeline.from_pretrained(
... "Tencent-Hunyuan/HunyuanDiT-Diffusers", torch_dtype=torch.float16
... )
>>> pipe.to("cuda")
>>> # You may also use English prompt as HunyuanDiT supports both English and Chinese
>>> # prompt = "An astronaut riding a horse"
>>> prompt = "一个宇航员在骑马"
>>> image = pipe(prompt).images[0]encode_prompt
< source >( prompt: strdevice: device = Nonedtype: dtype = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt: str | None = 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] = Nonemax_sequence_length: int | None = Nonetext_encoder_index: int = 0 )
Tham số
- prompt (
strhoặclist[str], tùy chọn) — prompt cần được mã hóa - device — (
torch.device): thiết bị torch - dtype (
torch.dtype) — torch dtype - num_images_per_prompt (
int) — số lượng hình ảnh cần được tạo cho mỗi prompt - do_classifier_free_guidance (
bool) — có sử dụng classifier free guidance hay không - negative_prompt (
strhoặclist[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ềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếuguidance_scalenhỏ hơn1). - 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àoprompt. - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã đượ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, negative_prompt_embeds sẽ được tạo từ đối số đầu vàonegative_prompt. - prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt. Bắt buộc khiprompt_embedsđược truyền trực tiếp. - negative_prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) cho prompt âm. Bắt buộc khinegative_prompt_embedsđược truyền trực tiếp. - max_sequence_length (
int, tùy chọn) — độ dài tối đa của chuỗi để sử dụng cho prompt. - text_encoder_index (
int, tùy chọn) — Chỉ số của text encoder cần sử dụng.0cho clip và1cho T5.
Mã hóa prompt thành các trạng thái ẩn của text encoder.