Transformers documentation

Parametre verimli ince ayar

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

Parametre verimli ince ayar

Parametre verimli ince ayar (PEFT) yöntemleri, önceden eğitilmiş bir modelin üzerine eklenen küçük sayıda model parametresini (adaptörleri) ince ayarlar. Sadece adaptör parametreleri güncellendiğinden, optimizör çok daha az gradyan ve durumu izler; bu da bellek kullanımını önemli ölçüde azaltır. Adaptörler hafif olduğundan paylaşmak, depolamak ve yüklemek için uygundur.

Transformers, PeftAdapterMixin aracılığıyla PEFT kütüphanesiyle doğrudan entegre edilir ve bu karışım tüm PreTrainedModel sınıflarına eklenmiştir. Modelinizi ayrı bir PeftModel içine sarmalamadan adaptörleri yükleyebilir, ekleyebilir, eğitebilir, değiştirebilir ve silebilirsiniz. Prompt öğrenimi dışındaki tüm PEFT yöntemleri desteklenir (LoRA, IA3, AdaLoRA). Prompt tuning ve prefix tuning gibi prompt tabanlı yöntemler için PEFT kütüphanesini doğrudan kullanmanız gerekir.

Başlamak için PEFT'yi yükleyin. Entegrasyon peft >= 0.20.0 gerektirir.

pip install -U peft

Uyarlama ekleyin

Örneğin LoraConfig gibi bir PEFT yapılandırması oluşturun ve add_adapter() ile bir modele ekleyin.

from peft import LoraConfig, TaskType
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b")

lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1,
)

model.add_adapter(lora_config, adapter_name="my_adapter")

Belirli katmanların tamamen ince ayarı

Bir adaptörün (örneğin dil modeli başlığının) yanında ek modüller eğitmek için bunları modules_to_save içinde belirtin. modules_to_save, adaptörle birlikte tamamen ince ayarlanan katmanları belirtir; bu nedenle bu katmanların tüm parametreleri güncellenir. Bir nedensel LM'yi dizi sınıflandırma için uyarlarken, dil modeli başlığı (lm_head) gibi belirli katmanların güncellenmesi gerektiğinde bu özellik kullanışlıdır.

lora_config = LoraConfig(
    modules_to_save=["lm_head"],
    ...
)
model.add_adapter(lora_config)

Uyarlanacak katmanların seçimi

Yaygın mimarilerde (Llama, Gemma, Qwen vb.) PEFT, q_proj ve v_proj gibi önceden tanımlı varsayılan hedeflere sahiptir; bu nedenle target_modules parametresini belirtmenize gerek yoktur. Farklı katmanları hedeflemek isterseniz veya modelde önceden tanımlı hedefler yoksa, target_modules parametresini modül adlarının bir listesi veya bir regex deseni olarak açıkça iletin.

lora_config = LoraConfig(
    target_modules=["q_proj", "k_proj"],
    ...
)
model.add_adapter(lora_config)

Eğitim

Bağlı bir adaptöre sahip modeli Trainer sınıfına iletin ve train() fonksiyonunu çağırın. Trainer yalnızca adaptör parametrelerini (bunlar requires_grad=True olanlardır) günceller, çünkü temel model dondurulmuştur.

from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./output",
    num_train_epochs=3,
    per_device_train_batch_size=4,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
)

trainer.train()

Eğitim sırasında Trainer kontrol noktaları yalnızca adaptör ağırlıklarını (adapter_model.safetensors) ve yapılandırmayı (adapter_config.json) içerir; bu sayede kontrol noktaları küçük kalır. Temel model dahil edilmez.

Eğitimden sonra, son adaptörü save_pretrained() ile kaydedin.

model.save_pretrained("./my_adapter")

Kontrol noktasından devam etme

Trainer, devam ederken adapter checkpoint'lerini otomatik olarak algılar. Trainer, checkpoint dizinini tarar, adapter ağırlıkları içeren alt dizinleri bulur ve her bir adapter'ı doğru eğitilebilir durumla yeniden yükler.

trainer.train(resume_from_checkpoint="./output/checkpoint-1000")

Dağıtık eğitim

PEFT adaptörleri, dağıtık eğitimle hazır olarak çalışır.

ZeRO-3 için Trainer, PEFT modeliyle checkpoint'leri kaydederken exclude_frozen_parameters=True parametresini iletir. Donmuş temel model ağırlıkları atlanır. Yalnızca eğitilebilir adaptör parametreleri kaydedilir; bu da checkpoint boyutunu ve kayıt süresini azaltır.

FSDP için Trainer, LoRA katmanlarını doğru şekilde işleyebilmek için FSDP otomatik sarma politikasını günceller. QLoRA (kuantize edilmiş temel model + LoRA) durumunda ise Trainer, karma hassasiyet politikasını da kuantizasyon depolama veri türüne uyduracak şekilde ayarlar.

PEFT adaptörlerini tensör paralel bir temel modele yükleyebilir ve adaptör ağırlıklarının bölünmesini PEFT'nin yönetmesine izin verebilirsiniz. Bir adaptör yüklemek için peft >= 0.21.1 gereklidir. TP ile eğitim için Tensör paralelliği bölümüne bakın.

Bir adaptörün yüklenmesi

