# AutoencoderDC

Model Autoencoder 2D yang digunakan dalam [SANA](https://huggingface.co/papers/2410.10629) dan diperkenalkan dalam [DCAE](https://huggingface.co/papers/2410.10733) oleh penulis Junyu Chen\*, Han Cai\*, Junsong Chen, Enze Xie, Shang Yang, Haotian Tang, Muyang Li, Yao Lu, Song Han dari MIT HAN Lab.

Abstrak dari makalah tersebut adalah:

*Kami memperkenalkan Deep Compression Autoencoder (DC-AE), keluarga model autoencoder baru untuk mempercepat model difusi resolusi tinggi. Model autoencoder yang ada telah menunjukkan hasil yang mengesankan pada rasio kompresi spasial yang moderat (misalnya, 8x), tetapi gagal mempertahankan akurasi rekonstruksi yang memuaskan untuk rasio kompresi spasial yang tinggi (misalnya, 64x). Kami mengatasi tantangan ini dengan memperkenalkan dua teknik utama: (1) Residual Autoencoding, di mana kami merancang model kami untuk mempelajari residual berdasarkan fitur yang ditransformasi dari ruang ke kanal untuk mengurangi kesulitan optimasi pada autoencoder kompresi spasial tinggi; (2) Decoupled High-Resolution Adaptation, strategi pelatihan tiga fase yang terdekopel secara efisien untuk memitigasi penalti generalisasi pada autoencoder kompresi spasial tinggi. Dengan desain ini, kami meningkatkan rasio kompresi spasial autoencoder hingga 128 sambil mempertahankan kualitas rekonstruksi. Dengan menerapkan DC-AE kami pada model difusi laten, kami mencapai percepatan yang signifikan tanpa penurunan akurasi. Sebagai contoh, pada ImageNet 512x512, DC-AE kami memberikan percepatan inferensi 19,1x dan percepatan pelatihan 17,9x pada GPU H100 untuk UViT-H sambil mencapai FID yang lebih baik, dibandingkan dengan autoencoder SD-VAE-f8 yang banyak digunakan. Kode kami tersedia di [URL https ini](https://github.com/mit-han-lab/efficientvit).*

Model-model DCAE berikut telah dirilis dan didukung di Diffusers.

| Format Diffusers | Format asli |
|:----------------:|:---------------:|
| [`mit-han-lab/dc-ae-f32c32-sana-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-sana-1.0-diffusers) | [`mit-han-lab/dc-ae-f32c32-sana-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-sana-1.0)
| [`mit-han-lab/dc-ae-f32c32-in-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-in-1.0-diffusers) | [`mit-han-lab/dc-ae-f32c32-in-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-in-1.0)
| [`mit-han-lab/dc-ae-f32c32-mix-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-mix-1.0-diffusers) | [`mit-han-lab/dc-ae-f32c32-mix-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f32c32-mix-1.0)
| [`mit-han-lab/dc-ae-f64c128-in-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f64c128-in-1.0-diffusers) | [`mit-han-lab/dc-ae-f64c128-in-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f64c128-in-1.0)
| [`mit-han-lab/dc-ae-f64c128-mix-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f64c128-mix-1.0-diffusers) | [`mit-han-lab/dc-ae-f64c128-mix-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f64c128-mix-1.0)
| [`mit-han-lab/dc-ae-f128c512-in-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f128c512-in-1.0-diffusers) | [`mit-han-lab/dc-ae-f128c512-in-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f128c512-in-1.0)
| [`mit-han-lab/dc-ae-f128c512-mix-1.0-diffusers`](https://huggingface.co/mit-han-lab/dc-ae-f128c512-mix-1.0-diffusers) | [`mit-han-lab/dc-ae-f128c512-mix-1.0`](https://huggingface.co/mit-han-lab/dc-ae-f128c512-mix-1.0)

Model ini disumbangkan oleh [lawrence-cj](https://github.com/lawrence-cj).

Muat model dalam format Diffusers dengan [from_pretrained()](/docs/diffusers/v0.43.0/id/api/models/overview#diffusers.ModelMixin.from_pretrained).

```python
from diffusers import AutoencoderDC

ae = AutoencoderDC.from_pretrained("mit-han-lab/dc-ae-f32c32-sana-1.0-diffusers", dtype=torch.float32).to("cuda")  # or "mps", "xpu", "cpu"
```

## Muat model di Diffusers melalui `from_single_file`

```python
from difusers import AutoencoderDC

ckpt_path = "https://huggingface.co/mit-han-lab/dc-ae-f32c32-sana-1.0/blob/main/model.safetensors"
model = AutoencoderDC.from_single_file(ckpt_path) 

```

Model `AutoencoderDC` memiliki varian checkpoint file tunggal `in` dan `mix` yang memiliki kunci checkpoint yang cocok, tetapi menggunakan faktor penskalaan yang berbeda. Diffusers tidak dapat secara otomatis menyimpulkan file config yang benar untuk digunakan dengan model berdasarkan hanya checkpoint, dan akan secara default mengonfigurasi model menggunakan file config varian `mix`. Untuk menimpa config yang ditentukan secara otomatis, silakan gunakan argumen `config` saat menggunakan pemuatan file tunggal dengan checkpoint varian `in`.

```python
from diffusers import AutoencoderDC

ckpt_path = "https://huggingface.co/mit-han-lab/dc-ae-f128c512-in-1.0/blob/main/model.safetensors"
model = AutoencoderDC.from_single_file(ckpt_path, config="mit-han-lab/dc-ae-f128c512-in-1.0-diffusers")
```

## AutoencoderDC[[diffusers.AutoencoderDC]]

#### diffusers.AutoencoderDC[[diffusers.AutoencoderDC]]

```python
diffusers.AutoencoderDC(in_channels: int = 3, latent_channels: int = 32, attention_head_dim: int = 32, encoder_block_types: str | tuple[str] = 'ResBlock', decoder_block_types: str | tuple[str] = 'ResBlock', encoder_block_out_channels: tuple[int, ...] = (128, 256, 512, 512, 1024, 1024), decoder_block_out_channels: tuple[int, ...] = (128, 256, 512, 512, 1024, 1024), encoder_layers_per_block: tuple[int, ...] = (2, 2, 2, 3, 3, 3), decoder_layers_per_block: tuple[int, ...] = (3, 3, 3, 3, 3, 3), encoder_qkv_multiscales: tuple[tuple[int, ...], ...] = ((), (), (), (5,), (5,), (5,)), decoder_qkv_multiscales: tuple[tuple[int, ...], ...] = ((), (), (), (5,), (5,), (5,)), upsample_block_type: str = 'pixel_shuffle', downsample_block_type: str = 'pixel_unshuffle', decoder_norm_types: str | tuple[str] = 'rms_norm', decoder_act_fns: str | tuple[str] = 'silu', encoder_out_shortcut: bool = True, decoder_in_shortcut: bool = True, decoder_conv_act_fn: str = 'relu', scaling_factor: float = 1.0)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_dc.py#L380)

**Parameter:**

in_channels (`int`, defaultnya `3`) : Jumlah saluran input dalam sampel.

latent_channels (`int`, defaultnya `32`) : Jumlah channel dalam representasi ruang laten.

encoder_block_types (`str | tuple[str]`, defaultnya `"ResBlock"`) : Jenis blok yang digunakan dalam encoder.

decoder_block_types (`str | tuple[str]`, defaultnya `"ResBlock"`) : Jenis blok yang digunakan dalam decoder.

encoder_block_out_channels (`tuple[int, ...]`, defaultnya `(128, 256, 512, 512, 1024, 1024)`) : Jumlah kanal output untuk setiap blok dalam encoder.

decoder_block_out_channels (`tuple[int, ...]`, defaultnya `(128, 256, 512, 512, 1024, 1024)`) : Jumlah kanal output untuk setiap blok dalam decoder.

encoder_layers_per_block (`tuple[int]`, defaultnya `(2, 2, 2, 3, 3, 3)`) : Jumlah lapisan per blok di encoder.

decoder_layers_per_block (`tuple[int]`, defaultnya `(3, 3, 3, 3, 3, 3)`) : Jumlah lapisan per blok dalam decoder.

encoder_qkv_multiscales (`tuple[tuple[int, ...], ...]`, defaultnya `((), (), (), (5,), (5,), (5,))`) : Konfigurasi multi-skala untuk transformasi QKV (query-key-value) dari encoder.

decoder_qkv_multiscales (`tuple[tuple[int, ...], ...]`, defaultnya `((), (), (), (5,), (5,), (5,))`) : Konfigurasi multi-skala untuk transformasi QKV (query-key-value) dari decoder.

upsample_block_type (`str`, defaultnya `"pixel_shuffle"`) : Jenis blok yang digunakan untuk upsampling di decoder.

downsample_block_type (`str`, defaultnya `"pixel_unshuffle"`) : Jenis blok yang digunakan untuk downsampling di encoder.

decoder_norm_types (`str | tuple[str]`, defaultnya `"rms_norm"`) : Jenis normalisasi yang akan digunakan dalam decoder.

decoder_act_fns (`str | tuple[str]`, defaultnya `"silu"`) : Fungsi aktivasi yang digunakan dalam decoder.

encoder_out_shortcut  (`bool`, defaultnya `True`) : Apakah akan menggunakan shortcut di akhir encoder.

decoder_in_shortcut (`bool`, defaultnya `True`) : Apakah akan menggunakan shortcut di awal decoder.

decoder_conv_act_fn (`str`, defaultnya `"relu"`) : Fungsi aktivasi yang digunakan di akhir decoder.

scaling_factor (`float`, defaultnya `1.0`) : Invers perkalian dari akar rata-rata kuadrat (root mean square) dari fitur laten. Ini digunakan untuk menskalakan ruang laten agar memiliki varians satuan saat melatih model difusi. Laten diskalakan dengan rumus `z = z * scaling_factor` sebelum diteruskan ke model difusi. Saat decoding, laten diskalakan kembali ke skala aslinya dengan rumus: `z = 1 / scaling_factor * z`.

Model Autoencoder yang diperkenalkan dalam [DCAE](https://huggingface.co/papers/2410.10733) dan digunakan dalam [SANA](https://huggingface.co/papers/2410.10629).

Model ini mewarisi dari [ModelMixin](/docs/diffusers/v0.43.0/id/api/models/overview#diffusers.ModelMixin). Periksa dokumentasi kelas induk untuk metode generiknya yang diimplementasikan untuk semua model (seperti mengunduh atau menyimpan).

#### encode[[diffusers.AutoencoderDC.encode]]

```python
encode(x: Tensor, return_dict: bool = True)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_dc.py#L548)

**Parameter:**

x (`torch.Tensor`) : Batch input gambar.

return_dict (`bool`, defaultnya `True`) : Apakah akan mengembalikan `~models.vae.EncoderOutput` alih-alih tuple biasa.

**Mengembalikan:**

Representasi laten dari video yang dikodekan. Jika `return_dict` bernilai True, sebuah `~models.vae.EncoderOutput` dikembalikan, selain itu sebuah `tuple` polos yang dikembalikan.

Enkodekan batch gambar menjadi latents.

#### decode[[diffusers.AutoencoderDC.decode]]

```python
decode(z: Tensor, return_dict: bool = True)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_dc.py#L582)

**Parameter:**

z (`torch.Tensor`) : Batch input dari vektor laten.

return_dict (`bool`, defaultnya `True`) : Apakah akan mengembalikan `~models.vae.DecoderOutput` alih-alih tuple biasa.

**Mengembalikan:** `~models.vae.DecoderOutput` atau `tuple`

Jika return_dict adalah True, sebuah `~models.vae.DecoderOutput` dikembalikan, selain itu sebuah `tuple` biasa dikembalikan.

Decode sekelompok gambar.

#### enable_tiling[[diffusers.AutoencoderDC.enable_tiling]]

```python
enable_tiling(tile_sample_min_height: int | None = None, tile_sample_min_width: int | None = None, tile_sample_stride_height: float | None = None, tile_sample_stride_width: float | None = None)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_dc.py#L506)

**Parameter:**

tile_sample_min_height (`int`, *opsional*) : Tinggi minimum yang diperlukan agar sampel dipisahkan menjadi ubin di sepanjang dimensi tinggi.

tile_sample_min_width (`int`, *opsional*) : Lebar minimum yang diperlukan agar sampel dipisahkan menjadi ubin di sepanjang dimensi lebar.

tile_sample_stride_height (`int`, *opsional*) : Jumlah minimum tumpang tindih antara dua ubin vertikal yang berurutan. Hal ini untuk memastikan tidak ada artefak penataan ubin yang dihasilkan di sepanjang dimensi tinggi.

tile_sample_stride_width (`int`, *opsional*) : Jarak (stride) antara dua tile horizontal yang berurutan. Hal ini untuk memastikan tidak ada artefak tiling yang dihasilkan di sepanjang dimensi lebar.

Aktifkan decoding AE bertile. Ketika opsi ini diaktifkan, AE akan membagi tensor input menjadi tile untuk menghitung decoding dan encoding dalam beberapa langkah. Hal ini berguna untuk menghemat memori dalam jumlah besar dan memungkinkan pemrosesan gambar yang lebih besar.

#### forward[[diffusers.AutoencoderDC.forward]]

```python
forward(sample: Tensor, return_dict: bool = True)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_dc.py#L708)

**Parameter:**

sample (`torch.Tensor`) : Sampel input.

return_dict (`bool`, *opsional*, defaultnya `True`) : Apakah akan mengembalikan `DecoderOutput` alih-alih tuple biasa.

**Mengembalikan:** `~models.vae.DecoderOutput` atau `tuple`

Jika `return_dict` bernilai True, sebuah `~models.vae.DecoderOutput` akan dikembalikan, selain itu sebuah `tuple` biasa akan dikembalikan.

## DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

#### diffusers.models.autoencoders.vae.DecoderOutput[[diffusers.models.autoencoders.vae.DecoderOutput]]

```python
diffusers.models.autoencoders.vae.DecoderOutput(sample: Tensor, commit_loss: typing.Optional[torch.FloatTensor] = None)
```

[Sumber](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/vae.py#L49)

**Parameter:**

sample (`torch.Tensor` dengan bentuk `(batch_size, num_channels, height, width)`) : Sampel output yang didekodekan dari lapisan terakhir model.

Output dari metode decoding.

