Transformers documentation
التوازي الخبير
التوازي الخبير
التوازي بين الخبراء هو استراتيجية توازي مخصصة لنماذج مزيج الخبراء (MoE). يتواجد كل خبير في طبقة التغذية الأمامية الخاصة به على مُسرِّع عتاد مختلف. يقوم الموجِّه بإرسال الرموز إلى الخبراء المناسبين وجمع النتائج. يتيح هذا النهج توسيع النماذج إلى أعداد أكبر بكثير من المعلمات دون زيادة تكلفة الحساب، لأن كل رمز يُفعِّل عدداً قليلاً فقط من الخبراء.
DistributedConfig
فعّل توازي الخبراء باستخدام فئة DistributedConfig والحجة ep_size. تقسم نماذج MoE خبرائها باستخدام "ep_dispatch_experts". تختار تطبيقاتها كيفية وصول الرموز إلى الخبراء. يتيح Token dispatch أن يختلف ep_size عن tp_size. تتطلب بعض تطبيقات EP أن يكون ep_size=tp_size، مثل "all_reduce" و"deepgemm_megamoe"، بحيث تحتفظ كل رتبة ضمن مجموعة الخبراء بنفس الرموز.
لا يحتوي Llama 4 على خطة EP: حيث تتلقى خبراته كل رمز مُقيَّم مسبقًا بواسطة درجة موجّهه، لذا لا يوجد شيء يُرسَل. قسّمها باستخدام توازي الموترات (tp_size) بدلاً من ذلك.
import os
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.distributed.configuration_utils import DistributedConfig
distributed_config = DistributedConfig(
tp_size=int(os.environ["WORLD_SIZE"]),
ep_size=int(os.environ["WORLD_SIZE"]),
)
model = AutoModelForCausalLM.from_pretrained(
"openai/gpt-oss-120b",
distributed_config=distributed_config,
)يحدد كل نموذج MoE خطتين في ملفه الإعدادي: base_model_tp_plan للوحدات الكثيفة وbase_model_ep_plan للخبراء. وتُعرض هاتان الخطتان على النموذج المحمّل على شكل model.tp_plan وmodel.ep_plan. عند استخدام tp_size > 1 وep_size > 1، تُطبَّق الخطتان معاً: حيث يقوم خط التوازي على مستوى المصفوفات بتقسيم وحدات الانتباه ووحدات MLP الكثيفة، بينما يقوم خط التوازي على مستوى الخبراء بتقسيم الخبراء. ولأن قواعد EP لها الأولوية على قواعد TP بالنسبة لنفس الوحدات، فإن أوزان الخبراء تُقسَّم مرة واحدة فقط، وذلك وفق خط EP. وفي خط EP، يقوم نمط GroupedGemmParallel بتقسيم أوزان الخبراء على طول بُعد الخبراء بحيث يحمّل كل rank الخبراء المحليين لديه فقط، بينما تختار قاعدة "ep_dispatch_experts" على وحدة الخبراء كيفية وصول الرموز (tokens) إليها.
يُطبَّق tp_plan فقط عندما يكون tp_size > 1، وep_plan فقط عندما يكون ep_size > 1. عند تفعيل TP وتعطيل EP، يُطبَّق خطة TP الكاملة، بما في ذلك قواعد الخبراء.
"ep_dispatch_experts" يقسّم الخبراء بالكامل لكل رتبة (ep_size مضاعف لـ tp_size يقسم fsdp_size * tp_size) ويصل إليهم من خلال أسماء التنفيذ ep_implementation، راجع اختيار تنفيذ.
اختيار تطبيق
"ep_dispatch_experts" يقسّم الخبراء مرة واحدة ويحدد كيفية وصول الرموز إليهم من خلال التطبيقات المسجّلة في EPImplementationInterface، والتي يتم اختيارها عبر ep_implementation في DistributedConfig:
ep_implementation | المزايا | العيوب |
|---|---|---|
"all_to_all"، راجع توزيع الرموز | يعمل مع أي تخطيط، بما في ذلك ep_size > tp_size. تتحرك الرموز الموجهة فقط. | يوجد مجموعتان من عمليات الجمع الشاملة (all-to-all) ومزامنة واحدة للمضيف في كل طبقة، لذا لا يتم التقاطها في رسم CUDA. |
"all_reduce" | لا تتحرك أي رموز ولا يحدث مزامنة على المضيف، لذا تُلتقط عمليات فك الترميز في رسم CUDA. | يتطلب ep_size=tp_size. يقوم كل رتبة بتشغيل خبرائه على الدفعة الكاملة، لذا فإن تكلفته تزداد مع حجم الدفعة. |
"deepgemm_megamoe" | يجمع DeepGEMM Mega MoE بين عمليات الإرسال والخبراء والدمج في نواة واحدة. وتشارك كل طبقة ضمن مجموعة EP مخازن ذاكرتها المتماثلة. | يتطلب ep_size=tp_size، وتفعيلات FP8 مع خبراء FP4 على SM100+. للاستدلال فقط. |
"auto"، الافتراضي | يُنفّذ "all_reduce" أثناء الاستدلال عندما تتشارك رتب مجموعة الخبراء دفعة واحدة، وينفّذ "all_to_all" في الحالات الأخرى. | ليس الخيار الأسرع دائمًا: قد يستفيد الحمل من تنفيذ مخصص، راجع إضافة تنفيذ. |
ep_implementationيختار فقط ضمن أحجام التوازي المحددة في DistributedConfig. عندما تحتفظ رتب مجموعة الخبراء بدفعات مختلفة، على سبيل المثالtp_size=1معfsdp_size=ep_size، فإن"all_to_all"هو التنفيذ الوحيد المطبق.
إضافة تطبيق
تقوم الفئة الفرعية من التنفيذ بترث EPImplementation وتُسجَّل تحت الاسم الذي يختاره ep_implementation. يتم بناؤها مرة واحدة لكل وحدة خبراء، مما يتيح لها الاحتفاظ بحالة مثل مخازن الاتصال. عند استدعاؤها بالدفع الذي يحتفظ به هذا الرتبة، مع المعرّفات العالمية للخبراء، تُرجع مخرجات الخبراء الموزونة لكل رمز من رموزها. تُنفّذ خبراء هذا الرتبة باستخدام experts_forward، على الصفوف والمعرّفات المحلية للخبراء والأوزان التي أحضرتها معها.
from transformers.distributed.expert_parallel import EPImplementation, EPImplementationInterface
class MyEP(EPImplementation):
def __call__(self, hidden_states, top_k_index, top_k_weights):
tokens, expert_ids, weights = ... # bring this rank's experts the rows routed to them
expert_output = self.experts_forward(tokens, expert_ids, weights)
return ... # the weighted expert output for each token of the batch this rank holds
EPImplementationInterface.register("my_ep", MyEP)
distributed_config = DistributedConfig(tp_size=1, fsdp_size=8, ep_size=8, ep_implementation="my_ep")يجب أن تصل التدرّجات إلى كل رتبة تحتفظ برمز، بما في ذلك أوزان التوجيه، لذا لفّ عملية جماعية لا يميّز فيها autograd داخل
torch.autograd.Function.
استخدام
enable_expert_parallel=Trueدون تحديدep_sizeأصبح غير مدعوم، ويُصدر تحذيرًا من نوعFutureWarning. يقوم هذا الإعداد بتقسيم الخبراء فقط، تمامًا كما فيep_size=tp_size, tp_plan={}.
شغّل سكربت الاستدلال الخاص بك باستخدام torchrun. يجب أن يساوي عدد العمليات tp_size * fsdp_size * pp_size، وأن يقسم ep_size عدد الخبراء قسمة تامة.
torchrun --nproc-per-node 8 your_script.py
التجاوز على الخطط
مرّر tp_plan={...} أو ep_plan={...} إلى DistributedConfig لتجاوز قواعد محددة في الخطط المحددة مسبقًا. تُحفظ القواعد غير المحددة، وتُخزَّن الخطط المدمجة على النموذج. يجب أن يطابق كل مفتاح وحدةً أو معاملًا أو عنصرًا موجودًا في الخطة؛ وإلا فسيُطلق التحميل ValueError قبل تقسيم أي شيء. استخدم المسار الكامل كما يظهر من النموذج المحمّل، لذا model.layers.* لنموذج LM السببي وlayers.* لنموذه الأساسي.
distributed_config = DistributedConfig(
tp_size=4,
ep_size=4,
tp_plan={"model.layers.*.self_attn.q_proj": "colwise_rep"},
ep_plan={"model.layers.*.mlp.experts.down_proj": "grouped_gemm"},
)تقديم خطة لا يستنتج أحجام التوازي: اضبط tp_size وep_size بشكل صريح.
عند استخدام ep_size=tp_size، يعمل التنفيذ الافتراضي "auto" على تشغيل "all_reduce" أثناء الاستدلال، ويوزّع الرموز أثناء التدريب. ولإخفاء الرموز وتجميعها الكلّي (all-reduce) أثناء التدريب أيضاً، اضبط ep_implementation="all_reduce":
distributed_config = DistributedConfig(tp_size=4, ep_size=4, ep_implementation="all_reduce")توزيع الرموز
Token dispatch is the "all_to_all" implementation: each rank trains on its own part of the batch. At every MoE layer, a rank routes its tokens, sends each (token, expert) pair to the rank that owns the expert with an all-to-all, runs its local experts on what it receives, gets the results back with a second all-to-all and combines them with the routing weights. Only the routed activations and expert outputs travel, and no rank computes experts for tokens it does not own.
from transformers import AutoModelForCausalLM
from transformers.distributed import DistributedConfig
distributed_config = DistributedConfig(
tp_size=1,
fsdp_size=8,
ep_size=4,
)
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-30B-A3B", distributed_config=distributed_config)عند tp_size=1، يجب أن يكون ep_size قاسماً لـ fsdp_size وعدد الخبراء، ولا يكون الانتباه مقيداً بـ num_key_value_heads. أما بالنسبة لباقي النموذج:
- تُقسَّم المعاملات خارج الخبراء باستخدام FSDP2 عبر
fsdp، مما يقلل من تدرجاتها. - تُقسَّم الخبراء عبر
ep، وعندما يكونefsdp_size = fsdp_size * tp_size // ep_sizeأكبر من واحد، تُقسَّم أيضًا عبرefsdpباستخدام تقسيم FSDP. وهي دائمًا مُغلَّفة بـ FSDP، لذا فإنfsdp_mixed_precisionوfsdp_cpu_offloadتنطبق عليها أيضًا، وsave_pretrained() تجمعها مثل أي معامل آخر. - يحتوي مجموعة التوازي الخبير على
ep_size / tp_sizeدفعات، لذا فإن تدرج الخبير هو مجموع على ذلك العدد من الدفعات. تقسيمefsdpيقسم علىfsdp_sizeبدلاً من حجم مجموعته، مما يعطي متوسط FSDP2 لكل دفعة الذي تتخذه للوحدات الكثيفة. - يعالج كل خبير محلي أيضًا صفًا واحدًا من الحشو الصفري في كل طبقة. أما المرتبة التي لم تتلقِ خبراؤها أي رموز، فإنها تشارك لا تزال في عملية all-to-all العكسية وتقليل تدرجات الخبراء.
كيف يتم دمج الأحجام
tp_size * fsdp_sizeهو عدد العمليات.ep_sizeلا يضيف شيئًا: فهو يعيد تجميع نفس الرتب لأوزان الخبراء فقط.- يقسم
ep_sizeقائمة الخبراء إلىep_sizeكتل. يحسب كل رتبةnum_experts / ep_sizeمن الخبراء، وتحتفظep_sizeرتب متتالية بمجموعة كاملة واحدة. تلك المجموعة من الرتب هي المجموعة التي يعمل فيها all-to-all. efsdp_size = fsdp_size * tp_size / ep_sizeهو عدد النسخ الكاملة الموجودة من مجموعة الخبراء. تقوم الرتب الموجودة في نفس الموقع في النسخ المختلفة بتجزئة هؤلاء الخبراء من أجل الذاكرة، ثم تُوسط تدرجاتهم، تماماً كما تفعل FSDP مع الوحدات الكثيفة.- يعتمد الدفعة التي يحتفظ بها كل رتبة على
fsdpفقط. تتكوّن الرتب المتتالية من مجموعة TP وتحصل على نفس الدفعة؛ بينما تحصل مجموعاتfsdp_sizeعلى دفعات مختلفة.
ثماني عمليات، tp_size=2, fsdp_size=4، ثمانية خبراء:
rank 0 1 2 3 4 5 6 7 batch [====B0====] [====B1====] [====B2====] [====B3====] one batch per TP pair tp 0 1 0 1 0 1 0 1 ep_size=2 E0-3 E4-7 E0-3 E4-7 E0-3 E4-7 E0-3 E4-7 group = a TP pair, efsdp_size=4 ep_size=4 E0E1 E2E3 E4E5 E6E7 E0E1 E2E3 E4E5 E6E7 group = two pairs, efsdp_size=2 ep_size=8 E0 E1 E2 E3 E4 E5 E6 E7 group = all ranks, efsdp_size=1
ينجم عن الصورة عددان:
- داخل مجموعة EP، يوجد كل رمز
tp_sizeمرات، مرة واحدة لكل رتبة من الزوج الذي يحمل دفعته. ولا يعتمد هذا علىep_size. - تحتوي مجموعة EP على
ep_size / tp_sizeدفعات مختلفة. وهذا هو العدد الذي تُجمَّع عليه تدرّجات الخبير.
مع توازي الموترات
اضبط tp_size > 1 لتقسيم الوحدات الكثيفة وفق خطة TP بينما تستخدم الخبراء الإرسال. على ثمانية عمليات:
distributed_config = DistributedConfig(
tp_size=2,
fsdp_size=4,
ep_size=4,
)تستقبل كل زوج من رتب TP الدفعة (batch) نفسها، لأن توازي الموترات (tensor parallelism) يكرر التفعيلات (activations) داخل الزوج. إذا أرسلت كلتا الرتب جميع رموزها (tokens)، فإن الرتبة التي تمتلك خبيرًا (expert) ستتلقى كل رمز مرتين، وتحسبه مرتين، وستتضاعف تدرج أوزانه (weight gradient). نظرًا لأن الخبراء كاملون على رتبة واحدة، فلا يمكن تقسيم النسخة المكررة عبر الأوزان، وغالبًا ما تكون الرتبة المالكة رتبة أخرى، فلا يمكن حل المشكلة عبر الملكية كما تفعل عملية الإخفاء (masking). لذلك يقسم الزوج الصفوف: ترسل كل رتبة TP جزءًا منفصلًا 1 / tp_size من الرموز، وتعود النتائج إلى الرتبة التي أرسلتها، ثم تعيد عملية all-reduce على الزوج للنصفين المملوءين بالصفر استعادة المخرجات المكررة التي تتوقعها الطبقة التالية. يتم التقسيم حسب tp_size وليس ep_size، لأن الرتب التي تحمل دفعة فقط هي التي يمكنها إرسالها. تمتد مجموعات الخبراء عبر أربع رتب، وكل خبير مقسّم عبر FSDP على efsdp_size = 2 رتبة، بينما تمتد مجموعة FSDP للجذع (trunk) عبر أربع رتب. لا تزال قيود TP المعتادة للنموذج، مثل قابلية رؤوس الانتباه (attention-heads) للقسمة، تنطبق على الوحدات الكثيفة (dense modules). قد تكون شرائح الرموز غير متساوية أو فارغة، بما في ذلك أثناء فك ترميز رمز واحد.
لا يمكن دمج توزيع الرموز (Token dispatch) مع توازي الخطوط (pipeline parallelism) بعد؛ استخدم pp_size=1 (لم يتم الاختبار بعد)
تستخدم كل من هذه الإعدادات ثمانية وحدات معالجة رسومية (GPU):
| الإعداد | النتيجة |
|---|---|
DistributedConfig(tp_size=4, fsdp_size=2, ep_size=4) | تشارك كل مجموعة TP مكوّنة من أربعة عناصر دفعة واحدة. في التدريب، تُوزَّع الرموز بحيث يتولى كل رتبة ربع الدفعة؛ أما في الاستدلال فتُستخدم "all_reduce"؛ وعند تعيين ep_implementation="all_reduce" تُستخدم هذه الطريقة في كل المراحل. |
DistributedConfig(tp_size=1, fsdp_size=8, ep_size=4) | Dispatch مع دفعة مستقلة على كل رتبة، دون تقطيع، وخبراء مُقسَّمين عبر أزواج من الرتب باستخدام FSDP. |
DistributedConfig(tp_size=2, fsdp_size=4, ep_size=4) | أرسل باستخدام زوج TP لكل دفعة، حيث يقسم كل زوج دفعته إلى نصفين؛ دفعتان لكل مجموعة خبراء. |
DistributedConfig(tp_size=8, ep_size=8) | تشارك كل رتبة دفعة واحدة. في التدريب، تُوزَّع الرموز بحيث تأخذ كل رتبة ثمن الدفعة؛ أما في الاستدلال فتُستخدم "all_reduce"؛ وعند تعيين ep_implementation="all_reduce" تُستخدم هذه الطريقة في كل المراحل. |
لا يأخذ Trainer بعد في الحسبان إرسال الرموز: فعدّ الدفعات والرموز يفترض تخطيط all-reduce، حيث تتشارك رتب مجموعة TP دفعة واحدة وتوجد
fsdp_sizeشظايا موازية للبيانات. تأتي دعم Trainer للإرسال في متابعة لاحقة.
الدمج مع FSDP2
يقوم توازي الموترات وتوازي الخبراء بتقسيم الأوزان عبر شبكاتهما الخاصة، tp وep، لكن حالة المُحسِّن (optimizer) والوحدات التي لا تخضع لقاعدة ما تبقى مكررة على كل رتبة ضمن المجموعة، مما يحد من حجم النموذج الذي يمكنك تدريبه. أضف FSDP2 على بُعد شبكة آخر باستخدام fsdp_size. مع استخدام الإخفاء (masking) وall-reduce، حافظ على ep_size=tp_size وقم بتمرير ep_implementation="all_reduce".
from transformers import AutoModelForCausalLM
from transformers.distributed import DistributedConfig
distributed_config = DistributedConfig(
tp_size=4,
ep_size=4, # expert parallel size, must match tp_size with masking and all-reduce
fsdp_size=2, # data parallel shards
ep_implementation="all_reduce", # "auto" would dispatch tokens in training, which the Trainer does not support yet
)
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-30B-A3B", distributed_config=distributed_config)حمّل النموذج كما هو معتاد، ثم درّبه باستخدام Trainer. يقوم هذا بإيجاد معيار التدرج عبر كلا الشبكتين ومنح كل شبكة مجموعة معلمات خاصة بها في المُحسِّن. تجمع save_model() الأوزان المجزأة في نقطة تحقق عادية. يتطلب هذا accelerate>=1.12 حتى يتمكن Trainer من عكس tp_size وfsdp_size إلى ~Accelerate.ParallelismConfig.
يقارن الجدول أدناه التدريب باستخدام EP فقط مع التدريب ثنائي الأبعاد EP+FSDP2 على 8 وحدات GPU من نوع H100. يتكون عبء العمل من الضبط الكامل لنموذج Qwen3-30B-A3 بدقة bf16 عند طول تسلسل يبلغ 2048. تقلل شظايا FSDP الإضافية من ذروة الذاكرة، وتنخفض سرعة المعالجة (رموز/ثانية) قليلاً لأن FSDP2 يقوم بجمع (all-gathers) وتشتيت (reduce-scatters) الخبراء عبر fsdp.
| الإعداد | رموز/ثانية/وحدة معالجة رسومية | ذروة الذاكرة/وحدة معالجة الرسوميات |
|---|---|---|
tp_size=8 | 3485 | 38.6 GB |
tp_size=4, fsdp_size=2 | 2900 | 34.2 GB |
tp_size=2, fsdp_size=4 | 2830 | 32.3 GB |
لا يُدعَم استئناف التدريب من نقطة تحقق بعد للنماذج التي تُقسَّم عند التحميل، لذا يقبل Trainer فقط
save_only_model=Trueأوsave_strategy="no"لها.
مرجع الواجهة البرمجية
فئة transformers.DistributedConfig
< source >( tp_size: int | None = Nonetp_plan: typing.Union[dict[str, str], typing.Literal['auto'], NoneType] = Noneenable_sequence_parallel: bool = Falseenable_expert_parallel: bool = Falsefsdp_size: int | None = Nonedp_replicate_size: int | None = Nonefsdp_plan: dict[str, str] | None = Nonefsdp_cpu_offload: bool = Falsefsdp_mixed_precision: bool = Falsepp_size: int | None = Noneep_size: int | None = Noneep_plan: dict[str, str] | None = Noneep_implementation: str = 'auto' )
المعاملات
- tp_size (
int، اختياري) — عدد الأجهزة للتوازي على مستوى الموترات. إذا كانNoneوتم تعيينtp_plan، فإن القيمة الافتراضية هيWORLD_SIZE // (other_parallel_size). إذا كانNoneولم يتم تعيينtp_plan، فإن القيمة الافتراضية هي 1. - tp_plan (
dict[str, str]أو"auto"، اختياري) — خطة تقسيم التوازي على مستوى المصفوفات. مرّر"auto"، أو اتركهNoneعند ضبطtp_size، لاستخدامbase_model_tp_planالمُعرّف مسبقًا للنموذج. مرّر قاموسًا لتجاوز قواعد محددة في تلك الخطة؛ تُحفظ القواعد غير المحددة. تطبيق قاموس فارغ يعني عدم تطبيق أي قاعدة لتوازي المصفوفات. - enable_sequence_parallel (
bool، اختياري، القيمة الافتراضيةFalse) — مخصص للتوازي التسلسلي. لم يتم ربطه بعد. - enable_expert_parallel (
bool، اختياري، القيمة الافتراضيةFalse) — مُتقادم، أُزيل في الإصدار v5.21. بدونep_size، يكون مطابقًا لـep_size=tp_size, tp_plan={}: خطة التوازي بين الخبراء وحدها عبرtp_sizeمن الرتب. القيمة الصريحة لـep_sizeلها الأولوية. لا يغيّر هذا العلم قيمةtp_sizeأوfsdp_size. - fsdp_size (
int، اختياري) — عدد الأجهزة الخاصة بـ FSDP (التوازي في البيانات). إذا كانتNoneوتم تعيينtp_size، فإن القيمة الافتراضية هي 1. - dp_replicate_size (
int, اختياري) — عدد نسخ FSDP (HSDP). يتم تقسيم المعاملات عبرfsdp_sizeأجهزة وتكرارهاdp_replicate_sizeمرات: تُختزل التدرجات وتُبعثر داخل النسخة الواحدة، ثم تُختزل عبر النسخ. القيمة الافتراضية هي 1. نقترح استخدامه للتدريب متعدد العقد: فـ FSDP العادي يجمع المعاملات ويختزل التدرجات ويبعثها عبر جميع الأجهزة في كل خطوة، مما يعني أن هذا المرور يمر عبر روابط بين العقد الأبطأ. اضبطdp_replicate_sizeعلى عدد العقد وfsdp_size * tp_sizeعلى عدد الأجهزة لكل عقدة: عندها يبقى مرور التقسيم على روابط داخل العقدة السريعة، ولا يعبر بين العقد سوى اختزال التدرجات. التكلفة هي زيادة الذاكرة لكل جهاز، لأن المعاملات مقسمة داخل العقدة. - fsdp_plan (
dict[str, str], اختياري) — خطة تجزئة FSDP2. اتركهNoneلاستخدامbase_model_fsdp_planالمحدد مسبقًا في النموذج و_fsdp_planعلى مستوى الفئة. مرر قاموسًا لتجاوز قواعد فردية؛ وتُحفظ القواعد غير المحددة. يُطبَّق فقط عندما يكونdp_replicate_size * fsdp_size > 1. - fsdp_cpu_offload (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تفعيل نقل المعالجة إلى وحدة المعالجة المركزية (CPU) لـ FSDP2. - fsdp_mixed_precision (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان سيتم تفعيل الدقة المختلطة لـ FSDP2. - pp_size (
int، اختياري) — عدد الأجهزة للتوازي في خط الأنابيب. إذا كانNoneوتم ضبط وضع توازي آخر، يكون الافتراضي 1. - ep_size (
int، اختياري) — عدد الأجهزة التي تمتلك شرائح خبراء مميزة. القيمة الافتراضية هي 1. اضبطه صراحةً لتفعيل EP. يجب أن يكون مضاعفًا لـtp_sizeوأن يقسمfsdp_size * tp_size. يتطلبep_size > tp_sizeقاعدة"ep_dispatch_experts"معep_implementationيقوم بتبادل الرموز، مثل"all_to_all". - ep_plan (
dict[str, str]، اختياري) — خطة تجزئة التوازي بين الخبراء. اتركهNoneلاستخدامbase_model_ep_planالمُعرَّفة مسبقًا في النموذج. مرِّر قاموسًا لتجاوز قواعد فردية في تلك الخطة؛ وتُحفظ القواعد غير المحددة. تُطبَّق فقط عندما يكونep_size > 1، وتأخذ قواعدها الأولوية على قواعدtp_planلنفس الوحدات. تتيح قاعدة"ep_dispatch_experts"لـep_implementationاختيار كيفية وصول الرموز إلى الخبراء. - ep_implementation (
str, اختياري, الافتراضي هو"auto") — كيف تجلب قاعدة"ep_dispatch_experts"الرموز للخبراء. إنها تحددEPImplementationمسجّلة فيEPImplementationInterface:"all_to_all"يتبادل الرموز الموجَّهة عبر مجموعات all-to-all."all_reduce"يشغّل خبراء كل رتبة على الدفعة التي يشاركها مجموعة EP، ويجمع المخرجات. ويتطلبep_size == tp_size."deepgemm_megamoe"يسلّم تلك الدفعة إلى DeepGEMM Mega MoE، حيث يقوم نواة (kernel) هذا الأخير بتبادل الرموز (tokens) بنفسه. يتم اختياره عند التحميل باستخدامexperts_implementation="deepgemm_megamoe"."auto"يشغّل"all_reduce"أثناء الاستدلال عندما تشارك مجموعة EP دفعة واحدة، و"all_to_all"في الحالات الأخرى.
إعدادات الاستدلال والتدريب الموزعين الأصليين باستخدام التوازي على مستوى الموترات أو خط الأنابيب أو FSDP2.