# SanaTransformer2DModel

NVIDIA 和 MIT HAN Lab 的 Enze Xie、Junsong Chen、Junyu Chen、Han Cai、Haotian Tang、Yujun Lin、Zhekai Zhang、Muyang Li、Ligeng Zhu、Yao Lu、Song Han 在 [SANA: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformers](https://huggingface.co/papers/2410.10629) 中介绍了一种用于 2D 数据的 Diffusion Transformer 模型。

该论文的摘要如下：

*我们推出了 Sana，一个能够高效生成最高达 4096×4096 分辨率图像的文本到图像框架。Sana 能够以极快的速度合成高分辨率、高质量且文本-图像对齐度强的图像，并且可以部署在笔记本电脑 GPU 上。其核心设计包括：(1) 深度压缩自编码器：与传统仅将图像压缩 8 倍的自编码器不同，我们训练了一个能够将图像压缩 32 倍的自编码器，从而有效减少潜在 token 的数量。(2) 线性 DiT：我们将 DiT 中所有的标准注意力机制替换为线性注意力机制，使其在高分辨率下更加高效，同时不牺牲质量。(3) 仅解码器文本编码器：我们用现代仅解码器的小型 LLM 替换了 T5 作为文本编码器，并设计了复杂的人类指令，通过上下文学习来增强图像-文本对齐。(4) 高效的训练与采样：我们提出了 Flow-DPM-Solver 以减少采样步数，并通过高效的字幕标注和选择来加速收敛。因此，Sana-0.6B 与当今的大型扩散模型（例如 Flux-12B）相比极具竞争力，其体积缩小了 20 倍，实测吞吐量提升了 100 倍以上。此外，Sana-0.6B 可以部署在 16GB 的笔记本电脑 GPU 上，生成一张 1024×1024 分辨率的图像所需时间不到 1 秒。Sana 实现了低成本的创作。代码和模型将公开发布。*

可以使用以下代码片段加载该模型。

```python
from diffusers import SanaTransformer2DModel

transformer = SanaTransformer2DModel.from_pretrained("Efficient-Large-Model/Sana_1600M_1024px_BF16_diffusers", subfolder="transformer", dtype=torch.bfloat16)
```

## SanaTransformer2DModel[[diffusers.SanaTransformer2DModel]]

#### diffusers.SanaTransformer2DModel[[diffusers.SanaTransformer2DModel]]

```python
diffusers.SanaTransformer2DModel(in_channels: int = 32, out_channels: int | None = 32, num_attention_heads: int = 70, attention_head_dim: int = 32, num_layers: int = 20, num_cross_attention_heads: int | None = 20, cross_attention_head_dim: int | None = 112, cross_attention_dim: int | None = 2240, caption_channels: int = 2304, mlp_ratio: float = 2.5, dropout: float = 0.0, attention_bias: bool = False, sample_size: int = 32, patch_size: int = 1, norm_elementwise_affine: bool = False, norm_eps: float = 1e-06, interpolation_scale: int | None = None, guidance_embeds: bool = False, guidance_embeds_scale: float = 0.1, qk_norm: str | None = None, timestep_scale: float = 1.0)
```

[源代码](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/sana_transformer.py#L294)

**参数：**

in_channels (`int`，默认为 `32`)：输入中的通道数。

out_channels (`int`，*可选*，默认为 `32`)：输出的通道数。

num_attention_heads (`int`，默认为 `70`)：用于多头注意力的注意力头数量。

attention_head_dim (`int`，默认为 `32`)：每个头中的通道数。

num_layers (`int`，默认为 `20`)：要使用的 Transformer 块层数。

num_cross_attention_heads (`int`，*可选*，默认为 `20`)：用于交叉注意力的注意力头数量。

cross_attention_head_dim (`int`，*可选*，默认为 `112`)：交叉注意力中每个头的通道数。

cross_attention_dim (`int`，*可选*，默认为 `2240`)：交叉注意力输出的通道数。

caption_channels (`int`，默认为 `2304`)：标题嵌入的通道数。

mlp_ratio (`float`，默认值为 `2.5`)：GLUMBConv 层中使用的扩展比率。

dropout (`float`，默认为 `0.0`)：Dropout 概率。

attention_bias (`bool`，默认为 `False`)：是否在注意力层中使用偏置。

sample_size (`int`，默认为 `32`)：输入潜变量的基础尺寸。

patch_size (`int`，默认为 `1`)：用于 patch 嵌入层的 patch 大小。

norm_elementwise_affine (`bool`，默认为 `False`)：是否在归一化层中使用逐元素亲和性。

norm_eps (`float`，默认值为 `1e-6`)：归一化层的 epsilon 值。

qk_norm (`str`，*可选*，默认为 `None`)：用于查询和键的归一化方式。

timestep_scale (`float`，默认为 `1.0`)：用于时间步的缩放比例。

在 [Sana](https://huggingface.co/papers/2410.10629) 系列模型中引入的一种 2D Transformer 模型。

#### forward[[diffusers.SanaTransformer2DModel.forward]]

```python
forward(hidden_states: Tensor, encoder_hidden_states: Tensor, timestep: Tensor, guidance: typing.Optional[torch.Tensor] = None, encoder_attention_mask: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, attention_kwargs: dict[str, typing.Any] | None = None, controlnet_block_samples: tuple[torch.Tensor] | None = None, return_dict: bool = True)
```

[源代码](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/sana_transformer.py#L419)

**参数：**

hidden_states (`torch.Tensor`，形状为 `(batch_size, in_channels, height, width)`)：输入 `hidden_states`。

encoder_hidden_states (`torch.Tensor`，形状为 `(batch_size, sequence_len, embed_dims)`)：要使用的条件嵌入（从输入条件（例如提示词）计算得出的嵌入）。

timestep (`torch.LongTensor`)：用于指示去噪步骤。

guidance (`torch.Tensor`，*可选*)：引导尺度嵌入。

encoder_attention_mask (`torch.Tensor`, *可选*) : 应用于 `encoder_hidden_states` 的交叉注意力掩码。

attention_mask (`torch.Tensor`, *可选*) : 应用于 `hidden_states` 的自注意力掩码。

attention_kwargs (`dict`, *可选*) : 一个 kwargs 字典，如果指定，将作为参数传递给 [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py) 中 `self.processor` 下定义的 `AttentionProcessor`。

controlnet_block_samples (`tuple` of `torch.Tensor`, *可选*) : 一个张量列表，如果指定，将被添加到 Transformer 块的残差中。

return_dict (`bool`，*可选*，默认为 `True`)：是否返回 `~models.transformer_2d.Transformer2DModelOutput` 而不是普通元组。

**返回值：**

如果 `return_dict` 为 True，则返回 `~models.transformer_2d.Transformer2DModelOutput`，否则返回一个 `tuple`，其中第一个元素是样本张量。

[SanaTransformer2DModel](/docs/diffusers/main/zh/api/models/sana_transformer2d#diffusers.SanaTransformer2DModel) 的前向方法。

## Transformer2DModelOutput[[diffusers.models.modeling_outputs.Transformer2DModelOutput]]

#### diffusers.models.modeling_outputs.Transformer2DModelOutput[[diffusers.models.modeling_outputs.Transformer2DModelOutput]]

```python
diffusers.models.modeling_outputs.Transformer2DModelOutput(sample: torch.Tensor)
```

[源代码](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_outputs.py#L21)

**参数：**

sample (`torch.Tensor`，形状为 `(batch_size, num_channels, height, width)`；若 [Transformer2DModel](/docs/diffusers/main/zh/api/models/transformer2d#diffusers.Transformer2DModel) 为离散模式，则为 `(batch size, num_vector_embeds - 1, num_latent_pixels)`)：以 `encoder_hidden_states` 输入为条件的隐藏状态输出。若为离散模式，则返回未加噪潜在像素的概率分布。

[Transformer2DModel](/docs/diffusers/main/zh/api/models/transformer2d#diffusers.Transformer2DModel) 的输出。

