فصل التعبئة المسبقة وفك التشفير
فصل التعبئة المسبقة وفك التشفير عبر الأجهزة يسرع استدلال نماذج اللغات الكبيرة ويحسن الأداء
من أجل توليد الرموز الناتجة من موجه الإدخال، يتم تقسيم استدلال نماذج اللغات الكبيرة (LLM) إلى مرحلتين: التعبئة المسبقة (Prefill) وفك التشفير (Decode). تعمل التعبئة المسبقة على رموز الإدخال، وتقوم بملء ذاكرة التخزين المؤقت لـ KV، قبل الانتقال إلى مرحلة فك التشفير التي تولد الرموز واحداً تلو الآخر. وبينما تستغرق خطة فك التشفير الواحدة عادةً عشرات الملي ثوانٍ، فإن التعبئة المسبقة تستغرق وقتاً أطول بكثير. وإذا تم تشغيلهما على الأجهزة نفسها، فإن دمج التعبئة المسبقة مع فك التشفير يؤدي إلى تدهور أداء فك التشفير. في هذه المقالة، نستكشف حلاً راسخاً في شكل فصل التعبئة المسبقة عن فك التشفير، وتشغيلهما على أجهزة منفصلة لتحقيق أقصى استفادة من معدل نقل التعبئة المسبقة وزمن وصول فك التشفير.
أداء التعبئة المسبقة مقابل فك التشفير
في محرك خدمة نماذج اللغات الكبيرة النموذجي، يختار مجدول الدفعات الطلبات المراد معالجتها في كل خطوة تنفيذ للنموذج. عند التشغيل على جهاز أو عقدة واحدة، يتم تجميع طلبات التعبئة المسبقة وفك التشفير معاً. تكلفة الانتباه (attention)، التي تتجمع على طول طول التسلسل، تنمو لكل من التعبئة المسبقة وفك التشفير، بشكل تناسبي مع طول الإدخالات في ذاكرة التخزين المؤقت لـ KV (kv_len). عادةً ما تُمرر طلبات فك التشفير رمزاً واحداً (qo_len=1)، بتكلفة ضئيلة عبر الطبقات الأخرى التي تعمل بشكل مستقل على رموز التسلسل. بينما تُمرر طلبات التعبئة المسبقة الآلاف أو عشرات الآلاف من الرموز بتكلفة كبيرة عبر الطبقات الكثيفة (qo_len الكبير).
يتأثر زمن الوصول في تمرير أمامي بشكل أكبر بعدد الرموز المستقلة المارة عبر الطبقات الكثيفة (qo_len) مقارنةً بعدد الرموز المسترجعة من ذاكرة التخزين المؤقت KV أثناء الانتباه (kv_len). يمكن للانتباه أن يوازي كلاً من عدد الطلبات وkv_len بما يتناسب مع أطوال التسلسل، محققًا استخدامًا جيدًا للموارد. مرحلة prefill مقيدة بالحوسبة: ومع ارتفاع qo_len، يمكن لنوى GEMM تخصيص عدد كافٍ من الكتل على طول البعد M للاستفادة الكاملة من قدرات الحوسبة في وحدات معالجة الرسومات الحديثة. مرحلة decode مقيدة بالذاكرة: وبسبب أحجام الدُفعات المنخفضة عادةً، يكون عدد المدخلات على طول M صغيرًا في العادة، وهو ما يكفي لكتلة واحدة فقط. وبينما يمكن لنوى GEMM من نوع Split-K تحسين استخدام SM عند أحجام دفعات رمزية منخفضة، فإن ذاكرات التخزين المؤقت ووحدات ضرب المصفوفات تظل عادةً غير مستغلة بالكامل.
عند دمجها معاً، تتكبد الدفعات التي تحتوي على طلبات للتعبئة المسبقة أوقات وصول أعلى خلال عملية التمرير الأمامي، مما يؤثر سلباً على معدل نقل فك التشفير للنموذج بأكمله. وفي حين أن دمج طلبات التعبئة المسبقة مع طلبات فك التشفير أو توظيف التعبئة المسبقة المقطعة يمكن أن يحسن أداء فك التشفير قليلاً، إلا أنه من الصعب الحفاظ على معدل نقل كافٍ للتعبئة المسبقة لمعالجة ما يكفي من الطلبات على المثيل لزيادة معدل نقل فك التشفير إلى أقصى حد. وفي حالة النماذج الكبيرة، ذات أطوال الإخراج النوذجية، للحفاظ على حجم دفعة كبير لفك التشفير، يجب إجراء التعبئة المسبقة بشكل متكرر لدرجة أنها تدهور متوسط زمن الوصول بشكل كبير وتسبب تقطيعاً في الإخراج.
يمكن معالجة هذه المشكلات باستخدام مجموعة منفصلة من العقد لتنفيذ التعبئة المسبقة وفك التشفير. من خلال ربط عقدة تعبئة مسبقة بعقد فك تشفير متعددة، يمكن جدولة طلبات كافية للتعبئة المسبقة لتحقيق أقصى معدل نقل والحفاظ على عدد كبير بما يكفي من الطلبات المتزامنة على عقد فك التشفير لزيادة معدل نقل فك التشفير إلى أقصى حد أيضاً. تقوم عقد التعبئة المسبقة بملء ذكريات التخزين المؤقت لـ KV، والتي يتم نقلها بعد ذلك إلى عقد فك التشفير. ونظراً لأن وحدات فك التشفير لم تعد بحاجة للتوقف مؤقتاً للتعبئة المسبقة، تصبح أوقات الوصول أكثر حتمية بكثير، حيث يكون التأثير الإجمالي لنمو kv_len للطلبات النشطة أقل وضوحاً بكثير. ويتم دفع التكلفة في زيادة الوقت حتى الرمز الأول (TTFT)، حيث يمكن أن يستغرق نقل ذكريات التخزين المؤقت لـ KV عبر الشبكة عشرات إلى مئات الملي ثوانٍ.
راسل KV (KV Messenger)
في Perplexity، تم بناء تطبيقنا لفصل التعبئة المسبقة وفك التشفير حول نظام مراسلة KV الذي يتفاعل مع محرك LLM لتنسيق عمليات نقل ذاكرة التخزين المؤقت لـ KV من عقد التعبئة المسبقة إلى عقد فك التشفير عبر الشبكة. على جانب التعبئة المسبقة، يقبل المراسل الطلبات من عقد فك التشفير، ويسلمها إلى مجدول الدفعات ويتتبع تنفيذ التمرير الأمامي لإرسال ذكريات التخزين المؤقت لـ KV بأقل زمن وصول ممكن. وعلى جانب فك التشفير، بعد تخصيص الصفحات التي لا يمكن إخلاؤها، يقوم المراسل بحظر الطلب من الجدولة لفك التشفير حتى يتم إخطاره بإتمام عمليات نقل ذاكرة التخزين المؤقت لـ KV وسياق فك التشفير.
يتطلب فصل التعبئة المسبقة اتصالات عالية الإنتاجية ومنخفضة زمن الوصول، وبالتالي فإن تنفيذنا مصمم خصيصاً لتقنية RDMA، مع دعم كل من وحدات تحكم واجهة شبكة EFA وConnectX (NICs). تم بناء راصل KV على libfabric، باستخدام غلافنا fabric-lib لتوفير تجريدات عالية المستوى ومنخفضة زمن الوصول فوق أساسيات الوصول المباشر عن بعد للذاكرة (RDMA)، وتنفيذ عمليات نقل فعالة للصفحات والبيانات الوصفية، إلى جانب الإشارات منخفضة زمن الوصول. في الخلفية، تنسق fabric-lib وحدة معالجة رسومات (GPU) وواجهات شبكة متصلة بها مباشرة لنسخ البيانات من عقدة التعبئة المسبقة إلى عقدة فك التشفير.
عند الاستلام، تخصص عقدة التعبئة المسبقة مجموعة مقابلة من صفحات KV المصدرية وتجدول الطلب للتعبئة المسبقة باستخدام محركها المحلي. لتقليل زمن الوصول، لا تنتظر عمليات النقل التمرير الأمامي: بدلاً من ذلك، يتم بدء عمليات نسخ صفحات KV بمجرد أن ينتهي النموذج من إلحاق إدخالات ذاكرة التخزين المؤقت لـ KV بذاكرة التخزين المؤقت لـ KV للطبقات الفردية. ونظراً لأنه يمكن تقطيع طلبات التعبئة المسبقة، يقوم مجدول الدفعات بإخطار راسل KV بالقطع المجدولة حالياً قبل التنفيذ. لدعم رسوم بيانية CUDA مع القدرة على تتبع الطبقات، يحتفظ المراسل بسلسلة مخصصة تراقب عداداً تتم زيادة قيمته بعد إسقاط الإخراج للانتباه. يتم الاحتفاظ بالعداد فقط على العقدة الرئيسية في بيئة مجزأة: على الرغم من أن إدخالات ذاكرة التخزين المؤقت لـ KV تكون صالحة بعد الإلحاق وقبل الانتباه، إلا أن إسقاط الإخراج يتم تقليصه عبر الرتب، مما يؤدي إلى مزامنتها ضمناً. بمجرد ملاحظة تغيير في العداد، يتم إخطار المراسل ويقوم باستدعاء fabric-lib لبدء نقل الطبقة.
بعد اكتمال نقل القطعة الأخيرة، يتم أيضاً نسخ أي بيانات وصفية إضافية: يتطلب فك التشفير التخميني أو MTP نقل السجلات (logits) والحالات المخفية إلى وحدة فك التشفير. يتم إجراء عمليات النسخ هذه أيضاً من خلال RDMA، إلى ومن مخازن مؤقتة مخصصة مسبقاً.
عند اكتمال جميع عمليات النقل المعلقة للقطعة الأخيرة، تقوم عقدة التعبئة المسبقة بإلغاء تخصيص صفحات KV وتكمل الطلب. لا يتم إخطار عقدة فك التشفير صراحةً: بدلاً من ذلك، تستخدم العدادات الفورية لتتبع عدد العمليات المكتملة. عدد عمليات RDMA على جانب التعبئة المسبقة يتناسب طردياً مع عدد الصفحات المنقولة. عند اكتمال العدد المعروف من عمليات نسخ الصفحات والسياق، تدعو fabric-lib راسل KV للإشارة إلى أن الطلب جاهز لفك التشفير. يقوم المراسل بإلغاء تخصيص أي سياق وتسليم الطلب إلى محرك LLM.
عمليات نقل ذاكرة التخزين المؤقت لـ KV المجزأة
إذا كانت أداة التعبئة المسبقة ووحدة فك التشفير تعتمدان على التوازي الموثق (Tensor Parallelism - TP) وتقومان بتجزئة أو تكرار ذكريات التخزين المؤقت لـ KV بشكل متطابق، فإن محرك نقل واحد ينسق أجهزة متعددة لإرسال واستقبال صفحات جميع النسخ المتماثلة. من أجل היכולת لاستخدام مراسل واحد ومحرك نقل واحد على الرغم من حقيقة أن منفذ النموذج مكرر عبر أجهزة وprocesses متعددة، يتم استخدام cuMem وcuMemImportFromShareableHandle لتخصيص ذاكرة الجهاز الداعمة لذاكرات التخزين المؤقت لـ KV وتعيينها في العملية الرئيسية. يفحص محرك النقل طوبولوجيا العقدة للعثور على واجهات الشبكة ووحدات المعالجة المركزية (CPUs) في عقدة NUMA الأقرب لاستخدامها في نقل كل شريحة من شرائح ذاكرة التخزين المؤقت لـ KV.
إذا كان المصدر والوجهة مجزأين بشكل متطابق، تكون عمليات النقل تافهة نظراً وجود تعيين واحد لواحد من الأجهزة والصفحات للمصدر والوجهة. في هذه الحالة، تساعد التجزئة ضمناً في أوقات نقل زمن الوصول: باستخدام المزيد من وحدات معالجة الرسومات، يمكن استخدام المزيد من واجهات الشبكة المرتبطة، مما يقترب من الاستخدام الكامل لعرض النطاق الترددي. ومع ذلك، إذا كان هناك عدم تطابق، يجب على محرك النقل تقسيم أو إعادة بناء الصفحات اعتماداً على النسبة بين شرائح المصدر والوجهة.
إذا قامت أداة التعبئة المسبقة بتقسيم ذاكرة التخزين المؤقت لـ KV عبر المزيد من الأجهزة، تتم إعادة بناء الصفحات الكاملة على وحدة فك التشفير عن طريق إرسال النصفين المقابلين من أجهزة التعبئة المسبقة. إذا كان لدى وحدة فك التشفير المزيد من التجزئات، فإنها تتلقى صفحات من مصادر متعددة. تحتاج وحدة فك التشفير إلى معرفة مخطط التجزئة لأداة التعبئة المسبقة لكي تتمكن من حساب عدد كتابات RDMA المتوقع استقبالها. إذا كان النسخ المتماثل متورطاً، تقوم أداة التعبئة المسبقة بتجميع الأجهزة في مجموعات نسخ متماثل تنسخ ذاكرة التخزين المؤقت لـ KV الكاملة فيما بينها. يتم تعيين مجموعات النسخ المتماثل الوجهة عشوائياً لأحد مجموعات المصدر من أجل استخدام جميع الأجهزة المتاحة لبدء كتابات RDMA.
تتطلب عمليات النقل المجزأة تعديلاً طفيفاً على ذاكرات التخزين المؤقت لـ KV. افتراضياً، تعتمد FlashInfer على تخطيط NHD، والذي يرتّب الرموز داخل الصفحة داخل الرؤوس. نظراً لأن ذاكرات التخزين المؤقت مجزأة على الأرجح على طول عدد رؤوس الانتباه، فإن هذا يخلق انقطاعاً داخل الرأس. لا تدعم عمليات نقل RDMA كتابات الفترات (strided writes) ضمناً، مما يتطلب عملية واحدة لكل رأس لإجراء النقل. بدلاً من ذلك، من أجل تقليل عدد التفاعلات مع libfabric، نقوم بتنظيم ذكريات التخزين المؤقت لـ KV باستخدام تخطيط HND الذي يضع بُعد الرأس قبل عدد الرموز. هذا يضمن الاستمرارية، مما يسمح بسبخ صفحة كاملة بعملية كتابة واحدة.
فك التشفير التخميني
يتطلب فك التشفير التخميني تعديلات طفيفة على عملية التعبئة المسبقة وفك التشفير المفصولة. في تنفيذنا، لا يُسمح لعقد التعبئة المسبقة بأخذ عينات من الرموز. نظراً لأن نماذج Sonar التابعة لـ Perplexity تدعم الإخراج المهيكل، فإننا لا نريد تحمل تعقيد مزامنة تنفيذ معالج المخطط عبر أدوات التعبئة المسبقة ووحدات فك التشفير. في آليات MTP وفك التشفير التخميني، تتضمن تعبئة النموذج المسودة مسبقاً حتى الرمز الأخير أخذ عينات من الرموز من النموذج المستهدف.
للتغلب على هذه المشكلات، لا تتضمن التعبئة المسبقة الرمز الأخير لتسلسل الإدخال. بدلاً من ذلك، يتم نقل الحالات المخفية أو السجلات (logits) من التعبئة المسبقة السابقة للرمز الأخير ويتم التعامل معها كرمز فك تشفير في الخطوة التالية على وحدة فك التشفير. وفي حين أن هذا يزيد من أوقات الوصول قليلاً، حيث يجب إجراء خطوة فك تشفير كاملة بعد التعبئة المسبقة لإصدار الرمز الأول، إلا أنه يتم تقليل تعقيد التنفيذ بشكل كبير.
عمليات النشر المفصولة
لقد قمنا بنشر أو تجربة تكوينات مفصولة متعددة مع نماذج مختلفة، لدعم إما حركة مرور الإنتاج أو أحمال عمل التقييم الداخلية. بناءً على حجم وآلية الانتباه للنماذج، اخترنا مخططات تجزئة مناسبة لعقد التعبئة المسبقة وفك التشفير للاستفادة القصوى من وحدات معالجة الرسومات.
DeepSeek-R1
مع DeepSeek، نظرنا في عمليات نشر التوازي الموثق (TP) والتوازي البيانات (DP). كما هو مناقش في منشورات المدونة السابقة، توفر عمليات نشر TP زمناً أفضل للوصول وتكلفة إنتاجية أقل، مما يتطلب المزيد من وحدات معالجة الرسومات لخدمة حركة المرور الكثيفة. تتدرج عمليات نشر DP بشكل أفضل بكثير مع الحمل، ومع ذلك فإن إنتاجيتها القصوى تكون أقل بسبب تكلفة الاتصال بين الأجهزة أو بين العقد.
تعتمد DeepSeek على الانتباه الكامن متعدد الرؤوس (Multi-Head Latent Attention)، مما يضغط ذكريات التخزين المؤقت لـ KV. ونظراً لضغط جميع رؤوس KV في متجه كامن واحد، لا تستطيع TP تجزئة ذكريات التخزين المؤقت لـ KV، حيث يجب عليها بدلاً من ذلك تكرار المتجهات الكامنة على جميع الرتب. تحدث التجزئة بعد إلغاء الضغط، حيث يمكن لكل رتبة استخراج رؤوس مختلفة من نفس التمثيل الكامن. ونتيجة لذلك، تكون جميع تجزئات ذاكرة التخزين المؤقت لـ KV متطابقة عبر كل من تجزئات التعبئة المسبقة وفك التشفير.
مع إعداد TP داخل العقدة، تتم تجزئة كل من أدوات التعبئة المسبقة ووحدات فك التشفير بشكل متطابق. يتم إرسال عمليات النقل من جميع الرتب للاستفادة الكاملة من جميع واجهات الشبكة المتاحة. ومع ذلك، مع نشر DP، حيث يكون حجم رتبة TP أقل أو يتم تعيين كل رتبة DP لوحدة معالجة رسومات واحدة، يمكن لأي جهاز تعبئة مسبقة يحتوي على نسخة مكررة من ذاكرة التخزين المؤقت لـ KV إرسالها. لموازنة الطلبات عبر جميع واجهات الشبكة المتاحة، نختار عشوائياً وحدة معالجة رسومات وواجهة شبكة لإرسال ذاكرة التخزين المؤقت لـ KV من أداة التعبئة المسبقة إلى وحدة فك التشفير.
مع الدمج بين التعبئة المسبقة وفك التشفير، كان نشر R1 الخاص بنا يكافح لتجاوز 50 رمزاً في الثانية (TPS) باستمرار بسبب مقاطعات التعبئة المسبقة المتكررة التي تتراوح في حدود مئات الملي ثوانٍ. في المقابل، من خلال فصل التعبئة المسبقة، تكبدنا عقوبة بحوالي 100 مللي ثانية في TTFT لكل طلب، ولكن يمكن لعقدة تعبئة مسبقة واحدة الحفاظ على أحجام دفعات متسقة على 3 عقد لفك التشفير، مما يوفر معدل نقل يتجاوز 90 TPS مع التعامل مع حمل يبلغ حوالي 1 طلب في الثانية (QPS) لكل عقدة فك تشفير. مع عمليات النشر المتوازية للبيانات، كان معدل TPS أقل قليلاً بحوالي 50، ومع ذلك يمكن للمثيلات التعامل مع حمل قدره 1 QPS لكل رتبة، مع وجود 8 رتب لعقدة واحدة.
Qwen3-Coder
يستخدم هذا النموذج ذو الحجم 480B انتباه الاستعلام المجمع (GQA)، لذا يمكن تجزئة الانتباه بسهولة والاستفادة من التوازي الموثق دون التضحية بالذاكرة لذكريات التخزين المؤقت لـ KV. ونتيجة لذلك، يمكننا تجزئة النموذج عبر 8 وحدات معالجة رسومات لكل من التعبئة المسبقة وفك التشفير، مع ربط حوالي 3 عقد فك تشفير بعقدة تعبئة مسبقة واحدة. ونظراً لتجزئة الانتباه، فإننا نعتمد على تخطيط ذاكرة التخزين المؤقت HND KV لتجزئة ذكريات التخزين المؤقت لـ KV لأداة التعبئة المسبقة ووحدة فك التشفير، مع ربط رتب التعبئة المسبقة برتب فك التشفير والاستفادة الكاملة من جميع واجهات الشبكة لنقل الشرائح بالتوازي.
اقتباس
@online{perplexity2025DisaggregatedPrefillAndDecode,
author = {{Perplexity} and Nandor Licker and Lequn Chen and Kevin Hu and Erin McKnight and Phi Hoang},
title = {{Disaggregated prefill and decode}},
date = {2025-08-01},
url = {https://perplexity.coolkeypoint.com/hub/blog/disaggregated-prefill-and-decode}
}