# 並列性

並列化戦略は、計算を複数のデバイスに分散させることで、拡散型トランスフォーマーの推論/学習時間を短縮し、高速化を助けます。詳細については、[Distributed inference](../training/distributed_inference)ガイドを参照してください。

## ParallelConfig[[diffusers.ParallelConfig]]

#### diffusers.ParallelConfig[[diffusers.ParallelConfig]]

```python
diffusers.ParallelConfig(context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = None, tensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None)
```

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

**パラメータ:**

context_parallel_config (`ContextParallelConfig`, *任意*) : コンテキスト並列化の設定。

tensor_parallel_config (`TensorParallelConfig`, *任意*) : テンソル並列の構成。

異なる並列化を適用するための設定。

## ContextParallelConfig[[diffusers.ContextParallelConfig]]

#### diffusers.ContextParallelConfig[[diffusers.ContextParallelConfig]]

```python
diffusers.ContextParallelConfig(ring_degree: int | None = None, ulysses_degree: int | None = None, convert_to_fp32: bool = True, rotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather', mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None, ulysses_anything: bool = False, ring_anything: bool = False, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None, _flattened_mesh: DeviceMesh = None, _ring_mesh: DeviceMesh = None, _ulysses_mesh: DeviceMesh = None, _ring_local_rank: int = None, _ulysses_local_rank: int = None)
```

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

**パラメータ:**

ring_degree (`int`, *任意*, デフォルトは `1`) : Ring Attention に使用するデバイスの数。シーケンスはデバイス間で分割されます。各デバイスは、リングを順に回されて渡されるローカルな Q と KV チャンク間のアテンションを計算します。メモリ使用量が低く（一度に KV の 1/N しか保持しない）、計算と通信をオーバーラップできますが、すべてのトークンを見るには N 回の反復が必要です。メモリや帯域幅が限られている長いシーケンスに最適です。コンテキスト並列領域内のリングアテンションに使用するデバイスの数。コンテキスト並列メッシュのデバイス総数の約数である必要があります。

ulysses_degree (`int`、*任意*、デフォルトは`1`) : Ulysses Attention に使用するデバイスの数。シーケンスはデバイス間で分割されます。各デバイスがローカル QKV を計算し、その後、すべての KV チャンクを all-gather して、1 パスで完全なアテンションを計算します。メモリ使用量が高くなります（すべての KV を保持するため）、高帯域幅の all-to-all 通信が必要ですが、レイテンシは低くなります。インターコネクト帯域幅が十分な中程度の長さのシーケンスに最適です。

convert_to_fp32 (`bool`、*任意*、デフォルトは `True`) : リングアテンションの数値的安定性を確保するために、出力と LSE を float32 に変換するかどうかを指定します。

rotate_method (`str`、*任意*、デフォルトは `"allgather"`) : リングアテンションにおいて、デバイス間でキー/バリュー状態をローテーションするために使用するメソッド。現在サポートされているのは `"allgather"` のみです。

ulysses_anything (`bool`、*任意*、デフォルトは `False`) : `ulysses_degree` で均等割り切れない任意のシーケンス長とヘッド数に対応する「Ulysses Anything」モードを有効にするかどうか。有効にした場合、`ulysses_degree` は 1 より大きく、`ring_degree` は 1 でなければなりません。

ring_anything (`bool`、*任意*、デフォルトは`False`) : 任意のシーケンス長をサポートする "Ring Anything" モードを有効にするかどうか。有効にした場合、`ring_degree` は 1 より大きく、`ulysses_degree` は 1 でなければなりません。

mesh (`torch.distributed.device_mesh.DeviceMesh`, *任意*) : コンテキスト並列性で使用するカスタムのデバイスメッシュです。指定された場合、新しいメッシュを作成する代わりに、このメッシュが使用されます。これは、同じデバイスメッシュを共有する他の並列化戦略（FSDP やテンソル並列など）とコンテキスト並列性を組み合わせる場合に有用です。メッシュには "ring" と "ulysses" の両方の次元が必要です。使用しない次元にはサイズ 1 を指定します（例: FSDP と組み合わせたリングアテンションのみの場合、`mesh_shape=(2, 1, 4)` と `mesh_dim_names=("ring", "ulysses", "fsdp")` を使用）。

