Diffusers documentation

並列性

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

並列性

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

ParallelConfig

class diffusers.ParallelConfig

< >

( context_parallel_config: diffusers.models._modeling_parallel.ContextParallelConfig | None = Nonetensor_parallel_config: diffusers.models._modeling_parallel.TensorParallelConfig | None = None_rank: int = None_world_size: int = None_device: device = None_mesh: DeviceMesh = None )

パラメータ

  • context_parallel_config (ContextParallelConfig, 任意) — コンテキスト並列化の設定です。
  • tensor_parallel_config (TensorParallelConfig, 任意) — テンソル並列化の設定です。

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

ContextParallelConfig

class diffusers.ContextParallelConfig

< >

( ring_degree: int | None = Noneulysses_degree: int | None = Noneconvert_to_fp32: bool = Truerotate_method: typing.Literal['allgather', 'alltoall'] = 'allgather'mesh: typing.Optional[torch.distributed.device_mesh.DeviceMesh] = Noneulysses_anything: bool = Falsering_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 )

パラメータ

  • 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

< >

( module: Moduleparallel_config: ContextParallelConfigplan: 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, ...]]] )

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

TensorParallelConfig

class diffusers.TensorParallelConfig

< >

( tp_degree: int = 1mesh: 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 )

パラメータ

  • 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

< >

( model: Moduleconfig: TensorParallelConfigtp_plan: dictweights_already_sharded: bool = False )

パラメータ

  • 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からモデルにテンソル並列を適用します。

Update on GitHub