Diffusers documentation
التوازي في البيانات
التوازي في البيانات
يعمل التوازي في البيانات على تكرار النموذج نفسه على كل وحدة معالجة رسومية (GPU) ومنح كل وحدة معالجة رسومية أوامر مختلفة. فهو يزيد من الإنتاجية عندما يتسع النموذج بالفعل على وحدة معالجة رسومية واحدة، ويبقي زمن استجابة الأمر الواحد دون تغيير. إذا لم تفعل ذلك بعد، جرّب الاستدلال الدُفعي على وحدة معالجة رسومية واحدة أولاً. راجع الاستدلال الموزّع لمقارنته بالاستراتيجيات الأخرى.
يمكنك إعداد توازي البيانات باستخدام Accelerate أو باستخدام PyTorch Distributed مباشرة.
Accelerate
يضبط Accelerate العمليات ويُسند وحدة معالجة رسومية إلى كل عملية.
قم بتثبيت Accelerate باستخدام الأمر التالي.
uv pip install accelerate
أنشئ PartialState في ملف يُسمى run_distributed.py لإعداد البيئة الموزعة. انقل DiffusionPipeline إلى PartialState.device لتخصيص وحدة معالجة رسومية لكل عملية.
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 على عدد وحدات معالجة الرسومات.
accelerate launch --num_processes=2 run_distributed.py
لمثال كامل، راجع سكربت الاستدلال متعدد وحدات GPU البسيط. لمعرفة المزيد، راجع دليل الاستدلال الموزّع باستخدام Accelerate.
توزيع PyTorch
يمكنك أيضًا إعداد توازي البيانات مباشرةً باستخدام torch.distributed، دون الحاجة إلى Accelerate.
استدعِ init_process_group لإنشاء البيئة الموزعة. يحدد torchrun ترتيب كل عملية وعدد العمليات الإجمالي (حجم العالم) عبر متغيرات البيئة، لذا لا تحتاج إلى تمريرها بنفسك.
تحتاج كل عملية إلى وحدة معالجة رسومية خاصة بها وإلى موجه خاص بها. يحدد torchrun متغير البيئة LOCAL_RANK بمؤشر وحدة معالجة الرسومية للعملية على عقدها، لذا استخدمه لاختيار وحدة معالجة الرسومية. استخدم 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 على عدد وحدات معالجة الرسومات. تحتوي قائمة prompts على موجه واحد لكل عملية، لذا أضف موجهًا لكل وحدة معالجة رسومات تستخدمها.
torchrun --nproc-per-node 2 run_distributed.py