مقالة

تسريع السونار من خلال التخمين

شعاع ضوئي مجرد يتقاطع مع شكل هندسي، يرمز إلى تسريع توليد النماذج اللغوية الكبيرة

تسرع فك الشيفرة الافتراضية سرعة إنشاء نماذج اللغة الكبيرة (LLMs) باستخدام نموذج مسودة صغير وسريع لإنتاج مرشحين للإكمال يتم التحقق منهم بواسطة النموذج المستهدف الأكبر.

في ظل هذا النظام، بدلاً من تشغيل الهدف المكلف لإنتاج رمز واحد، يتم إصدار عدة رموز في خطوة واحدة. هنا نقدم تفاصيل تنفيذ الأنواع المختلفة لفك الشيفرة الافتراضية، المطبقة في Perplexity لتقليل زمن التأخير بين الرموز في نماذج Sonar.

فك الشيفرة الافتراضية

يستفيد فك الشيفرة الافتراضية من بنية اللغات الطبيعية والطبيعة الدائمة للخلط الذاتي للمحولين لتسريع توليد الرموز. على الرغم من أن النماذج الأكبر، مثل Llama-70B، تحمل المزيد من المعرفة مقارنةً بالنماذج الأصغر، مثل Llama-1B، فإنها تؤدي أحيانًا أداءً متشابهًا في بعض المهام البسيطة. يشير هذا التداخل إلى أن تسلسلات معينة يتم توليدها بشكل أفضل بواسطة النماذج الأقل تكلفة، تاركة المشاكل المعقدة للنماذج الأكبر. التحدي يكمن في تحديد أي إكمالات أفضل وما إذا كان توليد النموذج الأصغر من نفس جودة النموذج الأكبر.

لحسن الحظ، تعد LLM نماذج محولات دائمة: عندما يتم إعطاؤها سلسلة من الرموز، فإنها تخرج توزيع الاحتمالات للرمز التالي. بالإضافة إلى ذلك، تشير القيم المستخرجة من الميزات الوسيطة المرتبطة بالرموز في سلسلة الإدخال إلى مدى احتمال أن يقوم النموذج بإصدار تلك الرموز بالضبط. تتيح هذه الخاصية التكهن: إذا تم توليد سلسلة من الرموز بواسطة نموذج أصغر بدءًا من مقدمة إدخال، فيمكن تشغيله من خلال النموذج الأكبر لتحديد مدى توافقه مع النموذج المستهدف. يتم تقييم كل مقدمة من المرشحين باحتمالية ويتم اختيار الأطول فوق عتبة القبول. كإضافة، يوفر النموذج المستهدف أيضًا رمزًا لاحقًا مجانًا: إذا قام نموذج المسودة بتوليد n رموز، فيمكن إصدارها حتى n + 1 في خطوة واحدة.

في وقت الاستدلال، يمكن تقسيم عملية أخذ العينات الافتراضية تقريبًا إلى 4 مراحل:

  1. التعبئة المسبقة: يجب تشغيل النموذجين المستهدف والمسودة على سلسلة الإدخال لملء بيانات ذاكرة التخزين الوسيط (KV). بينما تستخدم بعض الخطط، مثل Medusa، طبقات بسيطة للتنبؤ، نركز في هذا المنشور على المسودات المستندة إلى التحويلات التي تحتاج إلى ذاكرة التخزين الوسيط الخاصة بها.

  2. توليد المسودة: يكرر نموذج المسودة لإنتاج عدد من الرموز الثابتة. يمكن أن تكون سلسلة المسودة خطية أو يمكن للنموذج استكشاف بنية شجرية حتى عمق معين (EAGLE، Medusa). هنا، نركز على التسلسلات الخطية.

  3. القبول: يعمل النموذج المستهدف على سلسلة المسودة، بناءً المغربات المطابق لكل رمز مسودة. يتم تحديد طول أطول سلسلة مقبولة.

  4. توليد الهدف: بما أن الهدف قد أنشأ المغربات، في الموقع غير المتطابق أو الطرف الخلفي للسلسلة، تتوافق هذه المغربات مع رمز لاحق. يمكن أخذ العينات من هذه المغربات لتوفير رمز قوي من الهدف، تكملة للسلسلة.

