نماذج ومنصات الذكاء الاصطناعي
SGLang: تنفيذ فعال للبرامج النصية المنظمة
تستخدم نماذج اللغة الكبيرة (LLMs) بشكل متزايد في مهام معقدة تتطلب مكالمات توليد متعددة وتقنيات تحفيز متقدمة وسيطرة على تدفق ومدخلات ومخرجات منظمة. ومع ذلك ، فإن الأنظمة الفعالة لبرمجة وتشغيل هذه التطبيقات ناقصة. يهدف SGLang ، وهو نظام تم تقديمه حديثًا ، إلى解决 هذه القضية من خلال تقديم تنفيذ فعال للبرامج النصية المعقدة. يتكون SGLang من لغة واجهة أمامية ووقت تشغيل. تسهل واجهة المستخدم الأمامية البرمجة باستخدام البريميات للتحكم في التوليد والتوازي ، بينما يعزز وقت التشغيل التنفيذ من خلال تحسينات جديدة مثل RadixAttention لإعادة استخدام ذاكرة التخزين المؤقت KV وآلات الحالة المنتهية المضغوطة لفك التشفير البطيء للمخرجات المنظمة. تظهر التجارب أن SGLang يحقق ما يصل إلى 6.4 أضعاف معدل الإنتاجية الأعلى مقارنة بنظم الاستدلال الحالية في نماذج اللغة الكبيرة والمتعددة الأشكال المختلفة ، وتحديد المهام مثل التحكم في الوكيل والاستدلال المنطقي واختبارات التعلم القليل وتنسيق JSON وخطوط الأنابيب المعززة بالاسترجاع وتوليد المحادثة المتعددة.
التقدم الأخير في قدرات LLMs扩ع من فائدته ، مما يسمح لها بمعالجة مجموعة أوسع من المهام العامة وتعمل كوكلاء مستقلين. في هذه التطبيقات ، تشارك LLMs في التخطيط المتعدد والاستدلال والتفاعل مع البيئات الخارجية. يتم تسهيل ذلك من خلال استخدام الأدوات وعدة طرق إدخال وتقنيات التحفيز المختلفة ، مثل التعلم القليل والتوافق الذاتي وهيكل الفكرة وشجرة الفكرة. هذه الحالات الجديدة تتطلب مكالمات متعددة غالبًا ما تعتمد على LLMs ، مما يشير إلى اتجاه استخدام هياكل متعددة المكالمات لإكمال المهام المعقدة.
تعتبر هذه التحول علامة على الانتقال من استخدام الدردشة البسيط إلى استخدام برنامجي أكثر تعقيدًا لل LLMs ، حيث يجدول البرامج وتسيطر على عمليات التوليد LLMs. يشار إلى هذه البرامج باسم “برامج نموذج اللغة” (LM Programs). تقنيات التحفيز المتقدمة وسير عمل الوكيل تقع في نطاق برامج LM. هناك خاصيتان شائعتان لبرامج LM: (1) غالبًا ما تتضمن برامج LM مكالمات متعددة LLMs متبوعة بتدفق تحكم لإكمال المهام المعقدة وتحسين الجودة بشكل عام. (2) تتلقى برامج LM مدخلات منظمة وتنتج مخرجات منظمة ، مما يتيح تجميع برامج LM وتكاملها في الأنظمة البرمجية الحالية.
في هذه المقالة ، سنقوم بتحليل أعمق في إطار SGLang ، واستكشاف هيكله ، وتحليل أدائه ، ومقارنته بالهياكل الحالية. لذا دعونا نبدأ.
مقدمة في SGLang
على الرغم من استخدام برامج LM على نطاق واسع ، فإن الأنظمة الحالية لتعبيرها وتنفيذها لا تزال غير فعالة. يحدد SGLang两个 تحديات رئيسية متعلقة بالاستخدام الفعال لبرامج LM:
- تعقيد البرمجة: تطوير برامج LM هو أمر متعب وصعب بسبب الطبيعة غير المتوقعة لل LLMs. يتضمن هذا التعامل المتكرر للسلاسل ، وضبط التحفيز التجريبي ، وتنسيق الإخراج الهش ، ومعالجة عدة طرق إدخال ، وتنفيذ آليات التوازي. يقلل هذا التعقيد بشكل كبير من可 قراءة حتى البرامج البسيطة.
- عدم كفاءة التنفيذ: تنفيذ برامج LM غير فعال بسبب الحسابات المتكررة واستخدام الذاكرة. لا تملك محركات الاستدلال الحالية ، التي تم تحسينها لتقليل التأخير وتحسين الإنتاجية ، المعرفة المباشرة بالحمل ، مما يؤدي إلى عدم كفاءة كبيرة. مثال ملحوظ هو إعادة استخدام ذاكرة التخزين المؤقت KV ، التي تتكون من متجهات وسيطة قابلة لإعادة الاستخدام ضرورية للاستدلال التوليدي. تفتقر الأنظمة الحالية إلى آليات فعالة لتسهيل إعادة استخدام ذاكرة التخزين المؤقت KV عبر مكالمات متعددة LLMs التي تشترك في بادئة مشتركة ، مما يؤدي إلى حسابات غير ضرورية وذاكرة مخلفة.
للتغلب على هذه التحديات ، يقدم SGLang لغة توليد منظمة لل LLMs. الفكرة الأساسية هي الاستفادة منهياكل متعددة المكالمات في برامج LM لتنفيذ فعال. كما هو موضح في الشكل التالي ، SGLang يتكون من جزأين: لغة واجهة أمامية ووقت تشغيل.

