# عملية التنفيذ

عند العمل مع أنظمة التدريب الموزّع، من المهم إدارة كيفية تنفيذ العمليات ومتى عبر وحدات معالجة الرسوميات (GPUs). بعض العمليات تُنجز أسرع من غيرها، وبعض العمليات لا ينبغي أن تبدأ إذا لم تكتمل عمليات أخرى بعد. يوفر Accelerate أدوات لتنسيق توقيت تنفيذ العمليات لضمان بقاء كل شيء متزامنًا عبر جميع الأجهزة.

ستعلّمك هذه الشرحية كيفية تنفيذ عملية على جهاز واحد فقط، وكيفية تأجيل التنفيذ حتى تصل جميع العمليات إلى نقطة معينة.

## التنفيذ على عملية واحدة

بعض الأكواد لا يحتاج إلى التشغيل مرة واحدة فقط على جهاز معيّن، مثل طباعة عبارة سجل أو عرض شريط تقدّم واحد فقط على العملية الرئيسية المحلية.

يجب عليك استخدام `accelerator.is_local_main_process` للإشارة إلى الأكواد التي ينبغي تنفيذها مرة واحدة فقط.

```py
from tqdm.auto import tqdm

progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process)
```

يمكنك أيضًا تضمين عبارة داخل `accelerator.is_local_main_process`.

> [!TIP]
> بالنسبة إلى عبارات `print` المستقلة غير المغلفة بـ `accelerator.is_local_main_process`، استبدل `print` بطريقة [print()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.print) الخاصة بـ Accelerate لطباعة النص مرة واحدة لكل عملية.

```py
if accelerator.is_local_main_process:
    print("Accelerate is the best")
```

بالنسبة لدالة يجب تنفيذها مرة واحدة فقط، استخدم [on_local_main_process()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.on_local_main_process).

```py
@accelerator.on_local_main_process
def do_my_thing():
    "Something done once per server"
    do_thing_once_per_server()
```

يمكنك أيضًا توجيه Accelerate لتنفيذ الكود مرة واحدة عبر *جميع العمليات* بغض النظر عن عدد الأجهزة. وهذا مفيد إذا كنت تقوم برفع نموذج نهائي إلى Hub.

يجب عليك استخدام `accelerator.is_main_process` للإشارة إلى الأكواد التي ينبغي تنفيذها مرة واحدة فقط عبر جميع العمليات.

```py
if accelerator.is_main_process:
    repo.push_to_hub()
```

بالنسبة لدالة يجب تنفيذها مرة واحدة فقط عبر جميع العمليات، استخدم [on_main_process()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.on_main_process).

```py
@accelerator.on_main_process
def do_my_thing():
    "Something done once per server"
    do_thing_once()
```

## التنفيذ على عملية محددة

يمكن لـ Accelerate أيضًا مساعدتك في تنفيذ الدوال التي يجب أن تُنفَّذ فقط على عملية محددة أو على فهرس عملية محلية.

استخدم طريقة [on_process()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.on_process) وحدد فهرس العملية لتنفيذ دالة عليها.

```py
@accelerator.on_process(process_index=0)
def do_my_thing():
    "Something done on process index 0"
    do_thing_on_index_zero()
```

استخدم طريقة [on_local_process()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.on_local_process) وحدد فهرس العملية المحلية لتنفيذ دالة عليها.

```py
@accelerator.on_local_process(local_process_idx=0)
def do_my_thing():
    "Something done on process index 0 on each server"
    do_thing_on_index_zero_on_each_server()
```

## تأجيل التنفيذ

عند تشغيل سكربت على عدة وحدات معالجة رسومية (GPU) في وقت واحد، قد يتم تنفيذ بعض الأكواد بشكل أسرع من غيرها. قد تحتاج إلى الانتظار حتى تصل جميع العمليات إلى نقطة معينة قبل تنفيذ مجموعة التعليمات التالية. على سبيل المثال، لا ينبغي لك حفظ النموذج قبل التأكد من أن كل عملية قد انتهت من التدريب.

لتنفيذ ذلك، أضف [wait_for_everyone()](/docs/accelerate/main/ar/package_reference/accelerator#accelerate.Accelerator.wait_for_everyone) في كودك. هذا يمنع جميع العمليات التي انتهت أولاً من المتابعة حتى تصل جميع العمليات المتبقية إلى نفس النقطة (لا يؤثر هذا الأمر إذا كنت تعمل على وحدة معالجة رسومات واحدة أو وحدة معالجة مركزية واحدة).

```py
accelerator.wait_for_everyone()
```

