TRL documentation
Pişmanlık Olmadan LoRA
Pişmanlık Olmadan LoRA
Thinking Machines Lab ekibinden gelen son araştırmalar (Schulman et al., 2025), LoRA'nın doğru yapılandırıldığında tam ince ayar performansını yakalayabildiğini ve bunun için yalnızca ~%67 oranında hesaplama gücü kullandığını göstermektedir. Bu bulgular, TRL kullanıcıları için heyecan vericidir çünkü uygulaması basittir ve daha küçük bütçelerle model performansını iyileştirebilir.
Bu kılavuz, TRL'de blog gönderisinin sonuçlarını yeniden üretmek için basit talimatlar sağlar.
Bu kılavuza uymadan önce blog yazısını okumanız veya en iyi sonuçlar için her iki kaynağı paralel olarak incelemeniz önerilir.
LoRA'nın tam ince ayara göre avantajları
Öncelikle, LoRA'nın tam ince ayara göre avantajlarını hatırlayalım.
LoRA, taban modelin üzerine, taban modelin kendisinden çok daha az parametreye sahip olan adaptör katmanları ekler. Bu tasarım, GPU bellek gereksinimlerini azaltır ve daha verimli bir eğitim sağlar. blog'da belirtildiği gibi, bu yaklaşımın başlangıçta bir performans ödüşü gerektirdiği düşünülüyordu; ancak dikkatli yapılandırma bu ödüşü ortadan kaldırabilir ve tam ince ayar performansına eşit sonuçlar verebilir.
TRL ile Örnekler
Blog yazısının temel bulgularına dayanarak TRL betiklerinde LoRA adaptörlerini uygulayıp eğitelim. Ardından, her bir bulguyu TRL sonuçları ışığında yeniden inceleyeceğiz.
Gözetimli İnce Ayar (SFT)
Blog yazısı, Hub'daki çeşitli modeller ve veri kümeleri üzerinde SFT gerçekleştirir ve bunu TRL'de yeniden üretebiliriz.
Bu bulguları TRL Python API'siyle şu şekilde entegre edebiliriz:
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTTrainer, SFTConfig
dataset = load_dataset("open-thoughts/OpenThoughts-114k", split="train")
peft_config = LoraConfig(r=256, lora_alpha=16, target_modules="all-linear")
training_args = SFTConfig(
learning_rate=2e-4,
per_device_train_batch_size=1,
gradient_accumulation_steps=4,
num_train_epochs=1,
report_to=["trackio"],
)
trainer = SFTTrainer(
model="Qwen/Qwen2.5-3B-Instruct",
train_dataset=dataset,
peft_config=peft_config,
args=training_args,
)
trainer.train()
hf jobs uv run \
--flavor a100-large \
--timeout 8h \
--secrets HF_TOKEN \
"https://raw.githubusercontent.com/huggingface/trl/main/trl/scripts/sft.py" \
--model_name_or_path Qwen/Qwen2.5-3B-Instruct \
--dataset_name open-thoughts/OpenThoughts-114k \
--learning_rate 2.0e-5 \
--num_train_epochs 1 \
--packing \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 16 \
--use_peft \
--lora_r 256 \
--lora_alpha 16 \
--lora_target_modules all-linear \
--output_dir Qwen2.5-3B-OpenThoughts-LoRA \
--report_to trackio \
--push_to_hub
Hugging Face Jobs'u kullanmak için Hub'a giriş yapın (hf auth login) ve kredi bakiyenizin pozitif olduğundan emin olun. Ayrıntılar için Jobs belgelerini inceleyin.
uv run "https://raw.githubusercontent.com/huggingface/trl/main/trl/scripts/sft.py" \
--model_name_or_path Qwen/Qwen2.5-3B-Instruct \
--dataset_name open-thoughts/OpenThoughts-114k \
--learning_rate 2.0e-5 \
--num_train_epochs 1 \
--packing \
--per_device_train_batch_size 2 \
--gradient_accumulation_steps 16 \
--eval_strategy no \
--use_peft \
--lora_r 256 \
--lora_alpha 16 \
--lora_target_modules all-linear \
--output_dir Qwen2.5-3B-OpenThoughts-LoRA \
--report_to trackio \
--push_to_hub
Betik dosyasını yerel olarak çalıştırmak için uv kurulu olmalıdır. Daha fazla ayrıntı için uv belgelerini inceleyin.
Eğitim başladığında, URL'yi kaydedecek olan Trackio üzerinden ilerlemeyi izleyebilirsiniz.
Pekiştirmeli Öğrenme (GRPO)
Blog yazısı, Hub'daki çeşitli modeller ve veri kümeleri üzerinde GRPO uyguluyor ve sonuçları bir kez daha TRL'de yeniden üretebiliyoruz.
| Model | Veri seti |
|---|---|
| Llama-3.1-8B-Base | GSM8k |
| Llama-3.1-8B-Base | DeepMath-103K |
| Qwen3-8b-base | DeepMath-103K |
Pekiştirmeli öğrenme için, blog bir matematik akıl yürütme görevi kullanır ve bu görevi bir Python işlevi olarak yeniden üretebiliriz.
Bu önerileri TRL Python API ile şu şekilde uygulayabiliriz:
from datasets import load_dataset
from peft import LoraConfig
from trl import GRPOConfig, GRPOTrainer
from trl.rewards import reasoning_accuracy_reward
dataset = load_dataset("HuggingFaceH4/OpenR1-Math-220k-default-verified", split="train")
peft_config = LoraConfig(
r=1,
lora_alpha=32,
target_modules="all-linear"
)
training_args = GRPOConfig(
learning_rate=5e-5,
per_device_train_batch_size=1,
gradient_accumulation_steps=4,
num_train_epochs=1,
num_generations=8,
generation_batch_size=8,
report_to=["trackio"],
)
trainer = GRPOTrainer(
model="Qwen/Qwen3-0.6B",
reward_funcs=reasoning_accuracy_reward,
args=training_args,
train_dataset=dataset,
peft_config=peft_config,
)
trainer.train()
Bu kod parçası, örneğin kısa tutulması için yukarıda tanımlanan ödül fonksiyonunu atlar.
hf jobs uv run \
--flavor a100-large \
--timeout 4h \
--secrets HF_TOKEN \
--env PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
"https://huggingface.co/datasets/burtenshaw/lora-without-regrets/resolve/main/grpo.py" \
--model_name_or_path Qwen/Qwen3-0.6B \
--dataset_name HuggingFaceH4/OpenR1-Math-220k-default-verified \
--output_dir grpo-full-qwen3-0.6b \
--learning_rate 1.0e-6 \
--lr_scheduler_type cosine \
--warmup_steps 0.0 \
--max_grad_norm 1.0 \
--beta 0.0 \
--max_completion_length 4096 \
--num_generations 16 \
--generation_batch_size 16 \
--gradient_accumulation_steps 8 \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--lora_r 1 \
--lora_alpha 32 \
--lora_dropout 0.0 \
--lora_target_modules all-linear \
--vllm_mode colocate \
--save_strategy steps \
--save_steps 50 \
--save_total_limit 1 \
--logging_steps 1 \
--max_steps 200 \
--report_to trackioHugging Face Jobs'u kullanmak için Hub'a giriş yapın (hf auth login) ve kredi bakiyenizin pozitif olduğundan emin olun. Ayrıntılar için Jobs belgelerini inceleyin.
uv run "https://huggingface.co/datasets/burtenshaw/lora-without-regrets/resolve/main/grpo.py" \
--model_name_or_path Qwen/Qwen3-0.6B \
--dataset_name HuggingFaceH4/OpenR1-Math-220k-default-verified \
--output_dir grpo-full-qwen3-0.6b \
--learning_rate 1.0e-6 \
--lr_scheduler_type cosine \
--warmup_steps 0.0 \
--max_grad_norm 1.0 \
--beta 0.0 \
--max_completion_length 4096 \
--num_generations 16 \
--generation_batch_size 16 \
--gradient_accumulation_steps 8 \
--per_device_train_batch_size 1 \
--num_train_epochs 1 \
--lora_r 1 \
--lora_alpha 32 \
--lora_dropout 0.0 \
--lora_target_modules all-linear \
--vllm_mode colocate \
--save_strategy steps \
--save_steps 50 \
--save_total_limit 1 \
--logging_steps 1 \
--max_steps 200 \
--report_to trackioBetik dosyasını yerel olarak çalıştırmak için uv kurulu olmalıdır. Daha fazla ayrıntı için uv belgelerini inceleyin.
GRPO ile pekiştirmeli öğrenme betiği, yukarıda gösterilen ödül işlevini kullanan özel bir TRL betiği olarak uygulanmıştır. Bunu grpo.py - LoRA ile pekiştirmeli öğrenme en iyi uygulamaları adresinde inceleyebilirsiniz.
LoRA optimizasyonundaki temel bulgular
Yazarlar, rank değerini artırmak bu kısıtlamayı telafi etmediği için LoRA'nın yalnızca dikkat katmanlarıyla sınırlı tutulmak yerine tüm ağırlık matrislerine uygulanmasını önermektedir. TRL'de bu, LoRA'nın tüm ağırlık matrislerine uygulanması için --lora_target_modules all-linear kullanılarak yapılandırılabilir.
TRL ve SmolLM3 modelini kullanarak blog gönderisindeki sonuçları yeniden üretebildik. Modeli, yukarıdaki ödül fonksiyonu ve yapılandırmasıyla Math 220k veri seti üzerinde 500 adım boyunca eğittik. Aşağıdaki şekilden de görülebileceği gibi, LoRA modelinin ortalama eğitim ödül eğrisi, tam ince ayar eğrisiyle örtüşmektedir.

