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

Tencent Hunyuan'dan [Hunyuan-DiT : A Powerful Multi-Resolution Diffusion Transformer with Fine-Grained Chinese Understanding](https://huggingface.co/papers/2405.08748).

Makalenin özeti şudur:

*Hem İngilizce hem de Çince için ince taneli anlama yeteneğine sahip, metinden görüntüye difüzyon dönüştürücüsü olan Hunyuan-DiT'yi sunuyoruz. Hunyuan-DiT'yi oluşturmak için dönüştürücü yapısını, metin kodlayıcısını ve konumsal kodlamayı özenle tasarladık. Ayrıca, yinelemeli model optimizasyonu için verileri güncellemek ve değerlendirmek amacıyla sıfırdan tüm bir veri hattı inşa ettik. İnce taneli dil anlama için, görüntülerin açıklamalarını iyileştirmek üzere Çok Modlu Büyük Dil Modeli eğittik. Son olarak, Hunyuan-DiT kullanıcılarla çok turlu çok modlu diyalog yürütebilir ve bağlama göre görüntüleri oluşturup iyileştirebilir. 50'den fazla profesyonel insan değerlendiricisiyle gerçekleştirdiğimiz bütüncül insan değerlendirme protokolü aracılığıyla, Hunyuan-DiT diğer açık kaynak modellerle karşılaştırıldığında Çince'den görüntüye üretimde yeni bir en iyi durumu (state-of-the-art) belirlemiştir.*