توجد طرق متنوعة لتنفيذ فك الشيفرة الافتراضية. في هذا المنشور، سنركز على الخطط التي استخدمناها لتسريع نماذج Sonar باستخدام نموذج داخلي الحجم 1B، وكذلك آليات التنبؤ التي نبنيها لتسريع النماذج بحجم DeepSeek.

الهدف-المسودة

يمكن تحقيق فك الشيفرة الافتراضية عن طريق ربط نموذج صغير موجود لـ LLM كنموذج مسودة بنموذج الهدف لتوليد تسلسلات مرشحة. في الإنتاج، قمنا بتسريع Sonar باستخدام نموذج Llama-1B المدرب على نفس مجموعة البيانات المستهدفة. بينما لم يتطلب هذا النهج تدريب مسودة من الصفر، إلا أن النموذج الصغير لا يزال يستخدم سعة كبيرة من ذاكرة التخزين الوسيط ويدخل زيادة طفيفة في الوقت المسبق، مما يزيد TTFT.

في ظل هذا النظام، يتكهن جهاز فك التشفير فقط على دفعات فك التشفير فقط، مولداً رموزاً من خلال أخذ العينات القياسية أثناء التعبئة المسبقة أو على دفعات التعبئة-الخاصة-المشتركة. في مرحلة التعبئة المسبقة، يتم أخذ عينات المغربات المستهدفة على الفور أيضًا للتعبئة مسبقًا للرمز الذي تم توليده حديثًا في ذاكرة التخزين الخاصة بالمسودة. لم يتم أخذ عينات المسودة بعد، لكن المغربات التي تنتجها يتم نقلها إلى مرحلة فك التشفير.

في فك التشفير، يتم تقدم نموذج المسودة، أخذ العينات من الرمز العلوي في كل مرحلة. بعد الوصول إلى الطول المطلوب للمسودة، يتم تشغيل الرموز من خلال النموذج المستهدف لإنتاج المغربات التي يقوم جهاز أخذ العينات بتحديد طول السلسلة المقبولة بناءً عليها. يتم تحديد القبول بمقارنة التوزيعات الاحتمالية الكاملة من المسودة والهدف. بما أن الهدف دائمًا يخرج مجموعة من المغربات بعد سلسلة المسودة المقبولة، يتم أخذ عينات منه لإنتاج مخرج إضافي. بما أن نموذج المسودة لم يشاهد ذلك الرمز المقبول بعد، يتم إعادة تشغيله لملء مدخلات ذاكرة التخزين الخاصة به استعدادًا للخطوة التالية من فك التشفير، ونقل المغربات مرة أخرى.

EAGLE

إيجل هو نظام فك شيفرة افتراضي يستكشف مسودات متعددة تسلسلات، يتم إنشاؤها من خلال اجتياز بنية شجرية للرموز المسودة المتوقع. يتم استكشاف شجرة ثابتة (EAGLE) أو ذات شكل ديناميكي (EAGLE-2) باستخدام تنفيذات متتابعة للرموز المسودة، مع اعتبار أفضل K مرشح في كل عقدة بدلاً من اتباع الرمز الأعلى تصنيفًا في سلسلة خطية. يتم بعد ذلك تسجيل التسلسلات ويتم اختيار الأطول منها للاستمرار، وإضافة رمز إضافي من الهدف.

