Diffusers documentation

Hunyuan-DiT

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

Hunyuan-DiT

chinese elements understanding

Hunyuan-DiT: A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding dari Tencent Hunyuan.

Abstrak dari makalah tersebut adalah:

Kami memperkenalkan Hunyuan-DiT, sebuah diffusion transformer untuk teks-ke-gambar dengan pemahaman yang rinci terhadap bahasa Inggris dan Mandarin. Untuk membangun Hunyuan-DiT, kami merancang dengan cermat struktur transformer, text encoder, dan positional encoding. Kami juga membangun dari nol seluruh pipeline data untuk memperbarui dan mengevaluasi data guna optimasi model secara iteratif. Untuk pemahaman bahasa yang rinci, kami melatih Multimodal Large Language Model untuk menyempurnakan caption dari gambar-gambar tersebut. Akhirnya, Hunyuan-DiT dapat melakukan dialog multimodal multi-turn dengan pengguna, menghasilkan dan menyempurnakan gambar sesuai dengan konteks. Melalui protokol evaluasi manusia holistik kami yang melibatkan lebih dari 50 evaluator manusia profesional, Hunyuan-DiT menetapkan state-of-the-art baru dalam generasi gambar dari bahasa Mandarin dibandingkan dengan model open-source lainnya.

Anda dapat menemukan basis kode asli di Tencent/HunyuanDiT dan semua checkpoint yang tersedia di Tencent-Hunyuan.

Highlight: HunyuanDiT mendukung teks bahasa Mandarin/Inggris ke gambar, serta generasi multi-resolusi.

HunyuanDiT memiliki komponen-komponen berikut:

  • Model ini menggunakan diffusion transformer sebagai backbone
  • Itu menggabungkan dua pengkode teks, CLIP dwibahasa dan pengkode T5 multibahasa

Pastikan untuk melihat panduan Schedulers untuk mempelajari cara mengeksplorasi tradeoff antara kecepatan dan kualitas scheduler, serta lihat bagian reuse components across pipelines untuk mempelajari cara memuat komponen yang sama secara efisien ke dalam beberapa pipeline.

Anda dapat meningkatkan kualitas generasi lebih lanjut dengan meneruskan gambar yang dihasilkan dari HungyuanDiTPipeline ke model SDXL refiner.

Optimasi

Anda dapat mengoptimalkan waktu eksekusi dan konsumsi memori pipeline dengan torch.compile dan feed-forward chunking. Untuk mempelajari metode optimasi lainnya, lihat panduan Speed up inference dan Reduce memory usage.

Inferensi

Gunakan torch.compile untuk mengurangi latensi inferensi.

Pertama, muat pipeline:

from diffusers import HunyuanDiTPipeline
import torch

pipeline = HunyuanDiTPipeline.from_pretrained(
	"Tencent-Hunyuan/HunyuanDiT-Diffusers", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

Lalu ubah tata letak memori komponen transformer dan vae menjadi torch.channels-last:

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

Terakhir, kompilasi komponen dan jalankan inferensi:

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]

Hasil benchmark pada mesin A100 80GB adalah:

With torch.compile(): Average inference time: 12.470 seconds.
Without torch.compile(): Average inference time: 20.570 seconds.

Optimasi memori

Dengan memuat T5 text encoder dalam 8 bit, Anda dapat menjalankan pipeline dengan VRAM GPU kurang dari 6 GB. Lihat skrip ini untuk detailnya.

Selain itu, Anda dapat menggunakan metode enable_forward_chunking() untuk mengurangi penggunaan memori. Feed-forward chunking menjalankan lapisan feed-forward dalam blok transformer secara berurutan dalam sebuah loop, bukan sekaligus. Hal ini memberikan Anda trade-off antara konsumsi memori dan waktu runtime inferensi.

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

HunyuanDiTPipeline

kelas diffusers.HunyuanDiTPipeline

< >

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

