⭐ في منشور المدونة هذا، سنستكشف فك التشفير الديناميكي – طريقة جديدة طورتها مختبرات Intel وHugging Face تعمل على تسريع عملية إنشاء النص بما يصل إلى 2.7x، اعتمادًا على المهمة. هذه الطريقة هي الوضع التشغيلي الافتراضي للتوليد المدعوم بدءًا من إصدار Transformers🤗 4.45.0 ⭐

فك التشفير التخميني

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


تكرار فك التشفير.

فك التشفير الديناميكي

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

نتوقع أن تؤدي استراتيجية التحسين المحسنة لإدارة عدد الرموز المميزة التي تم إنشاؤها إلى تقليل زمن الاستجابة بشكل أكبر. لاختبار هذه الأطروحة، نستخدم أوراكل الذي يحدد قيمة النظرة المستقبلية المثالية لكل تكرار تخميني. يستخدم Oracle نموذج المسودة لإنشاء الرموز المميزة بشكل رجعي حتى ينشأ تناقض بين الرموز المميزة المتوقعة للمسودة والنماذج المستهدفة. يتم تكرار هذه العملية لكل تكرار تخميني، مما يؤدي في النهاية إلى تحديد العدد الأمثل (الحد الأقصى) من الرموز المميزة المقبولة لكل تكرار. يتم تحديد عدم تطابق رمز المسودة/الهدف باستخدام خوارزمية أخذ عينات الرفض، التي قدمها Leviathan وآخرون، مع درجة حرارة صفر. تدرك أوراكل الإمكانات الكاملة لفك التشفير التخميني من خلال إنشاء الحد الأقصى لعدد رموز المسودة الصالحة في كل خطوة وتقليل عدد الاستدعاءات لكل من النموذجين المسودة والهدف.

يوضح الشكل الأيسر أدناه قيم التوقع المسبق لـ Oracle والثابتة عبر التكرارات التخمينية لمثال إنشاء التعليمات البرمجية من مجموعة بيانات MBPP. لوحظ وجود تباين كبير في قيم النظرة المستقبلية لتكهنات أوراكل (الأشرطة البرتقالية). النظرة الأمامية الثابتة (الأشرطة الزرقاء)، حيث يتم تحديد عدد رموز المسودة التي تم إنشاؤها على 5، تنفذ 38 تمريرة أمامية مستهدفة و192 تمريرة أمامية مسودة، في حين أن النظرة الأمامية المضاربة أوراكل، تؤدي فقط 27 تمريرة أمامية مستهدفة و129 تمريرة أمامية مسودة – وهو انخفاض كبير. يُظهر الشكل الصحيح نظرة أوراكل والتكهنات الثابتة عبر مجموعة بيانات Alpaca بأكملها.


قيم Oracle والتوقعات الثابتة (SL) في مثال MBPP واحد.


متوسط ​​توقعات أوراكل للتطلع إلى مجموعة بيانات Alpaca بأكملها.

يُظهر كلا الشكلين تباينًا كبيرًا في قيم النظرة المستقبلية للمضاربة أوراكل، مما يشير إلى أن النظرة المستقبلية للمضاربة الثابتة قد تكون دون المستوى الأمثل.

من أجل الاقتراب من Oracle والحصول على سرعة إضافية، قمنا بتطوير طريقة مباشرة لضبط قيمة النظرة المستقبلية للمضاربة ديناميكيًا في كل تكرار. بعد إنشاء كل رمز مميز للمسودة، نحدد ما إذا كان يجب على نموذج المسودة الاستمرار في إنشاء الرمز المميز التالي أو التبديل إلى النموذج المستهدف للتحقق منه. يعتمد هذا القرار على ثقة النموذج المساعد في تنبؤاته المقدرة بواسطة softmax للسجلات. إذا كانت ثقة النموذج المساعد في التنبؤ بالرمز المميز الحالي أقل من عتبة محددة مسبقًا، يشار إليها باسم assistant_confidence_threshold، فإنه يوقف عملية إنشاء الرمز المميز لهذا التكرار، حتى لو كان الحد الأقصى لعدد الرموز المميزة للمضاربة num_assistant_tokens لم يتم التوصل إليه. بمجرد التوقف، يتم إرسال مسودة الرموز المميزة التي تم إنشاؤها أثناء التكرار الحالي إلى النموذج المستهدف للتحقق منها.

قياس الأداء

