# Apple Silicon

تشغّل شرائح Apple Silicon (سلسلة M) إطار PyTorch عبر واجهة [Metal Performance Shaders (MPS)](https://docs.pytorch.org/docs/stable/notes/mps.html)، مع سلسلة الأجهزة `mps`. ويتشارك المعالج المركزي (CPU) ومعالج الرسوميات (GPU) وحدة واحدة من الذاكرة الموحدة.

يعمل MPS مع تثبيت `torch` القياسي. تتطلب إصدارات PyTorch الحالية لـ Apple Silicon نظام macOS 14 أو أحدث. تأكد من أن PyTorch تم بناؤه مع دعم MPS وأنه يمكنه رؤية وحدة معالجة الرسوميات (GPU).

```py
import torch

print(torch.backends.mps.is_available())
```

يطبع `True` عندما يكون MPS جاهزًا للاستخدام.

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

اضبط واجهة الانتباه باستخدام `attn_implementation` عند تحميل النموذج، حيث ينطبق ذلك على كل من الاستدلال والتدريب. تستخدم النماذج [SDPA](./attention_interface) افتراضياً. مع PyTorch 2.13 أو أحدث، يتعامل SDPA على MPS مع انتباه الاستعلام المجمّع مباشرة، دون الحاجة إلى تكرار رؤوس المفتاح والقيمة أولاً.

استخدم SDPA للتدريب.

- يدعم [kernels-community/metal-flash-sdpa](https://huggingface.co/kernels-community/metal-flash-sdpa) المدخلات ذات الطول المتغير فقط، مثل التسلسلات المكدسة أو دفعة تحتوي قناع الانتباه على حشو. ترفع الدفعة التي لا تحتوي على حشو، مثل موجه واحد، خطأً. لا يحسب التدرجات الإسقاطات للاستعلام والمفتاح والقيمة. يتحول [gpt-oss](./model_doc/gpt_oss) إليه تلقائياً عند طلب الانتباه البرق على MPS.
- [ggml-org/ggml-attn](https://huggingface.co/kernels/ggml-org/ggml-attn) هو الافتراضي لـ `transformers serve` ولنماذج [GGUF](./quantization/gguf#attention) عند تثبيت `kernels`.

قم بتثبيت الإضافة `kernels` لاستخدام أي من النواتين. يقوم هذا التثبيت بتثبيت نسخة تدعمها مكتبة Transformers.

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

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

مرّر `device_map="mps"` إلى [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained). يختار [pipeline()](/docs/transformers/main/ar/main_classes/pipelines#transformers.pipeline) MPS تلقائيًا عندما لا تمرّر `device`.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

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

inputs = tokenizer("Apple Silicon is", return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=50, do_sample=False)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

عند استخدام `device_map` يستهدف MPS، يقوم Transformers بتحميل أوزان safetensors مباشرةً على جهاز MPS.

### تقديم نموذج

يبدأ [transformers serve](./serve-cli/serving) خادمًا متوافقًا مع OpenAI. الخيار `--device` فيه افتراضيًا `auto`، لذا فإنه يُحمّل النماذج على MPS دون الحاجة إلى أعلام إضافية. ثبّت اعتماديات الخدمة ثم ابدأ الخادم.

```bash
pip install "transformers[serving]"
transformers serve
```

يُحمّل الخادم النموذج في المرة الأولى التي يُذكر فيها اسمه ضمن طلب. أرسل طلب دردشة إلى `http://localhost:8000`.

```bash
curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen/Qwen2.5-0.5B-Instruct",
    "messages": [{"role": "user", "content": "What is Apple Silicon? Answer in one sentence."}],
    "max_tokens": 64,
    "temperature": 0
  }'
```

```json
{"id":"b48e84c1-b3c6-484d-b781-4c9ce8022dff","choices":[{"finish_reason":"stop","index":0,"message":{"content":"Apple Silicon is a type of processor technology developed and manufactured by Apple Inc., designed to offer faster performance and lower power consumption compared to traditional silicon-based processors. This technology allows for the creation of more efficient and energy-efficient devices, such as high-performance computers, smartphones, and other Apple products.","role":"assistant"}}],"created":1791843839,"model":"Qwen/Qwen2.5-0.5B-Instruct@main","object":"chat.completion","usage":{"completion_tokens":59,"prompt_tokens":39,"total_tokens":98}}
```

عند تثبيت `kernels`، يعتمد `transformers serve` افتراضيًا على [ggml-org/ggml-attn](https://huggingface.co/kernels/ggml-org/ggml-attn) على MPS ويسجّل تحذيرًا عند بدء التشغيل. مرّر `--attn-implementation sdpa` لاستخدام SDPA بدلاً من ذلك.

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

تشارك أوزان النموذج ذاكرة موحّدة مع macOS وكل ما يعمل على Mac، لذا فإن تكميمها (Quantization) يتيح استيعاب نموذج أكبر حجمًا للاستدلال أو الضبط الدقيق. يقوم Metal بتكميم النموذج عند تحميله، بينما يعمل GGUF مع نقاط التفتيش (Checkpoints) التي تكون مكمّمة مسبقًا. كلاهما مخصص للاستدلال فقط.

- [Metal](./quantization/metal) يُجري التكميم إلى 2 أو 4 أو 8 بت باستخدام نواة Metal من Hub.
- يحافظ [GGUF](./quantization/gguf) على ضغط الأوزان على MPS عندما يكون نواة `ggml-org/ggml-quantization` متاحة.
- [bitsandbytes](./quantization/bitsandbytes) يُكمّم إلى 4 بتات باستخدام نواة MPS الأصلية.

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

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

يتعرّف [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) على MPS ويضبط الجهاز على `mps`، لذا يتدرّب [Trainer](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer) عليه دون أي إعدادات للجهاز. تعمل كلتا دقتي bf16 وfp16 المختلطتين. حمّل النموذج باستخدام انتباه SDPA الافتراضي، لأن [metal-flash-sdpa](#choose-an-attention-backend) لا يحسب التدرجات لعمليات الإسقاط الخاصة بالانتباه.

```py
from transformers import TrainingArguments

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

يطبع `mps` عندما سيقوم `Trainer` بالتدريب على وحدة معالجة الرسوميات (GPU).

على نظام macOS، تبدأ Python عمليات العامل (worker processes) باستخدام `spawn` افتراضياً، مما يعيد استيراد سكربت الخاص بك ويتطلب مجموعة بيانات قابلة للتسلسل (picklable) و`collate_fn`. عندما يكون `dataloader_num_workers` أكبر من 1، يضبط [TrainingArguments](/docs/transformers/main/ar/main_classes/trainer#transformers.TrainingArguments) قيمة `dataloader_multiprocessing_context="fork"` على MPS، بحيث تبدأ العمليات العامل من نسخة من عملية التدريب بدلاً من ذلك. اضبطها على `"spawn"` إذا لم يكن مصدر البيانات آمناً للاستنساخ (fork-safe).

### تقييد نمو ذاكرة التخزين المؤقت للرسوم البيانية

يقوم MPS بتجميع نواة Metal لكل شكل من أشكال المصفوفات التي يكتشفها، ويحافظ عليها في ذاكرة تخزين مؤقت للرسوميات لا يتم إزالتها أبدًا. يؤدي التدريب باستخدام مدخلات بطول متغير إلى إضافة نواة لكل شكل جديد، مما قد يؤدي إلى نفاد الذاكرة الموحدة.

قلّل عدد الأشكال عن طريق ملء كل دفعة حتى تكون مضاعفاً لطول ثابت باستخدام معامل `pad_to_multiple_of` في [DataCollatorWithPadding](/docs/transformers/main/ar/main_classes/data_collator#transformers.DataCollatorWithPadding).

```py
from transformers import AutoTokenizer, DataCollatorWithPadding

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=64)
```

مرّره إلى `Trainer` مع `data_collator=data_collator`.

## القيود

- `device_map="auto"` لا يمكنه تفريغ الطبقات إلى وحدة المعالجة المركزية (CPU)، لأن MPS ووحدة المعالجة المركزية (CPU) يتشاركان نفس الذاكرة. يتم توجيه الفائض إلى القرص.
- تُحمّل نقاط التفتيش [compressed-tensors](./quantization/compressed_tensors) FP8 على MPS، لكن أوزانها تُفكّ ضغطها بواسطة أول تمريرة أمامية، لذا لا تقلل من استهلاك الذاكرة أثناء الاستدلال.
- لا يُدعم توازي الموترات لأن جهاز Mac يحتوي على جهاز واحد فقط.
- بعض عمليات PyTorch لا تتوفر لها بعد نسخة MPS. اضبط `PYTORCH_ENABLE_MPS_FALLBACK=1` لتشغيلها على وحدة المعالجة المركزية بدلاً من رفع خطأ.

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

- اقرأ ملاحظات [خلفية MPS](https://docs.pytorch.org/docs/stable/notes/mps.html) في PyTorch للعمليات المدعومة والمشكلات المعروفة.
- اقرأ دليل [واجهات الانتباه الخلفية](./attention_interface) لمعرفة كيفية اختيار `attn_implementation` لدالة الانتباه.
- تحقق من عمود Metal في [نظرة عامة على التكميم](./quantization/overview) للعثور على كل طريقة تكميم تعمل على MPS.