تسهل واجهة المستخدم الأمامية برمجة برامج LM ، ويعزز وقت التشغيل تنفيذها. يمكن أن تعمل هذه الأجزاء معًا لتحقيق أداء أفضل أو تعمل بشكل مستقل.
SGLang هو لغة محددة المجال مضمنة في Python ، يوفر بريميات للتحكم في التوليد (مثل extend و gen و select) وآليات التوازي (مثل fork و join). وهو متوافق مع تدفق التحكم و المكتبات الخاصة ب Python ، مما يسمح للمستخدمين بتطوير سير عمل تحفيز متقدم بسهولة باستخدام بناء الجملة الأصلي ل Python. SGLang يتضمن مترجم ومترجم. يدير المترجم حالة التحفيز كتيار ويقدم العمليات البريمية إلى التيار للتنفيذ غير المحظور ، مما يضمن التحكم الصحيح على التزامن والتوازي داخل البرنامج. بالإضافة إلى ذلك ، يمكن تتبع برامج SGLang وتجميعها لتحسينات إضافية.
- RadixAttention: هذه التقنية تمكن من إعادة استخدام ذاكرة التخزين المؤقت KV تلقائيًا عبر مكالمات متعددة. في محركات الاستدلال الحالية ، يتم التخلص من ذاكرة التخزين المؤقت KV بعد معالجة الطلب ، مما يمنع إعادة استخدامها عبر مكالمات متعددة وゆوءد التنفيذ. SGLang يحتفظ بذاكرة التخزين المؤقت LRU لذاكرة التخزين المؤقت KV داخل شجرة الراديكس ، ويدير ذاكرة التخزين المؤقت KV كذاكرة تخزين مؤقت تقليدية ويستخدم شجرة الراديكس للبحث الفعال والإدراج والإقلاع.
- آلة الحالة المنتهية المضغوطة: هذه التقنية تمكن من فك التشفير البطيء للمخرجات المنظمة. الأنظمة الحالية تتبع القيود فقط للرمز التالي ، مما يجعلها قادرة على فك التشفير رمزًا واحدًا في كل مرة. بدلاً من ذلك ، SGLang يتحليل القيود ويبني آلة الحالة المنتهية المضغوطة لتمثيلها ، مما يضغط مسار متعدد الرموز إلى خطوة واحدة متاحة ، مما يسمح بفك التشفير عدة رموز في وقت واحد لزيادة السرعة.
- تنفيذ API التكهنات: لموديلات API فقط مثل OpenAI’s GPT-4 ، SGLang يقدم تنفيذ API التكهنات لتحسين برامج متعددة المكالمات.
باستخدام SGLang ، تم تنفيذ تطبيقات LLMs مختلفة ، بما في ذلك التحكم في الوكيل والاستدلال المنطقي واختبارات التعلم القليل وتنسيق JSON وخطوط الأنابيب المعززة بالاسترجاع ومحادثة متعددة وتحليل متعدد الأشكال. تم اختبار الأداء على نماذج بما في ذلك Llama-7B/70B و Mistral-8x7B و LLaVA-v1.5-7B (صورة) و LLaVA-NeXT-34B (فيديو) على NVIDIA (NVDA ) A10G و A100 GPUs. تظهر النتائج التجريبية أن SGLang يحقق ما يصل إلى 6.4 أضعاف معدل الإنتاجية الأعلى عبر مجموعة واسعة من أحمال العمل والنماذج وإعدادات الأجهزة ، مقارنة بنظم البرمجة والاستدلال الحالية ، بما في ذلك Guidance و vLLM و LMQL.
SGLang: نموذج البرمجة والمنهجية
يتم تقديم نموذج برمجة SGLang من خلال مثال تشغيل ، ووصف بريميات اللغة ووضع التنفيذ ، وتحديد فرص التحسين في وقت التشغيل. هذا النموذج يبسط العمليات المتعبة في سير العمل متعددة المكالمات (مثل التعامل مع السلاسل و呼وء API وقيود التنسيق والتوازي) من خلال تقديم بريميات مرنة وقابلة للتكوين. SGLang هو لغة محددة المجال مضمنة في Python.

