PyTorch 2.15 يسرّع نماذج MoE على Mac بمعدل 5–6.5 أضعاف ويضيف دعم FP8

أصدر فريق PyTorch في Hugging Face النسخة المرشحة للإصدار 2.15 مع تحديث كبير لواجهة MPS الخلفية على أجهزة Mac. أبرز ما فيه دعم FP8 ونوى Metal جديدة تحلّ محل MPSGraph، وهي تسرّع الاستدلال المحلي والتدريب. تفكّ نماذج MoE الترميز أسرع بمعدل 5–6.5 أضعاف مقارنة بالإصدار 2.14. فقد ارتفع أداء Qwen3.6-35B-A3B على M3 Ultra من 9.4 إلى 61.3 رمزًا/ثانية. ويعود ذلك إلى grouped matmul الأصلي، وتقليل عمليات المزامنة بين GPU وCPU، وتسريع top-k. • softmax على مفردات من 128 256 رمزًا: من 57 إلى 7 ميكروثانية • فك ترميز الفيديو في Wan2.2: ذروة ذاكرة برنامج التشغيل 8 GiB بدلًا من 270 GiB • يتطلب MPS الآن macOS 15 أو أحدث، ويتطلب PyTorch 2.15 الإصدار Python 3.11 أو أحدث

معالج بواسطة الذكاء الاصطناعي من Hugging Face Blog؛ بتحرير Hamidun News
PyTorch 2.15 يسرّع نماذج MoE على Mac بمعدل 5–6.5 أضعاف ويضيف دعم FP8
المصدر: Hugging Face Blog. كولاج: Hamidun News.
استمع للمقال
بطاقة الحقائق والأرقام
المعيارالتفاصيل
المصدر الأصليHugging Face Blog ↗
رئيس التحرير
Softmax على مفردات من 128 256 رمزًامن 57 إلى 7 ميكروثانية
فك ترميز الفيديو في Wan2.2ذروة ذاكرة برنامج التشغيل 8 GiB بدلًا من 270 GiB
حقيقة رئيسية #3يتطلب MPS الآن macOS 15 أو أحدث، ويتطلب PyTorch 2.15 الإصدار Python 3.11 أو أحدث

يحوّل إصدار PyTorch 2.15 جهاز Mac من منصة تجارب مقبولة إلى جهاز عملي فعلًا لتشغيل نماذج LLM المحلية وتوليد الفيديو. فقد أضاف فريق PyTorch في Hugging Face، المسؤول عن واجهة MPS الخلفية، دعم FP8، واستبدل بجزء من العمليات المبنية على MPSGraph نوى Metal مخصصة. وعلى M3 Ultra مع torch.compile، صار النموذج Qwen3.6-35B-A3B يولّد 61.3 رمزًا في الثانية بدلًا من 9.4. أما فك ترميز الفيديو في Wan2.2 فلم يعد يضخّم ذاكرة برنامج التشغيل حتى 270 GiB.

FP8 وفك ترميز MoE: من أين جاءت 61 رمزًا في الثانية

ظهر على MPS النوع torch.float8_e4m3fn. يشغل كل عنصر بايتًا واحدًا، أي نصف ما يشغله FP16 أو BF16. ويمكن ضرب هذه المصفوفات عبر F.scaled_mm، مع دعم التحجيم على مستوى المصفوفة كلها (tensorwise) وعلى مستوى الصفوف (rowwise). كما تعمل بقية العمليات المتاحة لهذا النوع على CUDA وCPU.

يرتبط الجزء الأكبر من مكسب السرعة بمرحلة فك الترميز. ففيها يمر كل رمز جديد عبر النموذج صفًّا واحدًا، فتتحول عمليات ضرب المصفوفات الكبيرة إلى ضرب مصفوفة في متجه. في الإصدار 2.14 كانت نوى GEMV متاحة لـ torch.mm فقط، بينما يمر F.linear عبر MPSGraph. أما الآن فيستخدمها الدخل النموذجي [1, 1, hidden_size] مباشرة، ويُدمج جمع bias المناسب مع النواة. وعلى 96 شكلًا من طبقات BF16 المأخوذة من نماذج حقيقية، يعطي ذلك تسريعًا بمتوسط هندسي قدره 1.23×. وتستفيد الإسقاطات الصغيرة أكثر من غيرها، مثل البوابات (gates) في MoE. أما الطبقات الكبيرة وLM-head فكانت أصلًا مقيّدة بعرض نطاق الذاكرة، لذا يبقى المكسب فيها عند نحو 1×.

وفي MoE جرى تنفيذ grouped matmul أصلي. فقد كانت إزاحات المجموعات تُنسخ سابقًا إلى CPU، وتدور العملية على المجموعات في حلقة. أما النوى الجديدة فتقرأ الإزاحات مباشرة على GPU. وهي تستخدم Metal Performance Primitives حيث تتوفر، ومسار Metal منفصلًا في الحالات الأخرى. وللمجموعات الصغيرة، النموذجية عند فك الترميز، توجد نواة خاصة. كما قُلّصت عمليات المزامنة بين GPU وCPU، وسُرّع توجيه top-k.

