Expert Parallelism
يوزّع التوازي على مستوى الخبراء خبراء طبقات مزيج الخبراء على وحدات GPU، ويوجّه كل رمز إليهم باستخدام اتصال الكل إلى الكل.
توازي الخبراء (EP) استراتيجية لـالتدريب الموزع والاستدلال في نماذج مزيج الخبراء (MoE)، توزّع خبراء مختلفين على وحدات GPU مختلفة وترسل كل رمز إلى الأجهزة التي تضم الخبراء المختارين له. وتستبدل طبقة MoE كتلة تغذية أمامية كبيرة في المحوّل بشبكات خبراء أصغر عديدة، بالإضافة إلى موجّه ينشّط عددًا قليلًا من الخبراء لكل رمز فقط، لذا يمكن أن ينمو إجمالي المعلمات أسرع بكثير من الحوسبة المنفقة على كل رمز. ويتيح توازي الخبراء احتواء هذه المعلمات في الذاكرة: فبدلًا من تخزين كل GPU جميع الخبراء، يخزّن كل منها جزءًا. وكان نعوم شازير وزملاؤه في Google قد وزعوا الخبراء على الأجهزة، بنسخة مشتركة واحدة لكل خبير، في طبقة MoE ذات بوابة متناثرة عام 2017، ثم وسّع GShard هذا النهج في يونيو 2020، موزعًا خبراء نموذج ترجمة يضم أكثر من 600 مليار معلمة على 2,048 مسرّع TPU v3. وأصبح توازي الخبراء الآن معيارًا لتدريب وخدمة النماذج اللغوية الكبيرة اللغوية والرؤية واللغة من نوع MoE.
كيف تنتقل الرموز بين وحدات GPU#
تعمل كل طبقة MoE عبر أربع خطوات:
- التوجيه: يقيّم الموجّه كل رمز مقابل كل خبير، ويختار أفضل k من الخبراء، ويكون العدد عادةً واحدًا أو اثنين أو ثمانية.
- التوجيه: يرسل تجميع شامل من نوع الكل إلى الكل الحالة المخفية لكل رمز إلى وحدات GPU التي تستضيف الخبراء المختارين له.
- الحوسبة: تشغّل كل وحدة GPU خبراءها المحليين على الرموز التي استقبلتها.
- الدمج: تعيد عملية ثانية للجمع الشامل إلى الجميع المخرجات إلى وحدة GPU الأصلية لكل رمز، حيث تُوزن بحسب درجات الموجّه ثم تُجمع.
يحاكي المقتطف أدناه خطوتَي التوجيه والإرسال لطبقة واحدة تضم 8 خبراء موزعين على 4 وحدات GPU، بواقع خبيرين لكل وحدة:
import torch
torch.manual_seed(0)
num_experts, num_gpus, top_k = 8, 4, 2
tokens = torch.randn(4096, 512) # الحالات المخفية لـ 4,096 رمزًا
router = torch.nn.Linear(512, num_experts)
# التوجيه: يختار كل رمز أفضل خبيرين له وفق درجة الموجّه
with torch.no_grad():
_, experts = router(tokens).topk(top_k, dim=-1)
# التوازي بين الخبراء: يوجد الخبيران 0-1 على GPU 0، والخبيران 2-3 على GPU 1، وهكذا
gpu = experts // (num_experts // num_gpus)
# الإرسال: احسب تعيينات الرمز إلى الخبير التي يتلقاها كل خبير وكل GPU
print(torch.bincount(experts.flatten(), minlength=num_experts).tolist())
print(torch.bincount(gpu.flatten(), minlength=num_gpus).tolist())يعرض السطر الأول من المخرجات حِمل كل خبير، من 948 إلى 1,087 تعيينًا مقارنةً بحصة متساوية قدرها 1,024، ويعرض السطر الثاني استقبال وحدات GPU الأربع ما بين 1,968 و2,139 من أصل 8,192 تعيينًا. حتى الموجّه المهيأ عشوائيًا يوزّع العمل بصورة غير متساوية، وتطوّر الموجّهات المدرّبة خبراء شائعين يزيدون اختلال الحِمل كثيرًا.
موازنة الحِمل والسعة#
لا تنتهي الطبقة إلا عند انتهاء عمل أكثر وحدات GPU ازدحامًا، لذا يؤدي اختلال التوجيه مباشرةً إلى تعطّل الأجهزة. وتواجه تدريبات MoE هذا الاختلال بثلاث طرق:
- خسارة موازنة مساعدة: يكافئ حد إضافي في دالة الخسارة الموجّه على توزيع الرموز بالتساوي بين الخبراء.
- عامل السعة: لا يقبل كل خبير سوى عدد ثابت من الرموز كحد أقصى لكل دفعة، مثل 1.25 ضعف الحصة المتساوية، وتتجاوز الرموز الفائضة ذلك الخبير.
- الموازنة القائمة على الانحياز: يضيف DeepSeek-V3 انحيازًا لكل خبير إلى درجات الموجّه، يؤثر فقط في اختيار الخبراء، فيخفضه للخبراء المحمّلين بأكثر من طاقتهم ويرفعه للخبراء الخاملين بعد كل خطوة، ما يوازن الحمل من دون خسارة مساعدة تنافس الهدف الأساسي.
عند وجود حد للسعة، يعتمد مسار كل رمز على مدى انشغال خبرائه:
يواصل الرمز المتخطى المرور عبر وصلة التخطي للطبقة من دون تغيير، لذا يضر الإسقاط الكثيف بالجودة. ولا يُسقط DeepSeek-V3 أي رموز أثناء التدريب، بل يعتمد بدلًا من ذلك على الموازنة القائمة على الانحياز.
يمثل الاتصال الكلفة الأخرى. إذ يحدث تبادلا الكل إلى الكل في كل طبقة MoE، لذا يعمل توازي الخبراء على أفضل وجه داخل العقدة، حيث تتشارك وحدات GPU وصلات NVLink سريعة، ويصبح مكلفًا عبر الوصلات الأبطأ بين العقد. ويوزع DeepSeek-V3 خبراءه الموجّهين البالغ عددهم 256 في كل طبقة باستخدام توازي الخبراء بدرجة 64 على 8 عقد، ويرسل كل رمز إلى خبراء في 4 عقد كحد أقصى، ويوازي عمليات التبادل مع الحسابات.
الجمع بين استراتيجيات التوازي#
توازي الخبراء إحدى طرائق متعددة لتقسيم التدريب عبر الأجهزة:
- توازي البيانات: يكرر النموذج كاملًا على كل GPU ويقسّم كل دفعة، مع مزامنة التدرجات بعد كل خطوة.
- توازي الموترات: يقسم مصفوفات الأوزان الفردية على وحدات GPU، بحيث تشارك كل وحدة GPU في كل طبقة.
- توازي خطوط الأنابيب: يعيّن طبقات متتالية إلى وحدات GPU مختلفة، ويمرر الدفعات المصغرة عبرها.
- توازي السياق: يقسم تسلسل إدخال طويلًا واحدًا على وحدات GPU.
لا تحتاج النماذج الكثيفة التي تلائم وحدة GPU واحدة إلى أكثر من التوازي على مستوى البيانات، وهي الطريقة التي يدرّب بها Ultralytics YOLO26 النموذج على عدة وحدات GPU عند تمرير قائمة أجهزة مثل device=[0, 1] في وضع التدريب. تجمع نماذج MoE الكبيرة عدة أساليب: درّب DeepSeek-V3 معلماته البالغ عددها 671 مليارًا، منها 37 مليارًا نشطة لكل رمز، باستخدام توازي خط أنابيب من 16 اتجاهًا، وتوازي خبراء من 64 اتجاهًا، وتوازي البيانات المجزأ، ومن دون توازي الموترات. تطبق محركات الاستدلال مثل vLLM التقسيم نفسه عند تقديم نموذج، لذا يعمل نموذج MoE الذي تتجاوز ذاكرة الخبراء فيه سعة وحدة GPU واحدة على عدة وحدات، تحتفظ كل منها بنصيبها من الخبراء فقط.