من أجل تحقيق توقع أكثر دقة، لا يتنبأ نموذج مسودة EAGLE فقط على أساس الرموز، ولكن أيضاً باستخدام ميزات الهدف (الدول المخفية للطبقة الأخيرة) للنموذج المستهدف. العيب في EAGLE هو الحاجة إلى تدريب نماذج مسودة مخصصة وصغيرة دقيقة بما يكفي لتوليد مرشحين مناسبين ضمن ميزانية زمنية منخفضة. عادةً، يكون نموذج المسودة طبقة محول واحدة مطابقة لطبقة فك التشفير للنموذج الأصلي، التي ترتبط ارتباطًا وثيقًا بالهدف عن طريق ربطها مع الإسقاطات والرمز الرئيسي. بما أن هذا يتطلب قدرة منخفضة لذاكرة التخزين الوسيط، فإن EAGLE يكون ذو طابع ذاكرة منخفض.

للتحقق من التسلسلات الشبيهة بالشجرة في النموذج المستهدف، يجب استخدام أقنعة اهتمام مخصصة. للأسف، استخدام قناع اهتمام مخصص لتسلسل كامل يؤدي إلى تباطؤ كبير للانتباه لأطوال الإدخال الواقعية (بنسبة تصل إلى 50%)، مما يجعل بعض التسريع القابل للتحقيق من خلال التكهنات بلا فائدة. لم نقم بعد بنشر الاستكشاف الشجري الكامل للإنتاج لهذا السبب، وبدلاً من ذلك نركز على الحالة الخاصة بتنبؤ رمز واحد عبر السيناريوهات المشابهة لـMTP التي تم تقديمها في تقرير DeepSeek-V3 الفني.

MTP

هذا النظام مشابه لفك التشفير المسودة-الهدف، باستثناء أن الدول المخفية تستخدم بجانب الرموز للتنبؤ. يجب القيام بالعمل الإضافي قليلاً في كل من مراحل التعبئة المسبقة وفك التشفير مقارنة بالتكهن بالمسودة-الهدف المنتظم. يستخدم نموذج المسودة الرموز والدول المخفية: يتم أخذ رمز t_{i+1} من المغربات L_i المقابلة للرمز t_i، والتي تستنتج من الدول المخفية H_i. وبناءً عليه، يجب تحويل مخازن رموز الإدخال إلى اليسار خطوة واحدة بالنسبة إلى متجهات الدول المخفية الناتجة عن الهدف. يوضح الشكل أدناه الترابطات المستخدمة للتدريب، وكذلك التحول خلال الاستدلال.

تدفق فك التشفير مشابه جدًا لفك التشفير المسودة-الهدف، مع استخدام كل من الدول المخفية والمغربات. تشترك تنفيذنا في جميع عينات المعالجة والمغربات المرتبطة، وتخصص فقط دعوات النموذج للأمام. عندما يتم التنبؤ بعدة رموز، يستخدم نموذج المسودة الدول المخفية للمسودة لتنبؤ، أيضًا تعبئة مدخلات ذاكرة التخزين الوسيط بناءً على ميزاته الخاصة. على المدى الطويل، يمكن أن يقلل من الدقة. لاحقًا، عند تشغيل النموذج المسودة لتعبئة مدخلات ذاكرة التخزين الوسيط لتنبؤ الهدف، نقوم بتشغيله على السلسلة الكاملة بأخذ الدول المخفية الأكثر دقة كمدخلات. بما أن هذه النماذج المسودة صغيرة، فإن تكاليف معالجة الرموز الإضافية ضئيلة.

تدريب رؤوس MTP

من أجل الاستفادة من MTP، قمنا ببناء البنية التحتية اللازمة لتدريب رؤوس MTP المرفقة بنماذجنا المدربة خصيصًا على مجموعات بيانات Perplexity، تعمل على عقدة واحدة مع 8 أجهزة H100. في حوالي يوم واحد، يمكننا بناء رؤوس للنماذج تتراوح من Llama-1B إلى Llama-70B وDeepSeek V2-Lite. بالنسبة للنماذج الأكبر، نعتمد على رؤوس MTP التي تم بناءها أثناء عملية التدريب.

