Buckets:
Veri paralelliği
Data parallelism, aynı modeli her GPU üzerinde 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 (latency) 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 prompt'u olmalıdır. torchrun, LOCAL_RANK ortam değişkenini, sürecin düğümündeki GPU dizinine ayarlar; bu nedenle GPU seçiminde bunu kullanın. Prompt seçiminde, tüm düğümler arasındaki süreçleri sayan get_rank işlevini kullanın.
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
Xet Storage Details
- Size:
- 4.29 kB
- Xet hash:
- f09f0d5b0a6829f9e100d8b2ed4a5ddeb2c0afab820772679cc8af3318887e03
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.