ليرة تركية؛ د: العديد من LLMs مثل
gemma-2-9b و Mixtral-8x22B-Instruct-v0.1 تفتقر إلى إصدار أصغر بكثير لاستخدامه في التوليد المدعوم. في هذه التدوينة، نقدم الجيل العالمي المساعد: طريقة تم تطويرها بواسطة Intel Labs وHugging Face والتي تعمل على توسيع نطاق التوليد المدعوم للعمل مع نموذج لغة صغير من أي عائلة نموذجية 🤯. ونتيجة لذلك، أصبح من الممكن الآن تسريع الاستدلال من أي وحدة فك التشفير أو نموذج خليط من الخبراء 1.5x-2.0x مع ما يقرب من الصفر النفقات العامة 🔥🔥🔥. دعونا الغوص في!
مقدمة
في الوقت الحاضر، عادةً ما تحتوي أقوى LLMs ذات الوزن المفتوح على مليارات إلى مئات المليارات من المعلمات (hello Llama-3.1-405B 👋)، ويطرح نشر هذه الوحوش في بيئات الإنتاج مجموعة من التحديات الهندسية. أحد هذه التحديات هو أن إنشاء نص من هذه النماذج الكبيرة أمر صعب بطيءمما دفع المجتمع إلى تطوير مجموعة واسعة من التقنيات لتسريع عملية فك التشفير. يعد التوليد المدعوم، المعروف أيضًا باسم فك التشفير التخميني، أسلوبًا شائعًا وعمليًا للغاية لتسريع استدلال LLM دون فقدان الدقة. في منشور المدونة هذا، نلقي نظرة على كيفية عمل الجيل المدعوم ونشارك أبحاثنا لتوسيع نطاقه أي من بين 140.000 نموذج لغة على Hugging Face Hub 🚀!
الجيل المدعوم
تتضمن الفكرة الأساسية وراء التوليد المدعوم استخدام زوج من النماذج، يشار إليهما باسم هدف و مساعد نماذج. النموذج المساعد هو نسخة أصغر وأكثر كفاءة من النموذج المستهدف، على سبيل المثال يمكنك استخدامه Llama-3.2-1B كنموذج مساعد للأكبر Llama-3.1-70b نموذج الهدف. التوليد المدعوم هو عملية تكرارية. في كل دورة، يقوم النموذج المساعد بإنشاء سلسلة من الرموز المميزة بشكل انحداري، واحدة تلو الأخرى. يقوم النموذج المستهدف بعد ذلك بالتحقق من جميع الرموز المميزة للمساعد في التسلسل في تمريرة أمامية واحدة. يتم تحقيق التسريع من خلال تأكيد رموز متعددة في كل تمريرة أمامية للنموذج المستهدف، بدلاً من إنتاج رمز مميز واحد فقط في كل مرة. للحصول على شرح أكثر تفصيلاً، راجع منشور المدونة الأصلي. بالاشتراك مع استراتيجية المضاربة الديناميكية التي تم طرحها مؤخرًا، يعمل الجيل المساعد على تسريع إنشاء النص بمقدار 1.5x-3x، اعتمادًا على المهمة والنماذج المستخدمة.
إن عمليات التسريع الرائعة التي يقدمها الجيل المدعوم تأتي مع عيب كبير: يجب أن يتشارك النموذجان المستهدف والمساعد في نفس أداة الرمز المميز، مما يعني أنهما يجب أن يكونا من نفس عائلة النماذج. ومع ذلك، تفتقر العديد من النماذج المستخدمة على نطاق واسع إلى إصدارات أصغر حجمًا تكون مدمجة ودقيقة بما يكفي لتحقيق تخفيضات كبيرة في زمن الاستجابة. بناءً على خبرتنا، عادةً ما تتم ملاحظة عمليات تسريع ذات معنى عندما يكون النموذج المساعد أصغر بما لا يقل عن 50 إلى 100 مرة من النموذج المستهدف. على سبيل المثال، CodeLlama-13b يفتقر إلى نسخة أصغر، و gemma-2-9b لديه فقط 2b البديل الذي لا يزال غير صغير/سريع بما يكفي لتحقيق تحسينات كبيرة في الأداء.
الجيل العالمي المساعد
من أجل التخفيف من هذه المشكلة، قامت Intel Labs، بالتعاون مع أصدقائنا في Hugging Face، بتطوير الجيل العالمي المساعد (UAG). يتيح UAG تحديد أي زوج من النماذج المستهدفة والمساعدات بغض النظر عن رمزها المميز. على سبيل المثال، gemma-2-9b يمكن استخدامه كنموذج مستهدف، مع الحجم الصغير vicuna-68m كمساعد.
الفكرة الرئيسية وراء الطريقة التي نقترحها هي ترجمة الرموز المميزة ثنائية الاتجاه. بمجرد اكتمال النموذج المساعد لتكرار التوليد، يتم تحويل الرموز المميزة للمساعد إلى نص، والذي يتم بعد ذلك ترميزها باستخدام أداة الرمز المميزة للنموذج المستهدف لإنشاء الرموز المميزة المستهدفة. بعد خطوة التحقق، يتم تحويل الرموز المميزة المستهدفة بالمثل مرة أخرى إلى تنسيق الرموز المميزة المساعدة، والتي يتم بعد ذلك إلحاقها بسياق النموذج المساعد قبل بدء التكرار التالي.
نظرًا لأن الرموز المميزة للمساعد والهدف تستخدم مفردات مختلفة، فمن الضروري التعامل مع التناقضات بينهما. لإعادة تشفير الرموز المميزة المساعدة التي تم إنشاؤها حديثًا بدقة، من الضروري إضافة نافذة سياق تتكون من عدة رموز مميزة سابقة. تتم بعد ذلك إعادة تشفير هذا التسلسل بأكمله في تنسيق الرمز المميز المستهدف ومواءمته مع أحدث الرموز المميزة المستهدفة لتحديد الموقع الدقيق الذي يجب أن يتم فيه إلحاق الرموز المميزة التي تم إنشاؤها حديثًا. يتم توضيح هذه العملية في الفيديو أدناه.
على الرغم من عدم ظهور ذلك في الفيديو أعلاه، فإن إعادة ترميز الرمز المميز من الهدف إلى المساعد تتبع عملية مماثلة. ومع ذلك، يجب التخلص من الرموز المميزة غير المتطابقة من ذاكرة التخزين المؤقت لقيمة المفتاح (KV) الخاصة بالنموذج المساعد لضمان سلامة البيانات.
المعايير
يوضح الجدول أدناه تحسينات زمن الاستجابة التي تمت ملاحظتها للنماذج المستهدفة عند إقرانها بالنماذج المساعدة التي تستخدم رموزًا مميزة مختلفة.
| نموذج الهدف | نموذج مساعد | مجموعة البيانات | مهمة | تسريع |
|---|---|---|---|---|
codellama/CodeLlama-13b-Instruct-hf |
bigcode/tiny_starcoder_py |
openai/humaneval |
توليد الكود | 1.90x |
mistralai/Mixtral-8x22B-Instruct-v0.1 |
double7/vicuna-68m |
cnn_dailymail |
تلخيص | 1.52x |
google/gemma-2-9b |
double7/vicuna-68m |
cnn_dailymail |
تلخيص | 1.76x |
mistralai/Mixtral-8x22B-Instruct-v0.1 |
Qwen/Qwen2-0.5B-Instruct |
tau/scrolls |
تلخيص سياق طويل | 1.78x |
meta-llama/Llama-3.1-70B |
Qwen/Qwen2-0.5B-Instruct |
tau/scrolls |
تلخيص سياق طويل | 1.78x |
microsoft/Phi-3-medium-128k-instruct |
Qwen/Qwen2-0.5B-Instruct |
tau/scrolls |
تلخيص سياق طويل | 1.91x |
لاحظ أن النماذج المستهدفة أعلاه لا تحتوي على متغيرات صغيرة (أقل من مليار معلمة) مناسبة للتسريع باستخدام التوليد المدعوم القياسي.
تم إجراء كل تجربة على 100 نموذج تم اختيارهم عشوائيًا. تجارب مع Llama و Mixtral تستخدم النماذج المستهدفة 2 و4 وحدات معالجة رسوميات A100، على التوالي. تم إجراء جميع التجارب الأخرى باستخدام وحدة معالجة الرسومات A6000 واحدة.
شفرة
تم دمج الجيل المدعوم العالمي في الإصدار 4.46.0 من 🤗المحولات.
للاستخدام، تمرير tokenizer و assistant_tokenizer ل generate():
>>> from transformers import AutoModelForCausalLM, AutoTokenizer
>>> prompt = "Alice and Bob"
>>> checkpoint = "google/gemma-2-9b"
>>> assistant_checkpoint = "double7/vicuna-68m"
>>> assistant_tokenizer = AutoTokenizer.from_pretrained(assistant_checkpoint)
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)
>>> inputs = tokenizer(prompt, return_tensors="pt")
>>> model = AutoModelForCausalLM.from_pretrained(checkpoint)
>>> assistant_model = AutoModelForCausalLM.from_pretrained(assistant_checkpoint)
>>> outputs = model.generate(**inputs, assistant_model=assistant_model, tokenizer=tokenizer, assistant_tokenizer=assistant_tokenizer)
>>> tokenizer.batch_decode(outputs, skip_special_tokens=True)
['Alice and Bob are sitting in a bar. Alice is drinking a beer and Bob is drinking a']
الاتجاهات المستقبلية
أثناء المرور do_sample=True مع الجيل المساعد القياسي الذي يستخدم خوارزمية أخذ العينات التأملية (الخوارزمية 1 من الورقة)، تدعم UAG حاليًا أخذ العينات متعددة الحدود فقط. في أخذ العينات متعددة الحدود، إذا لم يأخذ النموذج المستهدف نفس الرمز المميز مثل المساعد، فسيتم رفض الرمز المميز تلقائيًا، وهذا ليس هو الحال مع أخذ العينات التخمينية. في الممارسة العملية، وهذا يعني أن UAG مع do_sample=True سيكون لها إنتاجية أقل مقارنة بالحالة التي يكون فيها المساعد لديه نفس الرمز المميز. في المستقبل، نخطط لإضافة دعم لأخذ العينات التخمينية باستخدام UAG. بالإضافة إلى ذلك، نعتزم دمج UAG في 🤗 خطوط أنابيب المحولات، لاستخدام أكثر إيجازًا وانسيابية.
مراجع