Transformers documentation
بناء واجهة خلفية متوافقة للنموذج للاستدلال
بناء واجهة خلفية متوافقة للنموذج للاستدلال
تتوافق نماذج Transformers مع محركات الاستدلال مثل vLLM و SGLang. استخدم نفس نموذج Transformers في أي مكان وتجنّب إعادة تنفيذ النموذج من الصفر لكل محرك استدلال. كما يساعد ذلك في التعامل مع النماذج التي لا يعيد محرك ما تنفيذها بشكل أصلي، طالما أن النموذج يدعم واجهة خلفية الانتباه (attention backend) الموصوفة أدناه.
يُظهرك هذا الدليل على كيفية تنفيذ نموذج في Transformers يعمل كواجهة خلفية لأي محرك استنتاج.
تنفيذ النموذج
اتبع إرشادات المساهمة الخاصة بالنموذج أو إرشادات المساهمة للنماذج المخصصة. يجب أن يحتوي دليل النموذج على ملف
config.jsonصالح وحقلauto_mapصالح يشير إلى فئة النموذج في ملف الإعدادات.استخدم فئة AttentionInterface للدوال المخصصة والمحسّنة للانتباه. تتيح هذه الواجهة ميزات الأداء الخاصة بكل محرك استدلال.
استخدم
ALL_ATTENTION_FUNCTIONSعند تحديد طبقة الانتباه، ونفّذ**kwargsمن الفئة الأساسيةMyModelإلى طبقات الانتباه. اضبط_supports_attention_backendعلىTrueفي PreTrainedModel.وسّع الكود أدناه للحصول على مثال.
modeling_my_model.py
from transformers import PreTrainedModel from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS from torch import nn class MyAttention(nn.Module): def forward(self, hidden_states, **kwargs): ... attention_interface = ALL_ATTENTION_FUNCTIONS[self.config._attn_implementation] attn_output, attn_weights = attention_interface( self, query_states, key_states, value_states, **kwargs, ) ... class MyModel(PreTrainedModel): _supports_attention_backend = Trueفعّل توازياً اختيارياً للتينسور أو خط الإنتاج بإضافة المفاتيح التالية إلى PreTrainedConfig.
base_model_tp_planيُفعّل التوازي على مستوى المصفوفات من خلال ربط أنماط أسماء الطبقات المؤهلة بالكامل بأنماط التوازي على مستوى المصفوفات. يدعم استراتيجيتي التقسيم"colwise"و"rowwise"فقط.base_model_pp_planيُفعّل توازلي خط الأنابيب من خلال تعيين أسماء طبقات الأبناء المباشرة إلى مجموعات من قوائم النصوص. يحتوي العنصر الأول من المجموعة على أسماء الحُجج المدخلة. ويحتوي العنصر الأخير على أسماء متغيرات مخرجات الطبقة في كود النمذجة.
وسّع الكود أدناه للحصول على مثال.
configuration_my_model.py
from transformers import PreTrainedConfig class MyConfig(PreTrainedConfig): base_model_tp_plan = { "layers.*.self_attn.k_proj": "colwise", "layers.*.self_attn.v_proj": "colwise", "layers.*.self_attn.o_proj": "rowwise", "layers.*.mlp.gate_proj": "colwise", "layers.*.mlp.up_proj": "colwise", "layers.*.mlp.down_proj": "rowwise", } base_model_pp_plan = { "embed_tokens": (["input_ids"], ["inputs_embeds"]), "layers": (["hidden_states", "attention_mask"], ["hidden_states"]), "norm": (["hidden_states"], ["hidden_states"]), }
نماذج متعددة الوسائط
تتطلب النماذج متعددة الوسائط تغييرات إضافية تتجاوز إرشادات المساهمة في نماذج اللغة البصرية. تضمن هذه التغييرات معالجة المدخلات متعددة الوسائط بشكل صحيح.
يجب أن تتضمن فئة ProcessorMixin الخاصيتين
self.image_tokenوself.image_token_ids. تشير رموز الوكيل هذه إلى مواضع الصور في المدخلات. يظهر الرمز نفسه في موجه الإدخال للصور وفي كود النموذج لتوزيع ميزات الصورة.يجب أن تتضمن فئة ProcessorMixin طريقة
self._get_num_multimodal_tokens. تحسب هذه الطريقة عدد رموز المحلّات المطلوبة للمدخلات متعددة الوسائط بأحجام محددة. وتعيد كائنًا من نوعMultiModalData. لا تُحتسب المحلّات الواقعة بين رموز<image>، مثل رموز الصفوف أو الأعمدة، ضمن محلّات الصور. احتسب فقط الرموز التي تُستبدل لاحقًا بخصائص الصور في كود النمذجة.يجب على فئة ProcessorMixin التحقق من قيمة
return_mm_token_type_idsوإرجاعmm_token_type_ids. يشير هذا إلى ما إذا كانت كل موضع يمثل رمز نص (0)، أو رمز موضع محجوز للصورة (1)، أو رمز موضع محجوز للفيديو (2). يجب أن تكون تسلسلات معرّفات أنواع الرموز متعددة الوسائط متصلة دون انقطاع بين الرموز المتتالية. تعامل مع الرموز الخاصة لبداية ونهاية الرموز، ورموز الصفوف والأعمدة، على أنها مواضع محجوزة.
وسّع الكود أدناه للحصول على مثال.
modeling_my_multimodal_model.py
class MyMultimodalProcessor(ProcessorMixin):
def __call__(self, images=None, text=None, **kwargs):
if return_mm_token_type_ids:
mm_token_type_ids = np.zeros_like(input_ids)
mm_token_type_ids[input_ids == self.image_token_id] = 1
text_inputs["mm_token_type_ids"] = mm_token_type_ids.tolist()
return BatchFeature(data={**text_inputs, **image_inputs}, tensor_type=return_tensors)
def _get_num_multimodal_tokens(self, image_sizes=None, **kwargs):
"""
Computes the number of placeholder tokens needed for multimodal inputs with the given sizes.
Args:
image_sizes (`list[list[int]]`, *optional*):
The input sizes formatted as (height, width) per each image.
Returns:
`MultiModalData`: A `MultiModalData` object holding number of tokens per each of the provided
input modalities, along with other useful data.
"""
vision_data = {}
if image_sizes is not None:
num_image_tokens = [256] * len(image_sizes) # 256 placeholder tokens for each image always
num_image_patches = [1] * len(image_sizes) # no patching, thus each image is processed as a single base image
vision_data.update({"num_image_tokens": num_image_tokens, "num_image_patches": num_image_patches})
return MultiModalData(**vision_data)الموارد
- اقرأ منشور المدونة تكامل واجهة Transformers الخلفية في vLLM لمزيد من التفاصيل.
- اقرأ منشور المدونة تكامل واجهة Transformers الخلفية في SGLang لمزيد من التفاصيل.