لقد قمنا بقياس النهج الديناميكي مقابل النهج الإرشادي عبر مجموعة من المهام والاقتران النموذجي. أظهر النهج الديناميكي أداءً أفضل في جميع الاختبارات. والجدير بالذكر أن استخدام النهج الديناميكي مع Llama3.2-1B كمساعد ل Llama3.1-8B، نلاحظ زيادات في السرعة تصل إلى 1.52x، في حين لم يُظهر النهج التجريبي أي زيادات كبيرة في السرعة مع نفس الإعداد. ملاحظة أخرى هي أن codegen-6B-mono الغلة ابطئ باستخدام النهج الاستكشافي، في حين يظهر النهج الديناميكي التسريع.

نموذج الهدف نموذج مسودة (مساعد). مهمة تسريع – ارشادي تسريع – ديناميكي
facebook/opt-6.7b facebook/opt-125m تلخيص 1.82x 2.71x
facebook/opt-6.7b facebook/opt-125m جيل مفتوح 1.23x 1.59x
Salesforce/codegen-6B-mono Salesforce/codegen-350M-mono توليد الكود (بيثون) 0.89x 1.09x
google/flan-t5-xl google/flan-t5-small تلخيص 1.18x 1.31x
meta-llama/Llama-3.1-8B meta-llama/Llama-3.2-1B تلخيص 1.00x 1.52x
meta-llama/Llama-3.1-8B meta-llama/Llama-3.2-1B جيل مفتوح 1.00x 1.18x
meta-llama/Llama-3.1-8B meta-llama/Llama-3.2-1B توليد الكود (بيثون) 1.09x 1.15x

شفرة

تم دمج التخمين الديناميكي في الإصدار 4.45.0 من مكتبة Hugging Face Transformers ويعمل الآن كوضع التشغيل الافتراضي للمساعدة في فك التشفير. لاستخدام التوليد المدعوم مع التكهنات الديناميكية، لا يلزم إجراء أي تغييرات في التعليمات البرمجية — ما عليك سوى تنفيذ التعليمات البرمجية كما تفعل عادةً:

from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

prompt = "Alice and Bob"
checkpoint = "EleutherAI/pythia-1.4b-deduped"
assistant_checkpoint = "EleutherAI/pythia-160m-deduped"
device = "cuda" if torch.cuda.is_available() else "cpu"

tokenizer = AutoTokenizer.from_pretrained(checkpoint)
inputs = tokenizer(prompt, return_tensors="pt").to(device)

model = AutoModelForCausalLM.from_pretrained(checkpoint).to(device)
assistant_model = AutoModelForCausalLM.from_pretrained(assistant_checkpoint).to(device)

outputs = model.generate(**inputs, assistant_model=assistant_model)

تعكس المعلمات الافتراضية للتوقعات الديناميكية القيم المثالية ولكن يمكن تعديلها لتحسين الأداء لأزواج نماذج أو مجموعات بيانات محددة باستخدام التعليمة البرمجية التالية:


assistant_model.generation_config.assistant_confidence_threshold=0.4


assistant_model.generation_config.num_assistant_tokens_schedule='constant'



assistant_model.generation_config.num_assistant_tokens=20

للرجوع إلى إرشادي أو ثابت (كما هو الحال في Leviathan et al.) يقترب، ببساطة num_assistant_tokens_schedule ل 'heuristic' أو 'constant'، على التوالي، تعيين assistant_confidence_threshold=0 و num_assistant_tokens=5 على النحو التالي:


assistant_model.generation_config.num_assistant_tokens_schedule='heuristic'
assistant_model.generation_config.assistant_confidence_threshold=0
assistant_model.generation_config.num_assistant_tokens=5

ما هي الخطوة التالية؟

لقد قدمنا ​​استراتيجية أسرع للجيل المدعوم تسمى فك التشفير الديناميكي، والتي تتفوق في الأداء على الأساليب القائمة على الاستدلال بالإضافة إلى رسم عدد ثابت من الرموز المميزة المرشحة.

في منشور المدونة القادم، سنعرض طريقة جديدة للإنشاء المدعوم: دمج أي نموذج مستهدف مع أي نموذج مساعد! سيؤدي هذا إلى فتح الباب أمام تسريع عدد لا يحصى من النماذج على Hugging Face Hub التي لا تحتوي على متغيرات مساعدة صغيرة بما يكفي. على سبيل المثال، Phi 3, Gemma 2, CodeLlama وغيرها الكثير ستكون مؤهلة لفك التشفير التخميني. ابقوا متابعين!

مراجع

الاقتباس

@article{mamou2024accelerating,
  title={Accelerating Speculative Decoding using Dynamic Speculation Length},
  author={Mamou, Jonathan and Pereg, Oren and Korat, Daniel and Berchansky, Moshe and Timor, Nadav and Wasserblat, Moshe and Schwartz, Roy},
  journal={arXiv preprint arXiv:2405.04304},
  year={2024}
}

شاركها.
اترك تعليقاً