PEFT documentation

Hızlı Tur

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Hızlı Tur

PEFT, büyük önceden eğitilmiş modelleri ince ayarlamak için parametre-verimli yöntemler sunar. Geleneksel paradigma, her aşağı akış görevi için modelin tüm parametrelerini ince ayarlamaktır; ancak günümüzdeki modellerdeki devasa parametre sayısı nedeniyle bu giderek son derece maliyetli ve uygulanabilirlikten uzak hale gelmektedir. Bunun yerine, daha az sayıda prompt parametresi eğitmek veya eğitilebilir parametre sayısını azaltmak için düşük rütbeli uyarlama (LoRA) gibi bir yeniden parametrelendirme yöntemi kullanmak daha verimlidir.

PEFT, mevcut modellerin ("temel modeller") keyfi yerlerine eğitilebilir parametreler eklemek için kullanılan bir çerçeve olarak düşünülebilir. Belirli PEFT yöntemleri, eğitilebilir parametreleri belirli şekillerde düzenler veya temel modelin tüm parametrelerini eğitmeye benzer bir ince ayar performansı elde etmek için eğitim sürecini değiştirir.

Bu hızlı tur, PEFT’nin ana özelliklerini ve tüketici cihazlarında genellikle erişilemez olan büyük modelleri nasıl eğitebileceğinizi veya çıkarım yapabileceğinizi gösterecektir.

PEFT yapılandırması ve modeli

Herhangi bir PEFT yöntemi için, PEFT yönteminin nasıl uygulanacağını belirleyen tüm parametreleri içeren bir yapılandırma oluşturmanız gerekir; en önemlisi, eğitilebilir parametrelerle hedeflenecek mevcut model katmanlarıdır. Yapılandırma ayarlandıktan sonra, bunu temel modelle birlikte get_peft_model() fonksiyonuna iletin ve eğitilebilir bir PeftModel oluşturun.

Örnek olarak LoRA kullanalım ancak yalnızca ortak parametrelerden bahsedelim - pek çok diğer PEFT yönteminden birini kullanmak isteyebilirsiniz. Yapılandırma genellikle şunu içerir:

  • target_modules: temel modelin uyarlanacak modülleri
  • task_type (varsayılan: None, bkz. mevcut TaskTypeler): eğitilen görevin doğası; sağlanırsa, adaptör ağırlıklarıyla birlikte ilgili katmanların otomatik olarak kaydedilmesine yardımcı olabilir veya uyumsuzluklar hakkında sizi uyarabilir
  • inference_mode (varsayılan: False): modelin çıkarım için mi yoksa başka bir amaçla mı kullanıldığını belirtir

Hangi PEFT yöntemini seçtiğinize bağlı olarak, örneğin güncelleme matrislerinin boyutunu belirleyen belirli parametreler ekleyeceksiniz. Aşağıda, gerçek hayatta karşılaşabileceğiniz bir yapılandırma örneği verilmiştir:

from peft import LoraConfig, TaskType

