Buckets:

hf-doc-build/doc / diffusers /main /ar /optimization /data_parallelism.md
mishig's picture
|
download
raw
5.17 kB
# التوازي في البيانات
يعمل [التوازي في البيانات](https://huggingface.co/spaces/nanotron/ultrascale-playbook?section=data_parallelism) على تكرار النموذج نفسه على كل وحدة معالجة رسومية (GPU) ومنح كل وحدة معالجة رسومية أوامر مختلفة. فهو يزيد من الإنتاجية عندما يتسع النموذج بالفعل على وحدة معالجة رسومية واحدة، ويبقي زمن استجابة الأمر الواحد دون تغيير. إذا لم تفعل ذلك بعد، جرّب [الاستدلال الدُفعي](../using-diffusers/batched_inference) على وحدة معالجة رسومية واحدة أولاً. راجع [الاستدلال الموزّع](../training/distributed_inference) لمقارنته بالاستراتيجيات الأخرى.
يمكنك إعداد توازي البيانات باستخدام [Accelerate](https://huggingface.co/docs/accelerate/index) أو باستخدام [PyTorch Distributed](https://pytorch.org/tutorials/beginner/dist_overview.html) مباشرة.
## Accelerate
يضبط Accelerate العمليات ويُسند وحدة معالجة رسومية إلى كل عملية.
قم بتثبيت Accelerate باستخدام الأمر التالي.
```bash
uv pip install accelerate
```
أنشئ [PartialState](https://huggingface.co/docs/accelerate/main/en/package_reference/state#accelerate.PartialState) في ملف يُسمى `run_distributed.py` لإعداد البيئة الموزعة. انقل [DiffusionPipeline](/docs/diffusers/main/ar/api/pipelines/overview#diffusers.DiffusionPipeline) إلى `PartialState.device` لتخصيص وحدة معالجة رسومية لكل عملية.
```py
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](https://huggingface.co/docs/accelerate/main/en/package_reference/state#accelerate.PartialState.split_between_processes) كمدير سياق لتقسيم الأوامر بين العمليات.
```py
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` على عدد وحدات معالجة الرسومات.
```bash
accelerate launch --num_processes=2 run_distributed.py
```
> [!TIP]
> لمثال كامل، راجع [سكربت الاستدلال متعدد وحدات GPU البسيط](https://gist.github.com/sayakpaul/cfaebd221820d7b43fae638b4dfa01ba). لمعرفة المزيد، راجع دليل [الاستدلال الموزّع باستخدام Accelerate](https://huggingface.co/docs/accelerate/en/usage_guides/distributed_inference#distributed-inference-with-accelerate).
## توزيع PyTorch
يمكنك أيضًا إعداد توازي البيانات مباشرةً باستخدام `torch.distributed`، دون الحاجة إلى Accelerate.
استدعِ [init_process_group](https://pytorch.org/docs/stable/distributed.html#torch.distributed.init_process_group) لإنشاء البيئة الموزعة. يحدد `torchrun` ترتيب كل عملية وعدد العمليات الإجمالي (حجم العالم) عبر متغيرات البيئة، لذا لا تحتاج إلى تمريرها بنفسك.
تحتاج كل عملية إلى وحدة معالجة رسومية خاصة بها وإلى موجه خاص بها. يحدد `torchrun` متغير البيئة `LOCAL_RANK` بمؤشر وحدة معالجة الرسومية الخاصة بالعملية على عقدها، لذا استخدمه لاختيار وحدة معالجة الرسومية. استخدم `get_rank`، الذي يعد العمليات عبر جميع العقد، لاختيار الموجه.
```py
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` على موجه واحد لكل عملية، لذا أضف موجهًا لكل وحدة معالجة رسومات تستخدمها.
```bash
torchrun --nproc-per-node 2 run_distributed.py
```

Xet Storage Details

Size:
5.17 kB
·
Xet hash:
365294b8e0311524708b42bcb20f072b7c2519f3f5faa9781303941d5cd9f60e

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.