# AutoencoderDC

Mô hình Autoencoder 2D được sử dụng trong [SANA](https://huggingface.co/papers/2410.10629) và được giới thiệu trong [DCAE](https://huggingface.co/papers/2410.10733) bởi các tác giả Junyu Chen\*, Han Cai\*, Junsong Chen, Enze Xie, Shang Yang, Haotian Tang, Muyang Li, Yao Lu, Song Han từ MIT HAN Lab.

Tóm tắt từ bài báo là:

*Chúng tôi giới thiệu Deep Compression Autoencoder (DC-AE), một họ mô hình autoencoder mới nhằm tăng tốc các mô hình diffusion độ phân giải cao. Các mô hình autoencoder hiện có đã cho thấy kết quả ấn tượng ở tỷ lệ nén không gian vừa phải (ví dụ: 8x), nhưng không duy trì được độ chính xác tái tạo thỏa mãn ở các tỷ lệ nén không gian cao (ví dụ: 64x). Chúng tôi giải quyết thách thức này bằng cách đưa ra hai kỹ thuật chính: (1) Residual Autoencoding, trong đó chúng tôi thiết kế mô hình để học phần dư dựa trên các đặc trưng đã được biến đổi space-to-channel, nhằm giảm bớt độ khó tối ưu của các autoencoder có tỷ lệ nén không gian cao; (2) Decoupled High-Resolution Adaptation, một chiến lược huấn luyện ba giai đoạn tách rời hiệu quả để giảm thiểu hình phạt tổng quát hóa của các autoencoder có tỷ lệ nén không gian cao. Với các thiết kế này, chúng tôi nâng tỷ lệ nén không gian của autoencoder lên tới 128 trong khi vẫn duy trì chất lượng tái tạo. Khi áp dụng DC-AE của chúng tôi vào các mô hình latent diffusion, chúng tôi đạt được tăng tốc đáng kể mà không làm giảm độ chính xác. Ví dụ, trên ImageNet 512x512, DC-AE của chúng tôi cung cấp tốc độ suy luận nhanh hơn 19,1 lần và tốc độ huấn luyện nhanh hơn 17,9 lần trên GPU H100 cho UViT-H, đồng thời đạt FID tốt hơn so với autoencoder SD-VAE-f8 được sử dụng rộng rãi. Mã nguồn của chúng tôi có sẵn tại [this https URL](https://github.com/mit-han-lab/efficientvit).*

Các mô hình DCAE sau đây đã được phát hành và hỗ trợ trong Diffusers.

| Định dạng Diffusers | Định dạng gốc |
|:----------------:|:---------------:|
| [`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)

Mô hình này được đóng góp bởi [lawrence-cj](https://github.com/lawrence-cj).

Tải một mô hình ở định dạng Diffusers bằng [from_pretrained()](/docs/diffusers/v0.43.0/vi/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"
```

## Tải một mô hình trong Diffusers thông qua `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) 

```

Mô hình `AutoencoderDC` có các biến thể checkpoint tệp đơn `in` và `mix` với các khóa checkpoint khớp nhau, nhưng sử dụng các hệ số tỷ lệ khác nhau. Diffusers không thể tự động suy luận tệp config chính xác để sử dụng với mô hình dựa trên riêng checkpoint và sẽ mặc định cấu hình mô hình bằng tệp config của biến thể `mix`. Để ghi đè lên config được xác định tự động, vui lòng sử dụng đối số `config` khi tải tệp đơn với các checkpoint biến thể `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)
```

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

**Tham số:**

in_channels (`int`, mặc định là `3`) : Số lượng kênh đầu vào trong các mẫu.

latent_channels (`int`, mặc định là `32`) : Số lượng kênh trong biểu diễn không gian tiềm ẩn.

encoder_block_types (`str | tuple[str]`, mặc định là `"ResBlock"`) : Kiểu khối được sử dụng trong bộ mã hóa.

decoder_block_types (`str | tuple[str]`, mặc định là `"ResBlock"`) : Kiểu khối được sử dụng trong bộ giải mã.

encoder_block_out_channels (`tuple[int, ...]`, mặc định là `(128, 256, 512, 512, 1024, 1024)`) : Số lượng kênh đầu ra cho mỗi khối trong bộ mã hóa.

decoder_block_out_channels (`tuple[int, ...]`, mặc định là `(128, 256, 512, 512, 1024, 1024)`) : Số lượng kênh đầu ra cho mỗi khối trong bộ giải mã.

encoder_layers_per_block (`tuple[int]`, mặc định là `(2, 2, 2, 3, 3, 3)`) : Số lượng lớp cho mỗi khối trong bộ mã hóa.

decoder_layers_per_block (`tuple[int]`, mặc định là `(3, 3, 3, 3, 3, 3)`) : Số lượng lớp trong mỗi khối của bộ giải mã.

encoder_qkv_multiscales (`tuple[tuple[int, ...], ...]`, mặc định là `((), (), (), (5,), (5,), (5,))`) : Cấu hình đa tỷ lệ cho các phép biến đổi QKV (query-key-value) của encoder.

decoder_qkv_multiscales (`tuple[tuple[int, ...], ...]`, mặc định là `((), (), (), (5,), (5,), (5,))`) : Cấu hình đa tỷ lệ cho các phép biến đổi QKV (query-key-value) của bộ giải mã.

upsample_block_type (`str`, mặc định là `"pixel_shuffle"`) : Loại khối được sử dụng để tăng mẫu (upsampling) trong bộ giải mã (decoder).

downsample_block_type (`str`, mặc định là `"pixel_unshuffle"`) : Loại khối được sử dụng để giảm mẫu trong bộ mã hóa.

decoder_norm_types (`str | tuple[str]`, mặc định là `"rms_norm"`) : Kiểu (các kiểu) chuẩn hóa cần sử dụng trong bộ giải mã.

decoder_act_fns (`str | tuple[str]`, mặc định là `"silu"`) : Hàm kích hoạt cần sử dụng trong bộ giải mã.

encoder_out_shortcut  (`bool`, mặc định là `True`) : Có sử dụng shortcut ở cuối encoder hay không.

decoder_in_shortcut (`bool`, mặc định là `True`) : Có sử dụng shortcut ở đầu bộ giải mã hay không.

decoder_conv_act_fn (`str`, mặc định là `"relu"`) : Hàm kích hoạt được sử dụng ở cuối bộ giải mã.

scaling_factor (`float`, mặc định là `1.0`) : Nghịch đảo nhân của căn phương sai trung bình của các đặc trưng tiềm ẩn. Giá trị này được dùng để chuẩn hóa không gian tiềm ẩn sao cho có phương sai bằng đơn vị khi huấn luyện mô hình khuếch tán. Các biến tiềm ẩn được chuẩn hóa theo công thức `z = z * scaling_factor` trước khi được truyền vào mô hình khuếch tán. Khi giải mã, các biến tiềm ẩn được đưa về thang đo ban đầu theo công thức: `z = 1 / scaling_factor * z`.

Mô hình Autoencoder được giới thiệu trong [DCAE](https://huggingface.co/papers/2410.10733) và được sử dụng trong [SANA](https://huggingface.co/papers/2410.10629).

Mô hình này kế thừa từ [ModelMixin](/docs/diffusers/v0.43.0/vi/api/models/overview#diffusers.ModelMixin). Hãy xem tài liệu của lớp cha để biết các phương thức chung được triển khai cho tất cả các mô hình (chẳng hạn như tải xuống hoặc lưu trữ).

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

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

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

**Tham số:**

x (`torch.Tensor`) : Lô đầu vào của các hình ảnh.

return_dict (`bool`, mặc định là `True`) : Có nên trả về một `~models.vae.EncoderOutput` thay vì một tuple thông thường hay không.

**Trả về:**

Các biểu diễn ẩn của các video đã được mã hóa. Nếu `return_dict` là True, một `~models.vae.EncoderOutput` sẽ được trả về, ngược lại một `tuple` thông thường sẽ được trả về.

Mã hóa một lô ảnh thành các biến ẩn.

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

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

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

**Tham số:**

z (`torch.Tensor`) : Lô đầu vào của các vector ẩn.

return_dict (`bool`, mặc định là `True`) : Có nên trả về một `~models.vae.DecoderOutput` thay vì một tuple thông thường hay không.

**Trả về:** `~models.vae.DecoderOutput` hoặc `tuple`

Nếu return_dict là True, một `~models.vae.DecoderOutput` sẽ được trả về, ngược lại một `tuple` thông thường sẽ được trả về.

Giải mã một lô ảnh.

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

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

**Tham số:**

tile_sample_min_height (`int`, *optional*) : Chiều cao tối thiểu cần thiết để một mẫu được tách thành các ô (tiles) theo chiều cao.

tile_sample_min_width (`int`, *optional*) : Độ rộng tối thiểu cần thiết để một mẫu được tách thành các ô (tiles) theo chiều rộng.

tile_sample_stride_height (`int`, *optional*) : Lượng chồng lấn tối thiểu giữa hai gạch dọc liên tiếp. Điều này nhằm đảm bảo không có hiện tượng lỗi ghép gạch nào xảy ra dọc theo chiều cao.

tile_sample_stride_width (`int`, *optional*) : Khoảng cách giữa hai ô gạch ngang liên tiếp. Điều này nhằm đảm bảo không có hiện tượng lỗi ghép gạch nào xảy ra dọc theo chiều rộng.

Bật giải mã AE dạng gạch. Khi tùy chọn này được bật, AE sẽ chia tensor đầu vào thành các gạch để tính toán giải mã và mã hóa qua nhiều bước. Điều này hữu ích để tiết kiệm một lượng lớn bộ nhớ và cho phép xử lý các hình ảnh lớn hơn.

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

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

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

**Tham số:**

sample (`torch.Tensor`) : Mẫu đầu vào.

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một `DecoderOutput` thay vì một tuple thông thường hay không.

**Trả về:** `~models.vae.DecoderOutput` hoặc `tuple`

Nếu `return_dict` là True, một `~models.vae.DecoderOutput` sẽ được trả về, ngược lại một `tuple` thông thường sẽ được trả về.

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

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

**Tham số:**

sample (`torch.Tensor` có shape `(batch_size, num_channels, height, width)`) : Mẫu đầu ra đã giải mã từ lớp cuối cùng của mô hình.

Đầu ra của phương pháp giải mã.

