# وحدة معالجة رسومات من NVIDIA

تعمل وحدات معالجة الرسوميات من NVIDIA على PyTorch عبر CUDA، مع سلسلة الأجهزة `cuda`. تدعم معظم نوى الانتباه (attention kernels) وتحسينات الخدمة في Transformers تقنية CUDA، وبعضها، مثل FlashAttention-3 وFlashAttention-4، يعمل حصريًا على CUDA.

## التثبيت

قم بتثبيت برامج تشغيل CUDA الخاصة بوحدة معالجة الرسوميات (GPU) لديك، ثم ثبّت PyTorch وTransformers. راجع [دليل التثبيت](./installation) لأجهزة NVIDIA Spark (ARM64)، التي تتطلب PyTorch من فهرس حزم NVIDIA.

```bash
pip install "transformers[torch]"
```

تحقق من أن PyTorch يمكنه رؤية وحدات معالجة الرسوميات (GPUs).

```py
import torch

print(torch.cuda.is_available(), torch.cuda.device_count())
```

يطبع `True` وعدد وحدات معالجة الرسومات، على سبيل المثال `True 4`.

## اختيار وحدات معالجة الرسوميات وترتيبها

استخدم متغير البيئة `CUDA_VISIBLE_DEVICES` لاختيار وحدات معالجة الرسوميات (GPU) وتحديد ترتيبها. اضبطه على سطر الأوامر نفسه الذي تُنفّذ فيه العملية، لأن متغيرًا مُصدَّرًا قد تنساه قد يُوجّه تشغيلًا لاحقًا إلى وحدات معالجة الرسوميات الخاطئة دون أي إنذار.

على سبيل المثال، لاختيار وحدات معالجة الرسوميات 0 و 2 من أصل أربع وحدات:

```cli
CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...
```

يرى PyTorch وحدات معالجة الرسوميات 0 و2 فقط، وهي مُرمّزة على `cuda:0` و`cuda:1`. لعكس الترتيب (استخدام وحدة معالجة الرسوميات 2 كـ`cuda:0` ووحدة معالجة الرسوميات 0 كـ`cuda:1`):

```cli
CUDA_VISIBLE_DEVICES=2,0 torchrun trainer-program.py ...
```

للتشغيل دون أي وحدات معالجة رسومية:

```cli
CUDA_VISIBLE_DEVICES= python trainer-program.py ...
```

ترتّب CUDA وحدات معالجة الرسوميات (GPU) من الأسرع إلى الأبطأ افتراضياً، وقد لا يتطابق ذلك مع `nvidia-smi`. اضبط `CUDA_DEVICE_ORDER=PCI_BUS_ID` حتى تتطابق الفهارس في `CUDA_VISIBLE_DEVICES` مع `nvidia-smi`.

```cli
CUDA_DEVICE_ORDER=PCI_BUS_ID CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...
```

## اختر واجهة خلفية للانتباه

تُعيّن واجهة الانتباه باستخدام `attn_implementation` عند تحميل النموذج، وتُطبَّق على كلٍّ من الاستدلال والتدريب. تستخدم النماذج [SDPA](./attention_interface) افتراضيًا. كما تدعم وحدات معالجة الرسوميات من NVIDIA ثلاث إصدارات من FlashAttention. عند عدم تثبيت حزمة FlashAttention، يقوم Transformers بتحميل نواة مُعدّة مسبقًا من 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` |

```py
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()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتقسيم نموذج لا يتسع على وحدة معالجة رسومية واحدة عبر وحدات المعالجة الرسومية المتاحة، أو مرّر `device_map="cuda"` لتحميله على وحدة معالجة رسومية واحدة. يختار [pipeline()](/docs/transformers/main/ar/main_classes/pipelines#transformers.pipeline) وحدة معالجة رسومية تلقائيًا عندما لا تمرّر `device`.

```py
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](./continuous_batching) رسوميات CUDA والتدريج غير المتزامن على وحدات معالجة NVIDIA GPU، ويقرر تلقائيًا ما إذا كان سيستخدمها أم لا.

## استخدام نواة Hub

اضبط `use_kernels=True` في [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لاستبدال الطبقات المدعومة بنوى مُحسَّنة من Hub. تتمتع معالجات NVIDIA الرسومية بأوسع تغطية، وتشمل دوال التنشيط، وRMSNorm، والتضمينات الدورانية، وطبقات MegaBlocks لخلطات الخبراء، وعمليات فضاء الحالة الخاصة بـ Mamba. ثبّت الحزمة الإضافية `kernels` لاستخدامها.

```py
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="cuda", use_kernels=True
)
```

تُطبَّق نوى Hub على التدريب أيضًا. عند استدعاء `model.train()` أو `model.eval()`، يتم تبديل النوى إلى تلك المناسبة للوضع المحدد. ولاختيار نواة بنفسك، مرّر [KernelConfig](/docs/transformers/main/ar/main_classes/kernels#transformers.KernelConfig) واستخدم `"cuda"` كمفتاح للجهاز للخرائط الخاصة بـ NVIDIA. راجع [تحميل النوى](./kernel_doc/loading_kernels) للاطلاع على الخريطة الكاملة.

## كمّ النماذج

تتيح عملية التكميم (Quantization) استيعاب نموذج أكبر في ذاكرة وحدة معالجة الرسوميات (GPU). تدعم معظم طرق التكميم في مكتبة Transformers تقنية CUDA. راجع عمود CUDA في [نظرة عامة على التكميم](./quantization/overview) للمقارنة بينها.

لضبط نموذج لا يتسع في ذاكرة وحدة معالجة الرسوميات، حمّله بدقة 4 بت باستخدام [bitsandbytes](./quantization/bitsandbytes) ودرّب محولات LoRA باستخدام [PEFT](./peft).

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

يتعرّف [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) على وحدات معالجة الرسوميات من NVIDIA ويضبط الجهاز على `cuda`، لذا يقوم [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) بالتدريب عليها دون الحاجة إلى أي إعدادات للجهاز. استخدم دقة مختلطة bf16 على وحدات معالجة الرسوميات من Ampere أو الأحدث، وfp16 على الوحدات الأقدم.

```py
from transformers import TrainingArguments

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

يطبع `cuda:0` عندما سيقوم `Trainer` بالتدريب على وحدة معالجة رسومية واحدة.

### التدريب الموزّع

يستخدم التدريب متعدد وحدات المعالجة الرسومية (Multi-GPU) واجهة [NCCL](https://developer.nvidia.com/nccl) الجماعية. شغّل عملية واحدة لكل وحدة معالجة رسومية باستخدام `torchrun` أو `accelerate launch`.

```bash
torchrun --nproc_per_node=4 train.py
```

راجع [DDP](./ddp) و[FSDP2](./fsdp) و[DeepSpeed ZeRO](./deepspeed) و[Tensor parallelism](./tensor_parallelism) لاختيار استراتيجية التوازي.

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

- اقرأ ملاحظات [دلالات CUDA](https://docs.pytorch.org/docs/stable/notes/cuda.html) في PyTorch لمعرفة كيفية إدارة PyTorch للأجهزة والتدفقات والذاكرة.
- اقرأ [استخدام ذاكرة وحدة معالجة الرسوميات](./model_memory_anatomy) لفهم أين تذهب ذاكرة وحدة معالجة الرسوميات أثناء التدريب.
- اقرأ [واجهات الانتباه الخلفية](./attention_interface) لمعرفة كيفية اختيار `attn_implementation` لدالة الانتباه.