peft_config = LoraConfig(target_modules=["q_proj"], task_type=TaskType.CAUSAL_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

PEFT yapılandırmasının nasıl çalıştığına dair daha fazla ayrıntı için yapılandırma kılavuzuna bakın.

LoraConfig ayarlandıktan sonra, get_peft_model() fonksiyonu ile bir PeftModel oluşturun. Bu fonksiyon, Transformers kütüphanesinden yükleyebileceğiniz (ancak yüklemek zorunda değilsiniz) bir temel model ve LoRA ile eğitim için modelin nasıl yapılandırılacağını belirleyen parametreleri içeren LoraConfig alır.

İnce ayar yapmak istediğiniz temel modeli yükleyin.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-1B")

Şimdi temel modeli ve peft_config öğesini get_peft_model() fonksiyonuyla sarmalayarak bir PeftModel oluşturun.

Wrapping, PEFT'nin hedeflenen katmanları (burada: tüm q_proj katmanları) hedef katmanın türüne uygun adaptöre özgü katmanla değiştirmesi anlamına gelir. Doğrusal katmanlarla uğraştığımız için bu durumda bir lora.Linear katmanı olacaktır. Not: Bu değişiklikler belleği tasarruflu kullanmak için yerinde (in-place) yapılır, bu nedenle temel modeliniz artık değiştirilmiştir.

Not edelim ki yalnızca q_proj belirttik, ancak aslında hedefimiz tüm model.layers[:].self_attn.q_proj katmanlarıdır. Bunun nedeni, PEFT'nin varsayılan olarak eşleşen sonekleri aramasıdır. Daha karmaşık katman desenlerini hedeflemek istiyorsanız, bir düzenli ifade içeren bir dize iletin.

Taban modelin katmanı sarılır, korunur ve eğitilmez; yeni, eğitilebilir ağırlıklar eklenir ve birleştirilir. Bu yeni ağırlıkların nasıl yapılandırıldığı ve taban modelin ağırlıklarıyla nasıl birleştirildiği, farklı PEFT yöntemlerini birbirinden ayıran önemli bir unsurdur.

Eğitime başlamadan önce, adaptör durumunu doğrulamak ve eğitilebilir parametre sayısını incelemek için bir sağlık kontrolü çalıştırın.

from peft import get_peft_model, LoraConfig

peft_config = LoraConfig()  # or your other PEFT method of choice
peft_model = get_peft_model(model, peft_config)
peft_model.print_healthcheck()

Sağlık kontrolü, eğitilebilir parametre oranını adaptör durumu, model yapılandırması ve ortamla birlikte içerir.

Sağlık kontrolü çalıştırın

Şüpheli durumları, örneğin birleştirilmiş veya tutarsız adaptörleri, tespit etmek ve bir hata raporu için kompakt bir rapor oluşturmak için print_healthcheck() kullanın.

peft_model.print_healthcheck()

Bunun şu şekilde bir şey göstermesi gerekir:

PEFT healthcheck
Model:
  ID: meta-llama/Llama-3.2-1B, type: LlamaForCausalLM, adapters: default (LORA)
Environment:
  peft: 0.21.0, transformers: 5.18.0.dev0, torch: 2.14.0+cu130, Python: 3.13.9
Runtime:
  training: True, devices: cpu, dtypes: bfloat16=1,235,814,400, float32=851,968, gradient checkpointing: False
Parameters:
  trainable: 851,968, total: 1,236,666,368, percent trainable: 0.0689%, adapter layers: 32
State:
  adapter is enabled: True, active: default, merged: none
Layer types:
  default:
    lora.Linear=32

Yazdırma çıktısı değişebilir, bunu ayrıştırmaya çalışmayın. Programatik kullanım için, aynı bilgileri JSON-serializable bir sözlük olarak döndüren healthcheck() fonksiyonunu çağırın.

İşte bu kadar 🎉! Artık modeli Transformers Trainer, Accelerate veya herhangi bir özel PyTorch eğitim döngüsüyle eğitebilirsiniz.

Örneğin, Trainer sınıfıyla eğitim yapmak için bazı eğitim hiperparametreleriyle bir TrainingArguments sınıfı yapılandırın.

training_args = TrainingArguments(
    output_dir="your-name/meta-llama/my-llama3.2-adapter",
    learning_rate=1e-3,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=32,
    num_train_epochs=2,
    weight_decay=0.01,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)

Modeli, eğitim argümanlarını, veri setini, tokenizer'ı ve diğer gerekli bileşenleri Trainer'a iletin ve eğitimi başlatmak için train çağrısını yapın.

trainer = Trainer(
    model=peft_model,
    args=training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["test"],
    data_collator=data_collator,
    compute_metrics=compute_metrics,
)

trainer.train()

Modeli kaydet

Modelinizin eğitimi tamamlandıktan sonra, modeli save_pretrained() işlevini kullanarak bir dizine kaydedebilirsiniz.

peft_model.save_pretrained("output_dir")

Modelinizi push_to_hub işleviyle Hub'a da kaydedebilirsiniz (önce Hugging Face hesabınızda oturum açtığınızdan emin olun).

from huggingface_hub import notebook_login

notebook_login()
peft_model.push_to_hub("your-name/my-llama3.2-adapter")

Her iki yöntem de yalnızca eğitilen ek PEFT ağırlıklarını kaydeder; bu nedenle depolama, aktarım ve yükleme işlemleri son derece verimlidir. Örneğin, LoRA ile eğitilen bu facebook/opt-350m modeli yalnızca iki dosya içerir: adapter_config.json ve adapter_model.safetensors. adapter_model.safetensors dosyası yalnızca 6,3 MB boyutundadır!

Hub'da saklanan bir opt-350m modeli için adaptör ağırlıkları, model ağırlıklarının tam boyutu olan ~700MB'a kıyasla yalnızca ~6MB'dır.

Çıkarım

Mevcut AutoPeftModel sınıflarının tam listesi için AutoPeftModel API referansına göz atın.

Herhangi bir PEFT ile eğitilmiş modeli AutoPeftModel sınıfı ve from_pretrained yöntemiyle kolayca çıkarım için yükleyin:

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch

device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"

peft_model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")

peft_model = peft_model.to(device)
peft_model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")

outputs = peft_model.generate(input_ids=inputs["input_ids"].to(peft_model.device), max_new_tokens=50)
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])

