# وحدة المعالجة المركزية

تعمل وحدات المعالجة المركزية (CPUs) على تشغيل نماذج Transformers باستخدام سلسلة الأجهزة `cpu`، دون الحاجة إلى معالج تسريع. وتُعدّ هذه الوحدات مناسبة للاستدلال والتدريب عندما لا تكون وحدات معالجة الرسوميات (GPUs) متاحة، أو عندما ترغب في إعداد ميسور التكلفة.

## تشغيل الاستدلال

تُحمَّل النماذج على وحدة المعالجة المركزية (CPU) افتراضيًا عند عدم تمرير `device_map`، كما يستخدم [pipeline()](/docs/transformers/main/ar/main_classes/pipelines#transformers.pipeline) وحدة المعالجة المركزية (CPU) عندما لا يتوفر مُسرِّع. قم بتمرير `device_map="cpu"` أو `device="cpu"` لاستخدام وحدة المعالجة المركزية (CPU) على جهاز يحتوي أيضًا على مُسرِّع.

```py
from transformers import pipeline

generator = pipeline("text-generation", model="Qwen/Qwen3-0.6B", device="cpu")
print(generator("CPUs are", max_new_tokens=50, do_sample=False)[0]["generated_text"])
```

## التدريب باستخدام Trainer

يمكن لوحات المعالجة المركزية (CPUs) التي تدعم bf16، مثل معالجات Intel وAMD الحديثة، استخدام تدريب الدقة المختلطة bf16 مع [AMP في PyTorch](https://docs.pytorch.org/docs/stable/amp)، مما يقلل من استهلاك الذاكرة ويسرّع عملية التدريب.

تغطي الأمثلة أدناه ثلاثة إعدادات، بدءًا من وحدة معالجة مركزية واحدة وصولاً إلى عدة أجهزة عندما تكون وحدة المعالجة المركزية الواحدة بطيئة جدًا:

- معالج واحد
- عمليات متعددة على جهاز واحد (عملية لكل مقبس وحدة معالجة مركزية)
- عمليات متعددة عبر عدة أجهزة

تطلق أمثلة العقدة الواحدة والعقد المتعددة العمليات باستخدام `mpirun` من [Intel MPI](https://www.intel.com/content/www/us/en/developer/tools/oneapi/mpi-library.html)، وهو جزء من [Intel oneAPI HPC Toolkit](https://www.intel.com/content/www/us/en/developer/tools/oneapi/hpc-toolkit.html)، بينما يعمل [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) على DDP عبر الخلفية `gloo`.

اضبط `bf16=True` و`use_cpu=True` في [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments)، أو مرّر `--bf16` و`--use_cpu` إلى سكربت التدريب. يُفضَّل استخدام bf16 بدلاً من fp16 على المعالج المركزي (CPU) لأنه أكثر استقراراً من الناحية العددية.

```py
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./outputs",
    bf16=True,
    use_cpu=True,
)
```

على معالج ذي مقبسَين، شغّل عمليةً واحدة لكل مقبس. يُحسّن إبقاء عمليات الوصول إلى الذاكرة محليةً لكل مقبس من معدل الإنتاجية. يُطلق المثال أدناه عمليَّتَين على جهاز واحد، بعمليةٍ واحدة لكل مقبس، حيث `train.py` هو سكربت تدريب `Trainer` الخاص بك.

> [!TIP]
> اضبط `OMP_NUM_THREADS` على عدد الأنوية الفعلية في المقبس الواحد، مطروحًا منها نواة واحدة مخصصة لنظام التشغيل. على سبيل المثال، في مقبس يحتوي على 24 نواة، اضبط `OMP_NUM_THREADS=23`.

```bash
export MASTER_ADDR=127.0.0.1
mpirun -n 2 -genv OMP_NUM_THREADS=23 \
python3 train.py \
 --output_dir ./outputs \
 --use_cpu \
 --bf16
```

قم بتوسيع التدريب إلى أربعة عمليات عبر جهازين (`node0` و`node1`) باستخدام `hostfile` يحدد عنوان IP لكل عقدة. يحدد العلم `-n 4` العدد الإجمالي للعمليات. يحدد `-ppn 2` عمليتين لكل عقدة (عملية واحدة لكل مقبس).

شغّل هذا السكربت من `node0`، والذي يعمل كعملية رئيسية.

> [!TIP]
> اضبط `OMP_NUM_THREADS` على عدد الأنوية الفعلية في المقبس الواحد، مطروحًا منها نواة واحدة مخصصة لنظام التشغيل. على سبيل المثال، في مقبس يحتوي على 24 نواة، اضبط `OMP_NUM_THREADS=23`.

أنشئ ملف مضيف يحتوي على عنوان IP الخاص بكل عقدة.

```bash
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ip
```

ثم شغّل سكربت التدريب.

```bash
export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip
mpirun -f hostfile -n 4 -ppn 2 \
 -genv OMP_NUM_THREADS=23 \
python3 train.py \
 --output_dir ./outputs \
 --use_cpu \
 --bf16
```

## ضبط أداء المعالج

قم بتحميل مُخصِّص ذاكرة أسرع وبيئة تشغيل OpenMP من Intel مسبقًا لتقليل النفقات الإضافية في التدريب على المعالج المركزي. ثبّت حزمة `google-perftools` (لـ `libtcmalloc`) وحزمة Python `intel-openmp` (لـ `libiomp5`)، ثم أضف كلا المكتبتين إلى متغير البيئة `LD_PRELOAD` قبل بدء التدريب.

اضبط `OMP_NUM_THREADS` على عدد النوى التي يمكن لكل عملية استخدامها. في حاوية أو مهمة عنقودية مع حدود معالج، يكون ذلك هو عدد وحدات المعالج المخصصة، لذا اترك بعض النوى غير مخصصة للعمليات النظامية.

## الخطوات التالية

- اقرأ منشور المدونة [تسريع PyTorch Transformers باستخدام Intel Sapphire Rapids](https://huggingface.co/blog/intel-sapphire-rapids) للحصول على نظرة أعمق على أداء BF16 على أجهزة Intel الحديثة.
- اقرأ [DDP](./ddp) لمزيد من المعلومات حول استراتيجية التوزيع التي تستخدمها أمثلة العمليات المتعددة.
- اقرأ ملاحظات [إسناد الخيوط إلى المعالج](https://docs.pytorch.org/docs/stable/notes/cpu_threading_torchscript_inference.html) في PyTorch لمعرفة كيفية تأثير `OMP_NUM_THREADS` على الأداء.
- اقرأ دليل [PyTorchJob](https://www.kubeflow.org/docs/components/training/user-guides/pytorch/) الخاص بـ Kubeflow لتشغيل التدريب الموزّع على المعالجات المركزية (CPU) في Kubernetes.