Orijinal kod tabanını [Tencent/HunyuanDiT](https://github.com/Tencent/HunyuanDiT) adresinde, kullanılabilir tüm kontrol noktalarını ise [Tencent-Hunyuan](https://huggingface.co/Tencent-Hunyuan/HunyuanDiT) adresinde bulabilirsiniz.

**Öne çıkanlar**: HunyuanDiT, Çince/İngilizce'den görüntüye ve çoklu çözünürlüklü üretim destekler.

HunyuanDiT aşağıdaki bileşenlere sahiptir:
* Omurga olarak bir difüzyon dönüştürücü kullanır
* İki metin kodlayıcıyı birleştirir: ikili dilli bir CLIP ve çok dilli bir T5 kodlayıcı

> [!TIP]
> Scheduler'lar [kılavuzunu](../../using-diffusers/schedulers) inceleyerek scheduler hızı ve kalitesi arasındaki ödünleşimi nasıl keşfedebileceğinizi öğrenin ve aynı bileşenleri birden fazla pipeline'a nasıl verimli bir şekilde yükleyebileceğinizi öğrenmek için [pipeline'lar arasında bileşenleri yeniden kullanma](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) bölümüne göz atın.

> [!TIP]
> `HungyuanDiTPipeline` tarafından oluşturulan görüntüyü [SDXL refiner](./stable_diffusion/stable_diffusion_xl#base-to-refiner-model) modeline ileterek üretim kalitesini daha da artırabilirsiniz.

## Optimizasyon

Hattın çalışma süresini ve bellek tüketimini torch.compile ve ileri besleme parçalama (feed-forward chunking) ile optimize edebilirsiniz. Diğer optimizasyon yöntemleri hakkında bilgi edinmek için [Çıkarımı hızlandırma](../../optimization/fp16) ve [Bellek kullanımını azaltma](../../optimization/memory) kılavuzlarına göz atın.

### Çıkarım

Çıkarım gecikmesini azaltmak için [`torch.compile`](https://huggingface.co/docs/diffusers/main/en/tutorials/fast_diffusion#torchcompile) kullanın.

Önce hattı yükleyin:

```python
from diffusers import HunyuanDiTPipeline
import torch

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

Ardından, `transformer` ve `vae` bileşenlerinin bellek yerleşimini `torch.channels-last` olarak değiştirin:

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

Son olarak, bileşenleri derleyin ve çıkarımı çalıştırı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]
```

80GB A100 makinedeki [benchmark](https://gist.github.com/sayakpaul/29d3a14905cfcbf611fe71ebd22e9b23) sonuçları şunlardır:

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

### Bellek optimizasyonu

T5 metin kodlayıcısını 8 bit olarak yükleyerek, hattı yalnızca 6 GB GPU VRAM'in biraz altında çalıştırabilirsiniz. Ayrıntılar için [bu betiğe](https://gist.github.com/sayakpaul/3154605f6af05b98a41081aaba5ca43e) bakın.

Ayrıca, bellek kullanımını azaltmak için [enable_forward_chunking()](/docs/diffusers/main/tr/api/models/hunyuan_transformer2d#diffusers.HunyuanDiT2DModel.enable_forward_chunking) yöntemini kullanabilirsiniz. Feed-forward chunking, bir transformer bloğundaki feed-forward katmanlarını tek seferde çalıştırmak yerine bir döngü içinde çalıştırır. Bu, bellek tüketimi ile çıkarım çalışma süresi arasında bir ödünleşim sağlar.

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

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L149)

**Parametreler:**

vae ([AutoencoderKL](/docs/diffusers/main/tr/api/models/autoencoderkl#diffusers.AutoencoderKL)) : Görüntüleri latent temsillere kodlamak ve bu temsillerden görüntülere çözmek için kullanılan Varyasyonel Oto-Kodlayıcı (VAE) Modeli. `sdxl-vae-fp16-fix` kullanıyoruz.

text_encoder (`~transformers.BertModel`, `~transformers.CLIPTextModel` | None) : Donmuş metin kodlayıcı ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)). HunyuanDiT, ince ayarlanmış [çift dilli CLIP] kullanır.

tokenizer (`~transformers.BertTokenizer`, `~transformers.CLIPTokenizer` | None) : Metni tokenleştirmek için bir `BertTokenizer` veya `CLIPTokenizer`.

transformer ([HunyuanDiT2DModel](/docs/diffusers/main/tr/api/models/hunyuan_transformer2d#diffusers.HunyuanDiT2DModel)) : Tencent Hunyuan tarafından tasarlanan HunyuanDiT modeli.

text_encoder_2 (`T5EncoderModel`) : mT5 gömme modeli. Özellikle 't5-v1_1-xxl' modelidir.

tokenizer_2 (`T5Tokenizer`) : mT5 gömmeleyicisi için belirteçleştirici.

scheduler ([DDPMScheduler](/docs/diffusers/main/tr/api/schedulers/ddpm#diffusers.DDPMScheduler)) : HunyuanDiT ile birlikte kullanılarak kodlanmış görüntü latentlerini gürültüden arındırmak için kullanılacak bir zamanlayıcı.

HunyuanDiT kullanarak İngilizce/Çince'den görüntü üretimi için pipeline.

Bu model [DiffusionPipeline](/docs/diffusers/main/tr/api/pipelines/overview#diffusers.DiffusionPipeline) sınıfından devralır. Kütüphanenin tüm pipeline'lar için uyguladığı genel yöntemler (indirme veya kaydetme, belirli bir cihazda çalıştırma vb.) için üst sınıf belgelendirmesine bakın.

HunyuanDiT iki metin kodlayıcı kullanır: [mT5](https://huggingface.co/google/mt5-base) ve [çift dilli CLIP](kendi kendimize ince ayar yaptık)

#### __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 = ['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 = (0, 0), use_resolution_binning: bool = True)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L568)

**Parametreler:**

prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmek için istem veya istemler. Tanımlanmadıysa, `prompt_embeds` parametresini iletmeniz gerekir.

height (`int`) : Üretilen görüntünün piksel cinsinden yüksekliği.

width (`int`) : Üretilen görüntünün piksel cinsinden genişliği.

num_inference_steps (`int`, *isteğe bağlı*, varsayılan 50) : Gürültü azaltma adım sayısı. Daha fazla gürültü azaltma adımı genellikle daha yavaş çıkarım pahasına daha yüksek kaliteli bir görüntüye yol açar. Bu parametre `strength` tarafından modüle edilir.

guidance_scale (`float`, *opsiyonel*, varsayılan 7.5) : Daha yüksek bir guidance scale değeri, modelin `prompt` ile yakından ilişkili görseller üretmesini teşvik eder; bunun bedeli ise daha düşük görsel kalitedir. Guidance scale, `guidance_scale > 1` olduğunda etkinleşir.

negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimde nelerin dahil edilmeyeceğini yönlendirmek için istem veya istemler. Tanımlanmadıysa bunun yerine `negative_prompt_embeds` parametresini geçmeniz gerekir. Yönlendirme kullanılmadığında (`guidance_scale < 1`) yok sayılır.

num_images_per_prompt (`int`, *isteğe bağlı*, varsayılan 1) : Her istem için üretilecek görsel sayısı.

eta (`float`, *isteğe bağlı*, varsayılan 0.0) : [DDIM](https://huggingface.co/papers/2010.02502) makalesindeki eta (η) parametresine karşılık gelir. Yalnızca [DDIMScheduler](/docs/diffusers/main/tr/api/schedulers/ddim#diffusers.DDIMScheduler) için geçerlidir ve diğer zamanlayıcılarda yok sayılır.

generator (`torch.Generator` veya `list[torch.Generator]`, *isteğe bağlı*) : Üretimi deterministik hale getirmek için bir [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html).

latents (`torch.Tensor`, *isteğe bağlı*) : Görsel üretimi için girdi olarak kullanılacak, Gauss dağılımından örneklenen önceden oluşturulmuş gürültülü latensler. Farklı istemlerle aynı üretimi ayarlamak için kullanılabilir. Sağlanmazsa, sağlanan rastgele `generator` kullanılarak örneklem yoluyla bir latens tensörü oluşturulur.

prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş metin gömme değerleri. Metin girdilerini (istek ağırlıklandırması) kolayca ayarlamak için kullanılabilir. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından üretilir.

prompt_embeds_2 (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş metin gömme değerleri. Metin girdilerini (istek ağırlıklandırması) kolayca ayarlamak için kullanılabilir. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından üretilir.

negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini (istek ağırlıklandırması) kolayca ayarlamak için kullanılabilir. Sağlanmazsa, `negative_prompt_embeds`, `negative_prompt` girdi argümanından üretilir.

negative_prompt_embeds_2 (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini (istek ağırlıklandırması) kolayca ayarlamak için kullanılabilir. Sağlanmazsa, `negative_prompt_embeds`, `negative_prompt` girdi argümanından üretilir.

prompt_attention_mask (`torch.Tensor`, *isteğe bağlı*) : İstek için dikkat maskesi. `prompt_embeds` doğrudan geçirildiğinde zorunludur.

prompt_attention_mask_2 (`torch.Tensor`, *isteğe bağlı*) : İstek için dikkat maskesi. `prompt_embeds_2` doğrudan geçirildiğinde zorunludur.

negative_prompt_attention_mask (`torch.Tensor`, *isteğe bağlı*) : Negatif prompt için dikkat maskesi. `negative_prompt_embeds` doğrudan geçirildiğinde gereklidir.

negative_prompt_attention_mask_2 (`torch.Tensor`, *isteğe bağlı*) : Negatif prompt için dikkat maskesi. `negative_prompt_embeds_2` doğrudan geçirildiğinde gereklidir.

output_type (`str`, *isteğe bağlı*, varsayılan `"pil"`) : Üretilen görüntünün çıktı biçimi. `PIL.Image` veya `np.array` arasında seçim yapın.

return_dict (`bool`, *isteğe bağlı*, varsayılan `True`) : Düz bir tuple yerine [StableDiffusionPipelineOutput](/docs/diffusers/main/tr/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) döndürülüp döndürülmemesi.

callback_on_step_end (`Callable[[int, int], None]`, `PipelineCallback`, `MultiPipelineCallbacks`, *isteğe bağlı*) : Her gürültü azaltma adımının sonunda çağrılacak bir geri çağrı işlevi veya geri çağrı işlevleri listesi.

callback_on_step_end_tensor_inputs (`list[str]`, *isteğe bağlı*) : Geri çağrı fonksiyonuna iletilmesi gereken gergilik girdilerinin listesi. Tanımlanmazsa, tüm gergilik girdileri iletilir.

guidance_rescale (`float`, *isteğe bağlı*, varsayılan 0.0) : Gürültüyü `guidance_rescale`'ye göre yeniden ölçekler. [Common Diffusion Noise Schedules and Sample Steps are Flawed](https://huggingface.co/papers/2305.08891) makalesindeki bulgulara dayanır. Bölüm 3.4'e bakın

original_size (`tuple[int, int]`, *isteğe bağlı*, varsayılan `(1024, 1024)`) : Görselin orijinal boyutu. Zaman kimliklerini hesaplamak için kullanılır.

target_size (`tuple[int, int]`, *isteğe bağlı*) : Görselin hedef boyutu. Zaman kimliklerini hesaplamak için kullanılır.

crops_coords_top_left (`tuple[int, int]`, *isteğe bağlı*, varsayılan `(0, 0)`) : Kırpmanın sol üst koordinatları. Zaman kimliklerini hesaplamak için kullanılır.

use_resolution_binning (`bool`, *isteğe bağlı*, varsayılan `True`) : Çözünürlük sınıflandırmasının (resolution binning) kullanılıp kullanılmayacağını belirtir. `True` ise, girdi çözünürlüğü en yakın standart çözünürlüğe eşlenir. Desteklenen çözünürlükler 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 ve 768x1280'dir. Bu değerin `True` olarak ayarlanması önerilir.

**Dönüş:** [StableDiffusionPipelineOutput](/docs/diffusers/main/tr/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) veya `tuple`

`return_dict` `True` ise [StableDiffusionPipelineOutput](/docs/diffusers/main/tr/api/pipelines/stable_diffusion/img2img#diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput) döndürülür, aksi takdirde bir `tuple` döndürülür; bu yapının ilk öğesi üretilen görsellerin listesini, ikinci öğesi ise ilgili üretilen görselin "not-safe-for-work" (nsfw) içerip içermediğini gösteren `bool` değerlerinin listesini içerir.

HunyuanDiT ile üretim için pipeline çağrı fonksiyonu.

Örnekler:
```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)
```

[Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/hunyuandit/pipeline_hunyuandit.py#L248)

**Parametreler:**

prompt (`str` veya `list[str]`, *isteğe bağlı*) : kodlanacak istem

device : (`torch.device`): torch cihazı

dtype (`torch.dtype`) : torch veri türü

num_images_per_prompt (`int`) : her istem için oluşturulacak görsel sayısı

do_classifier_free_guidance (`bool`) : sınıflandırıcı serbest yönlendirmenin (classifier free guidance) kullanılıp kullanılmayacağı

negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Tanımlanmazsa, bunun yerine `negative_prompt_embeds` parametresinin geçirilmesi gerekir. Yönlendirme kullanılmadığında (yani `guidance_scale` değeri `1`'den küçükse) yok sayılır.

prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından oluşturulur.

negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds, `negative_prompt` girdi argümanından oluşturulur.

prompt_attention_mask (`torch.Tensor`, *isteğe bağlı*) : İstek için dikkat maskesi. `prompt_embeds` doğrudan geçirildiğinde zorunludur.

negative_prompt_attention_mask (`torch.Tensor`, *isteğe bağlı*) : Negatif prompt için dikkat maskesi. `negative_prompt_embeds` doğrudan geçirildiğinde gereklidir.

max_sequence_length (`int`, *isteğe bağlı*) : prompt için kullanılacak maksimum dizi uzunluğu.

text_encoder_index (`int`, *opsiyonel*) : Kullanılacak metin kodlayıcısının indeksi. clip için `0` ve T5 için `1`.

İsteği metin kodlayıcı gizli durumlarına kodlar.