الهدف من تدريب MTP هو مطابقة الدول المخفية للمسودة والمغربات المستخلصه من الدول المخفية للهدف مع المغربات والدول المخفية للرمز التالي للهدف. بما أن الاستدلال للدول المخفية مكلف، فنحن نحسبها مسبقًا باستخدام تنفيذنا الذي يعمل على الاستدلال الأمثل للنموذج المستهدف، لاستخدامها خلال التدريب. ومع ذلك، للتحقق من تنفيذ MTP الخاص بالاستدلال وضمان عدم تأثر النتائج من الفروقات العددية بسبب التكميم أو التحسينات، لإثبات القوة والعمل على التنبؤ الدقيق نستخدم تنفيذ الاستدلال بالكامل لكل من النموذج المستهدف والمسودة.

عند التوسع من مجموعة بيانات ShareGPT المستخدمة في الورقة الأصلية إلى عينات أكبر، لاحظنا أن هندسة رأس MTP الموضحة والمنفذة في ورقة EAGLE فشلت في التدريب للنماذج بحجم 70B. على عكس ShareGPT الذي يحتوي على عدد أكبر من التسلسلات الأقصر، نحن ندرب على عدد أقل من المطالبات الأطول بشكل ملحوظ. نظرًا لأن الرؤوس الأصلية لـ EAGLE انحرفت قليلًا في البنية عن المحول النموذجي، قمنا بإعادة تقديم بعض طبقات التسوية RMS التي تم تجريدها. وجدنا أن هذا لا يسمح فقط بتقارب التدريب، بل إنه يعزز أيضًا دقة الرؤوس بنسبة بضع نقاط مئوية.

لا تسهل التسوية الطبقات التدريب فقط، بل إن إعادة تقديم التسويات أمر منطقي رياضيًا. تستخدم رؤوس MTP التضمينات (Embeddings) وإسقاط (Projections) المغربات للنموذج المستهدف، حيث يمكن أن تكون كبيرة الحجم جدًا (حوالي 2 جيجابايت لـ Llama 70B). خلال التدريب، يتم تجميد هذه التضمينات وإسقاطات المغربات، والتوقع استنساخ التضمينات في المساحة بنفس الكفاءة لإعادة العمليات المماثلة كما تعلمت طبقة الإسقاط للنموذج الأصلي خلال التدريب. بإسقاط التسويات، من المتوقع أن يتعلم MLP منفرد نفس الوظيفة مثل MLP متبوع بالتسوية، وهو ما يعيق التطابق بين الدول المخفية لنماذج المسودة والهدف.

الاستدلال مع فك الشيفرة الافتراضية

في محرك الاستدلال، من أجل توليد الرموز لسلاسل الإدخال، يجب أولاً تجميعها في دفعات ذات أحجام معقولة، ثم يجب تخصيص صفحات في ذاكرة التخزين الوسيط للرموز القادمة. يتم بعد ذلك تعبئة رموز الإدخال ومعلومات صفحة ذاكرة التخزين إلى ذاكرة تخزين مؤقتة يتم بثها إلى كل التصنيفات المتوازية التي تشغل النموذج. وأخيرا، يتم نسخ البيانات الوصفية إلى ذاكرة GPU ويتم تنفيذ النموذج لإنتاج المغربات التي يتم أخذ عينات الرمز التالي منها.

على عكس بعض التنفيذات التي تقترن بشكل غير محكم بين خادمي استدلال المسودة والهدف عبر غلاف ينظم الطلبات بينهما، تم ربط الأزواج المسودة-المستهدفة لدينا بشكل وثيق وتنفيذها خطوة بخطوة في التوليد. يتم مشاركة جدولة الدفعة وتخصيص صفحات ذاكرة التخزين الوسيط بين النماذج لجميع أشكال فك الشيفرة الافتراضية: هذا يوحد المنطق الذي يربط النموذج بمحرك الاستدلال الأكبر، حيث جميعهم يعرضون نفس الواجهة.

