TRL: Transformer Reinforcement Learning¶
Quick Facts¶
| Aspect | Details |
|---|---|
| Organization | Hugging Face |
| Purpose | Fine-tuning and RLHF training |
| License | Apache 2.0 (Open Source) |
| Installation | pip install trl |
| Best For | RLHF workflows, production training |
| Community | Large, well-maintained |
What It Does¶
TRL (Trainer Reinforcement Learning) is Hugging Face's complete library for training LLMs with: - Supervised Fine-Tuning (SFT) - Reward Model Training - PPO (Proximal Policy Optimization) - DPO (Direct Preference Optimization) - QLoRA integration for memory efficiency
Installation¶
pip install trl
pip install transformers datasets peft torch
Core Features¶
1. Supervised Fine-Tuning (SFT)¶
from trl import SFTTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from datasets import load_dataset
# Load model
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# Load dataset
dataset = load_dataset("imdb", split="train[:1000]")
# Configure training
training_args = TrainingArguments(
output_dir="./sft-model",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
save_steps=100,
logging_steps=10,
)
# Create trainer
trainer = SFTTrainer(
model=model,
train_dataset=dataset,
tokenizer=tokenizer,
dataset_text_field="text",
max_seq_length=512,
args=training_args,
)
# Train
trainer.train()
# Save
trainer.save_model("./my-sft-model")
2. Reward Model Training¶
from trl import RewardTrainer
from transformers import AutoModelForSequenceClassification, AutoTokenizer
# Load base model
model = AutoModelForSequenceClassification.from_pretrained(
"meta-llama/Llama-2-7b-hf",
num_labels=1
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
# Create trainer
reward_trainer = RewardTrainer(
model=model,
tokenizer=tokenizer,
args=TrainingArguments(...),
train_dataset=reward_dataset,
)
# Train
reward_trainer.train()
3. PPO Training¶
from trl import PPOTrainer, PPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
config = PPOConfig(
model_name="meta-llama/Llama-2-7b-hf",
learning_rate=1e-5,
num_ppo_epochs=4,
mini_batch_size=4,
batch_size=32,
)
model = AutoModelForCausalLM.from_pretrained(config.model_name)
tokenizer = AutoTokenizer.from_pretrained(config.model_name)
reward_model = AutoModelForSequenceClassification.from_pretrained("./reward-model")
ppo_trainer = PPOTrainer(
config=config,
model=model,
ref_model=None,
tokenizer=tokenizer,
dataset=dataset,
data_collator=data_collator,
)
# Training loop
for epoch in range(10):
for batch in ppo_trainer.dataloader:
query_tensors = batch["input_ids"]
response_tensors = ppo_trainer.generate(query_tensors)
# Get reward from reward model
rewards = reward_model(response_tensors)["score"]
# Update policy with PPO
stats = ppo_trainer.step(query_tensors, response_tensors, rewards)
ppo_trainer.log_stats(stats, batch, rewards)
4. DPO (Direct Preference Optimization)¶
from trl import DPOTrainer, DPOConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
config = DPOConfig(
output_dir="./dpo-model",
per_device_train_batch_size=4,
learning_rate=5e-5,
num_train_epochs=3,
beta=0.1, # Temperature parameter
)
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
trainer = DPOTrainer(
model=model,
args=config,
train_dataset=dpo_dataset, # Dataset with preferred/rejected pairs
tokenizer=tokenizer,
peft_config=peft_config,
)
trainer.train()
Memory Efficiency with QLoRA¶
from peft import LoraConfig, get_peft_model
from transformers import BitsAndBytesConfig
import torch
# 4-bit quantization
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
# Load quantized model
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantization_config=bnb_config,
device_map="auto",
)
# Add LoRA
lora_config = LoraConfig(
r=8,
lora_alpha=16,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
)
model = get_peft_model(model, lora_config)
# Now train with SFTTrainer
# Memory usage: ~4GB (vs 28GB for full training)
Strengths¶
✅ RLHF Support - Complete pipeline for preference training
✅ Proven - Used by Hugging Face and industry leaders
✅ Flexible - Supports multiple training paradigms
✅ Well-Documented - Extensive examples and tutorials
✅ Active Development - Regular updates and improvements
Weaknesses¶
❌ Memory Usage - Without QLoRA, needs substantial GPU memory
❌ Complexity - PPO training has many hyperparameters
❌ Speed - Slower than optimized alternatives like Unsloth
Best Practices¶
- Start with SFT - Verify data quality before RLHF
- Use QLoRA - Reduces memory 80% with minimal quality loss
- Validate Rewards - Reward model quality critical for PPO
- Monitor Training - Use Weights & Biases integration for tracking
Integration¶
# With Weights & Biases
from trl import SFTTrainer
from transformers import TrainingArguments
args = TrainingArguments(
report_to="wandb", # Log to Weights & Biases
run_name="my-sft-run",
)
trainer = SFTTrainer(..., args=args)
trainer.train()
When to Use TRL¶
| Scenario | Recommendation |
|---|---|
| RLHF training | ✅ Best choice |
| Production fine-tuning | ✅ Good choice |
| Speed critical | ❌ Use Unsloth |
| No coding | ❌ Use Ludwig |
| Multi-method flexibility | ⚠️ Use Axolotl |
Resources¶
Next: Compare with 02 Axolotl for flexible multi-method training