تفاصيل صغيرة كانت تلتهم الذاكرة والوقت

جاءت أوضح نتيجة من إصلاح constant padding. فمفكّك VAE في Wan-AI/Wan2.2-TI2V-5B-Diffusers ينفّذ 8 764 استدعاء حشو (padding) عند فك الترميز الكامل من 28 رقعة. وعبر MPSGraph كانت ذروة ذاكرة برنامج التشغيل تصل إلى 270.135 GiB، أما مع الحشو على Metal فتبلغ 8.108 GiB. وذروة المصفوفات المخصصة لم تتغير تقريبًا: 4.422 مقابل 4.095 GiB. أي أن الذاكرة التي كانت تتضخم هي تلك التي يحتجزها برنامج التشغيل للرسوم البيانية (graphs).

والإصلاح نفسه عالج مشكلة في مرمّز VAE الخاص بـ Qwen-Image-2.1. ففي الإصدار 2.14 كان يُفسد الصور بصمت على MPS، ما كان يعطّل سيناريوهات التحرير في ComfyUI. أما الآن فتطابق دورة «الترميز ثم فك الترميز» نتيجة CPU عند مستوى 29.95 ديسيبل PSNR، بعد أن كان 10.06 ديسيبل.

قائمة بقية تغييرات 2.15:

  • softmax وlog_softmax: نوى Metal منفصلة؛ وتسارع softmax بدقة FP32 على الصف [1, 128256] من 57 إلى 7 ميكروثانية، أي نحو 8 أضعاف.
  • conv1d forward: نوى متخصصة بدلًا من MPSGraph، ومسار im2col مع matmul للمخرجات القصيرة، وهو مفيد للصوت والنماذج المتدفقة.
  • Reflection وreplication padding: تنفيذات Metal جديدة، أسرع ومع إصلاح backward.
  • Dropout: يستخدم nn.Dropout وF.dropout نواة fused موجودة أصلًا.
  • Upsampling backward: نواة gather على Metal بدلًا من رسم تدرج resize البياني.
  • Channels-last conv2d backward: يبقى على مسار channels-last الفعّال، دون رسم NCHW البياني ودون الوصول المتقطع (strided) المكلف.
  • الجبر الخطي المركّب: LU وLU solve وtriangular solve للنوع complex64، ومعها المحددات والتدرجات المركّبة.
  • المصفوفات الصغيرة: تُعكس دفعات FP32 حتى 4×4 بنواة Metal واحدة تجمع بين التحليل إلى عوامل والحل.
  • QR وtriangular solve: تحديثات كتلية، ويؤول جزء كبير من العمل إلى ضرب المصفوفات. ولـ Gated DeltaNet يوجد مسار سريع للأنظمة 16×16 و32×32 و64×64 بدقة FP32 عند وجود ثمانية أطراف يمنى أو أكثر.
  • SVD: يعالج بشكل صحيح القيم المنفردة الصغيرة جدًا، والمقاييس القصوى للمدخلات، وfull_matrices=True، ما يحسّن المعكوسات الزائفة والمربعات الصغرى.
  • MPS streams: torch.mps.Stream عام، وسياق torch.mps.stream، وTensor.record_stream، مع قياسات زمنية أكثر موثوقية عبر الأحداث (events).
  • عمليات جديدة: torch.frexp، وtorch.logspace (دون دعم حتى الآن للمخرجات الصحيحة والمنطقية عند وجود عدة عناصر)، وtorch.take، وTensor.put_، وtorch.heaviside، وtorch.special.laguerre_polynomial_l، ومقارنات الأعداد الصحيحة غير المؤشَّرة. وفي التنفيذ الرياضي لـ SDPA جرى إصلاح البث (broadcasting) على الدفعة والرؤوس.

ما الجديد في 2.16 وكيف تجرّبه

تتضمن النسخ الليلية (nightly) بالفعل جزءًا من خطط 2.16. سيُرسَل command buffer كل 16 نواة، كي تبدأ GPU العمل بينما يواصل CPU ترميز الباقي.

وفي فك الترميز المضغوط بصيغة BF16 وبسياق 2048 رمزًا، يرتفع أداء LFM2.5-8B-A1B من 108.8 إلى 126.

0 رمزًا/ثانية (+16%)، وQwen3.6-35B-A3B من 52.9 إلى 62.

8 (+19%)، وQwen3.8-27B من 12.1 إلى 12.

6 (+4%). وستنتقل عملية الانتباه (attention) بالكامل إلى Metal. وعلى M5 Pro سيتقلص فك الترميز مع GQA (32 رأس استعلام، و8 رؤوس KV، وhead dim 80، وسياق 4K) من 465 إلى 65 ميكروثانية، ومرحلة prefill بحجم 4K×4K مع head dim 40 من 42 إلى 6 مللي ثانية.

