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

المُحسِّنات والمُجدوِلات

يحدّث المُحسِّن أوزان النموذج أثناء التدريب. يغلّف المجدول المُحسِّن ويضبط معدل التعلم في كل خطوة تدريب. ينشئ Trainer كلاهما عند استدعائه create_optimizer_and_scheduler().

                                    ┌────────────┐         ┌──────────────┐
                                    │ Optimizer  │         │  Scheduler   │
                                    │ (adamw_torch_fused)◄─│  (linear)    │
                                    │            │         │              │
                                    │ param_groups         |              |
                                    │  └ lr       ◄────────┤              |
                                    │  └ weight_decay      │              │
                                    └──────┬─────┘         └──────────────┘
                                           │                      
  ┌──── EACH TRAINING STEP ───────────────────────────────────────────┐
  │                                        │                          │
  │   model(batch)                         │                          │
  │       │                                │                          │
  │       ▼                                │                          │
  │     loss ──► loss.backward() ──► param.grad                       │
  │                                        │                          │
  │                          ┌─────────────┘                          │
  │                          ▼                                        │
  │              optimizer.step()                                     │
  │                          │                                        │
  │                          ▼                                        │
  │                   param.data updated                              │
  │                          │                                        │
  │                          ▼                                        │
  │              lr_scheduler.step()  ──► recalculates lr             │
  │                          │            writes to optimizer         │
  │                          ▼            .param_groups['lr']         │
  │              model.zero_grad()                                    │
  │                                                                   │
  └───────────────────────────────────────────────────────────────────┘

اضبط سلوك المُحسِّن والمجدول، مثل lr_scheduler_type() وoptim()، في TrainingArguments. تُعدّ القيم الافتراضية (مُحسِّن adamw_torch ومجدول التسخين linear) نقطة انطلاق جيدة لمعظم عمليات الضبط الدقيق.

from transformers import TrainingArguments

args = TrainingArguments(
    ...,
    # Optimizer
    optim="adamw_torch",          # or "adamw_torch_fused", "adafactor", "sgd", etc.
    learning_rate=2e-5,
    weight_decay=0.01,
    adam_beta1=0.9,
    adam_beta2=0.999,
    adam_epsilon=1e-8,
    # Scheduler
    lr_scheduler_type="cosine",   # "linear", "cosine", "constant_with_warmup", etc.
    warmup_steps=500,
    lr_scheduler_kwargs={"num_cycles": 3},  # scheduler-specific extras
)

المجدولون المعتمدون على المقاييس

تتكيف بعض مجدولات التعلم مع ديناميكيات التدريب بدلاً من اتباع جدول ثابت.

يحدّث GreedyLR معدل التعلم من نتائج التقييم. فهو يرفع معدل التعلم بقسمته على factor عندما يستمر المؤشر في التحسّن، ويخفض معدل التعلم بضربه في factor عندما لا يتحسّن المؤشر. وعندما يتوقف معدل التعلم عند min_lr ولا يتحسّن بعد reset_start خطوة، يعيد GreedyLR ضبط نفسه إلى حالته الأولية ويبدأ دورة جديدة.

يتطلب GreedyLR التقييم أثناء التدريب. اضبط eval_strategy على "steps" أو "epoch".

args = TrainingArguments(
+   lr_scheduler_type="greedy",
+   lr_scheduler_kwargs={"patience": 10, "factor": 0.95, "min_lr": 1e-5},
+   eval_strategy="steps",
+   eval_steps=200,
    ...  # remaining args from the TrainingArguments intro config
)

يعمل الوضع الافتراضي mode="min" مع الخسارة. إذا كنت تتتبع مقياسًا تكون فيه القيمة الأعلى أفضل، مثل الدقة، فمرّر "mode": "max" في lr_scheduler_kwargs.

راجع فئة GreedyLR للحصول على القائمة الكاملة للمعلمات القابلة للضبط.

تكاملات المُحسِّن

تدمج مكتبة Transformers محسّنات الطرف الثالث لسيناريوهات التدريب المتخصصة.

المُحسِّنتثبيتoptim="value"الوصف
APOLLOapollo-torchapollo_adamwكفاءة في استخدام الذاكرة عبر الإسقاطات العشوائية؛ رتبة 1 كافية
GrokAdamWgrokadamwgrokadamwيستهدف التعميم المتأخر (الغروكينغ)
LOMO / AdaLomolomo-optimlomo / adalomoيجمع بين خطوة تدرّج خطوة التحديث لتدريب كامل المعاملات بذاكرة منخفضة
جدولة مجانيةschedulefreeschedule_free_adamw, schedule_free_radam, schedule_free_sgdيلغي تخفيف معدل التعلم؛ يُستخدم مع lr_scheduler_type="constant"
GaLoregalore-torchgalore_adamw, galore_adafactor, galore_adamw_8bitالتعلم الكامل للمعاملات عبر الإسقاط منخفض الرتبة للتدرجات
StableAdamWtorch-optimistable_adamwقصّ تحديث AdamW + AdaFactor؛ لا حاجة إلى قصّ التدرّجات
APOLLO
GrokAdamW
LOMO
جدولة مجانية
StableAdamW
GaLore
pip install apollo-torch

