Connect with us

SGLang: تنفيذ كفء لبرامج النماذج اللغوية المهيكلة

الذكاء الاصطناعي

SGLang: تنفيذ كفء لبرامج النماذج اللغوية المهيكلة

mm
SGLang: Efficient Execution of Structured Language Model Programs

تُستخدم نماذج اللغة الكبيرة (LLMs) بشكل متزايد لأداء مهام معقدة تتطلب عدة مكالمات للتنفيذ، وتقنيات التوجيه المتقدمة، وflux التحكم، ومدخلات ومخرجات مهيكلة. ومع ذلك، فإن الأنظمة الكفئة لبرمجة وتنفيذ هذه التطبيقات ناقصة. يهدف SGLang، نظام تم تقديمه حديثًا، إلى解决 هذه القضية من خلال توفير تنفيذ كفء لبرامج النماذج اللغوية المعقدة. يتكون SGLang من لغة واجهة أمامية ووقت تشغيل. تُبسط واجهة المستخدم الأمامية البرمجة باستخدام البريميتيفات للتنفيذ والتحكم في التوازي، بينما يسرع وقت التشغيل التنفيذ من خلال تحسينات جديدة مثل RadixAttention لإعادة استخدام ذاكرة التخزين المؤقت KV وآلات الحالة المنتهية المضغوطة لأسرع فك التشفير للمخرجات المهيكلة. تُظهر التجارب أن SGLang يتحقق من خلاله حد أقصى للناتج يصل إلى 6.4 مرة أعلى مقارنة بنظم الاستدلال الحالية في نماذج اللغة الكبيرة والمتعددة الوسائط المختلفة، ومهام مثل التحكم في الوكيل والاستدلال المنطقي واختبارات التعلم من القليل وتنسيق JSON وخطوط أنابيب التوليد المعزز بالاسترجاع و聊 多-التحول.

تُظهر التطورات الحديثة في قدرات LLMs توسيع نافذة فائدتهم، مما يسمح لهم بمعالجة مجموعة أوسع من المهام العامة ووظائفها كوكلاء مستقلين. في هذه التطبيقات، تُشارك LLMs في التخطيط المتعدد الجولات والاستدلال والتفاعل مع البيئات الخارجية. يتم تسهيل ذلك من خلال استخدام الأدوات وعدة طرق إدخال وتنسيقات توجيه مختلفة، مثل التعلم من القليل والتوافق الذاتي وهيكل التفكير و شجرة التفكير. هذه الحالات الجديدة ت đòiن مكالمات متعددة وغالبًا ما تعتمد على LLMs، مما يشير إلى اتجاه استخدام هياكل متعددة المكالمات لإكمال المهام المعقدة.

تُشير هذه التحول إلى انتقال من المحادثة البسيطة إلى استخدام برنامجي أكثر تعقيدًا لنماذج اللغة، حيث يجدول البرامج ويتحكم في عمليات التوليد لنماذج اللغة. وتُسمى هذه البرامج “برامج نموذج اللغة” (LM Programs). تقنيات التوجيه المتقدمة وعمليات الوكيل تقع ضمن نطاق برامج LM. هناك خاصتان شائعتان لبرامج LM: (1) غالبًا ما تتضمن برامج LM مكالمات متعددة من LLMs متبوعة بflux التحكم لإكمال المهام المعقدة وتحسين الجودة الإجمالية. (2) تتلقى برامج LM مدخلات مهيكلة وتنتج مخرجات مهيكلة، مما يسمح بتركيب برامج LM وتكاملها في الأنظمة البرمجية الحالية.

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

مدخل إلى SGLang

