Transformers documentation
الترميز بمساعدة
الترميز بمساعدة
يسرّع فك التشفير المُساعَد توليد النص من خلال السماح لنموذج مساعد باقتراح رموز مرشحة قبل أن يقرّ النموذج الرئيسي بها. يتحقق النموذج الرئيسي من الرموز المرشحة في تمريرة أمامية واحدة. النموذج المساعد سريع ومنخفض التكلفة، ويمكنه استبدال عشرات التمريرات الأمامية الأعلى تكلفة التي كان النموذج الرئيسي سيقوم بها.
يتناول هذا الدليل طرق فك الترميز المُساعَد في Transformers.
التفكيك التخميني
يستخدم التفكيك التخميني نموذجًا مساعدًا أصغر حجمًا لصياغة رموز مرشحة. يتحقق النموذج الرئيسي من هذه الرموز في مسار واحد. تدخل الرموز المُعتمدة إلى المخرجات النهائية، بينما تُطلق الرموز المرفوضة عملية أخذ عينات قياسية. تكون عملية التوليد أسرع لأن النموذج الرئيسي يُنفذ عددًا أقل من عمليات المرور الأمامي المكلفة.
يعمل هذا الأسلوب بأفضل أداء عندما يكون نموذج المساعد أصغر بكثير من النموذج الرئيسي ويستخدم نفس مُجزّئ الرموز. يدعم فك التشفير التخميني البحث الجشع والعينة، لكنه لا يدعم المدخلات المجمعة.
مرّر assistant_model إلى generate(). اضبط do_sample=True لإعادة أخذ العينة إذا فشلت عملية التحقق من الرموز.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, assistant_model=assistant_model)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine'يتوفر الحجة assistant_model أيضًا في واجهة Pipeline.
import torch
from transformers import pipeline
pipeline = pipeline(
"text-generation",
model="meta-llama/Llama-3.1-8B",
assistant_model="meta-llama/Llama-3.2-1B",
dtype="auto"
)
pipeline("Hugging Face is an open-source company, ", max_new_tokens=50, do_sample=False)اضبط temperature للتحكم في العشوائية. غالبًا ما تحسّن درجات الحرارة المنخفضة زمن الاستجابة.
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, assistant_model=assistant_model, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'فك الترميز بالبحث عن الاستدعاء
لا يحتاج فك التشفير بالبحث في الاستعلام إلى نموذج مساعد. فهو يبحث عن الن-جرامات المتداخلة في الاستعلام لتقديم رموز مرشحة. وإذا لم يوجد تطابق، فإنه يعود إلى فك التشفير الذاتي التكراري العادي. وهذا مناسب للمهام القائمة على المدخلات مثل التلخيص والترجمة، لأن الرموز المرشحة غالبًا ما تعكس الأنماط المحلية في النص المصدر.
مرّر prompt_lookup_num_tokens إلى generate(). يحدد هذا عدد الرموز التي يحاول الخوارزمية نسخها من الجزء السابق من الموجه عند اكتشافها لنمط متكرر.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, prompt_lookup_num_tokens=5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, prompt_lookup_num_tokens=5, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'الترميز التخميني الذاتي
يستخدم فك التشفير التخميني الذاتي الطبقات الوسيطة للنموذج كمساعد لاقتراح الرموز المرشحة. إذا تطابق الاقتراح، ينهي النموذج العملية مبكراً وتتحقق الطبقات المتبقية من الرموز أو تصححها.
بما أن الأمر يتعلق بنموذج واحد، فإن الأوزان والذاكرة المؤقتة مشتركة، مما يعزز السرعة دون زيادة في استهلاك الذاكرة. لا تعمل هذه التقنية إلا مع النماذج المدرَّبة على دعم قيم اللوجيت (logits) المبكرة من الطبقات الوسيطة.
مرّر assistant_early_exit إلى generate() لضبط طبقة الخروج.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("facebook/layerskip-llama3.2-1B")
model = AutoModelForCausalLM.from_pretrained("facebook/layerskip-llama3.2-1B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, assistant_early_exit=4, do_sample=False, max_new_tokens=20)
tokenizer.batch_decode(outputs, skip_special_tokens=True)طبقة التنبؤ متعدد الرموز (MTP)
طبقة التنبؤ متعدد الرموز (MTP) تُنشئ رموزًا مرشحة عبر طبقات تنبؤ إضافية مستمدة من نقطة الفحص الخاصة بالنموذج الرئيسي نفسه. تعيد طبقات MTP استخدام تمثيلات النموذج الرئيسي ورأس الإخراج. تُنشئ كل طبقة MTP رمزًا واحدًا، لذا فإن عدد المرشحين في كل خطوة يتطابق مع عدد طبقات MTP في نقطة الفحص. يتحقق النموذج الرئيسي من المسودات في تمريرة أمامية واحدة.
يعمل MTP فقط مع نقاط التفتيش المدربة بطبقات MTP، مثل DeepSeek-V3 وGLM-4.5. تحمل هذه النقاط التفتيشية أوزان MTP وتضبط num_mtp_layers في إعداداتها، حيث تُذكر باسم num_nextn_predict_layers في config.json.
مرّر use_mtp=True إلى generate()، حيث يثير خطأً إذا لم يحتوي النموذج على طبقات MTP. وكما هو الحال في فك التشفير التخميني، يدعم MTP البحث الجشع والعينة لكنه لا يدعم المدخلات المجمعة.
هنا، يشير MTP إلى طبقات التنبؤ المضمنة في نقطة الفحص المستهدفة، كما هو الحال في DeepSeek-V3 وGLM-4.5. يستخدم Gemma 4 نقطة فحص مساعد منفصلة لفك ترميز MTP. قم بتمريرها كـassistant_model (انظر مسودة التنبؤ متعدد الرموز).
يقبل خط أنابيب text-generation وgenerate() كلاهما use_mtp=True.
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="zai-org/GLM-4.5-Air",
device_map="auto",
)
outputs = pipe(
"Hugging Face is an open-source company",
use_mtp=True,
do_sample=False,
max_new_tokens=50,
add_special_tokens=True,
return_full_text=True,
)
[output["generated_text"] for output in outputs]بديلًا عن ذلك، يمكنك الاستدلال على النحو التالي.
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("zai-org/GLM-4.5-Air")
model = AutoModelForCausalLM.from_pretrained("zai-org/GLM-4.5-Air", device_map="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, use_mtp=True, do_sample=False, max_new_tokens=50)
tokenizer.batch_decode(outputs, skip_special_tokens=True)مسودة التنبؤ متعدد الرموز
نموذج MTP drafter هو نموذج مساعد خفيف يُحمَّل من نقطة تحقق (checkpoint) منفصلة. يقترح هذا النموذج رموزًا مرشحة ليُتحقق منها النموذج المستهدف. يستخدم نموذج المسودة (drafter) تضمينات الإدخال الخاصة بالنموذج المستهدف، ويتفاعل مع ذاكرة KV الخاصة به. يبدأ من الحالات المخفية (hidden states) للنموذج المستهدف، ثم يُنشئ الرموز بشكل ذاتي التراجع (autoregressively). لكل رمز تالٍ، يُعيد الحالة المخفية المُسقطَة (projected hidden state) إلى نموذج المسودة. يتحقق النموذج المستهدف من الرموز المُسودة في تمريرة أمامية واحدة، كما في فك التشفير التخميني (speculative decoding).
على عكس طبقات MTP، التي تُعد جزءًا من نقطة التفتيش المستهدفة وتشارك رأس إخراجها، فإن مُصاغ MTP هو نموذج مساعد منفصل. يستخدم تضمينات الإدخال ونقطة تخزين KV للنموذج المستهدف لاقتراح الرموز.
from transformers import AutoProcessor, AutoModelForCausalLM
processor = AutoProcessor.from_pretrained("google/gemma-4-E4B-it")
target_model = AutoModelForCausalLM.from_pretrained(
"google/gemma-4-E4B-it",
dtype="auto",
device_map="auto",
)
assistant_model = AutoModelForCausalLM.from_pretrained(
"google/gemma-4-E4B-it-assistant",
dtype="auto",
device_map="auto",
)
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Write a short joke about saving RAM."},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
return_dict=True,
return_tensors="pt",
add_generation_prompt=True,
enable_thinking=False
).to(target_model.device)
input_len = inputs["input_ids"].shape[-1]
outputs = target_model.generate(
**inputs,
assistant_model=assistant_model,
max_new_tokens=256,
)
response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)
processor.parse_response(response)الترميز المساعد الشامل
يجعل فك التشفير المُساعَد الشامل (UAD) فك التشفيد التخميني ممكنًا حتى عندما يكون لدى النموذج الرئيسي ونموذج المساعد مُرمِّزات مختلفة. يتيح لك إقران أي نموذج مساعد صغير مع النموذج الرئيسي. يتم إعادة ترميز الرموز المرشحة ويحسب الخوارزمية أطول تسلسل مشترك جزئيًا بحيث يبقى الاستمرار متوافقًا.
مرّر tokenizer وassistant_tokenizer وassistant_model إلى generate() لتفعيل UAD.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
assistant_tokenizer = AutoTokenizer.from_pretrained("double7/vicuna-68m")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-9b", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("double7/vicuna-68m", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, assistant_model=assistant_model, tokenizer=tokenizer, assistant_tokenizer=assistant_tokenizer)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'التحقق من التجميع الثابت
التخمين القياسي (Standard speculative decoding) خالي من الفقد — فهو يضمن تطابق توزيع المخرجات مع نموذج الهدف تمامًا. التحقق عبر التجميع الثابت يخفف من هذا الشرط من خلال التحقق مقابل خليط من توزيعي الهدف والمسودة، مما يزيد من معدل القبول (استدلال أسرع) على حساب جعل توزيع المخرجات خليطًا بدلاً من توزيع الهدف الدقيق. القيمة الابتدائية الموصى بها هي 0.7.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")
outputs = model.generate(**inputs, assistant_model=assistant_model, assistant_ensemble_weight=0.7, do_sample=True)
tokenizer.batch_decode(outputs, skip_special_tokens=True)يتطلب هذا الأمر قيم التوقعات المرشحة من نموذج المساعد، وهو غير مدعوم مع فك ترميز البحث في الاستعلام.
الموارد
- اقرأ منشور المدونة التوليد المُساعَد: اتجاه جديد نحو توليد نصوص منخفض الكمون للحصول على مزيد من السياق حول كمون توليد النصوص والتوليد المُساعَد.