# AWS Trainium

تعمل وحدات [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) على PyTorch بشكل أصلي من خلال حزمة `torch-neuronx`، التي تسجّل جهاز `neuron`. يقوم Neuron بتجميع نموذجك إلى رسم بياني واحد أو أكثر لكل شكل إدخال يراه، لذا فإن إبقاء أشكال الإدخال ثابتة يتجنب إعادة التجميع.

## التثبيت

قم بتثبيت `torch-neuronx` باتباع [دليل إعداد AWS Neuron](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/setup/pytorch/index.html). ثم تأكد من أن PyTorch يرى أجهزة Neuron.

```py
import torch

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

يطبع `True` وعدد أجهزة Neuron، على سبيل المثال `True 4`.

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

لا يكتشف `device_map="auto"` جهاز Neuron. يعتمد التوزيع التلقائي على [Accelerate](https://huggingface.co/docs/accelerate/index) لتعداد الأجهزة المتاحة، وبما أن Accelerate لا يدرج أجهزة Neuron، يتم تحميل النموذج على وحدة المعالجة المركزية (CPU) دون أي تنبيه. مرّر `device_map="neuron"` إلى [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) بشكل صريح، أو مرّر `device="neuron"` إلى [Pipeline](/docs/transformers/main/ar/main_classes/pipelines#transformers.Pipeline).

مرّر مدخلات التوليد على وحدة المعالجة المركزية (CPU) بدلاً من استدعاء `.to(model.device)`. تنقل [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) فقط المصفوفات التي تستهلكها `forward` إلى جهاز Neuron. تبقى المصفوفات التي تنمو في كل خطوة (تسلسل الإخراج، `attention_mask`) على وحدة المعالجة المركزية، مما يحافظ على استقرار الرسم المُجمّع. تُرجع `generate` الإخراج على نفس الجهاز الذي توجد عليه المدخلات. راجع [إبقاء مصفوفات التوليد على وحدة المعالجة المركزية](./kv_cache#keep-generation-tensors-on-cpu) لمزيد من التفاصيل.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="neuron"
)

# leave the inputs on CPU
inputs = tokenizer("The French Bread Law states", return_tensors="pt")
output = model.generate(
    **inputs, do_sample=False, max_new_tokens=50, cache_implementation="static"
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

```txt
The French Bread Law states that the French government must provide a certain amount of bread for the citizens of the country. The law is passed by the French parliament. The French parliament is a body of the French government. The French government is a body of the French state. The
```

مع ذاكرة مؤقتة ثابتة، يجمع [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) مسار التقدّم تلقائيًا باستخدام `torch.compile` على Neuron. مرّر `disable_compile=True` إلى [generate()](/docs/transformers/main/ar/main_classes/text_generation#transformers.GenerationMixin.generate) للاستثناء من ذلك.

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

يتعرّف [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) على Neuron ويضبط الجهاز على `neuron` تلقائيًا. تدعم جميع أجيال Trainium نمط bf16.

```py
from transformers import TrainingArguments

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

### تجميع النموذج

اضبط `torch_compile=True` لتغليف النموذج بواسطة `torch.compile`. يقوم هذا بتجميع مسار الأمامي للنموذج، بينما يتم تنفيذ خطوة المُحسِّن بشكل مباشر. يضبط [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) قيمة `torch_compile_backend` على `"neuron"` تلقائيًا عند اكتشافه لـ Neuron.

```py
from transformers import TrainingArguments

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

كل شكل إدخال جديد يُطلق عملية تجميع جديدة. قم بتعبئة المدخلات إلى طول ثابت (`padding="max_length"` في مُجزّئ الرموز) و اضبط `dataloader_drop_last=True` حتى لا يختلف حجم الدفعة الأخيرة.

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

يدعم Neuron واجهة Transformers الموزعة. أنشئ [DistributedConfig](/docs/transformers/main/ar/expert_parallelism#transformers.DistributedConfig) بأحجام التوازي التي تريدها وقم بتمريره إلى [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained). تقوم Transformers بتقسيم النموذج عند التحميل، ويستخدم [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) ذلك كما هو.

```py
import torch
from transformers import AutoModelForCausalLM, DistributedConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-1.7B",
    dtype=torch.bfloat16,
    distributed_config=DistributedConfig(tp_size=2, fsdp_size=2),
)
```

شغّل السكربت باستخدام `torchrun`.

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

راجع [توازي الموترات](./tensor_parallelism)، و[توازي الخبراء](./expert_parallelism)، و[FSDP](./fsdp) لمعرفة الخيارات المتاحة.

## القيود

- `device_map="auto"` يحمّل النموذج على وحدة المعالجة المركزية (CPU) بدلاً من Neuron. مرّر `device_map="neuron"` بشكل صريح.
- تُحفّز الأشكال الديناميكية إعادة التجميع. يتباطأ كلٌّ من التوليد والتدريب عندما تتغيّر أشكال المدخلات من خطوة إلى أخرى. استخدم ذاكرة مؤقتة ثابتة للتوليد، والتعبئة بطول ثابت للتدريب.