يتركز وقت الاستدلال في Perplexity حول FlashInfer، الذي يحدد البيانات الوصفية التي تحتاج إلى بنائها من أجل تكوين وجدولة نواة الاهتمام. بالنظر إلى بعض تسلسل الإدخال الذي يشكل دفعة، للإملاء، والفك، أو التحقق، يجب القيام بالعمل على جانب وحدة المعالجة المركزية (CPU) لتخصيص المخازن المؤقتة الوسيطة وملء المخازن الثابتة المستخدمة في الانتباه. يتم هذا العمل بالإضافة إلى تكلفة جدولة الدفعات وتخصيص صفحات ذاكرة التخزين الوسيط، والتي تتكبد أيضًا زمن تأخير يجب إخفاؤها من أجل تعظيم استخدام وحدة معالجة الرسومات (GPU).

بينما قمنا بتوازي كامل العمل الجانبي لوحدة المعالجة المركزية وGPU للاستدلال بدون التكهن، وجدنا أن التوازن CPU-GPU لفك الشيفرة الافتراضية أكثر تعقيدًا. يتمثل التحدي الرئيسي في أن عدد الرموز المقبولة يحدد طول السلسلة للتشغيل اللاحق، مما يقدم نقطة مزامنة بين GPU وCPU يصعب تجنبها. قمنا بتجربة مخططات جدولة مختلفة من أجل إخفاء أفضل لزمن تأخير العمل على المعالجة المركزية.

جدول المسودة-الهدف

على الرغم من كونها أصغر من النموذج المستهدف، عند استخدام LLM كامل كنموذج مسودة، فإنه لا يزال يقدم زمن تأخير كبير على GPU، مما يوفر بعض الوقت لتخفيف العمليات باهظة الثمن لوحدة المعالجة المركزية. بما أن النماذج الأصغر لا تستفيد من توازي التنسور، يوجد عدم تطابق في عدد التصنيفات التي يتم تقاسمها نموذج الهدف ونموذج المسودة. في تنفيذنا، يتم تشغيل نموذج المسودة فقط على تصنيف الزعيم لمجموعة TP.

كما هو موضح سابقًا، يحمل خطوة فك الرموز المغربات إلى التشغيل التالي. هذا يسمح بتداخل تنفيذ واحد لنموذج المسودة مع العمل على الشمول الجانبي لوحدة المعالجة المركزية لجدولة الدفعات. بعد جمع الدفعة معًا، يتم الاتصال المتكرر بجهاز أخذ العينات والمسودة لإنتاج رموز المسودة. بالتوازي، يتم تجميع الدفعة للتحقق منها للنموذج المستهدف ومزامنتها مع العمال المتوازين. يتم التحقق من المغربات المستهدفة وأخذ عينات لتحديد أطوال التسلسلات المقبولة. في هذه المرحلة، يتطلب المزامنة بين GPU وCPU لمعرفة أطوال التسلسلات التالية. بما أن نموذج المسودة يتم تشغيله فقط على العقدة القائدة، فإنه يتم إعداد الدفعة بالتتابع وتبدأ عملية تشغيلها لتعبئة مدخلات ذاكرemory التخزين الوسيط لها بالرمز الإضافي الذي أنتجته الهدف. يتم استخدام المغربات التي أنتجتها هذه المسودة في التشغيل الحالي لأخذ عينات الرمز الأول في التشغيل اللاحق. والأهم من ذلك، أثناء تشغيل المسودة، يمكن جدولة الدفعة التالية.

جدول MTP لرمز واحد

بينما لا يوفر وقت التشغيل بعد استكشاف مسودة الشجرة نمط النسور (Eagle)، قمنا بتنفيذ حالة خاصة لهذا النظام، مكونة سلسلة خطية من رموز المسودة أنتجها نموذج بحجم طبقة محول واحدة. يمكن استخدام هذا النظام لتنبؤ المسودة باستخدام الأوزان المفتوحة لـ DeepSeek R1. الحالة الفرعية لتنبؤ رمز واحد مثيرة للاهتمام، حيث تحقق طبقات MTP الكبيرة مستويات قبول عالية بما يكفي لتبرير تكلفتها.