Parameter

  • vae (AutoencoderKL) — Model Variational Auto-Encoder (VAE) untuk mengodekan dan mendekodekan gambar ke dan dari representasi laten. Kami menggunakan sdxl-vae-fp16-fix.
  • text_encoder (~transformers.BertModel, ~transformers.CLIPTextModel | None) — Text-encoder yang dibekukan (clip-vit-large-patch14). HunyuanDiT menggunakan [bilingual CLIP] yang telah dihaluskan.
  • tokenizer (~transformers.BertTokenizer, ~transformers.CLIPTokenizer | None) — BertTokenizer atau CLIPTokenizer untuk melakukan tokenisasi teks.
  • transformer (HunyuanDiT2DModel) — Model HunyuanDiT yang dirancang oleh Tencent Hunyuan.
  • text_encoder_2 (T5EncoderModel) — Embedder mT5. Secara spesifik, ini adalah ‘t5-v1_1-xxl’.
  • tokenizer_2 (T5Tokenizer) — Tokenizer untuk embedder mT5.
  • scheduler (DDPMScheduler) — Scheduler yang digunakan bersama HunyuanDiT untuk menghilangkan noise pada latens gambar yang telah dikodekan.

Pipeline untuk generasi gambar dari bahasa Inggris/Tionghoa menggunakan HunyuanDiT.

Model ini mewarisi dari DiffusionPipeline. Periksa dokumentasi kelas induk untuk metode generik yang diimplementasikan oleh pustaka untuk semua pipeline (seperti mengunduh atau menyimpan, menjalankan pada perangkat tertentu, dll.)

HunyuanDiT menggunakan dua pengkode teks: mT5 dan [CLIP dwibahasa](fine-tuned by ourselves)

__call__

< >