ومن التغييرات الأخرى: سيُحسب bincount على 4 ملايين عدد صحيح ذات قيم متقاربة جدًا في نصف مللي ثانية بدلًا من 6.8 ثانية، وسينخفض حجم libtorch_cpu.dylib من 384 إلى 287 MiB بفضل بناء الشيدرات لـ Metal 3.

1 افتراضيًا.

والخطوات العملية كالتالي. تحتاج إلى جهاز Mac بمعالج Apple silicon مع macOS 15 أو أحدث وPython 3.11 أو أحدث، وإلا فسيشرح فحص توفر MPS الآن سبب الرفض. تُثبَّت النسخة المرشحة للإصدار في بيئة منفصلة بالأمر uv pip install torch==2.15.0 --index-url https://download.pytorch.org/whl/test/cpu. ومن يشغّل نماذج MoE عبر transformers، فمن المجدي أن يفعّل torch.compile ويقارن عدد الرموز في الثانية بنتائج 2.14. وينبغي لمستخدمي ComfyUI مع Qwen-Image-2.1 التحديث بسبب إصلاح VAE، أما أصحاب أجهزة Mac ذات الذاكرة الكبيرة الذين يولّدون الفيديو في Wan2.2 فسيجنّبهم التحديث التضخم المفاجئ في ذاكرة برنامج التشغيل. وإذا بقي شيء بطيئًا أو لا يعمل، يطلب الفريق فتح issue على GitHub.

القصة

أسئلة وأجوبة حول الخبر

ما أبرز التفاصيل حول FP8 وفك ترميز MoE: من أين جاءت 61 رمزًا في الثانية؟

ظهر على MPS النوع torch.float8_e4m3fn. يشغل كل عنصر بايتًا واحدًا، أي نصف ما يشغله FP16 أو BF16. ويمكن ضرب هذه المصفوفات عبر F.scaled_mm، مع دعم التحجيم على مستوى المصفوفة كلها (tensorwise) وعلى مستوى الصفوف (rowwise). كما تعمل بقية العمليات المتاحة لهذا النوع على CUDA وCPU. يرتبط الجزء الأكبر من مكسب السرعة بمرحلة فك الترميز. ففيها يمر كل رمز جديد عبر النموذج صفًّا واحدًا، فتتحول عمليات ضرب المصفوفات الكبيرة إلى ضرب مصفوفة في متجه. في الإصدار 2.14 كانت نوى GEMV متاحة لـ torch.mm فقط، بينما يمر F.linear عبر MPSGraph. أما الآن فيستخدمها الدخل النموذجي [1, 1, hidden_size] مبا

ما أبرز التفاصيل حول تفاصيل صغيرة كانت تلتهم الذاكرة والوقت؟

جاءت أوضح نتيجة من إصلاح constant padding. فمفكّك VAE في Wan-AI/Wan2.2-TI2V-5B-Diffusers ينفّذ 8 764 استدعاء حشو (padding) عند فك الترميز الكامل من 28 رقعة. وعبر MPSGraph كانت ذروة ذاكرة برنامج التشغيل تصل إلى 270.135 GiB، أما مع الحشو على Metal فتبلغ 8.108 GiB. وذروة المصفوفات المخصصة لم تتغير تقريبًا: 4.422 مقابل 4.095 GiB. أي أن الذاكرة التي كانت تتضخم هي تلك التي يحتجزها برنامج التشغيل للرسوم البيانية (graphs). والإصلاح نفسه عالج مشكلة في مرمّز VAE الخاص بـ Qwen-Image-2.1. ففي الإصدار 2.14 كان يُفسد الصور بصمت على MPS، ما كان يعطّل سيناريوهات التحرير في ComfyUI. أما الآ

ما أبرز التفاصيل حول ما الجديد في 2.16 وكيف تجرّبه؟

تتضمن النسخ الليلية (nightly) بالفعل جزءًا من خطط 2.16. سيُرسَل command buffer كل 16 نواة، كي تبدأ GPU العمل بينما يواصل CPU ترميز الباقي. وفي فك الترميز المضغوط بصيغة BF16 وبسياق 2048 رمزًا، يرتفع أداء LFM2.5-8B-A1B من 108.8 إلى 126.0 رمزًا/ثانية (+16%)، وQwen3.6-35B-A3B من 52.9 إلى 62.8 (+19%)، وQwen3.8-27B من 12.1 إلى 12.6 (+4%). وستنتقل عملية الانتباه (attention) بالكامل إلى Metal. وعلى M5 Pro سيتقلص فك الترميز مع GQA (32 رأس استعلام، و8 رؤوس KV، وhead dim 80، وسياق 4K) من 465 إلى 65 ميكروثانية، ومرحلة prefill بحجم 4K×4K مع head dim 40 من 42 إلى 6 مللي ثانية. ومن التغيي

ZK
جمال حميدون — مدير المنتجات في Alpina Digital ومدير منتج AlpinaGPT. يبني منتجات الذكاء الاصطناعي منذ 2019. بدأ Hamidun News كمشروع شخصي ثم أصبح مُجمِّعًا إنتاجيًا بأكثر من 6000 قارئ.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
ما رأيك؟
جارٍ تحميل التعليقات…