على الرغم من استخدام برامج LM على نطاق واسع، فإن الأنظمة الحالية لتعبيرها وتنفيذها لا تزال غير كفئة. يحدد SGLang تحديين أساسيين مرتبطين بالاستخدام الكفء لبرامج LM:

  • تعقيد البرمجة: تطوير برامج LM هو أمر متعب وصعب بسبب الطبيعة غير المتوقعة لنماذج اللغة الكبيرة. يتضمن هذا تعاملات سلسلة متطورة، وتحسين تنبؤات تجريبي، وتركيب مخرجات هشة، وتحكم في عدة طرق إدخال، وتنفيذ آليات التوازي. يقلل هذا التعقيد بشكل كبير من قابلية قراءة البرامج البسيطة.
  • عدم كفاءة التنفيذ: تنفيذ برامج LM هو غير كفء بسبب الحساب والاستخدام المتكرر للذاكرة. تفتقر محركات الاستدلال الحالية، التي تم تحسينها لتقليل التأخير وتحسين الإنتاجية، إلى معرفة مباشرة بالحمل، مما يؤدي إلى عدم كفاءة كبيرة. مثال ملحوظ هو إعادة استخدام ذاكرة التخزين المؤقت KV، التي تتكون من تензورات وسيطة قابلة لإعادة الاستخدام ضرورية للاستدلال التوليدي. تفتقر الأنظمة الحالية إلى آليات فعالة لتسهيل إعادة استخدام ذاكرة التخزين المؤقت KV عبر مكالمات LLM متعددة التي تشترك في بادئة مشتركة، مما يؤدي إلى حسابات غير ضرورية وذاكرة مهدرة. بالإضافة إلى ذلك، فإن فك التشفير المقيد للمخرجات المهيكلة، مثل وضع JSON، هو غير مثالي لأن الأنظمة الحالية تفك فقط رمزًا واحدًا في كل مرة.

لمواجهة هذه التحديات، يقدم SGLang لغة توليد مهيكلة لنماذج اللغة. الفكرة الأساسية هي استغلال الهيكل المتعدد المكالمات في برامج LM بشكل منهجي من أجل التنفيذ الكفء. كما هو موضح في الشكل التالي، يتكون SGLang من جزأين: لغة واجهة أمامية ووقت تشغيل.

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

SGLang هو لغة محددة النطاق مدمجة في Python، يوفر بريميتيفات للتنفيذ (مثل extend و gen و select) وبريميتيفات للتحكم في التوازي (مثل fork و join). إنه متوافق مع flux التحكم و المكتبات في Python، مما يسمح للمستخدمين بتطوير تدفقات توجيه متقدمة بسهولة باستخدام بناء الجملة الأصلي ل Python. يتضمن SGLang محولًا و مترجمًا. يدير المحول حالة التوجيه كتيار ويقدم عمليات بريميتيف إلى التيار للتنفيذ غير المتزامن، مما يضمن التحكم الصحيح في التزامن والتوازي داخل البرنامج. بالإضافة إلى ذلك، يمكن تتبع برامج SGLang وتجميعها من أجل تحسينات إضافية. يقترح وقت تشغيل SGLang عدة تحسينات جديدة لتسريع تنفيذ برامج LM:

  • RadixAttention: هذه التقنية تمكن من إعادة استخدام تلقائي لذاكرة التخزين المؤقت KV عبر مكالمات توليد متعددة. في محركات الاستدلال الحالية، يتم التخلص من ذاكرة التخزين المؤقت KV لطلب بعد المعالجة، مما يمنع إعادة استخدامها عبر مكالمات متعددة ويبطئ التنفيذ. يحتفظ SGLang بذاكرة التخزين المؤقت LRU لذاكرة التخزين المؤقت KV داخل شجرة الراديكس، ويدير ذاكرة التخزين المؤقت KV كذاكرة تخزين مؤقت تقليدية، ويستخدم شجرة الراديكس للمطابقة والإدراج والإقلاع الفعالين. هذا يسمح لوقت التشغيل بمعالجة أنماط إعادة استخدام مختلفة بكفاءة.
  • آلة الحالة المنتهية المضغوطة: هذه التقنية تمكن من فك تشفير أسرع للمخرجات المهيكلة. تتبع الأنظمة الحالية القيود فقط للرمز التالي، مما يجعلها قادرة على فك تشفير رمز واحد في كل مرة. بدلاً من ذلك، يقوم SGLang بتحليل القيود و بناء آلة حالة منتهية مضغوطة لتمثيلها، مما يضغط مسار متعدد الرموز إلى خطوة واحدة متاحة، مما يسمح بفك تشفير رموز متعددة في وقت واحد من أجل سرعة أسرع.
  • تنفيذ التكهنات API: لموديلات API فقط مثل موديل GPT-4 من OpenAI، يقدم SGLang تنفيذًا تكهنًا API لتحسين برامج متعددة المكالمات.

باستخدام SGLang، تم تنفيذ تطبيقات LLM مختلفة، بما في ذلك التحكم في الوكيل والاستدلال المنطقي واختبارات التعلم من القليل وتنسيق JSON وخطوط أنابيب التوليد المعزز بالاسترجاع وچات متعدد التحولات ومعالجة المتعددة الوسائط. تم اختبار الأداء على نماذج بما في ذلك Llama-7B/70B و Mistral-8x7B و LLaVA-v1.5-7B (صورة) و LLaVA-NeXT-34B (فيديو) على معالجات الرسومات NVIDIA A10G و A100. تُظهر النتائج التجريبية أن 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، يتبع مخططًا محددًا بتعبير منتظم regex. يُبسط SGLang هذا البرنامج، حيث سيتطلب برنامج مكافئ باستخدام واجهة API مشابهة ل OpenAI 2.1 مرة أكثر من أسطر التعليمات البرمجية بسبب التعامل اليدوي مع السلاسل والتحكم في التوازي.

