Transformers documentation
واجهات الخلفية للخبراء
واجهات الخلفية للخبراء
تنفّذ جميع تطبيقات مزيج الخبراء (MoE) نفس العملية الحسابية على المستوى العالي. لكل رمز، يختار الموجّه k من الخبراء. ثم يُسقط حالة الرمز المخفية عبر معاملات الخبراء المختارين وتُجمَع باستخدام أوزان التوجيه. يكمن الفرق بين واجهات الخلفية للخبراء في كيف تُنفَّذ عمليات ضرب المصفوفات الخاصة بتلك الخبراء.
يوفر ExpertsInterface واجهات خلفية مُحسّنة للخبراء. إنه يفصل تنفيذ الخبراء عن كود النموذج لتسهيل التجارب مع دوال مختلفة. أضف واجهات خلفية جديدة من خلال نفس الواجهة.
| خلفية الخبراء | الوصف | وحدة معالجة الرسوميات | وحدة المعالجة المركزية |
|---|---|---|---|
"eager" | تنفيذ مرجعي يتكرر على الخبراء المحددين ويطبّق الإسقاطات على رموزهم. | أداء أساسي معقول دون الحاجة إلى التجميع. | أبطأ من grouped_mm لكن أسرع من batched_mm. |
"batched_mm" | ينسخ معاملات الخبير المحدد لكل رمز ويحسب إسقاط جميع الرموز في دفعة واحدة باستخدام torch.bmm. | Fastest للمدخلات الصغيرة، خاصةً عند استخدام التجميع. يستهلك ذاكرة أكبر بسبب تكرار المعلمات. | غير موصى به (أبطأ بكثير من الخوادم الخلفية الأخرى). |
"grouped_mm" | ترتّب الرموز (Tokens) حسب الخبراء المختارين وتستخدم torch.nn.functional.grouped_mm لإسقاط جميع الرموز في عملية GEMM مجمّعة واحدة (يتطلب PyTorch 2.9 أو أحدث). | يُعدّ الخيار الأفضل للمدخلات الأكبر حجمًا وأكثر كفاءةً في استخدام الذاكرة لأنه يتجنّب تكرار معاملات الخبراء. سريع عند استخدام التجميع. | أكثر الخوادم الخلفية كفاءةً لجميع أحجام المدخلات. |
"deepgemm" | ترتّب الرموز حسب الخبير المحدد وتُرجِع جميع الرموز في عملية GEMM مجمّعة واحدة متوافقة مع TMA باستخدام نواة DeepGEMM من kernels-community/deep-gemm. | واجهة خلفية أصلية لنماذج DeepSeek على Hopper (SM90+) وBlackwell (SM100+)؛ تدعم bfloat16 والخبراء المُكمَّمين بصيغتي FP8/FP4. | غير مدعوم (CUDA فقط). |
"deepgemm_megamoe" | يجمع بين توزيع الخبير المتوازي، وشبكة MLP البوابة (الإسقاط الصاعد، SwiGLU، الإسقاط الهابط)، ومزج EP في نواة DeepGEMM Mega MoE واحدة، مع تداخل عمليات نقل NVLink مع حسابات نواة المصفوفات. | Blackwell (SM100+) فقط، للخبراء المُكمّينين بـ FP4 الذين يعملون بالتوازي بين الخبراء. | غير مدعوم (CUDA فقط). |
"sonicmoe" | يُدمج مسار bfloat16 الخاص بـ MoE (توجيه الموزّع، الإسقاط الصاعد البوَّاب، التفعيل، الإسقاط الهابط) في نواة CuteDSL الخاصة بـ grouped-GEMM (من مكتبة quack) من kernels-community/sonic-moe. | أداء ذروة في الإنتاجية على Hopper (SM90+) لخبراء bfloat16 مع تفعيل مُبوَّب (SwiGLU/GeGLU/ReGLU)، لا سيما في التدريب. | غير مدعوم (CUDA فقط). |
تعمل واجهتا "batched_mm" و"grouped_mm" أيضًا على الخبراء المُكمّمين بدقة FP8 وFP4 (المُجمّعة بصيغة int8) عبر نواة Triton finegrained-fp8، مع قراءة مقاييس بصيغة float32 أو UE8M0. وتُشكّل هاتان الواجهتان الخيار الاحتياطي للنقاط الفحصية المُكمّمة عندما لا تكون واجهة "deepgemm" متاحة.
التبديل في مرحلة فك الترميز
على وحدة معالجة الرسوميات (GPU)، يتحول النموذج المحمّل باستخدام experts_implementation="grouped_mm" تلقائيًا إلى "batched_mm" لمرحلة فك الترميز (decode) من التوليد، وهو ما يكون أسرع بكثير عند عدد الرموز المنخفض. يتم استعادة الخلفية الأصلية بمجرد انتهاء التوليد. أما على وحدة المعالجة المركزية (CPU)، فتبقى grouped_mm نشطة طوال عملية التوليد لأنها أكثر كفاءة عند جميع أحجام المدخلات.
تصل عملية التبديل إلى طبقات MoE في النموذج على المستوى الأعلى وفي أي هيكل أساسي فرعي، مثل text_config لنموذج الرؤية واللغة. فقط إدخالات grouped_mm تتحول إلى batched_mm. أما الخبراء الذين يعملون بأي واجهة خلفية أخرى فيحتفظون بها.
تعيين خلفية الخبراء
استخدم الحجة experts_implementation في from_pretrained() لإنشاء نموذج مع واجهة خلفية محددة للخبراء.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen1.5-MoE-A2.7B",
dtype="bfloat16",
experts_implementation="batched_mm",
)يمكنك التبديل بين واجهات الخلفيات للخبراء أثناء التشغيل دون إعادة تحميل النموذج باستخدام set_experts_implementation().
model.set_experts_implementation("eager")اقرأ الخلفية (backend) قيد التشغيل حاليًا باستخدام get_experts_implementation(). تُعيد هذه الدالة dict يحتوي على إدخال واحد للنموذج، وإدخال واحد لكل إعداد فرعي (sub-config).
model.get_experts_implementation()
# {"": "grouped_mm", "text_config": "grouped_mm", "vision_config": "eager"}خلفية الخبراء المحددة للعمود الفقري
يمكن أن تحتوي النماذج متعددة الوسائط على عدة إعدادات فرعية (على سبيل المثال، هياكل أساسية مختلفة). يمكنك تعيين خلفية خبراء مختلفة لكل إعداد فرعي عن طريق تمرير dict إلى experts_implementation عند التحميل.
يجب أن تتطابق المفاتيح في الترميز مع أسماء الإعدادات الفرعية.
from transformers import AutoModelForImageTextToText
experts_implementation_per_backbone = {
"text_config": "grouped_mm",
"vision_config": "eager",
}
model = AutoModelForImageTextToText.from_pretrained(
"Qwen/Qwen3-VL-Moe",
experts_implementation=experts_implementation_per_backbone,
)اضبط واجهة الخبراء الخلفية على مستوى النظام باستخدام مفتاح فارغ.
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen1.5-MoE-A2.7B",
experts_implementation={"": "batched_mm"},
)DeepGEMM
يوجّه الخلفية "deepgemm" عمليات ضرب المصفوفات للخبراء عبر نواة DeepGEMM التي توزعها kernels-community/deep-gemm. تعمل مع خبراء bfloat16 غير مُكمّين ومع خبراء مُكمّينين بصيغة FP8/FP4 يتم تحميلهم عبر Fine-grained FP8.
يتطلب الخلفية "deepgemm":
- وحدة معالجة رسومات CUDA بقدرات حسابية ≥ 9.0 (Hopper أو أحدث).
- حزمة CUDA كاملة تتضمن
nvccلتجميع النواة عبر JIT، بإصدار 12.3 أو أحدث على Hopper و12.9 أو أحدث على Blackwell. التثبيت الذي يحتوي على وقت التشغيل فقط لا يتضمنnvccويُرفض. يحدد Transformers الحزمة عبرCUDA_HOME، ثمCUDA_PATH، ثمnvccفيPATH، ثم/usr/local/cuda. - حزمة kernels.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"deepseek-ai/DeepSeek-V3",
dtype="bfloat16",
experts_implementation="deepgemm",
)يتم تحميل النواة بشكل كسول عند أول تمرير أمامي.
الخبراء المُكمَّمون بصيغتي FP8 وFP4
عادةً ما تكون نقاط التفتيش بنمط DeepSeek مُكمّمة مسبقًا وتحمل إعدادات التكميم الخاصة بها، لذا لا حاجة إلى تمرير FineGrainedFP8Config. يختار الخلفية "deepgemm" تلقائيًا نواة GEMM المجمّعة FP8 (أو FP4 على Blackwell). تتطلب DeepGEMM مقاييس تنشيط ديناميكية لكل صف (activation_scheme="dynamic") وترفض تكميم التنشيط الثابت (لكل مُتجه).
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"deepseek-ai/DeepSeek-V3",
experts_implementation="deepgemm",
)بالنسبة لأوزان الخبراء المُجمّعة بصيغة FP4 (على غرار DeepSeek V4)، يجب أن يكون المعالج الرسومي (GPU) من طراز SM100 أو أحدث (Blackwell). عادةً ما يحدد تكوين نقطة الحفظ (checkpoint) expert_dtype="fp4" وscale_fmt="ue8m0".
على Blackwell (SM100+)، تتطلب نواة الخبراء
"deepgemm"و"deepgemm_megamoe"مقاييس خبراء UE8M0 تكون قوى للعدد 2. يؤدي تحميل نقطة تحقق (checkpoint) مُكمّمة بمقاييسfloat32عادية (scale_fmt="float") إلى رفعValueErrorفي أول تمريرة أمامية بدلاً من إتلاف المخرجات بصمت. حمّل نقطة تحقق مُكمّمة بـscale_fmt="ue8m0"، أو انتقل إلىgrouped_mmأوbatched_mm، والتي تستهلك مقاييس الكتلfloat32مباشرةً. تستهلك Hopper (SM90+) مقاييسfloat32على مسار DeepGEMM دون أي تحويل.
السبب الرئيسي لتمرير FineGrainedFP8Config لنقطة تحقق مُكمّاة مسبقاً هو فكّ تكميمها مرة أخرى إلى bfloat16، وفي هذه الحالة تعمل الخبراء في bfloat16 بدلاً من مسار DeepGEMM الخاص بـ FP8/FP4.
from transformers import AutoModelForCausalLM, FineGrainedFP8Config
model = AutoModelForCausalLM.from_pretrained(
"deepseek-ai/DeepSeek-V3",
quantization_config=FineGrainedFP8Config(dequantize=True),
experts_implementation="deepgemm",
)دمج ميجا مو إي على بلاكويل
على Blackwell (SM100+)، اضبط experts_implementation="deepgemm_megamoe" لتشغيل نواة مدمجة واحدة تجمع بين توزيع الخبراء بالتوازي، الإسقاط الصاعد، SwiGLU، الإسقاط الهابط، وتجميع EP، مع تداخل عمليات نقل NVLink مع حسابات نوى المصفوفات.
يتطلب هذا الخادم الخلفي:
- وحدة معالجة رسومات Blackwell (قدرة الحوسبة ≥ 10.0) مع مجموعة أدوات CUDA (
nvcc) الإصدار 12.9 أو أحدث. - أوزان الخبراء المُجمّعة بصيغة FP4 مع مقاييس أوزان بصيغة UE8M0 (يُعلن نقطة التفتيش المُسبقة التكميم عادةً عن
expert_dtype="fp4"وscale_fmt="ue8m0"في ملف الإعداد الخاص بها). - مجموعة عمليات
torch.distributedلمجموعة التوازي بين الخبراء، والتي يوفرها التغليف الخاص بالتوازي بين الخبراء تلقائياً عندما يكونep_size > 1.
import os
from transformers import AutoModelForCausalLM, DistributedConfig
distributed_config = DistributedConfig(
tp_size=int(os.environ["WORLD_SIZE"]),
ep_size=int(os.environ["WORLD_SIZE"]),
)
model = AutoModelForCausalLM.from_pretrained(
"deepseek-ai/DeepSeek-V4",
experts_implementation="deepgemm_megamoe",
distributed_config=distributed_config,
)SonicMoE
يجمع الخلفية "sonicmoe" بين تمرير MoE الموجَّه (الإرسال، الإسقاط الصاعد البوَّابي، التفعيل، الإسقاط الهابط) في مجموعة من نواة CuteDSL المجمَّعة GEMM المُحسَّنة للغاية، المبنية على مكتبة quack والموزَّعة عبر kernels-community/sonic-moe.
يتطلب الخلفية "sonicmoe":
- وحدة معالجة رسومات CUDA بقدرات حسابية ≥ 9.0 (Hopper أو أحدث).
- حزمة kernels وحزمة
nvidia-cutlass-dsl. - الخبراء الذين لديهم تفعيل مُتحكَّم به (
silu،gelu، أوrelu، مُرتبط بـ SwiGLU/GeGLU/ReGLU).
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen1.5-MoE-A2.7B",
dtype="bfloat16",
experts_implementation="sonicmoe",
)If the requirements aren’t met, the forward raises ImportError and you should pick a different experts_implementation.
torch.compile
تتوافق واجهات "eager" و"batched_mm" و"grouped_mm" مع torch.compile بدرجات متفاوتة. تلخص الجدول التالي مدى توافقها. أما واجهات "deepgemm" و"deepgemm_megamoe" و"sonicmoe" فتعبر عبر نوى CUDA خارجية، لذا لا يشملها هذا الجدول.
| التنفيذ | أوضاع الترجمة | أنواع البيانات | fullgraph=True |
|---|---|---|---|
grouped_mm | None, max-autotune-no-cudagraphs | bfloat16 | نعم |
grouped_mm (بديل احتياطي) | None, max-autotune-no-cudagraphs | bfloat16, float16, float32 | نعم |
batched_mm | الكل | bfloat16, float16, float32 | نعم |
eager | الكل | bfloat16, float16, float32 | لا |
ملاحظات:
- يدعم مُنفّذ الخبراء
grouped_mmحالياًbfloat16فقط عند تجميعه باستخدامtorch.compile. بالإضافة إلى ذلك، فهو غير متوافق مع رسوم CUDA، لذا يجب عليك استخدامmode=Noneأوmode="max-autotune-no-cudagraphs"عند التجميع. - يستخدم الخلفية
eagerللخبراء عملية تعتمد على البيانات للعثور على الخبراء الذين يُستخدمون في تمريرة أمامية. هذه العملية غير متوافقة مع تجميع الرسم البياني الكامل (fullgraph=True).
import torch
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen1.5-MoE-A2.7B",
dtype="bfloat16",
experts_implementation="grouped_mm",
device_map="auto",
).eval()
# Works for grouped_mm (no CUDA graphs)
model.forward = torch.compile(model.forward, mode="max-autotune-no-cudagraphs")المعايير
يقارن هذا اختبار المعيار بين أحجام مدخلات مختلفة وتنفيذات الخبراء مع torch.compile وبدونه.