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

تتوافق نماذج Transformers مع محركات الاستدلال مثل [vLLM](https://github.com/vllm-project/vllm) و [SGLang](https://docs.sglang.ai). استخدم نفس نموذج Transformers في أي مكان وتجنّب إعادة تنفيذ النموذج من الصفر لكل محرك استدلال. كما يساعد ذلك في التعامل مع النماذج التي لا يعيد محرك ما تنفيذها بشكل أصلي، طالما أن النموذج يدعم واجهة خلفية الانتباه (attention backend) الموصوفة أدناه.

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

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

1. اتبع [إرشادات المساهمة](../add_new_model) الخاصة بالنموذج أو [إرشادات المساهمة للنماذج المخصصة](../custom_models). يجب أن يحتوي دليل النموذج على ملف `config.json` صالح وحقل `auto_map` صالح يشير إلى فئة النموذج في ملف الإعدادات.

2. استخدم فئة [AttentionInterface](/docs/transformers/main/ar/internal/modeling_utils#transformers.AttentionInterface) للدوال المخصصة والمحسّنة للانتباه. تتيح هذه الواجهة ميزات الأداء الخاصة بكل محرك استنتاج.

   استخدم `ALL_ATTENTION_FUNCTIONS` عند تحديد طبقة الانتباه، ونفّذ `**kwargs` من الفئة الأساسية `MyModel` إلى طبقات الانتباه. اضبط `_supports_attention_backend` على `True` في [PreTrainedModel](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel).
   
   وسّع الكود أدناه للحصول على مثال.

    
    modeling_my_model.py

    ```python
    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](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig).

    * `base_model_tp_plan` يُفعّل [التوازي على مستوى المصفوفات](../perf_infer_gpu_multi) من خلال ربط أنماط أسماء الطبقات المؤهلة بالكامل بأنماط التوازي على مستوى المصفوفات. يدعم استراتيجيتي التقسيم `"colwise"` و`"rowwise"` فقط.
    * `base_model_pp_plan` يُفعّل توازلي خط الأنابيب من خلال تعيين أسماء طبقات الأبناء المباشرة إلى مجموعات من قوائم النصوص. يحتوي العنصر الأول من المجموعة على أسماء الحُجج المدخلة. ويحتوي العنصر الأخير على أسماء متغيرات مخرجات الطبقة في كود النمذجة.

    وسّع الكود أدناه للحصول على مثال.

    
    configuration_my_model.py

    ```python

    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"]),
        }
    ```

    

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

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

1. يجب أن تتضمن فئة [ProcessorMixin](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin) الخاصيتين `self.image_token` و`self.image_token_ids`. تشير رموز الوكيل هذه إلى مواضع الصور في المدخلات. يظهر الرمز نفسه في موجه الإدخال للصور وفي كود النموذج لتوزيع ميزات الصورة.

2. يجب أن تتضمن فئة [ProcessorMixin](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin) طريقة `self._get_num_multimodal_tokens`. تحسب هذه الطريقة عدد رموز المحلّات (placeholder tokens) المطلوبة للمدخلات متعددة الوسائط ذات الأحجام المحددة. وتعيد كائنًا من نوع `MultiModalData`. لا تُحتسب المحلّات الواقعة بين رموز `<image>`، مثل رموز الصفوف أو الأعمدة، ضمن محلات الصور. احتسب فقط الرموز التي يتم استبدالها لاحقًا بخصائص الصورة في كود النمذجة.

3. يجب على فئة [ProcessorMixin](/docs/transformers/main/ar/main_classes/processors#transformers.ProcessorMixin) التحقق من قيمة `return_mm_token_type_ids` وإرجاع `mm_token_type_ids`. يشير هذا إلى ما إذا كانت كل موضع يمثل رمز نص (`0`)، أو رمز موضع محجوز للصورة (`1`)، أو رمز موضع محجوز للفيديو (`2`). يجب أن تكون تسلسلات معرّفات أنواع الرموز متعددة الوسائط متصلة دون انقطاع بين الرموز المتتالية. تعامل مع الرموز الخاصة لبداية ونهاية الرموز، ورموز الصفوف والأعمدة، على أنها مواضع محجوزة.

وسّع الكود أدناه للحصول على مثال.

modeling_my_multimodal_model.py

```python
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](https://blog.vllm.ai/2025/04/11/transformers-backend.html) لمزيد من التفاصيل.
* اقرأ منشور المدونة [تكامل واجهة Transformers الخلفية في SGLang](https://huggingface.co/blog/transformers-backend-sglang) لمزيد من التفاصيل.