コンテキスト並列性用の設定。

#### diffusers.hooks.apply_context_parallel[[diffusers.hooks.apply_context_parallel]]

```python
diffusers.hooks.apply_context_parallel(module: Module, parallel_config: ContextParallelConfig, plan: dict[str, dict[str, dict[str | int, diffusers.models._modeling_parallel.ContextParallelInput | list[diffusers.models._modeling_parallel.ContextParallelInput] | tuple[diffusers.models._modeling_parallel.ContextParallelInput, ...]] | diffusers.models._modeling_parallel.ContextParallelOutput | list[diffusers.models._modeling_parallel.ContextParallelOutput] | tuple[diffusers.models._modeling_parallel.ContextParallelOutput, ...] | diffusers.models._modeling_parallel.Conditional]])
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/hooks/context_parallel.py#L81)

モデルにコンテキスト並列を適用します。

## TensorParallelConfig[[diffusers.TensorParallelConfig]]

#### diffusers.TensorParallelConfig[[diffusers.TensorParallelConfig]]

```python
diffusers.TensorParallelConfig(tp_degree: int = 1, mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = None, _rank: int = None, _world_size: int = None, _device: device = None, _mesh: DeviceMesh = None, _tp_degree: int = None)
```

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

**パラメータ:**

tp_degree (`int`、デフォルトは`1`) : シャードに分割するデバイスの数。並列化対象モデルのアテンションヘッド数（およびFFNの隠れ層次元数）の約数である必要があります。

mesh (`torch.distributed.device_mesh.DeviceMesh`, *任意*) : 使用するカスタムのデバイスメッシュです。指定された場合、`tp_degree` は `mesh.size()` から推論され、この引数は無視されます。同じメッシュを共有する他の並列化戦略（例: CP）と TP を組み合わせる場合に有用です。

テンソル並列化の設定。

Tensor parallelism は、重み行列をデバイス間で分割（カラム方向および行方向）します。各デバイスは部分結果を計算し、レイヤー境界での AllReduce/AllGather によって完全な出力が再構築されます。`torch.distributed.tensor.parallelize_module` を `ColwiseParallel` / `RowwiseParallel` のシャーディングスタイルと組み合わせて使用します。サポートされているデバイスタイプは `"cuda"`、`"neuron"` および `"tpu"` です。

#### diffusers.hooks.apply_tensor_parallel[[diffusers.hooks.apply_tensor_parallel]]

```python
diffusers.hooks.apply_tensor_parallel(model: Module, config: TensorParallelConfig, tp_plan: dict, weights_already_sharded: bool = False)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/hooks/tensor_parallel.py#L518)

**パラメータ:**

model (`torch.nn.Module`) : インプレースでシャードするモデル。

config (`TensorParallelConfig`) : テンソル並列の構成です。そのデバイスメッシュは、`config.setup(...)` で既に設定されている必要があります。

tp_plan (`dict`) : モジュール名のグロブから`"colwise"`/`"rowwise"`スタイル(またはパックされたバリアント)へのフラットなマッピング。通常はモデルの`_tp_plan`です。

weights_already_sharded (`bool`、デフォルトは`False`) : 計画されたパラメータが、ストリーミングによる`from_pretrained`読み込み後にそうなるように、すでに`DTensor`のシャードであるかどうかを示します。`True`の場合、フォワードフックのみが登録されます。これは検出ではなく明示的に渡されます。チェックポイントから欠落している計画されたパラメータは依然としてメタテンソルであり、実際には半分がシャード化されているモデルに対して「シャード化されていない」と誤って検出されてしまうためです。

フラットな`_tp_plan`からモデルにテンソル並列を適用します。