يوفر SGLang بريميتيفات للتحكم في حالة التوجيه، والتنفيذ، والتوازي، والتي يمكن استخدامها مع بناء الجملة و المكتبات في Python. هنا هي البريميتيفات:

gen: يستدعي نموذجًا لتنفيذ التوليد ويوفر النتائج في متغير باسم محدد في معاملته الأولى. يدعم معامل regex لتقيد الإخراج بgrammar محدد بتعبير منتظم (مثل مخطط JSON).

  • select: يستدعي نموذجًا لاختيار الخيار الأعلى احتمالية من قائمة.
  • += أو extend: يضيف سلسلة إلى التوجيه.
  • [variable_name]: يسترجع نتائج التوليد.
  • fork: يخلق فروعًا متوازية لحالة التوجيه.
  • join: يجمع حالة التوجيه.
  • image و video: يأخذان مدخلات الصورة والفيديو.

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

يمكن تصنيف أنظمة البرمجة لنماذج اللغة إلى أنظمة عالية المستوى (مثل LangChain و DSPy) و منخفضة المستوى (مثل LMQL و Guidance و SGLang). توفر الأنظمة عالية المستوى توجيهات محددة أو تلقائية، مثل محسن توجيه DSPy. الأنظمة منخفضة المستوى عادة لا تغير التوجيهات ولكن تسمح بالتحكم المباشر في التوجيهات والبريميتيفات. SGLang هو نظام منخفض المستوى مشابه ل LMQL و Guidance.

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

يوضح المثال السابق عمليات RadixAttention مع سياسة الإقلاع LRU عبر تسع نقاط زمنية، مما يظهر تطور شجرة الراديكس الديناميكي استجابة لطلبات مختلفة، بما في ذلك جلسات محادثة و مجموعة من استفسارات التعلم من القليل و عينة لتحليل التكامل.

الخطوة 1: شجرة الراديكس فارغة في البداية.

الخطوة 2: يقوم الخادم بمعالجة رسالة مستخدم قادمة “Hello” ويرد بالخرج “Hi”. يتم دمج توجيه النظام ورسالة المستخدم ورد نموذج اللغة في الشجرة كحافة واحدة متصلة ب节点 جديد.

الخطوة 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 تعمل بشكل جيد على نماذج أكبر. تم استبعاد Guidance و LMQL بسبب نقص التنفيذ الكفء لتوازي التنسور.

النتائج على نماذج متعددة الوسائط

يتمتع SGLang بدعم أصلي لنماذج متعددة الوسائط مع بريميتيفات الصورة والفيديو. التحسينات في هذه الورقة متوافقة مع نماذج متعددة الوسائط. بالنسبة إلى RadixAttention، يتم حساب هاش الإدخال الصورة و استخدامه ك مفتاح في شجرة الراديكس، مما يسمح بإعادة استخدام ذاكرة التخزين المؤقت KV لرموز الصورة من نفس الصورة. تم تشغيل LLaVA-v1.5-7B (صورة) على llava-bench-in-the-wild و LLaVA-NeXT-34B (فيديو) على ActivityNet. نظرًا لأن هذه النماذج لا يتم دعمها جيدًا من قبل أنظمة البaseline الأخرى، تم استخدام التنفيذ الأصلي للمصنع في Hugging Face Transformers كمرجع. كما هو موضح في الجدول التالي، يوفر SGLang إنتاجية تصل إلى 6 مرات أعلى على هذه الاختبارات. في llava-bench-in-the-wild، تمت معالجة أسئلة متعددة حول نفس الصورة، وأعادة SGLang استخدام ذاكرة التخزين المؤقت KV في هذه الحالة.

التحديث الإنتاجي

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

أفكار نهائية

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

مهندس بالمهنة، كاتب بالقلب. كونال هو كاتب تقني مع حب عميق وفهم لتقنيات الذكاء الاصطناعي والتعلم الآلي، مخصص لتبسيط المفاهيم المعقدة في هذه المجالات من خلال توثيقه الممتع والمعلوماتي.