Ve en önemlisi, aşağıdaki şekilden de görülebileceği üzere LoRA modeli, tam ince ayar modeline kıyasla çok daha az bellek kullanır.

Yukarıdaki modelleri eğitmek için kullandığımız parametreler şunlardır
| Parametre | LoRA | Tam FT |
|---|---|---|
--model_name_or_path | HuggingFaceTB/SmolLM3-3B | HuggingFaceTB/SmolLM3-3B |
--dataset_name | HuggingFaceH4/OpenR1-Math-220k-default-verified | HuggingFaceH4/OpenR1-Math-220k-default-verified |
--learning_rate | 1.0e-5 | 1.0e-6 |
--max_completion_length | 4096 | 4096 |
--lora_r | 1 | - |
--lora_alpha | 32 | - |
--lora_dropout | 0.0 | - |
--lora_target_modules | all-linear | - |
Blog yazısının ana bulgularını ve bunları nasıl yeniden üretebildiğimizi inceleyelim.
1. LoRA, tüm ağırlık matrislerine uygulandığında daha iyi performans gösterir
Yazarlar, bu kısıtlamayı telafi etmek için rütbenin artırılmasının yeterli olmadığını belirttiklerinden, LoRA'nın yalnızca dikkat katmanlarıyla sınırlı tutulmak yerine tüm ağırlık matrislerine uygulanmasını önermektedir.