( 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

Parameter

  • prompt (str atau list[str], opsional) — Prompt atau prompt-prompt untuk memandu generasi gambar. Jika tidak didefinisikan, Anda perlu meneruskan prompt_embeds.
  • height (int) — Tinggi gambar yang dihasilkan dalam piksel.
  • width (int) — Lebar gambar yang dihasilkan dalam piksel.
  • num_inference_steps (int, opsional, default 50) — Jumlah langkah denoising. Semakin banyak langkah denoising, biasanya menghasilkan gambar dengan kualitas lebih tinggi, namun dengan biaya inferensi yang lebih lambat. Parameter ini dimodulasi oleh strength.
  • guidance_scale (float, opsional, default 7.5) — Nilai guidance scale yang lebih tinggi mendorong model untuk menghasilkan gambar yang sangat terkait dengan prompt teks, dengan mengorbankan kualitas gambar yang lebih rendah. Guidance scale diaktifkan ketika guidance_scale > 1.
  • negative_prompt (str atau list[str], opsional) — Prompt atau prompt-prompt untuk mengarahkan apa yang tidak boleh disertakan dalam generasi gambar. Jika tidak didefinisikan, Anda perlu mengirimkan negative_prompt_embeds sebagai gantinya. Diabaikan saat tidak menggunakan panduan (guidance_scale < 1).
  • num_images_per_prompt (int, opsional, default 1) — Jumlah gambar yang akan dihasilkan per prompt.
  • eta (float, opsional, default 0.0) — Bersesuaian dengan parameter eta (η) dari paper DDIM. Hanya berlaku untuk DDIMScheduler, dan diabaikan pada scheduler lainnya.
  • generator (torch.Generator atau list[torch.Generator], opsional) — torch.Generator untuk membuat generasi menjadi deterministik.
  • latents (torch.Tensor, opsional) — Latents berisik yang telah dibuat sebelumnya dan diambil dari distribusi Gaussian, untuk digunakan sebagai input untuk generasi gambar. Dapat digunakan untuk menyesuaikan generasi yang sama dengan prompt yang berbeda. Jika tidak disediakan, tensor latents akan dibuat dengan pengambilan sampel menggunakan generator acak yang diberikan.
  • prompt_embeds (torch.Tensor, opsional) — Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (penimbangan prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input prompt.
  • prompt_embeds_2 (torch.Tensor, opsional) — Embedding teks yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (penimbangan prompt). Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input prompt.
  • negative_prompt_embeds (torch.Tensor, opsional) — Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (penimbangan prompt). Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input negative_prompt.
  • negative_prompt_embeds_2 (torch.Tensor, opsional) — Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks (penimbangan prompt). Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input negative_prompt.
  • prompt_attention_mask (torch.Tensor, opsional) — Attention mask untuk prompt. Wajib diisi ketika prompt_embeds dilewatkan secara langsung.
  • prompt_attention_mask_2 (torch.Tensor, opsional) — Attention mask untuk prompt. Wajib diisi ketika prompt_embeds_2 dilewatkan secara langsung.
  • negative_prompt_attention_mask (torch.Tensor, opsional) — Attention mask untuk negative prompt. Wajib diisi ketika negative_prompt_embeds dilewatkan secara langsung.
  • negative_prompt_attention_mask_2 (torch.Tensor, opsional) — Attention mask untuk negative prompt. Wajib diisi ketika negative_prompt_embeds_2 dilewatkan secara langsung.
  • output_type (str, opsional, default "pil") — Format output dari gambar yang dihasilkan. Pilih antara PIL.Image atau np.array.
  • return_dict (bool, opsional, default True) — Apakah akan mengembalikan StableDiffusionPipelineOutput alih-alih tuple biasa.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, opsional) — Fungsi callback atau daftar fungsi callback yang akan dipanggil di akhir setiap langkah denoising.
  • callback_on_step_end_tensor_inputs (list[str], opsional) — Daftar input tensor yang harus diteruskan ke fungsi callback. Jika tidak didefinisikan, semua input tensor akan diteruskan.
  • guidance_rescale (float, opsional, default 0.0) — Skala ulang noise_cfg sesuai dengan guidance_rescale. Berdasarkan temuan dari Common Diffusion Noise Schedules and Sample Steps are Flawed. Lihat Bagian 3.4
  • original_size (tuple[int, int], opsional, default (1024, 1024)) — Ukuran asli gambar. Digunakan untuk menghitung time ids.
  • target_size (tuple[int, int], opsional) — Ukuran target dari gambar. Digunakan untuk menghitung time ids.
  • crops_coords_top_left (tuple[int, int], opsional, default (0, 0)) — Koordinat kiri atas dari crop. Digunakan untuk menghitung time ids.
  • use_resolution_binning (bool, opsional, default True) — Apakah akan menggunakan resolusi binning atau tidak. Jika True, resolusi input akan dipetakan ke resolusi standar terdekat. Resolusi yang didukung adalah 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768, dan 768x1280. Disarankan untuk mengatur ini ke True.

Mengembalikan

StableDiffusionPipelineOutput atau tuple

Jika return_dict adalah True, StableDiffusionPipelineOutput dikembalikan, sebaliknya sebuah tuple dikembalikan di mana elemen pertama adalah daftar berisi gambar yang dihasilkan dan elemen kedua adalah daftar bool yang menunjukkan apakah gambar yang dihasilkan yang sesuai mengandung konten “not-safe-for-work” (nsfw).

Fungsi panggilan untuk pipeline generasi dengan HunyuanDiT.

Contoh:

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

< >

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

Parameter

  • prompt (str atau list[str], opsional) — prompt yang akan dienkod
  • device — (torch.device): perangkat torch
  • dtype (torch.dtype) — dtype torch
  • num_images_per_prompt (int) — jumlah gambar yang harus dihasilkan per prompt
  • do_classifier_free_guidance (bool) — apakah akan menggunakan classifier free guidance atau tidak
  • negative_prompt (str atau list[str], opsional) — Prompt atau prompt-prompt yang tidak digunakan untuk mengarahkan generasi gambar. Jika tidak didefinisikan, Anda harus meneruskan negative_prompt_embeds sebagai gantinya. Diabaikan jika tidak menggunakan guidance (yaitu, diabaikan jika guidance_scale kurang dari 1).
  • prompt_embeds (torch.Tensor, opsional) — Embedding teks yang sudah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, misalnya pembobotan prompt. Jika tidak disediakan, embedding teks akan dihasilkan dari argumen input prompt.
  • negative_prompt_embeds (torch.Tensor, opsional) — Embedding teks negatif yang telah dibuat sebelumnya. Dapat digunakan untuk dengan mudah menyesuaikan input teks, misalnya penimbangan prompt. Jika tidak disediakan, negative_prompt_embeds akan dibuat dari argumen input negative_prompt.
  • prompt_attention_mask (torch.Tensor, opsional) — Attention mask untuk prompt. Wajib diisi ketika prompt_embeds dilewatkan secara langsung.
  • negative_prompt_attention_mask (torch.Tensor, opsional) — Attention mask untuk negative prompt. Wajib diisi ketika negative_prompt_embeds dilewatkan secara langsung.
  • max_sequence_length (int, opsional) — panjang maksimum urutan yang digunakan untuk prompt.
  • text_encoder_index (int, opsional) — Indeks text encoder yang akan digunakan. 0 untuk clip dan 1 untuk T5.

Mengkodekan prompt menjadi hidden states dari text encoder.

Update on GitHub