Transformers documentation

Optimizatörler ve zamanlayıcılar

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Optimizatörler ve zamanlayıcılar

Bir optimizer, eğitim sırasında model ağırlıklarını günceller. Scheduler, optimizer'ı sarmalar ve her eğitim adımında öğrenme oranını ayarlar. Trainer, create_optimizer_and_scheduler() çağrısını yaptığında her ikisini de oluşturur.

                                    ┌────────────┐         ┌──────────────┐
                                    │ 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()                                    │
  │                                                                   │
  └───────────────────────────────────────────────────────────────────┘

TrainingArguments içinde lr_scheduler_type() ve optim() gibi optimizör ve zamanlayıcı davranışlarını yapılandırın. Varsayılanlar (adamw_torch optimizörü ve linear ısınma zamanlayıcısı), çoğu ince ayar çalışması için iyi bir başlangıç noktasıdır.

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
)

Metrik tabanlı zamanlayıcılar

Bazı zamanlayıcılar, sabit bir zaman çizelgesini takip etmek yerine eğitim dinamiklerine uyum sağlar.

GreedyLR, öğrenme oranını değerlendirme sonuçlarına göre günceller. Metrik sürekli iyileşiyorsa öğrenme oranını factor değerine bölerek artırır, metrik iyileşmiyorsa factor değerine çarparak azaltır. Öğrenme oranı min_lr değerinde durduktan ve reset_start adım boyunca iyileşme olmadığında, GreedyLR başlangıç durumuna sıfırlanır ve yeni bir döngü başlatır.

GreedyLR, eğitim sırasında değerlendirme gerektirir. eval_strategy değerini "steps" veya "epoch" olarak ayarlayın.

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
)

Varsayılan mode="min" kaybı (loss) için işe yarar. Doğruluk gibi daha yüksek değerin daha iyi olduğu bir metriği izliyorsanız, lr_scheduler_kwargs içinde "mode": "max" parametresini iletin.

Yapılandırılabilir parametrelerin tam listesi için GreedyLR sınıfına bakın.

Optimizatör entegrasyonları

Transformers, özel eğitim senaryoları için üçüncü taraf optimizörleri entegre eder.

OptimizatörYükleoptim="value"Açıklama
APOLLOapollo-torchapollo_adamwRastgele projeksiyonlar aracılığıyla bellek verimli tam parametre; rank-1 yeterli
GrokAdamWgrokadamwgrokadamwGecikmiş genelleşmeyi (grokking) hedefler
LOMO / AdaLomolomo-optimlomo / adalomoDüşük bellek tam parametreli ince ayar için gradyan + güncelleme adımını birleştirir
Ücretsiz Planlaschedulefreeschedule_free_adamw, schedule_free_radam, schedule_free_sgdLR annealing'i ortadan kaldırır; lr_scheduler_type="constant" ile birlikte kullanın
GaLoregalore-torchgalore_adamw, galore_adafactor, galore_adamw_8bitGradyan düşük-rank projeksiyonu ile tam parametre öğrenimi
StableAdamWtorch-optimistable_adamwAdamW + AdaFactor güncelleme kırpma; gradyan kırpma gerekmez
APOLLO
GrokAdamW
LOMO
Ücretsiz Planla
StableAdamW
GaLore
pip install apollo-torch

Approximated Gradient Scaling for Memory Efficient LLM Optimization (APOLLO), ön eğitim ve ince ayar sırasında tam parametre öğrenimi için bellek verimli bir optimizatördür. SVD yerine ucuz rastgele projeksiyonlar kullanarak SGD benzeri bellek maliyetiyle AdamW performansını eşitler. Aşırı bellek tasarrufu için, rank-1 varyantı olan APOLLO-Mini'yi kullanın.

Hangi katmanların eğitileceğini belirtmek için optim_target_modules parametresini kullanın.

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

Ek hiperparametreleri optim_args üzerinden iletin.

scale değerini n/r olarak ayarlayın; burada n orijinal uzay boyutunu, r ise düşük rütbeli uzay boyutunu temsil eder. scale değerini varsayılan olarak bırakıp öğrenme oranını ayarlamak benzer bir etkiyi sağlar.

parametreaçıklamaAPOLLOAPOLLO-Mini
rankgradiyan ölçekleme için yardımcı alt uzayın rütbesi2561
scale_typeölçekleme faktörlerinin nasıl uygulandığıchannel (kanal başına ölçeklendirme)tensor (tensor başına ölçeklendirme)
ölçekeğitimi stabilize etmek için gradyan güncellemelerini ayarlar1.0128
update_proj_gapprojeksiyon matrislerini güncellemeden önceki adımlar200200
projprojection türürandomrandom

APOLLO-Mini'yi rank-1 yapılandırmasıyla etkinleştirin.

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
)

Optimizatör ve zamanlayıcıyı özelleştirme

Henüz entegre edilmemiş bir optimizatör kullanmak, katman başına öğrenme oranlarını ayarlamak veya özel mantık uygulamak için özel bir optimizatör ve zamanlayıcı oluşturun.

Bir sınıf ve kwargs iletin

~Trainer.optimizer_cls_and_kwargs, Trainer'e parametre gruplandırma ve cihaz yerleşimi işlemlerini devrederek özel bir optimizör sınıfı kabul eder.

Trainer, modelin zaten doğru cihazda olmasını sağlamak için optimizatörün oluşturulmasını create_optimizer() çalışana kadar erteler.

import torch

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

Önceden oluşturulmuş örnekleri iletin

~Trainer.optimizers içine önceden tanımlanmış bir optimizer ve scheduler geçirin. Trainer, hazır örnekler sağlandığında create_optimizer() ve create_scheduler() işlemlerini atlar. Scheduler geçmezseniz, Trainer otomatik olarak bir tane oluşturur.

Modelinizi doğru cihaza yerleştirdikten sonra optimizatörü oluşturun. Parametreler, Trainer modeli taşımadan önce, inşaat sırasında çözümlenir. Dağıtık eğitimde, eşleşmeyen cihazlar sessizce hatalı davranışlara neden olabilir.

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),
)

Hazır yapılandırılmış örnekler create_optimizer() ve create_scheduler() işlevlerini atlar; bu nedenle kendi parametre gruplarınızı belirtmeniz gerekir.

Optimizatör ve zamanlayıcı yöntemlerini geçersiz kılma

Tam kontrol için create_optimizer() ve create_scheduler() sınıflarını alt sınıflandırın. Her iki yöntem de train() sırasında çalışır.

SchedulerType içinde bulunmayan OneCycleLR gibi bir zamanlayıcı kullanmak için create_scheduler() işlevini geçersiz kılın.

Her yöntem için, self'e atama yaptığınızdan ve onu döndürdüğünüzden emin olun.

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

Varsayılan optimizör işe yarıyorsa create_optimizer() metodunu yeniden tanımlamanıza gerek yoktur. Bir metodu tamamen değiştirmek yerine super() ile genişletmek daha kolaydır. Örneğin, her şeyi aynı bırakıp ek bir parametre grubu ekleyebilirsiniz.

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