Takip et

Mistral-7B’yi LoRA ile İnce Ayarlama: Hızlı Başlangıç Rehberi

Mistral-7B’yi LoRA ile İnce Ayarlama: Hızlı Başlangıç Rehberi Büyük Dil Modelleri (LLM’ler) günümüz yapay zeka uygulamalarının temelin

Mistral-7B’yi LoRA ile İnce Ayarlama: Hızlı Başlangıç Rehberi

Büyük Dil Modelleri (LLM’ler) günümüz yapay zeka uygulamalarının temelini oluşturuyor. Ancak bu modelleri belirli görevlere veya veri setlerine adapte etmek, genellikle maliyetli ve zaman alıcı bir süreç olan tam ince ayar (full fine-tuning) gerektirir. Neyse ki, Low-Rank Adaptation (LoRA) gibi Parameter-Efficient Fine-Tuning (PEFT) teknikleri sayesinde, daha az kaynakla ve çok daha hızlı bir şekilde modelleri özelleştirebiliyoruz. Bu rehberde, popüler ve güçlü bir açık kaynak modeli olan Mistral-7B’yi LoRA ile nasıl ince ayarlayacağınızı adım adım öğreneceksiniz.

1. LoRA ve Mistral-7B Neden Önemli?

Büyük dil modelleri genellikle milyarlarca parametreye sahiptir. Bu modelleri baştan sona eğitmek veya tam olarak ince ayarlamak, gigabaytlarca VRAM’e sahip güçlü GPU’lar ve haftalarca süren eğitim süreleri gerektirebilir.

* LoRA (Low-Rank Adaptation): Bu teknik, bir modelin sadece küçük bir kısmını (düşük ranklı matrisler) eğiterek, genel performanstan ödün vermeden belirli görevlere adaptasyon sağlar. Modellerin tamamını eğitmek yerine, mevcut ağırlıklara küçük, eğitilebilir matrisler ekler. Bu sayede:
* VRAM Tüketimi Azalır: Sadece eklenen LoRA katmanları eğitildiği için çok daha az GPU belleği kullanılır.
* Eğitim Süresi Kısalır: Eğitilmesi gereken parametre sayısı azaldığı için eğitim süresi dramatik bir şekilde düşer.
* Depolama Alanı Tasarrufu: İnce ayarlı modelin ağırlıkları çok daha küçüktür, bu da dağıtımı ve yönetimi kolaylaştırır.
* Mistral-7B: Mistral AI tarafından geliştirilen bu model, 7 milyar parametreye sahip olmasına rağmen, performans açısından daha büyük modellere rakip olabilen etkileyici yetenekler sunar. Açık kaynak olması, topluluk desteği ve optimize edilmiş mimarisi, onu ince ayar için cazip bir seçenek haline getirir. Özellikle sohbet ve talimat takip (instruction following) görevlerinde başarılıdır.

Bu rehberin amacı, Mistral-7B’yi belirli bir göreve (örneğin, özel bir chatbot veya özetleyici) adapte etmek isteyen geliştiricilere hızlı ve pratik bir başlangıç noktası sunmaktır.

2. Ortam Kurulumu ve Veri Hazırlığı

İnce ayar sürecine başlamadan önce gerekli kütüphaneleri kurmalı ve veri setinizi hazırlamalısınız.

2.1. Gerekli Kütüphanelerin Kurulumu

Bu süreç için Python ortamınızda belirli kütüphanelere ihtiyacımız var. Bir sanal ortam oluşturmanız tavsiye edilir.

# Gerekli kütüphaneleri kurun
pip install -q -U transformers peft bitsandbytes accelerate trl torch datasets

* transformers: Hugging Face’in model ve tokenizer arayüzlerini sağlar.
* peft: Parameter-Efficient Fine-Tuning tekniklerini (LoRA dahil) uygular.
* bitsandbytes: 4-bit nicemleme (quantization) yaparak modelin VRAM kullanımını azaltır.
* accelerate: Eğitim süreçlerini GPU’larda optimize eder.
* trl: Transformer Reinforcement Learning kütüphanesi, SFTTrainer gibi kolaylaştırıcı araçlar sunar.
* torch: PyTorch derin öğrenme çatısı.
* datasets: Veri setlerini kolayca yüklemek ve işlemek için kullanılır.

2.2. Donanım Gereksinimleri

Mistral-7B’yi 4-bit nicemleme ile ince ayarlamak için en az 16GB VRAM’e sahip bir NVIDIA GPU (örneğin, RTX 3060/3070/3080/3090, A100, H100) önerilir. Daha az VRAM ile (örneğin 12GB) batch size’ı düşürerek deneme yapabilirsiniz, ancak bu eğitim süresini uzatabilir.

