Transformers documentation

بناء واجهة خلفية متوافقة للنموذج للاستدلال

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

بناء واجهة خلفية متوافقة للنموذج للاستدلال

تتوافق نماذج Transformers مع محركات الاستدلال مثل vLLM و SGLang. استخدم نفس نموذج Transformers في أي مكان وتجنّب إعادة تنفيذ النموذج من الصفر لكل محرك استدلال. كما يساعد ذلك في التعامل مع النماذج التي لا يعيد محرك ما تنفيذها بشكل أصلي، طالما أن النموذج يدعم واجهة خلفية الانتباه (attention backend) الموصوفة أدناه.

يُظهرك هذا الدليل على كيفية تنفيذ نموذج في Transformers يعمل كواجهة خلفية لأي محرك استنتاج.

تنفيذ النموذج

  1. اتبع إرشادات المساهمة الخاصة بالنموذج أو إرشادات المساهمة للنماذج المخصصة. يجب أن يحتوي دليل النموذج على ملف config.json صالح وحقل auto_map صالح يشير إلى فئة النموذج في ملف الإعدادات.

  2. استخدم فئة 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
  3. فعّل توازياً اختيارياً للتينسور أو خط الإنتاج بإضافة المفاتيح التالية إلى 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"]),
        }

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

تتطلب النماذج متعددة الوسائط تغييرات إضافية تتجاوز إرشادات المساهمة في نماذج اللغة البصرية. تضمن هذه التغييرات معالجة المدخلات متعددة الوسائط بشكل صحيح.

  1. يجب أن تتضمن فئة ProcessorMixin الخاصيتين self.image_token وself.image_token_ids. تشير رموز الوكيل هذه إلى مواضع الصور في المدخلات. يظهر الرمز نفسه في موجه الإدخال للصور وفي كود النموذج لتوزيع ميزات الصورة.

  2. يجب أن تتضمن فئة ProcessorMixin طريقة self._get_num_multimodal_tokens. تحسب هذه الطريقة عدد رموز المحلّات المطلوبة للمدخلات متعددة الوسائط بأحجام محددة. وتعيد كائنًا من نوع MultiModalData. لا تُحتسب المحلّات الواقعة بين رموز <image>، مثل رموز الصفوف أو الأعمدة، ضمن محلّات الصور. احتسب فقط الرموز التي تُستبدل لاحقًا بخصائص الصور في كود النمذجة.

  3. يجب على فئة 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)

الموارد

Update on GitHub