# SanaWMTransformer3DModel

カメラ制御による画像から動画への生成に使用される3D Diffusion Transformer（16億パラメータ）であり、[SanaWMPipeline](/docs/diffusers/main/ja/api/pipelines/sana_wm#diffusers.SanaWMPipeline)のステージ1サンプラーとして機能します。このtransformerは以下を組み合わせます：

* 双方向 GDN-Triton 線形アテンションのメインブランチ（深さ 20、隠れ層サイズ 2240、ヘッド数 20）、
* UCPE（Unified Camera Pose Embedding）カメラ制御ブランチ。これは、要求された軌道のraymapおよびPlücker表現を消費し、
* Wanスタイルの3D回転位置埋め込みと、`softmax_every_n`層ごとに挿入される周期的なsoftmaxアテンションブロック。

モデルは以下のように読み込むことができます:

```python
import torch
from diffusers import SanaWMTransformer3DModel

transformer = SanaWMTransformer3DModel.from_pretrained(
    "Efficient-Large-Model/SANA-WM_bidirectional-diffusers",
    subfolder="transformer",
    torch_dtype=torch.bfloat16,
)
```

## SanaWMTransformer3DModel[[diffusers.SanaWMTransformer3DModel]]

#### diffusers.SanaWMTransformer3DModel[[diffusers.SanaWMTransformer3DModel]]

```python
diffusers.SanaWMTransformer3DModel(in_channels: int = 128, num_layers: int = 20, hidden_size: int = 2240, num_attention_heads: int = 20, patch_size: tuple[int, int, int] = (1, 1, 1), softmax_every_n: int = 4, linear_head_dim: int = 112, ffn_type: str = 'GLUMBConvTemp', t_kernel_size: int = 3, conv_kernel_size: int = 4, k_conv_only: bool = True, pos_embed_type: str = 'wan_rope', qk_norm: bool = True, cross_norm: bool = True, y_norm: bool = True, cam_attn_compress: int = 1, init_cam_from_base: bool = True, use_chunk_plucker_post_attn: bool = True, chunk_plucker_channels: int = 48, chunk_plucker_post_attn_blocks: int = 20, fp32_attention: bool = True, image_size: int = 720, caption_channels: int = 2304, mlp_ratio: float = 3.0, mlp_acts: tuple = ('silu', 'silu', None), use_pe: bool = True, learn_sigma: bool = False, pred_sigma: bool = False, mixed_precision: str = 'bf16')
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_sana_wm.py#L2663)

**パラメータ:**

in_channels (*int*、デフォルトは 128) : VAE の潜在チャネル数 (LTX-2)。

softmax_every_n (*int*、デフォルトは 4) : N ブロックごとに softmax attention ブロックを使用します。

linear_head_dim (*int*、デフォルトは 112) : GDN のヘッド次元。

ffn_type (*str*、デフォルトは `"GLUMBConvTemp"`) : FFN。

t_kernel_size (*int*、デフォルトは 3) : 時間方向の畳み込みカーネルサイズ。

conv_kernel_size (*int*、デフォルトは 4) : attention 内の空間畳み込みカーネル。

k_conv_only (*bool*、デフォルトは True) : conv を K にのみ適用します。

pos_embed_type (*str*、デフォルトは`"wan_rope"`) : 位置埋め込み。

qk_norm (*bool*、デフォルトは True) : Q/K に RMSNorm を適用します。

cross_norm (*bool*、デフォルトは True) : クロスアテンションの K に RMSNorm を適用します。

y_norm (*bool*、デフォルトは True) : テキスト埋め込みに `attention_y_norm` を適用します。

init_cam_from_base (*bool*、デフォルトは True) : 未使用。カメラブランチはチェックポイントから読み込まれます。公開済みの *config.json* ファイルを読み込めるように残されています。

use_chunk_plucker_post_attn (*bool*、デフォルトは True)。--

chunk_plucker_channels (*int*、デフォルトは 48) : `6 dims * temporal_stride 8`。

chunk_plucker_post_attn_blocks (*int*、デフォルトは 20) : すべてのブロック。

fp32_attention (*bool*、デフォルトは True) : 未使用。attention は常に fp32 で実行されます。公開済みの *config.json* ファイルを読み込めるように残されています。

image_size (*int*、デフォルトは 720) : 公称画像サイズ。

caption_channels (*int*、デフォルトは 2304) : Gemma-2 の隠れ層サイズ。

SANA-WM 1600M 双方向カメラ制御 DiT。

単一クラスの DiT（depth=20、hidden_size=2240、patch_size=(1,1,1)、num_heads=20、つまり公開されている `Efficient-Large-Model/SANA-WM_bidirectional` リリース）。`save_pretrained` / `from_pretrained` は [ConfigMixin](/docs/diffusers/main/ja/api/configuration#diffusers.ConfigMixin) を通じてそのまま動作します。

各ブロックはカメラ条件付き（UCPE）アテンションの [*BidirectionalGDNUCPESinglePathLiteLA*] を実行しますが、`softmax_every_n` 個目のブロックは、その softmax 対応版である [*_SoftmaxUCPESinglePathLiteLA*] を実行します。

state-dict は、意図的に削除された `pos_embed` バッファを除き、公開されている sana チェックポイントと同一です。

#### forward[[diffusers.SanaWMTransformer3DModel.forward]]

```python
forward(hidden_states: torch.Tensor, timestep: torch.Tensor, encoder_hidden_states: torch.Tensor, encoder_attention_mask: torch.Tensor | None = None, mask: torch.Tensor | None = None, return_dict: bool = True, data_info: Optional[dict] = None, camera_conditions: torch.Tensor | None = None, chunk_plucker: torch.Tensor | None = None, cam_pos_embeds: Optional[dict] = None, pos_embeds: torch.Tensor | None = None, raymats: torch.Tensor | None = None, frame_valid_mask: torch.Tensor | None = None, chunk_size: int | None = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_sana_wm.py#L2896)

**パラメータ:**

hidden_states : `(B, C, T, H, W)` の latents。

timestep : フレームごとの拡散タイムステップ（LTXスタイル）、`(B, 1, T)`

encoder_hidden_states : `(B, 1, L, D_caption)` テキスト埋め込み。

encoder_attention_mask : `(B, L)` テキストアテンションマスク（diffusers の規約）。

mask `encoder_attention_mask` の別名です。sana DiT の kwarg 名に一致します。両方が渡された場合、`mask` が優先されます。

return_dict : `True`（デフォルト）の場合、`Transformer2DModelOutput`を返します。それ以外の場合、1要素のタプル`(sample,)`を返します。

data_info : 追加の条件付け; `data_info["image_vae_embeds"]` が存在する場合、チャネル軸に沿って潜変数に連結されます。

camera_conditions : `(B, T, 20)` カメラ制御 (UCPE) ブランチを駆動する生のカメラス状態。

chunk_plucker : Plucker レイ埋め込み `(B, C, T, H, W)`。モデルが `use_chunk_plucker_input` / `use_chunk_plucker_post_attn` で設定されている場合に使用されます。

cam_pos_embeds : 再計算の代わりに再利用する、事前計算済みのカメラ位置埋め込み（`"absmap"` / `"P"` エントリ）。

pos_embeds : 事前計算済みのロータリー位置埋め込み。`None` の場合、潜在変数の形状から構築されます。

raymats : 任意の事前計算済みのUCPEレイ行列（`cam_pos_embeds`が`"P"`を保持しない場合にのみ使用されます）。

frame_valid_mask : フレームごとの任意の妥当性マスク。形状は`(B, 1, T, 1, 1)`、`(B, 1, T)`、または`(B, T)`。

chunk_size : ブロックに転送されるチャンク長のオーバーライド。各ブロックに設定された`chunk_size`にフォールバックします。

**戻り値:**

`(B, C, T, H, W)` の形状を持つ `sample` を持つ `Transformer2DModelOutput`。

SANA-WM DiTを実行します。

#### unpatchify[[diffusers.SanaWMTransformer3DModel.unpatchify]]

```python
unpatchify(x, post_patch_num_frames, post_patch_height, post_patch_width)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformers/transformer_sana_wm.py#L3099)

x: (N, T, patch_size**2 * C) imgs: (N, H, W, C)

## 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`、shape は `(batch_size, num_channels, height, width)`、または [Transformer2DModel](/docs/diffusers/main/ja/api/models/transformer2d#diffusers.Transformer2DModel) が離散型の場合 `(batch size, num_vector_embeds - 1, num_latent_pixels)`) : `encoder_hidden_states` 入力を条件とする隠れ状態の出力です。離散型の場合、ノイズ除去されていない潜在ピクセルの確率分布を返します。

[Transformer2DModel](/docs/diffusers/main/ja/api/models/transformer2d#diffusers.Transformer2DModel)の出力です。