جدولة MTP أكثر تعقيدًا بعض الشيء، حيث أن نموذج المسودة أسرع بكثير، ما يخفي زمن تأخير أقل على جانب وحدة المعالجة المركزية. بالإضافة إلى ذلك، يتم تقسيم المسودة جنبًا إلى جنب مع النموذج المستهدف، مما يتطلب نقل الذاكرة المشتركة لمعلومات الدفعة. يبدأ تشغيل عن طريق نقل معلومات الدفعة وأخذ عينات الرمز الأول من مغربات التمديد، مماثلًا للنظام السابق. بعد ذلك، يتم تشغيل الهدف للتحقق من الرموز، معالجة 2 * D رمزًا، حيث أن D هو حجم دفعة فك التشفير. هذا مثالي للدفع المصغر في نماذج مزيج الخبراء (MoE) على الروابط الأبطأ مثل InfiniBand، حيث تنقسم الدفعة بالتساوي إلى قسمين متساويين. الدول المخفية للهدف تحمل إلى تشغيل المسودة التالي، بينما يتم تمرير المغربات إلى جهاز أخذ العينات للتحقق.

من خلال إجراء مقدار محدود من العمل الإضافي على GPU، نتفادى المزامنة بين وحدة المعالجة المركزية وGPU بعد قبول سلسلة المسودة. بعد نقل رموز الأهداف إلى اليسار، يعمل نواة على إعداد الرموز المستهدفة التالية في مواقعها المطابقة. يتم بعد ذلك إعادة تشغيل المسودة بنفس معلومات الدفعة مثل الهدف، وتعبئة مدخلات ذاكرة التخزين الوسيط وبناء المغربات والدول المخفية للتشغيل اللاحق، مما ينفذ بعض العمل الزائد على الرموز التي لم تقبل. في هذه الحالات، لا يكاد يكون زمن تأخير العمل غير المستخدم قابلًا للقياس بسبب حجم نموذج المسودة الصغير. بالتوازي مع تشغيل المسودة، يتم تحديد أطوال التسلسلات على وحدة المعالجة المركزية ويتم بدء عملية جدولة الدفعة التالية، دون الحاجة إلى انتظار انتهاء العمل على GPU.

يجدر بالذكر أن العمل الإضافي في طبقة المسودة غير ملحوظ في الانتباه، بينما طبقات الـMLP أكثر إشكالية. بما أن تعليمات الضرب الصفري للمصفوفات تضبط لحدود 64 على طول بُعد عدد الرموز، إذا لم يتطلب التضاعف كتلًا أكثر بشكل ملحوظ، فإن العمل الإضافي يظل مخفيًا. بالنسبة لتسلسلات المسودة الأطول، يكون العمل الإضافي أكثر تكلفة والنظام المستخدم للنماذج المسودة-الهدف يعمل بشكل أفضل.

المراجع

مهتم بالمساهمة في تشكيل مستقبل منصة API الخاصة بنا؟ نحن نوظف.

انضم إلى مجتمع المطورين لدينا للبقاء على اطلاع دائم بالإصدارات الجديدة والميزات والتحديثات.

مهتم بالمساهمة في تشكيل مستقبل منصة API الخاصة بنا؟ نحن نوظف.

انضم إلى مجتمع المطورين لدينا للبقاء على اطلاع دائم بالإصدارات الجديدة والميزات والتحديثات.

مهتم بالمساهمة في تشكيل مستقبل منصة API الخاصة بنا؟ نحن نوظف.

انضم إلى مجتمع المطورين لدينا للبقاء على اطلاع دائم بالإصدارات الجديدة والميزات والتحديثات.