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 لتكون قابلة للتخصيص. يحتوي كود النموذج بالكامل على مجلد model الفرعي في مستودع Transformers. يحتوي كل مجلد على ملف modeling.py وملف configuration.py. انسخ هذه الملفات لبدء تخصيص النموذج.

قد يكون من الأسهل البدء من الصفر إذا كنت تنشئ نموذجًا جديدًا بالكامل. لكن بالنسبة للنماذج التي تشبه إلى حد كبير نموذجًا موجودًا في Transformers، يكون إعادة استخدام فئة الإعداد والنموذج نفسها أو إنشاء فئة فرعية منها أسرع.

ستُظهر لك هذه الدليل كيفية تخصيص نموذج ResNet، وتمكين دعم AutoClass، ومشاركته على Hub.

الإعداد

تحتوي التهيئة، المُحدَّدة بواسطة الفئة الأساسية PreTrainedConfig، على جميع المعلومات اللازمة لبناء نموذج. هنا ستقوم بإعداد خصائص نموذج ResNet المخصص. تمنح الخصائص المختلفة أنواعًا مختلفة من نماذج ResNet.

القواعد الرئيسية لتخصيص تكوين هي:

  1. A custom configuration must subclass PreTrainedConfig. This ensures a custom model has all the functionality of a Transformers’ model such as from_pretrained(), save_pretrained(), and push_to_hub().
  2. يجب أن يقبل PreTrainedConfig __init__ أي kwargs ويجب تمريرها إلى __init__ للفئة الأصلية. يحتوي PreTrainedConfig على حقول أكثر من تلك التي تم ضبطها في التهيئة المخصصة لك، لذا عند تحميل التهيئة باستخدام from_pretrained()، يجب أن تقبل تهيئتك هذه الحقول وتُمررها إلى الفئة الأصلية.

يُفيد التحقق من صحة بعض المعاملات. في المثال أدناه، يتم تنفيذ فحص للتأكد من أن block_type وstem_type تنتمي إلى أحد القيم المحددة مسبقًا.

أضف model_type إلى فئة الإعدادات لتفعيل دعم AutoClass.

from transformers import PreTrainedConfig
from typing import List

class ResnetConfig(PreTrainedConfig):
    model_type = "resnet"

    def __init__(
        self,
        block_type="bottleneck",
        layers: list[int] = [3, 4, 6, 3],
        num_classes: int = 1000,
        input_channels: int = 3,
        cardinality: int = 1,
        base_width: int = 64,
        stem_width: int = 64,
        stem_type: str = "",
        avg_down: bool = False,
        **kwargs,
    ):
        if block_type not in ["basic", "bottleneck"]:
            raise ValueError(f"`block_type` must be 'basic' or bottleneck', got {block_type}.")
        if stem_type not in ["", "deep", "deep-tiered"]:
            raise ValueError(f"`stem_type` must be '', 'deep' or 'deep-tiered', got {stem_type}.")

        self.block_type = block_type
        self.layers = layers
        self.num_classes = num_classes
        self.input_channels = input_channels
        self.cardinality = cardinality
        self.base_width = base_width
        self.stem_width = stem_width
        self.stem_type = stem_type
        self.avg_down = avg_down
        super().__init__(**kwargs)

احفظ الإعدادات في ملف JSON داخل مجلد النموذج المخصص الخاص بك، custom-resnet، باستخدام save_pretrained().

resnet50d_config = ResnetConfig(block_type="bottleneck", stem_width=32, stem_type="deep", avg_down=True)
resnet50d_config.save_pretrained("custom-resnet")

النموذج

باستخدام تكوين ResNet المخصص، يمكنك الآن إنشاء النموذج وتخصيصه. يرث النموذج من الفئة الأساسية PreTrainedModel. وبالمثل لما يحدث مع PreTrainedConfig، فإن الوراثة من PreTrainedModel وتهيئة الفئة الأصلية بالتكوين المخصص يوسّعان وظائف Transformers مثل الحفظ والتحميل إلى النموذج المخصص.

