Buckets:
تخصيص النماذج
تم تصميم نماذج Transformers لتكون قابلة للتخصيص. يحتوي كود النموذج بالكامل على مجلد model الفرعي في مستودع Transformers. يحتوي كل مجلد على ملف modeling.py وملف configuration.py. انسخ هذه الملفات لبدء تخصيص النموذج.
قد يكون من الأسهل البدء من الصفر إذا كنت تنشئ نموذجًا جديدًا بالكامل. لكن بالنسبة للنماذج التي تشبه إلى حد كبير نموذجًا موجودًا في Transformers، يكون إعادة استخدام فئة الإعداد والنموذج نفسها أو إنشاء فئة فرعية منها أسرع.
ستُظهر لك هذه الدليل كيفية تخصيص نموذج ResNet، وتمكين دعم AutoClass، ومشاركته على Hub.
الإعداد
تحتوي التهيئة، المُحدَّدة بواسطة الفئة الأساسية PreTrainedConfig، على جميع المعلومات اللازمة لبناء نموذج. هنا ستقوم بإعداد خصائص نموذج ResNet المخصص. تمنح الخصائص المختلفة أنواعًا مختلفة من نماذج ResNet.
القواعد الرئيسية لتخصيص تكوين هي:
- 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().
- يجب أن يقبل 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 مزوّد برأس تصنيف للصور.
حدد تخطيطًا بين أنواع الكتل والفئات. يتم إنشاء كل ما عدا ذلك عن طريق تمرير فئة الإعداد إلى فئة نموذج 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)
يتعيّن إعادة كتابة طريقة forward لحساب الخسارة لكل لوجيت إذا كانت التسميات متاحة. وإلا، فإن فئة نموذج ResNet هي نفسها.
أضف
config_classإلى فئة النموذج لتفعيل دعم AutoClass.
import torch
class ResnetModelForImageClassification(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, labels=None):
logits = self.model(tensor)
if labels is not None:
loss = torch.nn.functional.cross_entropy(logits, labels)
return {"loss": loss, "logits": logits}
return {"logits": logits}
يمكن أن يعيد النموذج أي صيغة مخرجات. يعيد إرجاع قاموس (مثل ResnetModelForImageClassification) مع الخسائر عندما تكون التسميات متاحة، النموذج المخصص متوافقًا مع Trainer. أما بالنسبة لصيغ المخرجات الأخرى، فستحتاج إلى حلقة تدريب خاصة بك أو مكتبة مختلفة للتدريب.
أنشئ كلاس النموذج المخصص مع الإعدادات.
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 من سطر الأوامر أو من دفتر الملاحظات.
hf auth login
from huggingface_hub import notebook_login
notebook_login()
استدعِ push_to_hub() على النموذج لرفع النموذج إلى Hub.
resnet50d.push_to_hub("custom-resnet50d")
يجب الآن رفع الأوزان المُسبقة التدريب، وملف الإعداد، وملفَي modeling.py وconfiguration.py إلى Hub في مستودع ضمن نطاقك.
بما أن النموذج المخصص لا يستخدم نفس كود النمذجة المستخدم في نماذج Transformers، فأنت بحاجة إلى إضافة trust_remote_code=True في from_pretrained() لتحميله. راجع قسم تحميل النماذج المخصصة لمزيد من المعلومات.
Xet Storage Details
- Size:
- 16.1 kB
- Xet hash:
- 30c3e2347bb3de834c6ff87eec24a97fb2495317b8d66f8d33812eb85c1e63bb
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.