# Hunyuan-DiT
![chinese elements understanding](https://github.com/gnobitab/diffusers-hunyuan/assets/1157982/39b99036-c3cb-4f16-bb1a-40ec25eda573)

[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](https://huggingface.co/papers/2405.08748) 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](https://github.com/Tencent/HunyuanDiT) và tất cả các checkpoint khả dụng tại [Tencent-Hunyuan](https://huggingface.co/Tencent-Hunyuan/HunyuanDiT).

**Đ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ữ

> [!TIP]
> Hãy chắc chắn xem qua [hướng dẫn](../../using-diffusers/schedulers) 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](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) để 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ả.

> [!TIP]
> 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ừ `HungyuanDiTPipeline` sang mô hình [SDXL refiner](./stable_diffusion/stable_diffusion_xl#base-to-refiner-model).

## 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](../../optimization/fp16) và [Giảm mức sử dụng bộ nhớ](../../optimization/memory).

### Suy luận

Sử dụng [`torch.compile`](https://huggingface.co/docs/diffusers/main/en/tutorials/fast_diffusion#torchcompile) để giảm độ trễ suy luận.

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

```python
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`:

```python
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:

```python
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](https://gist.github.com/sayakpaul/29d3a14905cfcbf611fe71ebd22e9b23) trên máy A100 80GB là:

```bash
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](https://gist.github.com/sayakpaul/3154605f6af05b98a41081aaba5ca43e) để 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()](/docs/diffusers/v0.43.0/vi/api/models/hunyuan_transformer2d#diffusers.HunyuanDiT2DModel.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.

```diff
+ pipeline.transformer.enable_forward_chunking(chunk_size=1, dim=1)
```

## HunyuanDiTPipeline[[diffusers.HunyuanDiTPipeline]]

#### diffusers.HunyuanDiTPipeline[[diffusers.HunyuanDiTPipeline]]

```python
diffusers.HunyuanDiTPipeline(vae: AutoencoderKL, text_encoder: BertModel, tokenizer: BertTokenizer, transformer: HunyuanDiT2DModel, scheduler: DDPMScheduler, safety_checker: StableDiffusionSafetyChecker, feature_extractor: CLIPImageProcessorPil, requires_safety_checker: bool = True, text_encoder_2: transformers.models.t5.modeling_t5.T5EncoderModel | None = None, tokenizer_2: transformers.models.t5.tokenization_t5.T5Tokenizer | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L149)

**Tham số:**

vae ([AutoencoderKL](/docs/diffusers/v0.43.0/vi/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh sang và từ 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](https://huggingface.co/openai/clip-vit-large-patch14)). HunyuanDiT sử dụng [CLIP song ngữ] đã tinh chỉnh.

tokenizer (`~transformers.BertTokenizer`, `~transformers.CLIPTokenizer` | None) : Một `BertTokenizer` hoặc `CLIPTokenizer` để phân tách văn bản.

transformer ([HunyuanDiT2DModel](/docs/diffusers/v0.43.0/vi/api/models/hunyuan_transformer2d#diffusers.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`) : Bộ phân từ cho bộ nhúng mT5.

scheduler ([DDPMScheduler](/docs/diffusers/v0.43.0/vi/api/schedulers/ddpm#diffusers.DDPMScheduler)) : Một trình lập lịch được sử dụng kết hợp với HunyuanDiT để khử nhiễu các ẩn hình ả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](/docs/diffusers/v0.43.0/vi/api/pipelines/overview#diffusers.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](https://huggingface.co/google/mt5-base) và [bilingual CLIP](được chúng tôi tinh chỉnh)

#### __call__[[diffusers.HunyuanDiTPipeline.__call__]]

```python
__call__(prompt: str | list[str] = None, height: int | None = None, width: int | None = None, num_inference_steps: int | None = 50, guidance_scale: float | None = 5.0, negative_prompt: str | list[str] | None = None, num_images_per_prompt: int | None = 1, eta: float | None = 0.0, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_2: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_2: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, prompt_attention_mask_2: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask_2: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: list[str] = ['latents'], guidance_rescale: float = 0.0, original_size: tuple[int, int] | None = (1024, 1024), target_size: tuple[int, int] | None = None, crops_coords_top_left: tuple[int, int] = (0, 0), use_resolution_binning: bool = True)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L568)

**Tham số:**

prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt để hướng dẫn tạo ảnh. Nếu không được định nghĩa, bạn cần truyền `prompt_embeds`.

height (`int`) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel.

width (`int`) : Độ rộng của hình ảnh được tạo ra, tính bằng pixel.

num_inference_steps (`int`, *optional*, 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, đổi lại là suy luận chậm hơn. Tham số này được điều chỉnh bởi `strength`.

guidance_scale (`float`, *optional*, 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ới `prompt` vă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 khi `guidance_scale > 1`.

negative_prompt (`str` hoặc `list[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ền `negative_prompt_embeds` thay thế. Bỏ qua khi không sử dụng guidance (`guidance_scale < 1`).

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

eta (`float`, *tuỳ 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 [DDIMScheduler](/docs/diffusers/v0.43.0/vi/api/schedulers/ddim#diffusers.DDIMScheduler) và bị bỏ qua ở các trình lập lịch khác.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đả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 vector nhúng 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 vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

prompt_embeds_2 (`torch.Tensor`, *tùy chọn*) : Các vector nhúng 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 vector nhúng 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 vector nhúng 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_embeds` sẽ được tạo từ đối số đầu vào `negative_prompt`.

negative_prompt_embeds_2 (`torch.Tensor`, *tùy chọn*) : Các vector nhúng 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_embeds` sẽ được tạo từ đối số đầu vào `negative_prompt`.

prompt_attention_mask (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt. Bắt buộc khi `prompt_embeds` được truyền trực tiếp.

prompt_attention_mask_2 (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt. Bắt buộc khi `prompt_embeds_2` được truyền trực tiếp.

negative_prompt_attention_mask (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt âm. Bắt buộc khi `negative_prompt_embeds` được truyền trực tiếp.

negative_prompt_attention_mask_2 (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt âm. Bắt buộc khi `negative_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ữa `PIL.Image` hoặc `np.array`.

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) thay vì một tuple thông thường hay không.

callback_on_step_end (`Callable[[int, int], None]`, `PipelineCallback`, `MultiPipelineCallbacks`, *optional*) : 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*) : Một 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`, *tuỳ chọn*, mặc định là 0.0) : Thang lại noise_cfg theo `guidance_rescale`. Dựa trên các phát hiện của [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891). Xem Mục 3.4

original_size (`tuple[int, int]`, *tùy chọn*, mặc định là `(1024, 1024)`) : Kích thước gốc của hình ảnh. Được sử dụng để tính toán các id thời gian.

target_size (`tuple[int, int]`, *tùy chọn*) : Kích thước đích của hình ảnh. Được sử 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ếu `True`, độ 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ành `True`.

**Trả về:** [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) hoặc `tuple`

Nếu `return_dict` là `True`, [StableDiffusionPipelineOutput](/docs/diffusers/v0.43.0/vi/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) 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 đã tạo và phần tử thứ hai là một danh sách các `bool` cho biết hình ảnh 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ụ:
```py
>>> 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[[diffusers.HunyuanDiTPipeline.encode_prompt]]

```python
encode_prompt(prompt: str, device: device = None, dtype: dtype = None, num_images_per_prompt: int = 1, do_classifier_free_guidance: bool = True, negative_prompt: str | None = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_attention_mask: typing.Optional[torch.Tensor] = None, negative_prompt_attention_mask: typing.Optional[torch.Tensor] = None, max_sequence_length: int | None = None, text_encoder_index: int = 0)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L248)

**Tham số:**

prompt (`str` hoặc `list[str]`, *tùy chọn*) : prompt cần được mã hóa

device : (`torch.device`): thiết bị torch

dtype (`torch.dtype`) : kiểu dữ liệu torch

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 (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Nếu không được định nghĩa, bạn phải 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`).

prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng 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, *vd.* trọng số prompt. Nếu không được cung cấp, các vector nhúng 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 vector nhúng 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, *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ào `negative_prompt`.

prompt_attention_mask (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt. Bắt buộc khi `prompt_embeds` được truyền trực tiếp.

negative_prompt_attention_mask (`torch.Tensor`, *tùy chọn*) : Mặt nạ chú ý cho prompt âm. Bắt buộc khi `negative_prompt_embeds` được truyền trực tiếp.

max_sequence_length (`int`, *tuỳ chọn*) : độ dài tối đa của chuỗi để sử dụng cho prompt.

text_encoder_index (`int`, *optional*) : Chỉ số của text encoder cần sử dụng. `0` cho clip và `1` cho T5.

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