تتبع نماذج Transformers اتفاقية تقضي بقبول كائن config في طريقة __init__. وهذا يمرر كائن config بأكمله إلى طبقات النموذج الفرعية، بدلاً من تقسيم كائن config إلى عدة معاملات تُمرر بشكل فردي إلى الطبقات الفرعية.

كتابة النماذج بهذه الطريقة تنتج كوداً أبسط مع مصدر واضح للحقيقة لأي من المعلمات الفائقة. كما أنها تسهّل إعادة استخدام الكود من نماذج Transformers الأخرى.

ستقوم بإنشاء نموذجين من ResNet، أحدهما نموذج ResNet أساسي يُخرج الحالات المخفية، والآخر نموذج ResNet مزوّد برأس تصنيف الصور.

ResnetModel
ResnetModelForImageClassification

حدد تخطيطًا بين أنواع الكتل والفئات. يتم إنشاء كل ما عدا ذلك عن طريق تمرير فئة الإعداد إلى فئة نموذج ResNet.

أضف config_class إلى فئة النموذج لتفعيل دعم AutoClass.

from transformers import PreTrainedModel
from timm.models.resnet import BasicBlock, Bottleneck, ResNet
from .configuration_resnet import ResnetConfig

BLOCK_MAPPING = {"basic": BasicBlock, "bottleneck": Bottleneck}

class ResnetModel(PreTrainedModel):
    config_class = ResnetConfig

    def __init__(self, config):
        super().__init__(config)
        block_layer = BLOCK_MAPPING[config.block_type]
        self.model = ResNet(
            block_layer,
            config.layers,
            num_classes=config.num_classes,
            in_chans=config.input_channels,
            cardinality=config.cardinality,
            base_width=config.base_width,
            stem_width=config.stem_width,
            stem_type=config.stem_type,
            avg_down=config.avg_down,
        )

    def forward(self, tensor):
        return self.model.forward_features(tensor)

يمكن أن تُرجع أي نموذج أي صيغة مخرجات. يُصبح النموذج المخصص متوافقًا مع Trainer عند إرجاع قاموس (مثل ResnetModelForImageClassification) يتضمن الخسائر عندما تكون التسميات متاحة. أما بالنسبة لصيغ المخرجات الأخرى، فستحتاج إلى حلقة تدريب خاصة بك أو إلى مكتبة مختلفة للتدريب.

أنشئ كلاس النموذج المخصص مع الإعدادات.

resnet50d = ResnetModelForImageClassification(resnet50d_config)

في هذه المرحلة، يمكنك تحميل الأوزان المُسبقة التدريب في النموذج أو تدريبه من الصفر. في هذا الدليل، ستقوم بتحميل الأوزان المُسبقة التدريب.

حمّل الأوزان المُسبقة التدريب من مكتبة timm، ثم انقل تلك الأوزان إلى النموذج المخصص باستخدام load_state_dict.

import timm

pretrained_model = timm.create_model("resnet50d", pretrained=True)
resnet50d.model.load_state_dict(pretrained_model.state_dict())

AutoClass

تُعد واجهة AutoClass اختصارًا لتحميل البنية الصحيحة تلقائيًا لنموذج معين. ومن المفيد تمكين هذه الميزة للمستخدمين الذين يقومون بتحميل نموذجك المخصص.

تأكد من وجود خاصية model_type (يجب أن تكون مختلفة عن أنواع النماذج الموجودة) في فئة الإعدادات وخاصية config_class في فئة النموذج. استخدم طريقة register() لإضافة الإعدادات والنموذج المخصصين إلى واجهة AutoClass.

يجب أن يطابق الحجة الأولى لـ AutoConfig.register() خاصية model_type في فئة التهيئة المخصصة، وأن يطابق الحجة الأولى لـ AutoModel.register() الخاصية config_class لفئة النموذج المخصصة.

from transformers import AutoConfig, AutoModel, AutoModelForImageClassification

