Diffusers documentation

Veri paralelliği

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Veri paralelliği

Data parallelism, aynı modeli her GPU’da kopyalar ve her GPU’ya farklı istemler (prompts) verir. Model zaten tek bir GPU’ya sığıyorsa bunu artırır ve tek bir istemin gecikmesini değiştirmez. Henüz denemediyseniz, önce tek bir GPU üzerinde Batch inference deneyin. Diğer stratejilerle karşılaştırmak için Distributed inference bölümüne bakın.

Veri paralelliğini Accelerate ile veya doğrudan PyTorch Distributed ile yapılandırabilirsiniz.

Accelerate

Accelerate, süreçleri kurar ve her birine bir GPU atar.

Aşağıdaki komutla Accelerate'i yükleyin.

uv pip install accelerate

Dağıtık ortamı kurmak için run_distributed.py adlı bir dosyada PartialState oluşturun. Her bir işleme bir GPU atamak için DiffusionPipeline nesnesini PartialState.device üzerine taşıyın.

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)

Aynı dosyada, istemleri süreçler arasında bölmek için split_between_processes öğesini bir bağlam yöneticisi olarak kullanın.

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")

Betik dosyasını accelerate launch ile çalıştırın ve --num_processes değerini GPU sayısına ayarlayın.

accelerate launch --num_processes=2 run_distributed.py

Tam bir örnek için bu minimal çoklu GPU çıkarım betiğine bakın. Daha fazla bilgi için Accelerate ile Dağıtık çıkarım kılavuzuna göz atın.

PyTorch Dağıtık

Ayrıca, Accelerate olmadan doğrudan torch.distributed ile veri paralelliği de yapılandırabilirsiniz.

Dağıtık ortamı oluşturmak için init_process_group çağrın. torchrun, her sürecin sırasını ve toplam süreç sayısını (dünya boyutu) ortam değişkenleri aracılığıyla ayarlar, bu nedenle bunları kendiniz iletmezsiniz.

Her sürecin kendi GPU’su ve kendi istemi (prompt) olmalıdır. torchrun, LOCAL_RANK ortam değişkenini, sürecin kendi düğümündeki GPU dizinine ayarlar; bu nedenle GPU seçiminde bunu kullanın. Tüm düğümler arasındaki süreçleri sayan get_rank işlevini kullanarak istemi seçin.

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()

Betik dosyasını run_distributed.py olarak kaydedin ve torchrun ile çalıştırın. --nproc-per-node değerini GPU sayısına ayarlayın. prompts listesinde her işlem için bir istem (prompt) bulunur; bu nedenle kullandığınız her GPU için bir istem ekleyin.

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