Transformers documentation
Apple Silicon
Apple Silicon
تشغّل شرائح Apple Silicon (سلسلة M) إطار PyTorch عبر واجهة Metal Performance Shaders (MPS)، مع سلسلة الأجهزة mps. ويتشارك المعالج المركزي (CPU) ومعالج الرسوميات (GPU) وحدة واحدة من الذاكرة الموحدة.
يعمل MPS مع تثبيت torch القياسي. تتطلب إصدارات PyTorch الحالية لـ Apple Silicon نظام macOS 14 أو أحدث. تأكد من أن PyTorch تم بناؤه مع دعم MPS وأنه يمكنه رؤية وحدة معالجة الرسوميات (GPU).
import torch
print(torch.backends.mps.is_available())يطبع True عندما يكون MPS جاهزًا للاستخدام.
اختر واجهة خلفية للانتباه
اضبط واجهة الانتباه باستخدام attn_implementation عند تحميل النموذج، حيث ينطبق ذلك على كل من الاستدلال والتدريب. تستخدم النماذج SDPA افتراضياً. مع PyTorch 2.13 أو أحدث، يتعامل SDPA على MPS مع انتباه الاستعلام المجمّع مباشرة، دون الحاجة إلى تكرار رؤوس المفتاح والقيمة أولاً.
استخدم SDPA للتدريب.
- يدعم kernels-community/metal-flash-sdpa المدخلات ذات الطول المتغير فقط، مثل التسلسلات المعبأة أو الدفعة التي تحتوي قناع الانتباه فيها على حشو. تثير الدفعة التي لا تحتوي على حشو، مثل موجه واحد، خطأً. كما لا يحسب التدرجات (Gradients) لإسقاطات الاستعلام والمفتاح والقيمة. يتحول gpt-oss إليه تلقائيًا عند طلب الانتباه البرق (Flash Attention) على MPS.
- ggml-org/ggml-attn هو الافتراضي لـ
transformers serveولنماذج GGUF عند تثبيتkernels.
قم بتثبيت الإضافة kernels لاستخدام أي من النواتين. يقوم هذا التثبيت بتثبيت نسخة تدعمها مكتبة Transformers.
pip install "transformers[kernels]"تشغيل الاستدلال
مرّر device_map="mps" إلى from_pretrained(). يختار pipeline() MPS تلقائياً عندما لا تمرّر device.
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 خادمًا متوافقًا مع OpenAI. الخيار --device فيه افتراضيًا auto، لذا فإنه يُحمّل النماذج على MPS دون الحاجة إلى أعلام إضافية. ثبّت اعتماديات الخدمة ثم ابدأ الخادم.
pip install "transformers[serving]"
transformers serveيُحمّل الخادم النموذج في المرة الأولى التي يُذكر فيها اسمه ضمن طلب. أرسل طلب دردشة إلى http://localhost:8000.
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
}'{"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 على MPS ويسجّل تحذيرًا عند بدء التشغيل. مرّر --attn-implementation sdpa لاستخدام SDPA بدلاً من ذلك.
كمّ النماذج
تشارك أوزان النموذج ذاكرة موحّدة مع macOS وكل ما يعمل على Mac، لذا فإن تكميمها (Quantization) يتيح استيعاب نموذج أكبر حجمًا للاستدلال أو الضبط الدقيق. يقوم Metal بتكميم النموذج عند تحميله، بينما يعمل GGUF مع نقاط التفتيش (Checkpoints) التي تكون مكمّمة مسبقًا. كلاهما مخصص للاستدلال فقط.
- Metal يُجري التكميم إلى 2 أو 4 أو 8 بت باستخدام نواة Metal من Hub.
- يحافظ GGUF على ضغط الأوزان على MPS عندما يكون نواة
ggml-org/ggml-quantizationمتاحة. - bitsandbytes يُكمّم إلى 4 بتات باستخدام نواة MPS الأصلية.
لضبط نموذج لا يتسع في الذاكرة، حمّله بدقة 4 بت باستخدام bitsandbytes ودرّب محولات LoRA باستخدام PEFT.
التدريب باستخدام Trainer
يتعرّف TrainingArguments على MPS ويضبط الجهاز على mps، لذا يتدرّب Trainer عليه دون أي إعدادات للجهاز. تعمل كلتا دقتي bf16 وfp16 المختلطتين. حمّل النموذج باستخدام انتباه SDPA الافتراضي، لأن metal-flash-sdpa لا يحسب التدرجات لعمليات الإسقاط الخاصة بالانتباه.
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./outputs",
bf16=True,
)
print(training_args.device)يطبع mps عندما سيقوم Trainer بالتدريب على وحدة معالجة الرسوميات (GPU).
على نظام macOS، تبدأ بايثون عمليات العامل (worker processes) باستخدام spawn افتراضياً، مما يعيد استيراد سكربتك ويتطلب مجموعة بيانات قابلة للتسلسل (picklable) وcollate_fn. عندما يكون dataloader_num_workers أكبر من 1، يضبط TrainingArguments قيمة dataloader_multiprocessing_context="fork" على MPS، بحيث تبدأ العمليات العامل من نسخة من عملية التدريب بدلاً من ذلك. اضبطها على "spawn" إذا لم تكن مصدر البيانات آمناً للاستنساخ (fork-safe).
تقييد نمو ذاكرة التخزين المؤقت للرسوم البيانية
يقوم MPS بتجميع نواة Metal لكل شكل من أشكال المصفوفات التي يكتشفها، ويحافظ عليها في ذاكرة تخزين مؤقت للرسوميات لا يتم إزالتها أبدًا. يؤدي التدريب باستخدام مدخلات بطول متغير إلى إضافة نواة لكل شكل جديد، مما قد يؤدي إلى نفاد الذاكرة الموحدة.
قلّل عدد الأشكال عن طريق ملء كل دفعة حتى تكون مضاعفًا لطول ثابت باستخدام معامل pad_to_multiple_of في DataCollatorWithPadding.
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 ووحدة المعالجة المركزية يتشاركان في نفس الذاكرة. يتم تحويل الفائض إلى القرص.- تُحمّل نقاط التفتيش compressed-tensors FP8 على MPS، لكن أوزانها تُفكّ ضغطها بواسطة أول تمريرة أمامية، لذا لا تقلل من الذاكرة أثناء الاستدلال.
- لا يُدعم توازي الموترات لأن جهاز Mac يحتوي على جهاز واحد فقط.
- بعض عمليات PyTorch لا تتوفر لها بعد نسخة MPS. اضبط
PYTORCH_ENABLE_MPS_FALLBACK=1لتشغيلها على وحدة المعالجة المركزية بدلاً من رفع خطأ.
الخطوات التالية
- اقرأ ملاحظات خلفية MPS في PyTorch للعمليات المدعومة والمشكلات المعروفة.
- اقرأ دليل واجهات الانتباه الخلفية لمعرفة كيفية اختيار
attn_implementationلدالة الانتباه. - تحقق من عمود Metal في نظرة عامة على التكميم للعثور على كل طريقة تكميم تعمل على MPS.