2.3. Veri Seti Hazırlığı

İnce ayar için kaliteli bir veri seti kritik öneme sahiptir. Veri setiniz, modelin öğrenmesini istediğiniz format ve içeriğe uygun olmalıdır. Örneğin, bir chatbot için “kullanıcı sorusu” ve “model cevabı” çiftleri içeren bir veri seti idealdir.

Bu rehberde, yaygın olarak kullanılan timdettmers/openassistant-guanaco veri setinin bir kısmını kullanacağız. Bu veri seti, talimat takip formatında (instruction-following format) olup, Mistral’ın beklentilerine uygundur.

Veri setiniz genellikle JSONL formatında olur ve her satır bir diyalog veya talimat çiftini temsil eder. Örnek bir veri formatı:

{"text": "### Human: Bu belgenin ana fikri nedir?\n### Assistant: Belge, yapay zekanın etik sonuçlarını tartışıyor..."}
{"text": "### Human: Bana bir şiir yaz.\n### Assistant: Gökyüzünde parlayan yıldızlar, bir umut ışığı taşır..."}

Veri setini datasets kütüphanesi ile yükleyebiliriz:

from datasets import load_dataset

Veri setini yükle (örnek olarak timdettmers/openassistant-guanaco)

Kendi veri setiniz varsa, "json" formatında yükleyebilirsiniz:

dataset = load_dataset("json", data_files="path/to/your_dataset.jsonl")

dataset = load_dataset("timdettmers/openassistant-guanaco", split="train")

Hızlı bir deneme için veri setini küçültebiliriz

dataset = dataset.shuffle().select(range(1000)) # Sadece ilk 1000 örneği al print(f"Veri seti boyutu: {len(dataset)}") print(f"Örnek veri: {dataset[0]['text']}")

Mistral modelleri genellikle özel bir sohbet şablonu kullanır. trl kütüphanesinin SFTTrainer‘ı, bu şablonu veya özel bir formatlama fonksiyonunu kullanarak veriyi modele uygun hale getirebilir.

3. Mistral-7B’yi LoRA ile İnce Ayarlama Adımları

Şimdi asıl ince ayar sürecine geçelim. Bu bölümde modelin yüklenmesi, LoRA yapılandırması ve eğitimin başlatılması adımlarını göreceğiz.

3.1. Model ve Tokenizer Yükleme

Modeli yüklerken bitsandbytes ile 4-bit nicemleme kullanarak VRAM kullanımını optimize edeceğiz.

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

Mistral-7B modelini ve tokenizer'ını yükle

model_id = "mistralai/Mistral-7B-v0.1" # Veya "mistralai/Mistral-7B-Instruct-v0.1"

4-bit nicemleme yapılandırması

bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=False, ) model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=bnb_config, device_map="auto", # Model katmanlarını otomatik olarak GPU'lara dağıt trust_remote_code=True, ) model.config.use_cache = False # Eğitim sırasında cache'i devre dışı bırak model.config.pretraining_tp = 1 # Distributed training için önemli olabilir tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True) tokenizer.pad_token = tokenizer.eos_token # Padding token'ı ayarla tokenizer.padding_side = "right" # Padding'in sağda olması genellikle tercih edilir

3.2. LoRA Yapılandırması

peft kütüphanesinden LoraConfig ile LoRA parametrelerini tanımlayacağız.

from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training

Modeli 4-bit eğitime hazırla (LoRA adaptörleri için)

model = prepare_model_for_kbit_training(model)

LoRA yapılandırması