Sadece dikkat katmanlarına uygulanan LoRA, parametre sayısını eşitlemek için daha yüksek bir rank kullanılsa bile düşük performans gösterir. TRL'de bu, LoRA'nın tüm ağırlık matrislerine uygulanması için --lora_target_modules all-linear kullanılarak yapılandırılabilir. Python'da bunu şu şekilde yapabiliriz:
from peft import LoraConfig
peft_config = LoraConfig(target_modules="all-linear") 2. Adaptörün, veri setinden öğrenmek için yeterli kapasiteye sahip olması gerekir
Blog yazısı, veri setinden öğrenmek için yeterli bir LoRA rütbesi kullanmayı önerir. Rütbe, LoRA adaptöründeki eğitilebilir parametre sayısını belirler. Bu nedenle, “LoRA kapasitesini aşan veri setlerinde LoRA, FullFT'den daha düşük performans gösterir”.

TRL betiğinde, --lora_r parametresini kullanarak rütbeyi ayarlayabilir ve bunu eğitim yaptığımız görev ve veri setine göre uyarlayabiliriz. Blog yazısı, görev ve veri seti boyutuna göre aşağıdaki rütbeleri önermektedir:
Reinforcement learning görevleri genellikle daha düşük kapasite gerektirdiğinden, daha küçük LoRA rank değerleri kullanılabilir. Bunun nedeni, policy gradient algoritmalarının bölüm başına yaklaşık ~1 bit bilgi çıkararak minimal parametre kapasitesi talep etmesidir.
Blog yazısı, tam ince ayar ile eşleşen LoRA için ideal veri seti boyutunu “Post-training scale” olarak tanımlar. Bunu, SFT ve RL LoRA'ları için önerilen rank'ı belirlemek için şu şekilde kullanabiliriz:
| Görev Türü | Veri Seti Boyutu | Önerilen Sıra |
|---|---|---|
| SFT | Eğitim sonrası ölçek | 256 |
| RL | Herhangi bir boyut | 1-32 |
3. “FullFT ve yüksek-rank LoRA'lar benzer öğrenme eğrilerine sahiptir”
Karşıt sezgisel olarak, blog yazısı tam ince ayar (full fine-tuning) için kullanılan öğrenme hızından daha yüksek bir öğrenme hızı kullanmayı önermektedir. Yukarıdaki tabloda LoRA için 1.0e-5, tam ince ayar için ise 1.0e-6 kullandık. TRL betiğinde şunu kullanabiliriz --learning_rate ile öğrenme hızını ayarlamak. LoRA'daki ölçekleme, optimal öğrenme hızını yaklaşık olarak rütbeden bağımsız hale getirir.

4. “Bazı senaryolarda, LoRA, tam ince ayara kıyasla büyük parti boyutlarına daha az tolerans gösterir.”
Blog yazısı, yazarların LoRA'nın büyük batch boyutlarına daha az toleranslı olduğunu bulması nedeniyle etkili bir batch boyutunun < 32 kullanılmasını önermektedir. Bu durum, LoRA rank'ını artırarak giderilememiştir. TRL betiğinde, batch boyutunu ayarlamak için --per_device_train_batch_size ve --gradient_accumulation_steps parametrelerini kullanabiliriz.

Özet
TRL ile tam ince ayar performansına ulaşacak şekilde LoRA adaptörlerini verimli bir şekilde uygulayabilir, tam ince ayarın yüksek hesaplama maliyeti olmadan temel içgörüleri (tüm ağırlık matrislerini hedefleme, doğru sırayı seçme ve parti boyutu ile öğrenme oranını yönetme) uygulayabilirsiniz.
Atıf
@article{schulman2025lora,
title = {{LoRA Without Regret}},
author = {John Schulman and Thinking Machines Lab},
year = 2025,
journal = {Thinking Machines Lab: Connectionism},
doi = {10.64434/tml.20250929},
note = {https://thinkingmachines.ai/blog/lora/}
}