Transformers documentation
وحدة معالجة رسومات من NVIDIA
وحدة معالجة رسومات من NVIDIA
تعمل وحدات معالجة الرسوميات من NVIDIA على PyTorch عبر CUDA، مع سلسلة الأجهزة cuda. تدعم معظم نوى الانتباه (attention kernels) وتحسينات الخدمة في Transformers تقنية CUDA، وبعضها، مثل FlashAttention-3 وFlashAttention-4، يعمل حصريًا على CUDA.
التثبيت
قم بتثبيت برامج تشغيل CUDA الخاصة بوحدة معالجة الرسوميات (GPU) لديك، ثم ثبّت PyTorch وTransformers. راجع دليل التثبيت لأجهزة NVIDIA Spark (ARM64)، والتي تتطلب PyTorch من فهرس حزم NVIDIA.
pip install "transformers[torch]"تحقق من أن PyTorch يمكنه رؤية وحدات معالجة الرسوميات (GPUs).
import torch
print(torch.cuda.is_available(), torch.cuda.device_count())يطبع True وعدد وحدات معالجة الرسومات، على سبيل المثال True 4.
اختيار وحدات معالجة الرسوميات وترتيبها
استخدم متغير البيئة CUDA_VISIBLE_DEVICES لاختيار وحدات معالجة الرسوميات (GPU) وتحديد ترتيبها. اضبطه على سطر الأوامر نفسه الذي تُنفّذ فيه العملية، لأن متغيرًا مُصدَّرًا قد تنساه قد يُوجّه تشغيلًا لاحقًا إلى وحدات معالجة الرسوميات الخاطئة دون أي إنذار.
على سبيل المثال، لاختيار وحدات معالجة الرسوميات 0 و 2 من أصل أربع وحدات:
CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...يرى PyTorch وحدات معالجة الرسوميات 0 و2 فقط، وهي مُرمّزة على cuda:0 وcuda:1. لعكس الترتيب (استخدام وحدة معالجة الرسوميات 2 كـcuda:0 ووحدة معالجة الرسوميات 0 كـcuda:1):
CUDA_VISIBLE_DEVICES=2,0 torchrun trainer-program.py ...للتشغيل دون أي وحدات معالجة رسومية:
CUDA_VISIBLE_DEVICES= python trainer-program.py ...ترتّب CUDA وحدات معالجة الرسوميات (GPU) من الأسرع إلى الأبطأ افتراضياً، وقد لا يتطابق ذلك مع nvidia-smi. اضبط CUDA_DEVICE_ORDER=PCI_BUS_ID حتى تتطابق الفهارس في CUDA_VISIBLE_DEVICES مع nvidia-smi.
CUDA_DEVICE_ORDER=PCI_BUS_ID CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...اختر واجهة خلفية للانتباه
تُعيّن واجهة الانتباه (attention backend) عبر attn_implementation عند تحميل النموذج، وتُطبَّق على كلٍّ من الاستدلال والتدريب. تستخدم النماذج SDPA افتراضياً. كما تدعم وحدات معالجة الرسوميات من NVIDIA ثلاث إصدارات من FlashAttention. عند عدم تثبيت حزمة FlashAttention، يقوم Transformers بتحميل نواة (kernel) مُعدّة مسبقاً من Hub بدلاً من ذلك، وهذا يتطلب إضافة kernels (pip install "transformers[kernels]").
attn_implementation | وحدات معالجة الرسوميات | نواة Hub عند عدم تثبيت الحزمة |
|---|---|---|
"flash_attention_2" | Ampere أو أحدث | kernels-community/flash-attn2 |
"flash_attention_3" | Ampere أو أحدث | kernels-community/vllm-flash-attn3 |
"flash_attention_4" | Hopper أو أحدث | kernels-community/flash-attn4 |
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B",
dtype="bfloat16",
device_map="cuda",
attn_implementation="flash_attention_2",
)تشغيل الاستدلال
مرّر device_map="auto" إلى from_pretrained() لتقسيم نموذج لا يتسع على وحدة معالجة رسومية واحدة عبر وحدات المعالجة الرسومية المتاحة، أو مرّر device_map="cuda" لتحميله على وحدة معالجة رسومية واحدة. يختار pipeline() وحدة معالجة رسومية تلقائيًا عندما لا تمرّر device.
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="cuda")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
inputs = tokenizer("NVIDIA GPUs are", return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=50, do_sample=False)
print(tokenizer.decode(output[0], skip_special_tokens=True))يدعم Continuous batching رسوميات CUDA والتدريج غير المتزامن على وحدات معالجة NVIDIA GPU، ويقرر تلقائيًا ما إذا كان سيستخدمها أم لا.
استخدام نواة Hub
اضبط use_kernels=True في from_pretrained() لاستبدال الطبقات المدعومة بنوى مُحسَّنة من Hub. تتمتع معالجات NVIDIA الرسومية بأوسع تغطية، وتشمل دوال التنشيط، وRMSNorm، والتضمينات الدورانية، وطبقات MegaBlocks لخلطات الخبراء، وعمليات فضاء الحالة الخاصة بـ Mamba. ثبّت الحزمة الإضافية kernels لاستخدامها.
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="cuda", use_kernels=True
)تُطبَّق نوى Hub على التدريب أيضًا. عند استدعاء model.train() أو model.eval()، يتم تبديل النوى إلى تلك المناسبة للوضع المحدد. ولاختيار نواة بنفسك، مرّر KernelConfig واستخدم "cuda" كمفتاح للجهاز للخرائط الخاصة بـ NVIDIA. راجع تحميل النوى للاطلاع على الخريطة الكاملة.
كمّ النماذج
تتيح عملية التكميم (Quantization) استيعاب نموذج أكبر في ذاكرة وحدة معالجة الرسوميات (GPU). تدعم معظم طرق التكميم في مكتبة Transformers تقنية CUDA. راجع عمود CUDA في نظرة عامة على التكميم للمقارنة بينها.
لضبط نموذج لا يتسع في ذاكرة وحدة معالجة الرسوميات، حمّله بدقة 4 بت باستخدام bitsandbytes ودرّب محولات LoRA باستخدام PEFT.
التدريب باستخدام Trainer
يتعرّف TrainingArguments على وحدات معالجة الرسوميات من NVIDIA ويضبط الجهاز على cuda، لذا يقوم Trainer بالتدريب عليها دون الحاجة إلى أي إعدادات للجهاز. استخدم دقة مختلطة bf16 على وحدات معالجة الرسوميات من Ampere أو الأحدث، وfp16 على الوحدات الأقدم.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
)
print(training_args.device)يطبع cuda:0 عندما سيقوم Trainer بالتدريب على وحدة معالجة رسومية واحدة.
التدريب الموزّع
يستخدم التدريب متعدد وحدات المعالجة الرسومية (Multi-GPU) واجهة NCCL الجماعية. شغّل عملية واحدة لكل وحدة معالجة رسومية باستخدام torchrun أو accelerate launch.
torchrun --nproc_per_node=4 train.py
راجع DDP وFSDP2 وDeepSpeed ZeRO وTensor parallelism لاختيار استراتيجية التوازي.
الخطوات التالية
- اقرأ ملاحظات دلالات CUDA في PyTorch لمعرفة كيفية إدارة PyTorch للأجهزة والتدفقات والذاكرة.
- اقرأ استخدام ذاكرة وحدة معالجة الرسوميات لفهم أين تذهب ذاكرة وحدة معالجة الرسوميات أثناء التدريب.
- اقرأ واجهات الانتباه الخلفية لمعرفة كيفية اختيار
attn_implementationلدالة الانتباه.