الوظيفة multi_dimensional_judge تأخذ ثلاثة حجج: `s` و `path` و `essay`. `s` يدير حالة التحفيز ، `path` هو مسار الملف ، و `essay` هو نص المقال. يمكن إضافة سلاسل جديدة وبريميات SGLang إلى حالة `s` للتنفيذ باستخدام عامل +=. أولاً ، تضيف الوظيفة الصورة والمقال إلى التحفيز. ثم ، يتحقق مما إذا كان المقال متعلقًا بالصورة باستخدام select ، ويخزن النتيجة في s[“related”]. إذا كان متعلقًا ، يُقسم التحفيز إلى ثلاث نسخ متوازية لتقييم متوازي من أبعاد مختلفة ، باستخدام gen لتخزين النتائج في f[“judgment”]. بعد ذلك ، يدمج الأحكام ، ويولد ملخصًا ، ويعين درجة حرفية. أخيرًا ، يعود بالنتائج بتنسيق JSON ، يتبع مخططًا محددًا بواسطة قيد تنسيق منتظم.
SGLang يوفر بريميات للتحكم في حالة التحفيز والتوليد والتوازي ، والتي يمكن استخدامها بناء الجملة و المكتبات الخاصة ب Python.
gen: يدعو نموذجًا لتوليد النتائج وتخزينها في متغير باسم محدد في الحجة الأولى. يدعم gen حجة regex لفرض قيود على الإخراج لتتبع قواعد محددة بتنسيق منتظم.
- select: يدعو نموذجًا لاختيار الخيار الأعلى احتمالية من قائمة.
- += أو extend: يضيف سلسلة إلى التحفيز.
- [variable_name]: يسترجع نتائج التوليد.
- fork: يخلق فوركات متوازية لحالة التحفيز.
- join: يعيد دمج حالة التحفيز.
- image و video: يأخذ إدخال الصورة والفيديو.
الطريقة الأكثر بساطة لتنفيذ برنامج SGLang هي من خلال مترجم ، حيث يتم التعامل مع التحفيز كتيار غير محظور. يتم تقديم بريميات مثل extend و gen و select إلى التيار للتنفيذ غير المحظور. هذه المكالمات غير المحظورة تسمح للكود Python بالاستمرار في التشغيل دون انتظار انتهاء التوليد ، مشابهة لإطلاق نوى CUDA بشكل غير محظور. كل تحفيز يُدار بواسطة منفذ التيار في خيط خلفي ، مما يسمح بالتوازي داخل البرنامج. سوف يمنع استرجاع نتائج التوليد حتى تكون جاهزة ، مما يضمن التزامن الصحيح. بدلاً من ذلك ، يمكن تجميع برامج SGLang كرسوم حسابية وتنفيذها بمحرك الرسم ، مما يسمح بمزيد من التحسينات.
يمكن تصنيف أنظمة البرمجة ل LLMs إلى أنظمة عالية المستوى (مثل LangChain و DSPy) و thấp المستوى (مثل LMQL و Guidance و SGLang). توفر الأنظمة عالية المستوى تحفيزات مسبقة أو تلقائية ، مثل تحفيز DSPy. الأنظمة منخفضة المستوى عادة لا تغير التحفيزات ولكن تسمح بالتحكم المباشر في التحفيزات والبريميات. SGLang هو نظام منخفض المستوى مشابه لـ LMQL و Guidance.

SGLang يركز على كفاءة وقت التشغيل ويأتي مع وقت تشغيل مصمم معه ، مما يسمح بتحسينات جديدة. يمكن تجميع لغات عالية المستوى (مثل DSPy) إلى لغات منخفضة المستوى (مثل SGLang). تم демонstration دمج SGLang كخلفية في DSPy لتحسين كفاءة وقت التشغيل.

