Buckets:

hf-doc-build/doc / transformers /main /ar /custom_models.md
mishig's picture
|
download
raw
16.1 kB
# تخصيص النماذج
تم تصميم نماذج Transformers لتكون قابلة للتخصيص. يحتوي كود النموذج بالكامل على مجلد [model](https://github.com/huggingface/transformers/tree/main/src/transformers/models) الفرعي في مستودع Transformers. يحتوي كل مجلد على ملف `modeling.py` وملف `configuration.py`. انسخ هذه الملفات لبدء تخصيص النموذج.
> [!TIP]
> قد يكون من الأسهل البدء من الصفر إذا كنت تنشئ نموذجًا جديدًا بالكامل. لكن بالنسبة للنماذج التي تشبه إلى حد كبير نموذجًا موجودًا في Transformers، يكون إعادة استخدام فئة الإعداد والنموذج نفسها أو إنشاء فئة فرعية منها أسرع.
ستُظهر لك هذه الدليل كيفية تخصيص نموذج ResNet، وتمكين دعم [AutoClass](#autoclass)، ومشاركته على Hub.
## الإعداد
تحتوي التهيئة، المُحدَّدة بواسطة الفئة الأساسية [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig)، على جميع المعلومات اللازمة لبناء نموذج. هنا ستقوم بإعداد خصائص نموذج ResNet المخصص. تمنح الخصائص المختلفة أنواعًا مختلفة من نماذج ResNet.
القواعد الرئيسية لتخصيص تكوين هي:
1. A custom configuration must subclass [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig). This ensures a custom model has all the functionality of a Transformers' model such as [from_pretrained()](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig.from_pretrained), [save_pretrained()](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig.save_pretrained), and [push_to_hub()](/docs/transformers/main/ar/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub).
2. يجب أن يقبل [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig) `__init__` أي `kwargs` ويجب تمريرها إلى `__init__` للفئة الأصلية. يحتوي [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig) على حقول أكثر من تلك التي تم ضبطها في التهيئة المخصصة لك، لذا عند تحميل التهيئة باستخدام [from_pretrained()](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig.from_pretrained)، يجب أن تقبل تهيئتك هذه الحقول وتُمررها إلى الفئة الأصلية.
> [!TIP]
> يُفيد التحقق من صحة بعض المعاملات. في المثال أدناه، يتم تنفيذ فحص للتأكد من أن `block_type` و`stem_type` تنتمي إلى أحد القيم المحددة مسبقًا.
>
> أضف `model_type` إلى فئة الإعدادات لتفعيل دعم [AutoClass](#autoclass).
```py
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()](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig.save_pretrained).
```py
resnet50d_config = ResnetConfig(block_type="bottleneck", stem_width=32, stem_type="deep", avg_down=True)
resnet50d_config.save_pretrained("custom-resnet")
```
## النموذج
باستخدام تكوين ResNet المخصص، يمكنك الآن إنشاء النموذج وتخصيصه. يرث النموذج من الفئة الأساسية [PreTrainedModel](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel). وبالمثل لما يحدث مع [PreTrainedConfig](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig)، فإن الوراثة من [PreTrainedModel](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel) وتهيئة الفئة الأصلية بالتكوين المخصص يوسّعان وظائف Transformers مثل الحفظ والتحميل إلى النموذج المخصص.
تتبع نماذج Transformers اتفاقية تقضي بقبول كائن `config` في طريقة `__init__`. وهذا ينقل كائن `config` بأكمله إلى طبقات النموذج الفرعية، بدلاً من تقسيم كائن `config` إلى عدة معاملات تُمرَّر إلى الطبقات الفرعية بشكل منفصل.
يُنتج كتابة النماذج بهذه الطريقة كوداً أبسط مع مصدر واضح للحقيقة لأي من المعلمات الفائقة. كما أنه يسهّل إعادة استخدام الكود من نماذج Transformers الأخرى.
ستقوم بإنشاء نموذجين من ResNet: نموذج ResNet أساسي يُخرج الحالات المخفية، ونموذج ResNet مزوّد برأس تصنيف للصور.
حدد تخطيطًا بين أنواع الكتل والفئات. يتم إنشاء كل ما عدا ذلك عن طريق تمرير فئة الإعداد إلى فئة نموذج ResNet.
> [!TIP]
> أضف `config_class` إلى فئة النموذج لتفعيل دعم [AutoClass](#autoclass).
```py
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 هي نفسها.
> [!TIP]
> أضف `config_class` إلى فئة النموذج لتفعيل دعم [AutoClass](#autoclass).
```py
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](/docs/transformers/main/ar/main_classes/trainer#transformers.Trainer). أما بالنسبة لصيغ المخرجات الأخرى، فستحتاج إلى حلقة تدريب خاصة بك أو مكتبة مختلفة للتدريب.
أنشئ كلاس النموذج المخصص مع الإعدادات.
```py
resnet50d = ResnetModelForImageClassification(resnet50d_config)
```
في هذه المرحلة، يمكنك تحميل الأوزان المُسبقة التدريب في النموذج أو تدريبه من الصفر. في هذا الدليل، ستقوم بتحميل الأوزان المُسبقة التدريب.
حمّل الأوزان المُسبقة التدريب من مكتبة [timm](https://hf.co/docs/timm/index)، ثم انقل تلك الأوزان إلى النموذج المخصص باستخدام [load_state_dict](https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module.load_state_dict).
```py
import timm
pretrained_model = timm.create_model("resnet50d", pretrained=True)
resnet50d.model.load_state_dict(pretrained_model.state_dict())
```
## AutoClass
تُعد واجهة [AutoClass](./models#model-classes) اختصارًا لتحميل البنية الصحيحة تلقائيًا لنموذج معين. ومن المفيد تمكين هذه الميزة للمستخدمين الذين يقومون بتحميل نموذجك المخصص.
تأكد من وجود خاصية `model_type` (يجب أن تكون مختلفة عن أنواع النماذج الموجودة) في فئة الإعدادات وخاصية `config_class` في فئة النموذج. استخدم طريقة [register()](/docs/transformers/main/ar/model_doc/auto#transformers.AutoConfig.register) لإضافة الإعدادات والنموذج المخصصين إلى واجهة [AutoClass](./models#model-classes).
> [!TIP]
> يجب أن يطابق الحجة الأولى لـ [AutoConfig.register()](/docs/transformers/main/ar/model_doc/auto#transformers.AutoConfig.register) خاصية `model_type` في فئة التهيئة المخصصة، وأن يطابق الحجة الأولى لـ `AutoModel.register()` الخاصية `config_class` لفئة النموذج المخصصة.
```py
from transformers import AutoConfig, AutoModel, AutoModelForImageClassification
AutoConfig.register("resnet", ResnetConfig)
AutoModel.register(ResnetConfig, ResnetModel)
AutoModelForImageClassification.register(ResnetConfig, ResnetModelForImageClassification)
```
أصبح كود النموذج المخصص الخاص بك متوافقًا مع واجهة [AutoClass](#autoclass). يمكن للمستخدمين تحميل النموذج باستخدام فئات [AutoModel](./model_doc/auto) أو [AutoModelForImageClassification](/docs/transformers/main/ar/model_doc/auto#transformers.AutoModelForImageClassification).
## رفع
ارفع نموذجًا مخصصًا إلى [Hub](https://hf.co/models) للسماح للمستخدمين الآخرين بتحميله واستخدامه بسهولة.
تأكد من أن هيكلية مجلد النموذج صحيحة كما هو موضح أدناه. يجب أن يحتوي المجلد على:
- `modeling.py`: يحتوي على كود `ResnetModel` و`ResnetModelForImageClassification`. يمكن لهذا الملف الاعتماد على الاستيرادات النسبية إلى ملفات أخرى طالما أنها موجودة في نفس المجلد.
> [!WARNING]
> عند نسخ ملف نموذج من Transformers، استبدل جميع الاستيرادات النسبية في أعلى ملف `modeling.py` لاستيرادها من Transformers بدلاً من ذلك.
- `configuration.py`: يحتوي على كود `ResnetConfig`.
- `__init__.py`: يمكن أن يكون فارغًا، إذ يتيح هذا الملف استخدام `resnet_model` في بايثون كوحدة.
```bash
.
└── resnet_model
├── __init__.py
├── configuration_resnet.py
└── modeling_resnet.py
```
لمشاركة النموذج، استورد نموذج ResNet وإعداداته.
```py
from resnet_model.configuration_resnet import ResnetConfig
from resnet_model.modeling_resnet import ResnetModel, ResnetModelForImageClassification
```
انسخ الكود من ملفات النموذج والإعدادات. للتأكد من حفظ كائنات AutoClass باستخدام [save_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.save_pretrained)، استدعِ الطريقة [register_for_auto_class()](/docs/transformers/main/ar/main_classes/configuration#transformers.PreTrainedConfig.register_for_auto_class). يعدّل هذا الأمر ملف JSON الخاص بالإعدادات ليشمل كائنات AutoClass وخريطة التوجيه.
بالنسبة إلى نموذج، اختر فئة `AutoModelFor` المناسبة بناءً على المهمة.
```py
ResnetConfig.register_for_auto_class()
ResnetModel.register_for_auto_class("AutoModel")
ResnetModelForImageClassification.register_for_auto_class("AutoModelForImageClassification")
```
لربط أكثر من مهمة بالنموذج، قم بتحرير `auto_map` مباشرةً في ملف الإعداد بصيغة JSON.
```json
"auto_map": {
"AutoConfig": "<your-repo-name>--<config-name>",
"AutoModel": "<your-repo-name>--<config-name>",
"AutoModelFor<Task>": "<your-repo-name>--<config-name>",
},
```
أنشئ التكوين والنموذج ثم حمّل الأوزان المُسبقة التدريب فيه.
```py
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 من سطر الأوامر أو من دفتر الملاحظات.
```bash
hf auth login
```
```py
from huggingface_hub import notebook_login
notebook_login()
```
استدعِ [push_to_hub()](/docs/transformers/main/ar/main_classes/model#transformers.utils.PushToHubMixin.push_to_hub) على النموذج لرفع النموذج إلى Hub.
```py
resnet50d.push_to_hub("custom-resnet50d")
```
يجب الآن رفع الأوزان المُسبقة التدريب، وملف الإعداد، وملفَي `modeling.py` و`configuration.py` إلى Hub في [مستودع](https://hf.co/sgugger/custom-resnet50d) ضمن نطاقك.
بما أن النموذج المخصص لا يستخدم نفس كود النمذجة المستخدم في نماذج Transformers، فأنت بحاجة إلى إضافة `trust_remote_code=True` في [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميله. راجع قسم تحميل [النماذج المخصصة](./models#custom-models) لمزيد من المعلومات.

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.