Bir adaptör yüklemek için, Hub deposu veya yerel dizin adapter_config.json dosyasını ve adaptör ağırlıklarını içermelidir.

from_pretrained
load_adapter

from_pretrained() adaptörleri otomatik olarak algılar. adapter_config.json dosyası bulunduğunda, doğru temel modeli yüklemek için base_model_name_or_path alanını okur ve ardından adaptörü bunun üzerine yükler.

from transformers import AutoModelForCausalLM

# Automatically loads the base model and attaches the adapter
model = AutoModelForCausalLM.from_pretrained("klcsp/gemma7b-lora-alpaca-11-v1")

Büyük modeller için bellek tasarrufu sağlamak üzere bitsandbytes ile 8-bit veya 4-bit hassasiyette bir kuantize sürüm yükleyin. Modeli kullanılabilir donanımlar arasında dağıtmak için device_map="auto" ekleyin.

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

model = AutoModelForCausalLM.from_pretrained(
    "klcsp/gemma7b-lora-alpaca-11-v1",
    quantization_config=BitsAndBytesConfig(load_in_8bit=True),
    device_map="auto",
)

Birden çok adaptörün yönetimi

Bir model aynı anda birden çok adaptör barındırabilir. Benzersiz adlarla adaptörler ekleyin ve gerektiğinde bunlar arasında geçiş yapın.

from peft import LoraConfig

model.add_adapter(LoraConfig(r=8, lora_alpha=32), adapter_name="adapter_1")
model.add_adapter(LoraConfig(r=16, lora_alpha=64), adapter_name="adapter_2")

Belirli bir adaptörü etkinleştirmek için set_adapter() kullanın. Diğer adaptörler devre dışı bırakılır ancak bellekte kalır.

model.set_adapter("adapter_2")

enable_adapters() bağlı tüm adaptörleri etkinleştirir, disable_adapters() ise hepsini devre dışı bırakır.

# Disable all adapters for base model inference
model.disable_adapters()

# Re-enable all adapters
model.enable_adapters()

Hangi adaptörlerin şu anda aktif olduğunu görmek için active_adapters() kullanın.

model.active_adapters()
# ["adapter_1"]

Artık ihtiyaç duymadığınız adaptörleri delete_adapter() ile kaldırarak bellek boşaltın.

model.delete_adapter("adapter_1")

Uydu değiştirme

Her istek sırasında yeni bir adaptör yüklemek yeni bellek ayırır. Model torch.compile ile derlenmişse, her yeni adaptör yeniden derlemeyi tetikler. Hotswapping, adaptör ağırlıklarını yerinde değiştirerek her iki sorunu da ortadan kaldırır. Yalnızca LoRA adaptörleri desteklenir.

hotswap=True parametresini, bir LoRA adaptörünün ağırlıklarını mevcut bir adaptör yuvasıyla değiştirmek için adaptörü yüklerken geçirin. adapter_name değerini, değiştirilecek adaptörün adıyla eşleştirin ("default" varsayılan adaptör adıdır).

model = AutoModel.from_pretrained(...)
# Load the first adapter normally
model.load_adapter(adapter_path_1)
# Generate outputs with adapter 1
...
# Hotswap the second adapter in-place
model.load_adapter(adapter_path_2, hotswap=True, adapter_name="default")
# Generate outputs with adapter 2

torch.compile

Derlenmiş modeller için, enable_peft_hotswap() fonksiyonunu ilk adaptörü yüklemekten ve derlemeden önce çağırın.

model = AutoModel.from_pretrained(...)
max_rank = ...  # highest rank among all LoRAs you'll load
model.enable_peft_hotswap(target_rank=max_rank)
model.load_adapter(adapter_path_1, adapter_name="default")
model = torch.compile(model, ...)
output_1 = model(...)

# Hotswap without recompilation
model.load_adapter(adapter_path_2, adapter_name="default")
output_2 = model(...)

target_rank argümanı, yükleyeceğiniz tüm LoRA adaptörleri arasındaki en yüksek rank değerini belirler. Rank 8 ve rank 16 değerine sahip adaptörleriniz varsa target_rank=16 değerini iletin. Varsayılan değer 128'dir.

enable_peft_hotswap çağrısından sonra, sonraki tüm load_adapter çağrıları varsayılan olarak hotswap yapar. Hotswap'ı devre dışı bırakmak için hotswap=False parametresini açıkça iletin.

Hotswap edilen adaptör, başlangıç adaptöründen daha fazla katmana yönelikse yeniden derleme yine gerçekleşebilir. Yeniden derlemeyi önlemek için en fazla katmana yönelik adaptörü önce yükleyin.

Beklenmedik yeniden derlemeyi tespit etmek için kodunuzu with torch._dynamo.config.patch(error_on_recompile=True) içine sarın. Yukarıdaki adımları izlemenize rağmen yeniden derleme tespit ederseniz, yeniden üretilebilir bir örnekle PEFT için bir sorun açın.

Sonraki adımlar

  • PEFT belgeleri, PEFT yöntemlerinin ve seçeneklerinin tamamını kapsar.
  • PEFT sıcak değiştirme referansı, kısıtlamaları ve sınır durumlarını ayrıntılarıyla açıklar.
  • Bir blog yazısı, torch.compile'in hotswapping ile çalışma süresini nasıl iyileştirdiğini ölçer.
Update on GitHub