Diffusers documentation

データ並列性

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

データ並列性

データ並列性では、同じモデルを各GPUに複製し、各GPUに異なるプロンプトを割り当てます。モデルがすでに1つのGPUに収まる場合、スループットを向上させ、単一プロンプトのレイテンシは変わりません。まだ試していない場合は、まず1つのGPUでバッチ推論を試してください。他の戦略との比較については、分散推論を参照してください。

Accelerate または PyTorch Distributed を直接使用して、データ並列性を設定できます。

Accelerate

Accelerate はプロセスを設定し、それぞれに GPU を割り当てます。

次のコマンドでAccelerateをインストールします。

uv pip install accelerate

run_distributed.py というファイルを作成し、PartialState を作成して分散環境を設定します。DiffusionPipeline を PartialState.device に移動して、各プロセスに GPU を割り当てます。

import torch
from accelerate import PartialState
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16
)
distributed_state = PartialState()
pipeline.to(distributed_state.device)

同じファイル内で、split_between_processes をコンテキストマネージャーとして使用し、プロンプトをプロセス間で分割します。

with distributed_state.split_between_processes(["a dog", "a cat"]) as prompt:
    result = pipeline(prompt).images[0]
    result.save(f"result_{distributed_state.process_index}.png")

accelerate launchでスクリプトを実行し、--num_processesをGPUの数に設定します。

accelerate launch --num_processes=2 run_distributed.py

完全な例については、この最小限のマルチGPU推論スクリプトを参照してください。詳細については、Accelerateによる分散推論ガイドを参照してください。

PyTorch Distributed

Accelerate を使わずに、torch.distributed を直接使用してデータ並列性を設定することもできます。

分散環境を作成するには、init_process_groupを呼び出します。torchrunは環境変数を通じて各プロセスのランクとプロセスの総数(ワールドサイズ)を設定するため、これらを自分で渡す必要はありません。

各プロセスには、それぞれ専用のGPUとプロンプトが必要です。torchrunは、LOCAL_RANK環境変数をそのノード上のプロセスのGPUインデックスに設定するため、GPUの選択にはこれを使用します。プロンプトの選択には、すべてのノードにまたがってプロセスを数えるget_rankを使用します。

import os
import torch
import torch.distributed as dist
from diffusers import DiffusionPipeline

def main():
    dist.init_process_group("nccl")
    rank = dist.get_rank()
    local_rank = int(os.environ["LOCAL_RANK"])
    device = torch.device(f"cuda:{local_rank}")

    pipeline = DiffusionPipeline.from_pretrained(
        "Qwen/Qwen-Image", dtype=torch.bfloat16,
    ).to(device)

    prompts = ["a dog", "a cat"]
    prompt = prompts[rank]

    image = pipeline(prompt).images[0]
    image.save(f"{prompt.replace(' ', '_')}.png")

    dist.destroy_process_group()


if __name__ == "__main__":
    main()

スクリプトをrun_distributed.pyとして保存し、torchrunで実行します。--nproc-per-nodeにはGPUの数を指定します。promptsリストにはプロセスごとに1つのプロンプトが含まれるため、使用するGPUごとにプロンプトを追加してください。

torchrun --nproc-per-node 2 run_distributed.py
Update on GitHub