並列性
並列化戦略は、計算を複数のデバイスに分散させることで、diffusion transformer の推論/学習時間を短縮します。詳細については、Distributed infereceガイドを参照してください。
ParallelConfig
class diffusers.ParallelConfig
< source >( 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 )
異なる並列化を適用するための設定。
ContextParallelConfig
class diffusers.ContextParallelConfig
< source >( 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
< source >( module: Moduleparallel_config: ContextParallelConfigplan: dict )
モデルにコンテキスト並列を適用します。
TensorParallelConfig
class diffusers.TensorParallelConfig
< source >( 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 )
テンソル並列化の設定。
Tensor parallelism は、重み行列をデバイス間で分割(カラム方向および行方向)します。各デバイスは部分結果を計算し、レイヤー境界での AllReduce/AllGather によって完全な出力を再構築します。torch.distributed.tensor.parallelize_module を ColwiseParallel / RowwiseParallel のシャーディングスタイルと組み合わせて使用します。サポートされているデバイスタイプは "cuda"、"neuron" および "tpu" です。
diffusers.hooks.apply_tensor_parallel
< source >( 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からモデルにテンソル並列を適用します。