AutoConfig.register("resnet", ResnetConfig)
AutoModel.register(ResnetConfig, ResnetModel)
AutoModelForImageClassification.register(ResnetConfig, ResnetModelForImageClassification)

أصبح كود النموذج المخصص الخاص بك متوافقًا مع واجهة AutoClass. يمكن للمستخدمين تحميل النموذج باستخدام فئات AutoModel أو AutoModelForImageClassification.

رفع

ارفع نموذجًا مخصصًا إلى Hub للسماح للمستخدمين الآخرين بتحميله واستخدامه بسهولة.

تأكد من أن هيكلية مجلد النموذج صحيحة كما هو موضح أدناه. يجب أن يحتوي المجلد على:

  • modeling.py: يحتوي على كود ResnetModel وResnetModelForImageClassification. يمكن لهذا الملف الاعتماد على الاستيرادات النسبية للملفات الأخرى طالما أنها موجودة في نفس المجلد.

عند نسخ ملف نموذج من Transformers، استبدل جميع الاستيرادات النسبية في أعلى ملف modeling.py لاستيرادها من Transformers بدلاً من ذلك.

  • configuration.py: يحتوي على كود ResnetConfig.
  • __init__.py: يمكن أن يكون فارغًا، إذ يتيح هذا الملف استخدام resnet_model في بايثون كوحدة.
.
└── resnet_model
    ├── __init__.py
    ├── configuration_resnet.py
    └── modeling_resnet.py

لمشاركة النموذج، استورد نموذج ResNet وإعداداته.

from resnet_model.configuration_resnet import ResnetConfig
from resnet_model.modeling_resnet import ResnetModel, ResnetModelForImageClassification

انسخ الكود من ملفات النموذج والإعدادات. للتأكد من حفظ كائنات AutoClass باستخدام save_pretrained()، استدعِ الطريقة register_for_auto_class(). يعدّل هذا الأمر ملف JSON الخاص بالإعدادات ليشمل كائنات AutoClass وخريطة التوجيه.

بالنسبة إلى نموذج، اختر فئة AutoModelFor المناسبة بناءً على المهمة.

ResnetConfig.register_for_auto_class()
ResnetModel.register_for_auto_class("AutoModel")
ResnetModelForImageClassification.register_for_auto_class("AutoModelForImageClassification")

لربط أكثر من مهمة بالنموذج، قم بتحرير auto_map مباشرةً في ملف الإعداد بصيغة JSON.

"auto_map": {
    "AutoConfig": "<your-repo-name>--<config-name>",
    "AutoModel": "<your-repo-name>--<config-name>",
    "AutoModelFor<Task>": "<your-repo-name>--<config-name>",    
},

أنشئ التكوين والنموذج ثم حمّل الأوزان المُسبقة التدريب فيه.

resnet50d_config = ResnetConfig(block_type="bottleneck", stem_width=32, stem_type="deep", avg_down=True)
resnet50d = ResnetModelForImageClassification(resnet50d_config)

pretrained_model = timm.create_model("resnet50d", pretrained=True)
resnet50d.model.load_state_dict(pretrained_model.state_dict())

النموذج جاهز الآن للرفع إلى Hub. سجّل الدخول إلى حسابك على Hugging Face من سطر الأوامر أو من دفتر الملاحظات.

huggingface-CLI
دفتر ملاحظات
hf auth login

استدعِ push_to_hub() على النموذج لرفع النموذج إلى Hub.

resnet50d.push_to_hub("custom-resnet50d")

يجب الآن رفع الأوزان المُسبقة التدريب، وملف الإعداد، وملفَي modeling.py وconfiguration.py إلى Hub في مستودع ضمن نطاقك.

بما أن النموذج المخصص لا يستخدم نفس كود النمذجة المستخدم في نماذج Transformers، فأنت بحاجة إلى إضافة trust_remote_code=True في from_pretrained() لتحميله. راجع قسم تحميل النماذج المخصصة لمزيد من المعلومات.

Update on GitHub