"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."

AutoPeftModelFor sınıfıyla açıkça desteklenmeyen diğer görevler - örneğin otomatik konuşma tanıma - için, görev için bir model yüklemek üzere yine de temel AutoPeftModel sınıfını kullanabilirsiniz.

from peft import AutoPeftModel

peft_model = AutoPeftModel.from_pretrained("smangrul/openai-whisper-large-v2-LORA-colab")

Eğitilmiş bir PEFT adaptörünü modele yüklemenin en genel yolu from_pretrained() kullanmaktır:

from transformers import AutoPeftModelForCausalLM
from peft import PeftModel

base_model = AutoModelForCausalLM.from_pretrained("meta-llama/llama3.2-1B")
peft_model = PeftModel.from_pretrained(base_model, "my-user/my-llama-adapter")  # you can also pass a directory instead of a hub path

Çoklu adaptörler

PEFT, bir temel modelin üzerine birden çok adaptörün (bu belgede bunlar LoRA) kurulmasını destekler. get_peft_model çağrıldığında yalnızca "default" adında bir adaptör bulunur, ancak peft_model.add_adapter(adapter_name=...) çağrılarak istediğiniz kadar ek adaptör ekleyebilirsiniz.

Bu, sarılmış katmanın her adaptör adı için gerçekten benzersiz bir eğitilebilir ağırlık setine sahip olmasından dolayı çalışır. Her adaptör varsayılan olarak etkin ve eğitilebilir değildir. Adaptörlerin etkin hale gelmesi için adlarıyla açıkça etkinleştirmeniz gerekir. Bu, görev özel bilgi gerektiğinde adaptörler arasında hızlıca geçiş yapmanıza veya tek bir modelin üzerine farklı kullanım senaryoları sunmanıza olanak tanır.

Önce adaptörü etkinleştirmek için peft_model.set_adapter(<adapter_name>) çağrısını yapmayı unutmayın.

Hızlı bir örnek:

peft_model.add_adapter(adapter_name='new_adapter')
peft_model.set_adapter('new_adapter')

Sonraki adımlar

Bir PEFT yöntemiyle model eğitmeyi gördüğünüze göre, prompt tuning gibi diğer yöntemleri denemenizi öneririz. Adımlar, quicktour'da gösterilenlerle çok benzerdir:

  1. PEFT yöntemi için, örneğin LoraConfig veya başka bir yapılandırma (bkz. yöntem özeti) için bir PeftConfig hazırlayın
  2. Yapılandırmadan ve temel modelden bir PeftModel oluşturmak için get_peft_model() yöntemini kullanın

Sonra onu istediğiniz gibi eğitebilirsiniz! Çıkarım için bir PEFT modelini yüklemek için AutoPeftModel sınıfını kullanabilirsiniz.

Belirli bir görev için başka bir PEFT yöntemiyle model eğitmekle ilgileniyorsanız, örneğin anlamsal segmentasyon, çok dilli otomatik konuşma tanıma, DreamBooth, token sınıflandırması ve daha fazlası için, görev kılavuzlarına da göz atabilirsiniz.

Update on GitHub