Transformers documentation
وحدة المعالجة المركزية
وحدة المعالجة المركزية
تعمل وحدات المعالجة المركزية (CPUs) على تشغيل نماذج Transformers باستخدام سلسلة الأجهزة cpu، دون الحاجة إلى معجّل. وتكون هذه الوحدات مناسبة للاستدلال والتدريب عندما لا تتوفر وحدات معالجة رسومية (GPUs)، أو عندما ترغب في إعداد موفر للتكلفة.
تشغيل الاستدلال
تُحمَّل النماذج على وحدة المعالجة المركزية (CPU) افتراضيًا عندما لا تمرر device_map، ويستخدم pipeline() وحدة المعالجة المركزية عندما لا يتوفر مُسرِّع. مرر device_map="cpu" أو device="cpu" لاستخدام وحدة المعالجة المركزية على جهاز يحتوي أيضًا على مُسرِّع.
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، مما يقلل من استهلاك الذاكرة ويسرّع عملية التدريب.
تغطي الأمثلة أدناه ثلاثة إعدادات، بدءًا من وحدة معالجة مركزية واحدة وصولاً إلى عدة أجهزة عندما تكون وحدة المعالجة المركزية الواحدة بطيئة جدًا:
- معالج واحد
- عمليات متعددة على جهاز واحد (عملية لكل مقبس وحدة معالجة مركزية)
- عمليات متعددة عبر عدة أجهزة
تطلق أمثلة العقدة الواحدة والعقد المتعددة العمليات باستخدام mpirun من Intel MPI، وهو جزء من Intel oneAPI HPC Toolkit، بينما يعمل Trainer على DDP عبر الخلفية gloo.
اضبط bf16=True وuse_cpu=True في TrainingArguments، أو مرّر --bf16 و--use_cpu إلى سكربت التدريب. يُفضَّل استخدام bf16 بدلاً من fp16 على المعالج المركزي لأنه أكثر استقراراً رقمياً.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
use_cpu=True,
)على معالج ذي مقبسَين، شغّل عمليةً واحدة لكل مقبس. يُحسّن إبقاء عمليات الوصول إلى الذاكرة محليةً لكل مقبس من معدل الإنتاجية. يُطلق المثال أدناه عمليَّتَين على جهاز واحد، بعمليةٍ واحدة لكل مقبس، حيث train.py هو سكربت تدريب Trainer الخاص بك.
اضبط
OMP_NUM_THREADSعلى عدد الأنوية الفعلية في المقبس الواحد، مطروحًا منها نواة واحدة مخصصة لنظام التشغيل. على سبيل المثال، في مقبس يحتوي على 24 نواة، اضبطOMP_NUM_THREADS=23.
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، والذي يعمل كعملية رئيسية.
اضبط
OMP_NUM_THREADSعلى عدد الأنوية الفعلية في المقبس الواحد، مطروحًا منها نواة واحدة مخصصة لنظام التشغيل. على سبيل المثال، في مقبس يحتوي على 24 نواة، اضبطOMP_NUM_THREADS=23.
أنشئ ملف مضيف يحتوي على عنوان IP الخاص بكل عقدة.
cat hostfile
xxx.xxx.xxx.xxx #node0 ip
xxx.xxx.xxx.xxx #node1 ipثم شغّل سكربت التدريب.
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) وحزمة بايثون intel-openmp (لـ libiomp5)، ثم أضف كلا المكتبتين إلى متغير البيئة LD_PRELOAD قبل بدء التدريب.
اضبط OMP_NUM_THREADS على عدد الأنوية التي يمكن لكل عملية استخدامها. في حاوية أو مهمة عنقودية مع حدود معالج، يكون ذلك هو عدد وحدات المعالج المخصصة، لذا اترك بعض الأنوية غير مخصصة للعمليات النظامية.
الخطوات التالية
- اقرأ منشور المدونة تسريع PyTorch Transformers باستخدام Intel Sapphire Rapids للحصول على نظرة أعمق على أداء BF16 على أجهزة Intel الحديثة.
- اقرأ DDP لمزيد من المعلومات حول استراتيجية التوزيع التي تستخدمها أمثلة العمليات المتعددة.
- اقرأ ملاحظات إسناد الخيوط إلى المعالج في PyTorch لمعرفة كيفية تأثير
OMP_NUM_THREADSعلى الأداء. - اقرأ دليل PyTorchJob الخاص بـ Kubeflow لتشغيل التدريب الموزّع على المعالجات المركزية (CPU) في Kubernetes.