يوضح المثال السابق عمليات RadixAttention مع سياسة الإقلاع LRU عبر تسع نقاط زمنية ، مما يظهر التطور الديناميكي لشجرة الراديكس استجابة لطلبات مختلفة. هذه الطلبات تشمل جلستين محادثة ، وجلسة استفسار التعلم القليل ، ونمذجة التكامل الذاتي.
الخطوة 1: شجرة الراديكس فارغة في البداية.
الخطوة 2: يعالج الخادم رسالة مستخدم قادمة “مرحبا” ويرد بالخرج LLM “هي”. يتم دمج التحفيز النصي ، ورسالة المستخدم “مرحبا!” ، ورد LLM “هي!” في الشجرة كحافة واحدة متصلة بnode جديدة.
الخطوة 3: يصل تحفيز جديد ، ويجد الخادم البادئة من التحفيز (أي الدورة الأولى من المحادثة) في شجرة الراديكس ويستعيد ذاكرة التخزين المؤقت KV. يتم إضافة الدورة الجديدة إلى الشجرة كعقدة جديدة.
الخطوة 4: تبدأ جلسة محادثة جديدة. يتم تقسيم العقدة من الخطوة 3 إلى عقدتين لتمكين الجلستين من مشاركة التحفيز النصي.
الخطوة 5: تستمر الجلسة الثانية من المحادثة. ومع ذلك ، بسبب قيود الذاكرة ، يجب إقلاع عقدة من الخطوة 4. يتم إضافة الدورة الجديدة بعد العقدة المتبقية من الخطوة 4.
الخطوة 6: يصل استفسار التعلم القليل ، ويعالج ، ويتم إدراجه في الشجرة. يتم تقسيم العقدة الجذرية لأن الاستفسار الجديد لا يشارك بادئة مع العقد الحالية.
الخطوة 7: يصل المزيد من استفسارات التعلم القليل. هذه الاستفسارات تشترك في نفس مجموعة أمثلة التعلم القليل ، لذلك يتم تقسيم عقدة من الخطوة 6 لتمكين المشاركة.
الخطوة 8: يصل رسالة جديدة من الجلسة الأولى للمحادثة. يتم إقلاع جميع العقد من الجلسة الثانية للمحادثة لأنها أقل استخدامًا مؤخرًا.
الخطوة 9: يصل طلب لتحفيز المزيد من الإجابات للأسئلة في عقدة من الخطوة 8 ، على الأرجح لتحفيز التكامل الذاتي. يتم إقلاع عدة عقد لجعل जगह لهذه الطلبات.
يوضح هذا المثال كيف يتعامل RadixAttention مع التخصيص الديناميكي والإقلاع للعقد استجابة لطلبات مختلفة ، مما يضمن إعادة استخدام ذاكرة التخزين المؤقت KV وفعالية إدارة الذاكرة.
SGLang: التقييم والنتائج
النتائج على نماذج الوزن المفتوح
تظهر النتائج التالية في الشكل التالي. SGLang يحسن الإنتاجية بنسبة تصل إلى 6.4 أضعاف ويقلل من التأخير بنسبة تصل إلى 3.7 أضعاف. هذه التحسينات ناتجة عن إعادة استخدام ذاكرة التخزين المؤقت KV و استغلال التوازي داخل البرنامج وفك التشفير البطيء للمخرجات المنظمة.

على هذه الاختبارات ، تتراوح نسبة ضربة الذاكرة بين 50% و 99%. الشكل 13 (المرفق) يُظهر معدلات الضربة المثالية والفعلية للذاكرة ، مما يُظهر أن جدولة SGLang الحساسة للذاكرة تصل إلى 96% من معدل الضربة المثالي.

النتائج على نماذج أكبر مع توازي التنسور
تم اختبار نماذج أكبر ، Mixtral-8x7B و Llama-70B ، مع توازي التنسور على نفس مجموعة الاختبارات ، وتم الإبلاغ عن النتائج في الشكل التالي. يُظهر تحسين السرعة على النماذج الأكبر اتجاهًا مشابهًا لما لوحظ على النماذج الأصغر ، مما يشير إلى أن تحسينات SGLang تعمل جيدًا على النماذج الأكبر.

النتائج على نماذج متعددة الأشكال
SGLang يدعم نماذج متعددة الأشكال بشكل أصلي مع بريميات الصورة والفيديو. التحسينات في هذه الورقة متوافقة مع نماذج متعددة الأشكال. بالنسبة إلى RadixAttention ، يتم حساب هاش الإدخال الصورة ويتم استخدامه كمفتاح في شجرة الراديكس ، مما يسمح بإعادة استخدام ذاكرة التخزين المؤقت KV لرموز الصورة من نفس الصورة.

النشر الإنتاجي
تم نشر SGLang في Chatbot Arena لخدمة نماذج الوزن المفتوح. بسبب حركة مرور منخفضة لبعض النماذج ، يخدم كل عامل SGLang نموذجًا واحدًا فقط. بعد شهر ، تمت ملاحظة نسبة ضربة ذاكرة RadixAttention بنسبة 52.4% ل LLaVA-Next-34B و 74.1% ل Vicuna-33B. جاءت ضربات الذاكرة من رسائل النظام الشائعة والصور التوضيحية الشائعة وتاريخ المحادثة المتعددة. هذا قلل من تأخير الرمز الأول بمتوسط 1.7 أضعاف ل Vicuna-33B.

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