تقريب تدرّج التدرّج لتحسين نماذج اللغة الكبيرة بكفاءة في الذاكرة (APOLLO) هو مُحسِّن موفّر للذاكرة للتعلم الكامل للمعاملات أثناء التدريب المسبق والتدريب الدقيق. إنه يطابق أداء AdamW بتكلفة ذاكرة مشابهة لتكلفة SGD من خلال استخدام إسقاطات عشوائية رخيصة بدلاً من SVD. للحصول على توفير أقصى للذاكرة، استخدم APOLLO-Mini، وهو متغير من الدرجة الأولى.

استخدم معامل optim_target_modules لتحديد الطبقات التي تريد تدريبها.

args = TrainingArguments(
+   optim="apollo_adamw",
+   optim_target_modules=[r".*.attn.*", r".*.mlp.*"],
    ...  # remaining args from the TrainingArguments intro config
)

مرّر معاملات فائقة إضافية عبر optim_args.

اضبط scale على n/r، حيث n هو بُعد الفضاء الأصلي وr هو بُعد الفضاء منخفض الرتبة. إن ضبط معدل التعلم مع إبقاء scale على قيمته الافتراضية يحقق تأثيرًا مشابهًا.

معاملالوصفAPOLLOAPOLLO-Mini
الترتيبرتبة الفضاء الفرعي المساعد لتقليص التدرج2561
scale_typeكيف تُطبَّق عوامل التوسيعchannel (تصعيد لكل قناة)tensor (مقياس لكل متجه)
scaleيُعدّل تحديثات التدرّج لتثبيت التدريب1.0128
update_proj_gapالخطوات قبل تحديث مصفوفات الإسقاط200200
projنوع الإسقاطrandomrandom

تفعيل APOLLO-Mini بتكوين من الدرجة الأولى.

args = TrainingArguments(
    optim="apollo_adamw",
    optim_target_modules=[r".*.attn.*", r".*.mlp.*"],
    optim_args="proj=random,rank=1,scale=128.0,scale_type=tensor,update_proj_gap=200",
    ...  # remaining args from the TrainingArguments intro config
)

تخصيص المُحسِّن والمجدول

أنشئ مُحسِّناً وجدولة مخصصين لاستخدام مُحسِّن لم يتم دمجه بعد، أو لضبط معدلات التعلم لكل طبقة، أو لتطبيق منطق مخصص.

مرّر فئة وkwargs

يقبل ~Trainer.optimizer_cls_and_kwargs فئة مُحسِّن مخصصة، مع تفويض تجميع المعاملات وتحديد الموقع على الجهاز إلى Trainer.

يؤجّل Trainer إنشاء المُحسِّن حتى يتم تنفيذ create_optimizer()، بحيث يكون النموذج موجودًا بالفعل على الجهاز الصحيح.

import torch

trainer = Trainer(
    ...
    optimizer_cls_and_kwargs=(
        torch.optim.SGD,
        {"momentum": 0.9, "nesterov": True}
    ),
)

تمرير الكائنات الجاهزة

مرّر مُحسِّنًا ومجدولًا مُعرَّفين مسبقًا إلى ~Trainer.optimizers. يتخطى Trainer استدعاء create_optimizer() وcreate_scheduler() عند توفير كائنات جاهزة مسبقًا. إذا لم تمرر مجدولًا، يقوم Trainer بإنشاء واحد تلقائيًا.

أنشئ المُحسِّن بعد وضع النموذج على الجهاز الصحيح. يتم تحديد المعاملات عند الإنشاء، قبل أن ينقل Trainer النموذج. في التدريب الموزّع، قد تُسبّب الأجهزة غير المتطابقة سلوكًا غير صحيح بصمت.

import torch
from transformers import Trainer, get_cosine_schedule_with_warmup

optimizer = torch.optim.AdamW(model.parameters(), lr=2e-5)
scheduler = get_cosine_schedule_with_warmup(
    optimizer, num_warmup_steps=500, num_training_steps=10_000
)

trainer = Trainer(
    ...
    optimizers=(optimizer, scheduler),
)

تتجاوز الأمثلة الجاهزة create_optimizer() و create_scheduler()، لذا عليك تحديد مجموعات المعلمات الخاصة بك.

تجاوز طرق المُحسِّن والمجدول

أنشئ فئة فرعية من create_optimizer() و create_scheduler() للحصول على تحكم كامل. يتم تنفيذ كلا الطريقتين أثناء تشغيل train().

استبدل create_scheduler() لاستخدام جدولة مثل OneCycleLR غير المتوفرة في SchedulerType.

بالنسبة لكل طريقة، تأكد من إسناد القيمة إلى self وإرجاعها.

import torch
from transformers import Trainer

class MyTrainer(Trainer):

    def create_scheduler(self, num_training_steps, optimizer=None):
        optimizer = optimizer or self.optimizer
        self.lr_scheduler = torch.optim.lr_scheduler.OneCycleLR(
            optimizer,
            max_lr=0.1,
            total_steps=num_training_steps,
        )
        return self.lr_scheduler

لا تحتاج إلى تجاوز create_optimizer() إذا كان المُحسِّن الافتراضي يعمل بشكل صحيح. من الأسهل توسيع طريقة باستخدام super() بدلاً من استبدالها بالكامل. على سبيل المثال، أضف مجموعة معلمات إضافية مع إبقاء كل شيء آخر كما هو.

class MyTrainer(Trainer):
    def create_optimizer(self, model=None):
        super().create_optimizer(model)  # builds the default two param groups
        # add extra param group
        self.optimizer.add_param_group({
            "params": self.model.classifier.parameters(),
            "lr": self.args.learning_rate * 10,
        })
        return self.optimizer
Update on GitHub