lora_config = LoraConfig( r=16, # LoRA rank'i (düşük ranklı matrislerin boyutu) lora_alpha=32, # LoRA ölçeklendirme faktörü target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], # LoRA uygulanacak katmanlar lora_dropout=0.05, # LoRA katmanlarına uygulanacak dropout oranı bias="none", # Bias'ın eğitilip eğitilmeyeceği task_type="CAUSAL_LM", # Görev tipi (metin üretimi) )

Modeli PEFT (LoRA) modeline dönüştür

model = get_peft_model(model, lora_config)

Eğitilebilir parametre sayısını kontrol edelim

model.print_trainable_parameters()

Çıktı örneği: trainable params: 41,943,040 || all params: 7,280,716,800 || trainable%: 0.5760882193892708

Burada target_modules için Mistral’ın spesifik katman isimleri (q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj) kullanılmıştır. Bu, modelin farklı bölümlerine LoRA adaptörleri ekleyerek daha kapsamlı bir adaptasyon sağlar.

3.3. Eğitimi Başlatma (SFTTrainer ile)

trl kütüphanesindeki SFTTrainer (Supervised Fine-tuning Trainer), ince ayar sürecini büyük ölçüde basitleştirir.

from trl import SFTTrainer
from transformers import TrainingArguments

Çıktı dizini ve eğitim argümanları

output_dir = "./mistral-7b-lora-fine-tuned" training_args = TrainingArguments( output_dir=output_dir, num_train_epochs=1, # Eğitim epoch sayısı per_device_train_batch_size=4, # Her GPU için batch boyutu gradient_accumulation_steps=2, # Gradyan biriktirme adımı (daha büyük batch simülasyonu) optim="paged_adamw_8bit", # Optimize edici save_steps=500, # Kaç adımda bir modeli kaydet logging_steps=50, # Kaç adımda bir loglama yap learning_rate=2e-4, # Öğrenme oranı weight_decay=0.001, fp16=False, # fp16 yerine bfloat16 kullanıyoruz (bnb_4bit_compute_dtype) bf16=True, # bfloat16 etkinleştir max_grad_norm=0.3, # Gradyan kırpma max_steps=-1, # -1 ise num_train_epochs'a göre çalışır warmup_ratio=0.03, # Isınma oranı group_by_length=True, # Benzer uzunluktaki örnekleri gruplayarak verimliliği artırır lr_scheduler_type="cosine", # Öğrenme oranı zamanlayıcısı report_to="tensorboard", # Eğitim metriklerini TensorBoard'a raporla )

SFTTrainer'ı başlat

trainer = SFTTrainer( model=model, train_dataset=dataset, peft_config=lora_config, dataset_text_field="text", # Veri setinizdeki metin alanının adı tokenizer=tokenizer, args=training_args, max_seq_length=512, # Maksimum dizi uzunluğu )

Eğitimi başlat

trainer.train()

İnce ayarlı LoRA adaptörlerini kaydet

trainer.model.save_pretrained(output_dir) tokenizer.save_pretrained(output_dir)

İsteğe bağlı: LoRA adaptörlerini temel modelle birleştirme

Bu, modeli daha sonra tek bir birleşik model olarak yüklemeyi kolaylaştırır.

from peft import AutoPeftModelForCausalLM

Temel modeli ve LoRA adaptörlerini yükle

merged_model = AutoPeftModelForCausalLM.from_pretrained( output_dir, low_cpu_mem_usage=True, torch_dtype=torch.bfloat16, )

Birleşik modeli kaydet

merged_model.save_pretrained(output_dir + "/merged_model", safe_serialization=True) tokenizer.save_pretrained(output_dir + "/merged_model")

Bu kod bloğu, Mistral-7B modelini LoRA ile ince ayarlamak için gerekli tüm adımları içerir. Eğitim tamamlandıktan sonra, LoRA adaptörleri ve isteğe bağlı olarak birleşik model, belirtilen çıktı dizinine kaydedilecektir.

4. İnce Ayarlı Modeli Kullanma

Eğitim tamamlandıktan sonra, ince ayarlı modelinizi metin üretimi için kullanabilirsiniz.

4.1. İnce Ayarlı Modeli Yükleme

Eğer LoRA adaptörlerini temel modelle birleştirdiyseniz, doğrudan birleşik modeli yükleyebilirsiniz:

import torch
from transformers import AutoTokenizer
from peft import AutoPeftModelForCausalLM

Birleşik modeli yükle

model_path = "./mistral-7b-lora-fine-tuned/merged_model" # Birleşik modelin kaydedildiği dizin tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoPeftModelForCausalLM.from_pretrained( model_path, device_map="auto", torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, )

Modeli değerlendirme moduna al

model.eval()

Eğer birleştirmeyi yapmadıysanız, temel modeli ve LoRA adaptörlerini ayrı ayrı yükleyip birleştirmeniz gerekir:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel

Temel modeli (4-bit nicemlenmiş) yükle

model_id = "mistralai/Mistral-7B-v0.1" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, ) base_model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=bnb_config, device_map="auto", trust_remote_code=True, )

LoRA adaptörlerini yükle

lora_adapter_path = "./mistral-7b-lora-fine-tuned" # LoRA adaptörlerinin kaydedildiği dizin model = PeftModel.from_pretrained(base_model, lora_adapter_path) tokenizer = AutoTokenizer.from_pretrained(lora_adapter_path)

Modeli değerlendirme moduna al

model.eval()

4.2. Metin Üretimi

Modeli kullanarak yeni metinler üretebiliriz. Unutmayın, modelinizi eğittiğiniz şablonu kullanmak en iyi sonuçları verecektir.

# Örnek prompt (eğitimde kullanılan formatı taklit etmeye çalışın)
prompt = "### Human: Türkiye'nin başkenti neresidir?\n### Assistant:"

Prompt'u token'lara dönüştür

input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to("cuda")

Metin üretimi

with torch.no_grad(): outputs = model.generate( input_ids=input_ids, max_new_tokens=100, # Üretilecek maksimum yeni token sayısı do_sample=True, # Örnekleme tabanlı üretim temperature=0.7, # Yaratıcılık seviyesi (daha düşük daha deterministik) top_k=50, # En olası k token arasından seçim top_p=0.95, # Olasılık kümülatif toplamı p olan tokenlar arasından seçim eos_token_id=tokenizer.eos_token_id, # Cümle sonu token'ı )

Üretilen metni decode et

generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print(generated_text)

Beklenen çıktı örneği: ### Human: Türkiye'nin başkenti neresidir?\n### Assistant: Türkiye'nin başkenti Ankara'dır.

5. Sonuç ve Sıkça Sorulan Sorular (SSS)

Bu rehberde, Mistral-7B gibi güçlü bir açık kaynak dil modelini LoRA tekniğiyle nasıl ince ayarlayacağınızı ve ardından nasıl kullanacağınızı öğrendiniz. LoRA, sınırlı kaynaklarla bile büyük dil modellerini belirli görevlere hızla adapte etmenizi sağlayan devrim niteliğinde bir yaklaşımdır.

5.1. İpuçları ve En İyi Uygulamalar

* Veri Kalitesi: İnce ayarın başarısı, veri setinizin kalitesine ve modelin öğrenmesini istediğiniz göreve ne kadar uygun olduğuna bağlıdır. Temiz, tutarlı ve formatlı veriler kullanın.
* Hiperparametre Ayarı: r, lora_alpha, learning_rate, batch_size gibi LoRA ve eğitim hiperparametreleri üzerinde denemeler yaparak en iyi sonuçları elde edebilirsiniz.
* Epoch Sayısı: Genellikle 1-3 epoch, LoRA ile ince ayar için yeterlidir. Çok fazla epoch, aşırı öğrenmeye (overfitting) yol açabilir.
* GPU Belleği: per_device_train_batch_size ve gradient_accumulation_steps değerlerini ayarlayarak GPU belleğinizi verimli kullanın.
* Model Birleştirme: Eğitilen LoRA adaptörlerini temel modelle birleştirmek, modelin dağıtımını ve kullanımını kolaylaştırır.

5.2. Sıkça Sorulan Sorular (SSS)

* LoRA ile tam ince ayar arasındaki temel fark nedir?
LoRA, modelin sadece küçük bir kısmını (eklenen düşük ranklı matrisler) eğitirken, tam ince ayar modelin tüm parametrelerini eğitir. LoRA çok daha az kaynak tüketir ve daha hızlıdır, ancak bazı çok karmaşık görevlerde tam ince ayarın performansına ulaşamayabilir.
* Bu rehber için hangi GPU’ya ihtiyacım var?
4-bit nicemleme ile Mistral-7B’yi eğitmek için minimum 16GB VRAM’e sahip bir NVIDIA GPU önerilir. Daha az VRAM ile batch_size ve max_seq_length değerlerini düşürerek denemeler yapabilirsiniz.
* Veri setim ne kadar büyük olmalı?
Bu, görevin karmaşıklığına bağlıdır. Basit görevler için birkaç yüz ila birkaç bin örnek yeterli olabilirken, daha karmaşık görevler için on binlerce örneğe ihtiyacınız olabilir. Önemli olan kalite ve çeşitliliktir.
* Eğitim ne kadar sürer?
Kullanılan GPU’ya, veri setinin boyutuna, max_seq_length, batch_size ve num_train_epochs gibi hiperparametrelere bağlı olarak değişir. Birkaç bin örnekle ve 16GB VRAM’li bir GPU ile genellikle saatler içinde tamamlanabilir.
* Daha iyi sonuçlar elde etmek için ne yapabilirim?
1. Daha Kaliteli Veri: Veri setinizi iyileştirin ve çeşitlendirin.
2. Hiperparametre Ayarı: lora_config ve training_args içerisindeki parametrelerle denemeler yapın.
3. Daha Uzun Eğitim: Aşırı öğrenmeye dikkat ederek num_train_epochs değerini artırın.
4. Daha Büyük r ve lora_alpha: LoRA adaptörlerine daha fazla kapasite tanımak için bu değerleri artırabilirsiniz, ancak VRAM tüketimi artabilir.
5. Farklı Temel Model: Mistral-7B’nin instruct versiyonunu (Mistral-7B-Instruct-v0.1) veya başka bir modeli deneyebilirsiniz.

Bu rehberin, Mistral-7B’yi LoRA ile ince ayarlama yolculuğunuzda size yardımcı olmasını umuyoruz! İyi eğitimler!

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık