TRL documentation
Pelatih RLOO
Pelatih RLOO
Ikhtisar
TRL mendukung RLOO Trainer untuk melatih model bahasa, seperti yang dijelaskan dalam makalah Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs oleh Arash Ahmadian, Chris Cremer, Matthias Gallé, Marzieh Fadaee, Julia Kreutzer, Ahmet Üstün dan Sara Hooker.
Abstrak dari makalah tersebut adalah sebagai berikut:
AI alignment dalam bentuk Reinforcement Learning from Human Feedback (RLHF) semakin dianggap sebagai komponen penting untuk model bahasa besar berkinerja tinggi. Proximal Policy Optimization (PPO) telah diposisikan oleh literatur terbaru sebagai metode kanonik untuk bagian RL dari RLHF. Namun, metode ini melibatkan biaya komputasi yang tinggi dan penyetelan hiperparameter yang sensitif. Kami berpendapat bahwa sebagian besar prinsip motivasi yang mendorong pengembangan PPO kurang menjadi kekhawatiran praktis dalam RLHF, dan kami mengadvokasi metode yang kurang mahal secara komputasi namun tetap mempertahankan bahkan meningkatkan kinerja. Kami meninjau kembali formulasi alignment dari preferensi manusia dalam konteks RL. Dengan menjaga kesederhanaan sebagai prinsip panduan, kami menunjukkan bahwa banyak komponen PPO tidak diperlukan dalam konteks RLHF dan bahwa varian optimasi bergaya REINFORCE yang jauh lebih sederhana melampaui kinerja PPO maupun metode “RL-free” yang baru diusulkan seperti DPO dan RAFT. Pekerjaan kami menunjukkan bahwa adaptasi yang cermat terhadap karakteristik alignment LLM memungkinkan pemanfaatan optimasi RL online dengan biaya rendah.
Metode pasca-pelatihan ini disumbangkan oleh Costa Huang dan kemudian di-refactor oleh Shirin Yamani.
Mulai cepat
Contoh ini menunjukkan cara melatih model menggunakan metode RLOO. Kami melatih Qwen 0.5B Instruct model dengan prompt dari DeepMath-103K dataset. Anda dapat melihat data dalam dataset di sini:
Berikut adalah skrip untuk melatih model. accuracy_reward memerlukan math-verify, yang dapat Anda instal dengan pip install trl[math_verify].
# train_rloo.py
from datasets import load_dataset
from trl import RLOOTrainer
from trl.rewards import accuracy_reward
dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
trainer = RLOOTrainer(
model="Qwen/Qwen2-0.5B-Instruct",
reward_funcs=accuracy_reward,
train_dataset=dataset,
)
trainer.train()Jalankan skrip menggunakan perintah berikut:
torchrun --nproc_per_node 8 train_rloo.py
Menggali lebih dalam ke metode RLOO
RLOO adalah algoritma pembelajaran online, yang berarti ia meningkatkan secara iteratif dengan menggunakan data yang dihasilkan oleh model terlatih itu sendiri selama pelatihan. Intuisi di balik tujuan RLOO adalah memaksimalkan keuntungan dari penyelesaian yang dihasilkan, sambil memastikan bahwa model tetap dekat dengan kebijakan referensi. Untuk memahami cara kerja RLOO, prosesnya dapat dipecah menjadi empat langkah utama: menghasilkan penyelesaian, menghitung keuntungan, mengestimasi divergensi KL, dan menghitung loss.

Membuat kelengkapan
Pada setiap langkah pelatihan, kami mengambil sampel batch prompt dan menghasilkan satu set komplemen untuk setiap prompt (dilambangkan sebagai ).
Menghitung reward
Dalam RLOO, reward terdiri dari dua komponen: reward yang diberikan oleh model reward (atau fungsi reward) dan penalti KL yang mencegah kebijakan menyimpang terlalu jauh dari kebijakan referensi yang tetap
- Untuk setiap sekuens yang dihasilkan yang dikondisikan pada query , kami menghitung reward skalar menggunakan model reward .
- Secara bersamaan, kami memperkirakan divergensi KL antara kebijakan saat ini dan kebijakan referensi tetap pada sekuens. Estimasi KL untuk sekuens adalah:
Hadiah akhir yang diberikan ke urutan adalah sebagai berikut:
di mana mengontrol kekuatan penalti KL.
Dalam pengaturan murni online (
num_iterations = 1, default), data dihasilkan oleh kebijakan saat ini. Dalam kasus ini, penalti KL dihitung secara langsung menggunakan kebijakan saat ini.Dalam pengaturan yang lebih umum (misalnya, beberapa langkah gradien per batch), data justru dihasilkan oleh snapshot sebelumnya . Untuk menjaga agar penalti konsisten dengan distribusi sampling, KL didefinisikan terhadap kebijakan ini:
Secara ekuivalen, untuk urutan yang disampel , estimasi Monte Carlo adalah:
Menghitung keuntungan
Setelah reward untuk setiap completion dihitung, kita menghitung baseline sebagai rata-rata reward dari semua sampel lain dalam batch yang sama, dengan mengecualikan sampel saat ini. Baseline ini digunakan untuk mengurangi varians dari estimasi policy gradient. Advantage untuk setiap completion kemudian diperoleh sebagai selisih antara reward-nya sendiri dan baseline leave-one-out ini.
Secara formal, untuk batch berisi G penyelesaian, baseline untuk penyelesaian adalah:
dan kemudian keuntungan untuk setiap penyelesaian dihitung sebagai selisih antara reward-nya dan baseline:
Menghitung loss
Loss REINFORCE didefinisikan secara sederhana sebagai:
Dalam praktiknya, melakukan beberapa langkah gradien pada batch yang sama membuat aksi secara efektif menjadi off-policy relatif terhadap parameter saat ini. Untuk mengoreksi hal ini, kami memperkenalkan rasio importance sampling. Untuk mencegah pembaruan yang terlalu besar ketika kebijakan berubah antara pengambilan sampel dan langkah gradien, kami memotong (clip) rasio ini:
Dalam pengaturan online penuh, satu langkah (default), dan ini berkurang menjadi REINFORCE standar.
Berbeda dengan GRPO, RLOO tidak melakukan backpropagation gradien melalui istilah KL. Di sini, KL murni digunakan untuk reward shaping: ia dihitung di bawah
no_graddan digabungkan ke dalam reward skalar , yang menjadi advantage yang terdetas .Dengan kata lain, satu-satunya jalur yang diambil gradien ke dalam kebijakan adalah suku rasio kepentingan , dan suku KL tidak melakukan backpropagation ke dalam kebijakan.
Sebaliknya, GRPO menambahkan suku KL eksplisit yang dapat dibedakan ke dalam objektifnya, yang dihitung secara langsung dengan kebijakan saat ini , sehingga gradiennya mengalir melalui suku rasio dan penalti KL.
Metrik yang dicatat
Selama pelatihan dan evaluasi, kami mencatat metrik berikut:
num_tokens: Total jumlah token yang diproses sejauh ini, termasuk prompt dan penyelesaian.step_time: Rata-rata waktu (dalam detik) yang dibutuhkan per langkah pelatihan (termasuk generasi).completions/mean_length: Rata-rata panjang dari kelengkapan yang dihasilkan.completions/min_length: Panjang minimum dari kelengkapan yang dihasilkan.completions/max_length: Panjang maksimum dari kelengkapan yang dihasilkan.completions/mean_terminated_length: Rata-rata panjang dari kelengkapan yang dihasilkan yang diakhiri dengan EOS.completions/min_terminated_length: Panjang minimum dari completion yang dihasilkan yang diakhiri dengan EOS.completions/max_terminated_length: Panjang maksimum dari completion yang dihasilkan yang diakhiri dengan EOS.completions/clipped_ratio: Rasio penyelesaian yang dipotong (clipped).rewards/{reward_func_name}/mean: Rata-rata reward dari fungsi reward tertentu.rewards/{reward_func_name}/std: Deviasi standar dari reward yang dihasilkan oleh fungsi reward tertentu.reward: Rata-rata keseluruhan reward setelah menjumlahkan reward di seluruh fungsi (diberi bobot olehreward_weights).reward_std: Standar deviasi dari total reward di seluruh fungsi (diberat olehreward_weights), dihitung pada batch penuh.frac_reward_zero_std: Proporsi sampel dalam batch generasi yang memiliki standar deviasi reward nol, yang mengindikasikan bahwa terdapat sedikit keberagaman untuk prompt tersebut (semua jawaban benar atau salah).entropy: Entropi rata-rata dari prediksi token di seluruh kelengkapan yang dihasilkan. (Jikamask_truncated_completions=True, token dari urutan yang dimasker dikecualikan.)aux_loss: kerugian bantu penyeimbangan beban dari model Mixture-of-Experts, sebelum dikalikan denganrouter_aux_loss_coefdan ditambahkan ke kerugian. Dicatat hanya ketika model adalah model MoE danrouter_aux_loss_coeftidak nol.kl: Rata-rata divergensi KL antara model dan model referensi, dihitung di atas kelengkapan yang dihasilkan. Dicatat hanya jikabetatidak nol.clip_ratio/region_mean: Rasio probabilitas sekuens di mana tujuan RLOO dipangkas agar tetap berada di dalam trust region: . Nilai yang lebih tinggi berarti lebih banyak sampel yang dipangkas, yang membatasi seberapa besar kebijakan dapat berubah.clip_ratio/low_mean: Rata-rata rasio probabilitas urutan yang dipangkas pada batas bawah trust region: .clip_ratio/low_min: Indikator clip per-penyelesaian terkecil pada batas bawah trust region: .clip_ratio/high_mean: Rata-rata rasio probabilitas urutan yang dipangkas pada batas atas trust region: .clip_ratio/high_max: Indikator clip per-completion terbesar pada batas atas trust region: .
Kustomisasi
Percepat pelatihan dengan generasi yang didukung vLLM
Generasi sering menjadi bottleneck utama saat melatih dengan metode online. Untuk mempercepat generasi, Anda dapat menggunakan vLLM, mesin inferensi ber-throughput tinggi dan ber-latensi rendah untuk LLM. Untuk mengaktifkannya, pertama instal paketnya dengan
pip install trl[vllm]
Kami mendukung dua cara penggunaan vLLM selama pelatihan: mode server dan mode colocate.
Opsi 1: Mode Colocate
Pada mode ini, vLLM berjalan di dalam proses trainer dan berbagi memori GPU dengan model pelatihan. Hal ini menghindari peluncuran server terpisah dan dapat meningkatkan pemanfaatan GPU, tetapi dapat menyebabkan perebutan memori pada GPU pelatihan. Ini adalah mode default.
from trl import RLOOConfig
training_args = RLOOConfig(
...,
use_vllm=True, # vllm_mode="colocate" by default
)Opsi 2: Mode server
Pada mode ini, vLLM berjalan dalam proses terpisah (dan menggunakan GPU terpisah) serta berkomunikasi dengan trainer melalui HTTP. Ini ideal jika Anda memiliki GPU khusus untuk inferensi.
Mulai server vLLM:
VLLM_SERVER_DEV_MODE=1 vllm serve <model_name> \ --weight-transfer-config '{"backend": "nccl"}' \ --logprobs-mode processed_logprobs \ --max-logprobs -1Aktifkan mode server di skrip pelatihan Anda:
from trl import RLOOConfig training_args = RLOOConfig( ..., use_vllm=True, vllm_mode="server", )
Pastikan server menggunakan GPU yang berbeda dari trainer, jika tidak Anda mungkin akan menemui error NCCL. Anda dapat menentukan GPU yang akan digunakan dengan variabel lingkungan
CUDA_VISIBLE_DEVICES.
Tergantung pada ukuran model dan kebutuhan memori GPU keseluruhan untuk pelatihan, Anda mungkin perlu menyesuaikan parameter
vllm_gpu_memory_utilizationdi RLOOConfig untuk menghindari underutilization atau error out-of-memory.Kami menyediakan HF Space untuk membantu memperkirakan pemanfaatan memori GPU yang direkomendasikan berdasarkan konfigurasi model dan pengaturan eksperimen Anda. Cukup gunakan sebagai berikut untuk mendapatkan rekomendasi
vllm_gpu_memory_utilization:Jika nilai yang direkomendasikan tidak berfungsi di lingkungan Anda, kami menyarankan untuk menambahkan buffer kecil (misalnya, +0.05 atau +0.1) ke nilai yang direkomendasikan untuk memastikan stabilitas.
Jika Anda masih mengalami error out-of-memory, atur
vllm_enable_sleep_modeke True sehingga parameter vllm dan cache akan di-offload selama langkah optimasi. Untuk informasi lebih lanjut, lihat Mengurangi Penggunaan Memori dengan vLLM Sleep Mode.
Secara default, RLOO menggunakan
MASTER_ADDR=localhostdanMASTER_PORT=12345untuk vLLM, tetapi Anda dapat menimpa nilai-nilai ini dengan mengatur variabel lingkungan secara sesuai.
Untuk informasi lebih lanjut, lihat Mempercepat pelatihan dengan vLLM.
RLOO berskala besar: latih Model 70B+ di beberapa node
Saat melatih model besar seperti Qwen2.5-72B, Anda memerlukan beberapa optimasi kunci untuk membuat pelatihan efisien dan dapat diskalakan di beberapa GPU dan node. Optimasi ini meliputi:
- DeepSpeed ZeRO Stage 3: ZeRO memanfaatkan data parallelism untuk mendistribusikan state model (weights, gradients, optimizer states) ke beberapa GPU dan CPU, sehingga mengurangi kebutuhan memori dan komputasi pada setiap perangkat. Karena model besar tidak muat di satu GPU, penggunaan ZeRO Stage 3 diperlukan untuk melatih model semacam itu. Untuk detail lebih lanjut, lihat DeepSpeed Integration.
- torchrun: peluncur PyTorch memulai satu proses per GPU di setiap node dan menghubungkannya melalui rendezvous bersama. Untuk detail lebih lanjut, lihat Mendistribusikan Pelatihan.
- vLLM: Lihat bagian sebelumnya tentang cara menggunakan vLLM untuk mempercepat generasi.
Di bawah ini adalah contoh skrip SLURM untuk melatih model 70B dengan RLOO di beberapa node. Skrip ini melatih model di 4 node dan menggunakan node ke-5 untuk generasi yang didukung vLLM.
#!/bin/bash
#SBATCH --nodes=5
#SBATCH --gres=gpu:8
# Get the list of allocated nodes
NODELIST=($(scontrol show hostnames $SLURM_JOB_NODELIST))
# Assign the first 4 nodes for training and the 5th node for vLLM
TRAIN_NODES="${NODELIST[@]:0:4}" # Nodes 0, 1, 2, 3 for training
VLLM_NODE="${NODELIST[4]}" # Node 4 for vLLM
# Run training on the first 4 nodes (Group 1)
srun --nodes=4 --ntasks=4 --nodelist="${NODELIST[@]:0:4}" torchrun \
--nnodes 4 \
--nproc_per_node 8 \
--node_rank $SLURM_PROCID \
--rdzv_backend c10d \
--rdzv_endpoint ${NODELIST[0]}:29500 \
train_rloo.py \
--server_ip $VLLM_NODE &
# Run vLLM server on the 5th node (Group 2)
srun --nodes=1 --ntasks=1 --nodelist="${NODELIST[4]}" env VLLM_SERVER_DEV_MODE=1 vllm serve Qwen/Qwen2.5-72B --tensor-parallel-size 8 \
--weight-transfer-config '{"backend": "nccl"}' \
--logprobs-mode processed_logprobs \
--max-logprobs -1 &
waitimport argparse
from datasets import load_dataset
from trl import RLOOTrainer, RLOOConfig
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--vllm_server_host", type=str, default="", help="The server IP")
args = parser.parse_args()
# Example dataset from TLDR
dataset = load_dataset("trl-lib/tldr", split="train")
# Dummy reward function: count the number of unique characters in the completions
def reward_num_unique_chars(completions, **kwargs):
return [len(set(c)) for c in completions]
training_args = RLOOConfig(
output_dir="Qwen2.5-72B-RLOO",
per_device_train_batch_size=4,
bf16=True,
deepspeed="examples/deepspeed_configs/zero3.json",
use_vllm=True,
vllm_mode="server",
vllm_server_host=args.vllm_server_host.replace("ip-", "").replace("-", "."), # from ip-X-X-X-X to X.X.X.X
)
trainer = RLOOTrainer(model="Qwen/Qwen2.5-72B", args=training_args, reward_funcs=reward_num_unique_chars, train_dataset=dataset)
trainer.train()
if __name__=="__main__":
main()Menggunakan fungsi reward kustom
RLOOTrainer mendukung penggunaan fungsi reward kustom sebagai pengganti model reward padat. Untuk memastikan kompatibilitas, fungsi reward Anda harus memenuhi persyaratan berikut:
Fungsi reward dapat berupa callable Python sinkron atau coroutine async def asinkron. Ketika Anda menyediakan beberapa fungsi reward asinkron, fungsi-fungsi tersebut ditunggu secara bersamaan (dijalankan paralel melalui asyncio.gather) sehingga latensinya tumpang tindih.
Argumen input:
Fungsi harus menerima argumen berikut sebagai argumen kata kunci:
prompts(mengandung prompt),completions(mengandung kelengkapan yang dihasilkan),completion_ids(mengandung pelengkapan yang telah ditokenisasi),trainer_state(TrainerState): Status terkini dari trainer. Hal ini dapat digunakan untuk mengimplementasikan fungsi reward dinamis, seperti pembelajaran kurikulum, di mana reward disesuaikan berdasarkan kemajuan pelatihan.log_extra: callablelog_extra(column: str, values: list)untuk menambahkan kolom tambahan ke tabel completions. Lihat Contoh 6.log_metric: callablelog_metric(name: str, value: float)untuk mencatat metrik skalar sebagai plot di sampingkl,entropy, dll. Lihat Contoh 6.- Semua nama kolom (kecuali
prompt) yang mungkin dimiliki dataset. Misalnya, jika dataset berisi kolom bernamaground_truth, fungsi tersebut akan dipanggil denganground_truthsebagai argumen kata kunci.
Cara termudah untuk memenuhi persyaratan ini adalah dengan menggunakan
**kwargsdalam tanda tangan fungsi.Tergantung pada format dataset, input akan bervariasi:
- Untuk format standar,
promptsdancompletionsakan berupa daftar string. - Untuk format percakapan,
promptsdancompletionsakan berupa daftar kamus pesan.
- Untuk format standar,
Nilai yang dikembalikan: Fungsi harus mengembalikan daftar float. Setiap float mewakili reward yang sesuai dengan satu completion.
Contoh 1: Memberi imbalan pada penyelesaian yang lebih panjang
Berikut adalah contoh fungsi reward untuk format standar yang memberikan reward lebih tinggi untuk penyelesaian yang lebih panjang:
def reward_func(completion_ids, **kwargs):
"""Reward function that assigns higher scores to longer completions (in terms of token count)."""
return [float(len(ids)) for ids in completion_ids]Anda dapat mengujinya sebagai berikut:
>>> prompts = ["The sky is", "The sun is"] # not used in the reward function, but the trainer will pass it
>>> completions = [" blue.", " in the sky."] # not used in the reward function, but the trainer will pass it
>>> completion_ids = [[6303, 13], [304, 279, 12884, 13]]
>>> reward_func(prompts=prompts, completions=completions, completion_ids=completion_ids)
[2.0, 4.0]Contoh 1.1: Memberi imbalan untuk penyelesaian yang lebih panjang (berdasarkan jumlah karakter)
Sama seperti contoh sebelumnya, tetapi kali ini fungsi reward didasarkan pada jumlah karakter, bukan token.
def reward_func(completions, **kwargs):
"""Reward function that assigns higher scores to longer completions (in terms of character count)."""
return [float(len(completion)) for completion in completions]Anda dapat mengujinya sebagai berikut:
>>> prompts = ["The sky is", "The sun is"]
>>> completions = [" blue.", " in the sky."]
>>> completion_ids = [[6303, 13], [304, 279, 12884, 13]] # not used in the reward function, but the trainer will pass it
>>> reward_func(prompts=prompts, completions=completions, completion_ids=completion_ids)
[6.0, 12.0]Contoh 2: Memberikan imbalan untuk penyelesaian dengan format tertentu
Berikut adalah contoh fungsi reward yang memeriksa apakah penyelesaian memiliki format tertentu. Contoh ini terinspirasi dari fungsi format reward yang digunakan dalam makalah DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning. Fungsi ini dirancang untuk format percakapan, di mana prompt dan penyelesaian terdiri dari pesan terstruktur.
import re
def format_reward_func(completions, **kwargs):
"""Reward function that checks if the completion has a specific format."""
pattern = r"^<think>.*?</think><answer>.*?</answer>$"
completion_contents = [completion[0]["content"] for completion in completions]
matches = [re.match(pattern, content) for content in completion_contents]
return [1.0 if match else 0.0 for match in matches]Anda dapat menguji fungsi ini sebagai berikut:
>>> prompts = [
... [{"role": "user", "content": "What is the result of (1 + 2) * 4?"}],
... [{"role": "user", "content": "What is the result of (3 + 1) * 2?"}],
... ]
>>> completions = [
... [{"role": "assistant", "content": "<think>The sum of 1 and 2 is 3, which we multiply by 4 to get 12.</think><answer>(1 + 2) * 4 = 12</answer>"}],
... [{"role": "assistant", "content": "The sum of 3 and 1 is 4, which we multiply by 2 to get 8. So (3 + 1) * 2 = 8."}],
... ]
>>> format_reward_func(prompts=prompts, completions=completions)
[1.0, 0.0]Contoh 3: Memberikan imbalan pada penyelesaian berdasarkan referensi
Berikut adalah contoh fungsi reward yang memeriksa apakah penyelesaian benar. Contoh ini terinspirasi dari fungsi reward akurasi yang digunakan dalam makalah DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning.
Contoh ini dirancang untuk format standar, di mana dataset berisi kolom bernama ground_truth.
import re
def reward_func(completions, ground_truth, **kwargs):
# Regular expression to capture content inside \boxed{}
matches = [re.search(r"\\boxed\{(.*?)\}", completion) for completion in completions]
contents = [match.group(1) if match else "" for match in matches]
# Reward 1 if the content is the same as the ground truth, 0 otherwise
return [1.0 if c == gt else 0.0 for c, gt in zip(contents, ground_truth)]Anda dapat menguji fungsi ini sebagai berikut:
>>> prompts = ["Problem: Solve the equation $2x + 3 = 7$. Solution:", "Problem: Solve the equation $3x - 5 = 10$."]
>>> completions = [r" The solution is \boxed{2}.", r" The solution is \boxed{6}."]
>>> ground_truth = ["2", "5"]
>>> reward_func(prompts=prompts, completions=completions, ground_truth=ground_truth)
[1.0, 0.0]Contoh 4: Fungsi reward multi-tugas
Berikut adalah contoh penggunaan beberapa fungsi reward dalam RLOOTrainer. Dalam contoh ini, kami mendefinisikan dua fungsi reward yang spesifik untuk tugas: math_reward_func dan coding_reward_func. Fungsi math_reward_func memberikan reward untuk soal matematika berdasarkan kebenarannya, sedangkan coding_reward_func memberikan reward untuk soal pemrograman berdasarkan apakah solusinya berfungsi.
from datasets import Dataset
from trl import RLOOTrainer
# Define a dataset that contains both math and coding problems
dataset = Dataset.from_list(
[
{"prompt": "What is 2+2?", "task": "math"},
{"prompt": "Write a function that returns the sum of two numbers.", "task": "code"},
{"prompt": "What is 3*4?", "task": "math"},
{"prompt": "Write a function that returns the product of two numbers.", "task": "code"},
]
)
# Math-specific reward function
def math_reward_func(prompts, completions, task, **kwargs):
rewards = []
for prompt, completion, t in zip(prompts, completions, task):
if t == "math":
# Calculate math-specific reward
correct = check_math_solution(prompt, completion)
reward = 1.0 if correct else -1.0
rewards.append(reward)
else:
# Return None for non-math tasks
rewards.append(None)
return rewards
# Coding-specific reward function
def coding_reward_func(prompts, completions, task, **kwargs):
rewards = []
for prompt, completion, t in zip(prompts, completions, task):
if t == "code":
# Calculate coding-specific reward
works = test_code_solution(prompt, completion)
reward = 1.0 if works else -1.0
rewards.append(reward)
else:
# Return None for non-coding tasks
rewards.append(None)
return rewards
# Use both task-specific reward functions
trainer = RLOOTrainer(
model="Qwen/Qwen2-0.5B-Instruct",
reward_funcs=[math_reward_func, coding_reward_func],
train_dataset=dataset,
)
trainer.train()Pada contoh ini, math_reward_func dan coding_reward_func dirancang untuk bekerja dengan dataset campuran yang berisi soal matematika dan pemrograman. Kolom task dalam dataset digunakan untuk menentukan fungsi reward mana yang akan diterapkan pada setiap soal. Jika tidak ada fungsi reward yang relevan untuk sampel dalam dataset, fungsi reward akan mengembalikan None, dan RLOOTrainer akan melanjutkan dengan fungsi dan tugas yang valid. Hal ini memungkinkan RLOOTrainer untuk menangani beberapa fungsi reward dengan cakupan penerapan yang berbeda.
Perhatikan bahwa RLOOTrainer akan mengabaikan reward None yang dikembalikan oleh fungsi reward dan hanya mempertimbangkan reward yang dikembalikan oleh fungsi yang relevan. Hal ini memastikan bahwa model dilatih pada tugas yang relevan dan mengabaikan tugas yang tidak memiliki fungsi reward yang relevan.
Contoh 5: Fungsi reward asinkron
Fungsi reward kustom juga dapat didefinisikan sebagai korutin async def. Hal ini berguna jika reward Anda bergantung pada I/O yang lambat (misalnya, memanggil layanan jarak jauh). Ketika Anda meneruskan beberapa fungsi reward asinkron, RLOOTrainer akan mengeksekusinya secara bersamaan sehingga latensinya saling tumpang tindih.
Berikut adalah contoh minimal dari fungsi reward asinkron yang mensimulasikan operasi yang terikat I/O:
import asyncio
async def async_reward_func(prompts, completions, **kwargs):
# Simulate an I/O-bound call (e.g., HTTP request, database lookup)
await asyncio.sleep(0.01)
# Simple toy reward: 1.0 if the completion is non-empty, else 0.0
return [1.0 if completion else 0.0 for completion in completions]Contoh 6: Pencatatan kolom dan metrik tambahan
Di bawah ini adalah contoh fungsi reward yang mencatat kolom tambahan ke tabel completions dan metrik skalar sebagai plot.
import re
def reward_func(completions, ground_truth, log_extra=None, log_metric=None, **kwargs):
extracted = [re.search(r"\\boxed\{(.*?)\}", c) for c in completions]
extracted = [m.group(1) if m else None for m in extracted]
rewards = [1.0 if e == gt else 0.0 for e, gt in zip(extracted, ground_truth)]
if log_extra:
log_extra("golden_answer", list(ground_truth))
log_extra("extracted_answer", [e or "[none]" for e in extracted])
if log_metric:
log_metric("accuracy", sum(rewards) / len(rewards))
return rewardsMenyalurkan fungsi reward ke trainer
Untuk menggunakan fungsi reward kustom Anda, berikan ke RLOOTrainer sebagai berikut:
from trl import RLOOTrainer
trainer = RLOOTrainer(
reward_funcs=reward_func,
...,
)Anda dapat meneruskan beberapa fungsi reward sebagai daftar; daftar ini dapat mencakup fungsi sinkron dan asinkron:
from trl import RLOOTrainer
trainer = RLOOTrainer(
reward_funcs=[reward_func, async_reward_func1, async_reward_func2],
...,
)dan hadiah akan dihitung sebagai jumlah dari hadiah dari setiap fungsi, atau jumlah berbobot jika reward_weights disediakan dalam konfigurasi.
Perhatikan bahwa RLOOTrainer mendukung beberapa fungsi reward dengan tipe yang berbeda. Lihat dokumentasi parameter untuk detail lebih lanjut.
Pelatihan Model Bahasa Visual
RLOO mendukung pelatihan Vision-Language Models (VLMs) pada dataset multimodal yang berisi teks dan gambar.
Model yang Didukung
Diuji dengan:
- Gemma3 — misalnya,
google/gemma-3-4b-it - LLaVA-NeXT — misalnya,
llava-hf/llava-v1.6-mistral-7b-hf - Qwen2-VL — misalnya,
Qwen/Qwen2-VL-2B-Instruct - Qwen2.5-VL — misalnya,
Qwen/Qwen2.5-VL-3B-Instruct - SmolVLM2 — misalnya,
HuggingFaceTB/SmolVLM2-2.2B-Instruct
Kompatibilitas dengan semua VLM tidak dijamin. Jika Anda yakin suatu model harus didukung, silakan buka issue di GitHub — atau lebih baik lagi, kirimkan pull request dengan perubahan yang diperlukan.
Mulai Cepat
Gunakan rloo_vlm.py untuk fine-tune VLM. Contoh perintah untuk pelatihan pada lmms-lab/multimodal-open-r1-8k-verified:
torchrun --nproc_per_node 8 examples/rloo_visual_math/rloo_visual_math.py \
--deepspeed examples/deepspeed_configs/zero3.json \
--model_name_or_path Qwen/Qwen2.5-VL-3B-Instruct \
--output_dir rloo-Qwen2.5-VL-3B-Instruct \
--learning_rate 1e-5 \
--dtype bfloat16 \
--max_completion_length 1024 \
--use_vllm \
--vllm_mode colocate \
--use_peft \
--lora_target_modules "q_proj", "v_proj" \
--log_completionsTips Konfigurasi
- Gunakan LoRA pada lapisan proyeksi bahasa-visi
- Aktifkan kuantisasi 4-bit untuk mengurangi penggunaan memori
- VLMs sangat intensif terhadap memori — mulailah dengan ukuran batch yang lebih kecil
- Sebagian besar model kompatibel dengan vLLM (mode
serverdancolocate)
Format Dataset
Setiap sampel pelatihan harus mencakup:
prompt: Teks yang diformat melalui template chat prosesorimage/images: Gambar PIL atau daftar Gambar PIL
Trainer secara otomatis menangani konversi gambar-ke-tensor melalui image processor model.
RLOOTrainer
kelas trl.RLOOTrainer
< source >( model: str | PreTrainedModel | PeftModelreward_funcs: str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]] | list[str | transformers.modeling_utils.PreTrainedModel | collections.abc.Callable[..., list[float | None]]]args: trl.trainer.rloo_config.RLOOConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | datasets.dataset_dict.DatasetDict | datasets.dataset_dict.IterableDatasetDict | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonereward_processing_classes: transformers.tokenization_utils_base.PreTrainedTokenizerBase | list[transformers.tokenization_utils_base.PreTrainedTokenizerBase] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)quantization_config: BitsAndBytesConfig | None = Nonepeft_config: PeftConfig | None = None )
Parameter
- model (
stratau PreTrainedModel atau PeftModel) — Model yang akan dilatih. Bisa berupa:- String, berupa model id dari model pretrained yang dihosting di dalam model repo di huggingface.co, atau
path ke directory yang berisi model weights yang disimpan menggunakan
save_pretrained, misalnya
'./my_model_directory/'. Model dimuat menggunakan<ModelArchitecture>.from_pretrained(di mana<ModelArchitecture>diturunkan dari model config) dengan keyword arguments diargs.model_init_kwargs. Jikadtypetidak ditentukan diargs.model_init_kwargs, default-nya adalahfloat32. Ini berbeda dari from_pretrained, di mana (sejak Transformers v5) dtype disimpulkan dari model config. - Objek PreTrainedModel. Hanya model bahasa kausal yang didukung.
- Objek PeftModel. Hanya model bahasa kausal yang didukung.
- String, berupa model id dari model pretrained yang dihosting di dalam model repo di huggingface.co, atau
path ke directory yang berisi model weights yang disimpan menggunakan
save_pretrained, misalnya
- reward_funcs (
RewardFunc | list[RewardFunc]) — Fungsi reward yang akan digunakan untuk menghitung reward. Untuk menghitung reward, kami memanggil semua fungsi reward dengan prompt dan completion, lalu menjumlahkan reward-nya. Bisa berupa:-
Satu fungsi reward, seperti:
-
Sebuah string: ID model dari model pretrained yang dihosting di dalam repo model di huggingface.co, atau path ke direktori yang berisi bobot model yang disimpan menggunakan save_pretrained, misalnya
'./my_model_directory/'. Model dimuat menggunakan from_pretrained dengannum_labels=1dan keyword arguments diargs.model_init_kwargs. -
Objek PreTrainedModel: Hanya model klasifikasi urutan yang didukung.
-
Fungsi reward kustom: Fungsi ini diberikan prompt dan kelengkapan yang dihasilkan, ditambah kolom tambahan apa pun dalam dataset. Fungsi ini harus mengembalikan daftar reward. Fungsi reward kustom dapat bersifat sinkron atau asinkron, dan juga dapat mengembalikan
Noneketika reward tidak berlaku untuk sampel tersebut. Hal ini berguna untuk pelatihan multi-tugas di mana fungsi reward yang berbeda berlaku untuk jenis sampel yang berbeda. Ketika fungsi reward mengembalikanNoneuntuk suatu sampel, fungsi reward tersebut dikecualikan dari perhitungan reward untuk sampel tersebut. Untuk detail lebih lanjut, lihat Menggunakan fungsi reward kustom.Status trainer juga diteruskan ke fungsi reward. Status trainer adalah instance dari TrainerState dan dapat diakses dengan mengakses argumen
trainer_statepada signature fungsi reward.
-
-
Daftar fungsi reward, di mana setiap item dapat secara independen berupa salah satu tipe di atas. Pencampuran tipe yang berbeda dalam daftar (misalnya, ID model string dan fungsi reward kustom) diizinkan.
-
- args (RLOOConfig, opsional) —
Konfigurasi untuk trainer ini. Jika
None, konfigurasi default akan digunakan. - train_dataset (Dataset atau IterableDataset) —
Dataset yang digunakan untuk pelatihan. Dataset ini harus mencakup kolom
"prompt". Kolom tambahan lainnya dalam dataset akan diabaikan. Format sampel dapat berupa:- Standar: Setiap sampel berisi teks polos.
- Konversasional: Setiap sampel berisi pesan terstruktur (misalnya, peran dan konten).
Ketika
train_datasetadalah IterableDataset (misalnya dataset streaming),max_stepsharus diatur dalam argumen pelatihan, karena panjangnya tidak dapat disimpulkan dan jumlah total langkah pelatihan diperlukan untuk membatasi loop pelatihan serta mengonfigurasi penjadwal laju pembelajaran. - eval_dataset (Dataset, IterableDataset, DatasetDict, IterableDatasetDict atau
dict[str, Dataset | IterableDataset]) — Dataset yang digunakan untuk evaluasi. Dataset ini harus memenuhi persyaratan yang sama dengantrain_dataset. - processing_class (PreTrainedTokenizerBase, ProcessorMixin, opsional) —
Kelas pemrosesan yang digunakan untuk memproses data. Sisi padding harus diatur ke “left”. Jika
None, kelas pemrosesan dimuat dari nama model dengan from_pretrained. Token padding,tokenizer.pad_token, harus diatur. Jika kelas pemrosesan belum mengatur token padding,tokenizer.eos_tokenakan digunakan sebagai default. - reward_processing_classes (PreTrainedTokenizerBase atau
list[PreTrainedTokenizerBase], opsional) — Kelas pemrosesan yang sesuai dengan fungsi reward yang ditentukan dalamreward_funcs. Dapat berupa:- Satu kelas pemrosesan: Digunakan ketika
reward_funcshanya berisi satu fungsi reward. - Daftar kelas pemrosesan: Harus sesuai dengan urutan dan panjang fungsi reward di
reward_funcs. Jika diatur keNone, atau jika elemen daftar yang sesuai dengan PreTrainedModel adalahNone, tokenizer untuk model tersebut dimuat secara otomatis menggunakan from_pretrained. Untuk elemen direward_funcsyang merupakan fungsi reward kustom (bukan PreTrainedModel), entri yang sesuai direward_processing_classesdiabaikan.
- Satu kelas pemrosesan: Digunakan ketika
- callbacks (daftar TrainerCallback, opsional) —
Daftar callback untuk menyesuaikan loop pelatihan. Callback ini akan ditambahkan ke daftar callback default yang dijelaskan di sini.
Jika Anda ingin menghapus salah satu callback default yang digunakan, gunakan metode remove_callback.
- optimizers (
tuple[torch.optim.Optimizer | None, torch.optim.lr_scheduler.LambdaLR | None], opsional, defaultnya(None, None)) — Tuple yang berisi optimizer dan scheduler yang akan digunakan. Secara default akan menggunakan instanceAdamWpada model Anda dan scheduler yang diberikan oleh get_linear_schedule_with_warmup yang dikendalikan olehargs. - quantization_config (BitsAndBytesConfig, opsional) —
Konfigurasi kuantisasi yang digunakan saat memuat model dari pengidentifikasi model. Gabungkan dengan
peft_configuntuk pelatihan QLoRA. Diabaikan jika model sudah diinstansiasi. - peft_config (PeftConfig, opsional) —
Konfigurasi PEFT yang digunakan untuk membungkus model. Jika
None, model tidak dibungkus.
Trainer untuk metode Reinforce Leave One Out (RLOO). Algoritma ini awalnya diusulkan dalam makalah Back to Basics: Revisiting REINFORCE Style Optimization for Learning from Human Feedback in LLMs.
Contoh:
>>> from trl import RLOOTrainer
>>> from trl.rewards import accuracy_reward
>>> from datasets import load_dataset
>>> dataset = load_dataset("trl-lib/DeepMath-103K", split="train")
>>> trainer = RLOOTrainer(
... model="Qwen/Qwen2.5-0.5B-Instruct",
... reward_funcs=accuracy_reward,
... train_dataset=dataset,
... )
>>> trainer.train()latih
< source >( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput
Parameter
- resume_from_checkpoint (
strataubool, opsional) — Jika berupastr, jalur lokal ke checkpoint yang disimpan oleh instanceTrainersebelumnya. Jika berupabooldan bernilaiTrue, muat checkpoint terakhir di args.output_dir yang disimpan oleh instanceTrainersebelumnya. Jika ada, pelatihan akan dilanjutkan dari status model/optimizer/scheduler yang dimuat di sini. - trial (
optuna.Trialataudict[str, Any], opsional) — Jalankan trial atau kamus hiperparameter untuk pencarian hiperparameter. - ignore_keys_for_eval (
list[str], opsional) — Daftar kunci dalam output model Anda (jika berupa dictionary) yang harus diabaikan saat mengumpulkan prediksi untuk evaluasi selama pelatihan.
Mengembalikan
~trainer_utils.TrainOutput
Objek yang berisi jumlah langkah global, kerugian pelatihan, dan metrik.
Titik masuk utama pelatihan.
Akan menyimpan model, sehingga Anda dapat memuatnya kembali menggunakan from_pretrained().
Hanya akan menyimpan dari proses utama.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )
Parameter
- commit_message (
str, opsional, default"End of training") — Pesan untuk commit saat melakukan push. - blocking (
bool, opsional, defaultTrue) — Apakah fungsi harus hanya mengembalikan nilai setelahgit pushselesai. - token (
str, opsional, defaultnyaNone) — Token dengan izin tulis untuk menimpa argumen asli Trainer. - revision (
str, opsional) — Revisi git untuk di-commit. Secara default menggunakan head dari branch “main”. - kwargs (
dict[str, Any], opsional) — Argumen kata kunci tambahan yang diteruskan ke~Trainer.create_model_card.
Unggah self.model dan self.processing_class ke 🤗 model hub di repo self.args.hub_model_id.
RLOOConfig
kelas trl.RLOOConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_scheduler_type: transformers.trainer_utils.SchedulerType | str = 'linear'lr_scheduler_kwargs: dict | str | None = Nonewarmup_steps: float = 0optim: transformers.training_args.OptimizerNames | str = 'adamw_torch_fused'optim_args: str | None = Noneweight_decay: float = 0.0adam_beta1: float = 0.9adam_beta2: float = 0.999adam_epsilon: float = 1e-08optim_target_modules: None | str | list[str] = Nonegradient_accumulation_steps: int = 1average_tokens_across_devices: bool = Truemax_grad_norm: float = 1.0label_smoothing_factor: float = 0.0bf16: bool | None = Nonefp16: bool = Falsebf16_full_eval: bool = Falsefp16_full_eval: bool = Falsetf32: bool | None = Nonegradient_checkpointing: bool = Truegradient_checkpointing_kwargs: dict[str, typing.Any] | str | None = Nonetorch_compile: bool = Falsetorch_compile_backend: str | None = Nonetorch_compile_mode: str | None = Noneuse_liger_kernel: bool = Falseliger_kernel_config: dict[str, bool] | None = Noneuse_cache: bool = Falseneftune_noise_alpha: float | None = Nonetorch_empty_cache_steps: int | None = Noneauto_find_batch_size: bool = Falselogging_strategy: transformers.trainer_utils.IntervalStrategy | str = 'steps'logging_steps: float = 10logging_first_step: bool = Falselog_on_each_node: bool = Truelogging_nan_inf_filter: bool = Trueinclude_num_input_tokens_seen: str | bool = 'no'log_level: str = 'passive'log_level_replica: str = 'warning'disable_tqdm: bool | None = Nonereport_to: None | str | list[str] = 'none'run_name: str | None = Noneproject: str = 'huggingface'trackio_space_id: str | None = Nonetrackio_bucket_id: str | None = Nonetrackio_static_space_id: typing.Union[str, NoneType, typing.Literal[False]] = Noneeval_strategy: transformers.trainer_utils.IntervalStrategy | str = 'no'eval_steps: float | None = Noneeval_delay: float = 0per_device_eval_batch_size: int = 8prediction_loss_only: bool = Falseeval_on_start: bool = Falseeval_do_concat_batches: bool = Trueeval_use_gather_object: bool = Falseeval_accumulation_steps: int | None = Noneinclude_for_metrics: list[str] = <factory>batch_eval_metrics: bool = Falsesave_only_model: bool = Falsesave_strategy: transformers.trainer_utils.SaveStrategy | str = 'steps'save_steps: float = 500save_on_each_node: bool = Falsesave_total_limit: int | None = Noneenable_jit_checkpoint: bool = Falsepush_to_hub: bool = Falsehub_token: str | None = Nonehub_private_repo: bool | None = Nonehub_model_id: str | None = Nonehub_strategy: transformers.trainer_utils.HubStrategy | str = 'every_save'hub_always_push: bool = Falsehub_revision: str | None = Noneload_best_model_at_end: bool = Falsemetric_for_best_model: str | None = Nonegreater_is_better: bool | None = Noneignore_data_skip: bool = Falserestore_callback_states_from_checkpoint: bool = Falsefull_determinism: bool = Falseseed: int = 42data_seed: int | None = Noneuse_cpu: bool = Falseaccelerator_config: dict | str | None = Noneparallelism_config: accelerate.parallelism_config.ParallelismConfig | None = Nonedataloader_drop_last: bool = Falsedataloader_num_workers: int = 0dataloader_pin_memory: bool = Truedataloader_persistent_workers: bool = Falsedataloader_prefetch_factor: int | None = Nonedataloader_multiprocessing_context: str | None = Nonedataloader_in_order: bool = Trueremove_unused_columns: bool | None = Falselabel_names: list[str] | None = Nonetrain_sampling_strategy: str = 'random'length_column_name: str = 'length'ddp_find_unused_parameters: bool | None = Noneddp_bucket_cap_mb: int | None = Noneddp_broadcast_buffers: bool | None = Noneddp_static_graph: bool | None = Noneddp_backend: str | None = Noneddp_timeout: int = 1800fsdp: str | None = Nonefsdp_config: dict[str, typing.Any] | str | None = Nonedeepspeed: dict | str | None = Nonedebug: str | list[transformers.debug_utils.DebugOption] = ''skip_memory_metrics: bool = Truedo_train: bool = Falsedo_eval: bool = Falsedo_predict: bool = Falseresume_from_checkpoint: str | None = Nonelocal_rank: int = -1model_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falserouter_aux_loss_coef: float | None = Nonedisable_dropout: bool = Falsenum_generations: int | None = 2num_generations_eval: int | None = Nonemax_completion_length: int | None = 512ds3_gather_for_generation: bool = Trueshuffle_dataset: bool | None = Truepad_to_multiple_of: int | str | None = 'auto'generation_batch_size: int | None = Nonesteps_per_generation: int | None = Nonetemperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonegeneration_kwargs: dict | str | None = Nonechat_template_kwargs: dict | str | None = Nonerepetition_penalty: float = 1.0cache_implementation: str | None = Noneuse_vllm: bool = Falsevllm_mode: str = 'colocate'vllm_model_impl: str = 'vllm'vllm_enable_sleep_mode: bool = Falsevllm_structured_outputs_regex: str | None = Nonevllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8000vllm_server_timeout: float = 240.0vllm_group_port: int = 51216vllm_gpu_memory_utilization: float = 0.3vllm_max_model_length: int | None = Nonevllm_tensor_parallel_size: int = 1beta: float = 0.05num_iterations: int = 1epsilon: float = 0.2epsilon_high: float | None = Nonereward_weights: list[float] | None = Nonenormalize_advantages: bool = Falsereward_clip_range: tuple[float, float] | None = Nonemask_truncated_completions: bool = Falsesync_ref_model: bool = Falseref_model_mixup_alpha: float = 0.6ref_model_sync_steps: int = 512log_completions: bool = Falselog_multimodal: bool = Truenum_completions_to_print: int | None = Nonelog_unique_prompts: bool = Falseuse_transformers_continuous_batching: bool = Falsetransformers_continuous_batching_config: dict | str | None = Noneuse_transformers_paged: bool = False )
Parameter yang mengontrol model dan model referensi
- model_init_kwargs (
strataudict[str, Any], opsional) — Argumen kata kunci untuk from_pretrained, digunakan ketika argumenmodeldari RLOOTrainer diberikan sebagai string. Nilairevisionjuga digunakan saat memuat kelas pemrosesan. - trust_remote_code (
bool, opsional, defaultFalse) — Apakah mengizinkan pemuatan model dan tokenizer yang menyertakan kode Python kustom dari Hub. Diteruskan ke from_pretrained dan from_pretrained. Juga diterapkan pada pemuatan reward-model dan reward-tokenizer. - router_aux_loss_coef (
float, opsional) — Koefisien dari loss tambahan penyeimbangan beban untuk model Mixture-of-Experts (MoE), yang ditambahkan ke loss pelatihan dengan bobot ini. Jika tidak diatur, nilai yang dideklarasikan oleh konfigurasi model akan digunakan. Atur ke0.0untuk menonaktifkannya. Gagal jika digunakan dengan model non-MoE. - disable_dropout (
bool, opsional, defaultFalse) — Apakah akan menonaktifkan dropout pada model. Ini berguna untuk pelatihan dengan model referensi, karena mencegah model menghasilkan logprobs yang berbeda untuk input yang sama.
Parameter yang mengontrol pra-pemrosesan data
- remove_unused_columns (
bool, opsional, defaultFalse) — Apakah hanya kolom"prompt"yang akan dipertahankan dalam dataset. Jika Anda menggunakan fungsi reward kustom yang memerlukan kolom selain"prompts"dan"completions", Anda sebaiknya mempertahankan nilai ini sebagaiFalse. - num_generations (
int, opsional, defaultnya2) — Jumlah generasi per prompt yang akan disampelkan. Ukuran batch efektif (num_processes * per_device_batch_size * gradient_accumulation_steps) harus dapat dibagi habis oleh nilai ini.- gradient_accumulation_steps) harus dapat dibagi habis oleh nilai ini.
- num_generations_eval (
int, opsional) — Jumlah generasi yang akan disampelkan selama evaluasi. Hal ini memungkinkan penggunaan lebih sedikit generasi selama evaluasi untuk menghemat komputasi. JikaNone, menggunakan nilai darinum_generations. - max_completion_length (
intatauNone, opsional, defaultnya512) — Panjang maksimum dari penyelesaian yang dihasilkan. - ds3_gather_for_generation (
bool, opsional, defaultTrue) — Pengaturan ini berlaku untuk DeepSpeed ZeRO-3. Jika diaktifkan, bobot model kebijakan akan dikumpulkan untuk generasi, sehingga meningkatkan kecepatan generasi. Namun, menonaktifkan opsi ini memungkinkan pelatihan model yang melebihi kapasitas VRAM satu GPU, meskipun dengan biaya kecepatan generasi yang lebih lambat. Menonaktifkan opsi ini tidak kompatibel dengan generasi vLLM. - shuffle_dataset (
bool, opsional, defaultTrue) — Apakah dataset pelatihan akan diacak. - pad_to_multiple_of (
intataustr, opsional, default"auto") — Jika diset, prompt ids dan completion ids akan di-pad hingga menjadi kelipatan dari nilai ini."auto"melakukan padding hingga kelipatan 128 pada Neuron (AWS Trainium), yang dikompilasi sekali per bentuk input, dan tidak melakukan padding di tempat lain.
Parameter yang mengontrol generasi
- generation_batch_size (
int, opsional) — Ukuran batch yang digunakan untuk generasi. JikaNone, nilainya secara default adalah ukuran batch pelatihan efektif:per_device_train_batch_size * num_processes * steps_per_generation. Dengan kata lain, ada satu batch generasi yang diproses per langkah optimasi. Saling eksklusif dengansteps_per_generation. - steps_per_generation (
int, opsional) — Jumlah langkah per generasi. JikaNone, nilainya secara default adalahgradient_accumulation_steps. Saling eksklusif dengangeneration_batch_size. - temperature (
float, opsional, default1.0) — Suhu untuk sampling. Semakin tinggi suhu, semakin acak hasil pelengkapannya. - top_p (
float, opsional, default1.0) — Float yang mengontrol probabilitas kumulatif dari token teratas yang dipertimbangkan. Harus berada dalam (0, 1]. Atur ke1.0untuk mempertimbangkan semua token. - top_k (
int, opsional, default0) — Jumlah token kosakata dengan probabilitas tertinggi yang dipertahankan untuk top-k-filtering. Jika0, top-k-filtering dinonaktifkan dan semua token dipertimbangkan. - min_p (
float, opsional) — Probabilitas token minimum, yang akan diskalakan oleh probabilitas token yang paling mungkin. Nilainya harus berada di antara0.0dan1.0. Nilai tipikal berada dalam rentang0.01-0.2. - generation_kwargs (
dict[str, Any], opsional) — Argumen kata kunci tambahan untuk diteruskan ke GenerationConfig (jika menggunakan transformers) atauSamplingParams(jika menggunakan vLLM) saat mengambil sampel penyelesaian. Ini dapat digunakan untuk lebih menyesuaikan perilaku generasi, seperti mengatursuppress_tokens,num_beams, dll. Jika berisi kunci yang bertentangan dengan parameter generasi lainnya (sepertimin_p,top_p, dll.), mereka akan menimpanya. - chat_template_kwargs (
dict[str, Any], opsional) — Argumen kata kunci tambahan untuk diteruskan ke fungsiapply_chat_templatesaat menghasilkan kelengkapan. - repetition_penalty (
float, opsional, default1.0) — Float yang menghukum token baru berdasarkan apakah token tersebut muncul dalam prompt dan teks yang telah dihasilkan sejauh ini. Nilai >1.0mendorong model untuk menggunakan token baru, sedangkan nilai <1.0mendorong model untuk mengulang token. - cache_implementation (
str, opsional) — Implementasi metode cache untuk generasi yang lebih cepat ketikause_vllmdiatur keFalse.
Parameter yang mengontrol akselerasi generasi yang didukung oleh vLLM
- use_vllm (
bool, opsional, defaultFalse) — Apakah akan menggunakan vLLM untuk menghasilkan kelengkapan. Jika diatur keTrue, trainer akan menggunakan vLLM untuk generasi alih-alih model.generate() default. Memerlukanvllmterpasang. - vllm_mode (
str, opsional, defaultnya"colocate") — Mode yang digunakan untuk integrasi vLLM ketikause_vllmdiatur keTrue. Harus salah satu dari"server"atau"colocate"."server": Trainer akan mengirim permintaan generasi ke server vLLM terpisah. Pastikan server vLLM sedang berjalan (mulai denganvllm serve)."colocate": vLLM akan berjalan dalam proses yang sama dan berbagi GPU pelatihan. Hal ini menghindari kebutuhan akan server terpisah, tetapi dapat menyebabkan perebutan sumber daya dengan pelatihan.
- vllm_model_impl (
str, opsional, default"vllm") — Implementasi model yang digunakan untuk vLLM. Harus salah satu dari"transformers"atau"vllm"."transformers": Gunakan backendtransformersuntuk implementasi model."vllm": Gunakan pustakavllmuntuk implementasi model. - vllm_enable_sleep_mode (
bool, opsional, defaultFalse) — Aktifkan mode tidur vLLM untuk memindahkan bobot/cache selama langkah optimizer. Menjaga penggunaan memori GPU tetap rendah, tetapi membangunkan mesin menambah latensi transfer host–perangkat. - vllm_structured_outputs_regex (
str, opsional) — Regex untuk structured outputs vLLM. JikaNone(default), structured outputs dinonaktifkan.
Parameter yang mengontrol server vLLM (hanya digunakan ketika `vllm_mode` adalah `"server"`)
- vllm_server_base_url (
str, opsional) — URL dasar untuk server vLLM (misalnya,"http://localhost:8000"). Jika disediakan,vllm_server_hostdanvllm_server_portdiabaikan. - vllm_server_host (
str, opsional, default"0.0.0.0") — Host dari server vLLM yang akan dihubungi. Diabaikan jikavllm_server_base_urldisediakan. - vllm_server_port (
int, opsional, default8000) — Port server vLLM yang akan dihubungi. Diabaikan jikavllm_server_base_urldisediakan. - vllm_server_timeout (
float, opsional, default240.0) — Durasi total timeout dalam detik untuk menunggu server vLLM siap. Jika server belum siap setelah timeout,ConnectionErrorakan dilempar. - vllm_group_port (
int, opsional, default51216) — Nomor port untuk grup pembaruan bobot. Ini digunakan untuk berkomunikasi dengan server vLLM. Kecuali port tersebut sedang digunakan, tidak perlu diubah.
Parameter yang mengontrol eksekusi vLLM yang terkolokasi (hanya digunakan ketika `vllm_mode` adalah `"colocate"`)
- vllm_gpu_memory_utilization (
float, opsional, default0.3) — Mengontrol utilisasi memori GPU untuk vLLM. Pengaturan ini hanya berlaku ketikavllm_modediatur ke"colocate". Jika Anda menggunakanvllm_mode="server", parameter ini harus diteruskan secara terpisah saat meluncurkan server vLLM melalui flag--vllm_gpu_memory_utilization. - vllm_max_model_length (
int, opsional) — Jendela konteks untuk vLLM. Atur nilainya setidaknya sama dengan panjang prompt maksimum dalam dataset ditambahmax_completion_length; jika diabaikan, nilainya akan disimpulkan dari konfigurasi model. - vllm_tensor_parallel_size (
int, opsional, default1) — Mengontrol ukuran paralel tensor untuk vLLM. Pengaturan ini hanya berlaku ketikavllm_modediatur ke"colocate". Jika Anda menggunakanvllm_mode="server", parameter ini harus diteruskan secara terpisah saat meluncurkan server vLLM melalui flag--vllm_tensor_parallel_size.
Parameter yang mengontrol pelatihan
- beta (
float, opsional, default0.05) — Koefisien KL. Jika0.0, model referensi tidak dimuat, sehingga mengurangi penggunaan memori dan meningkatkan kecepatan pelatihan. - num_iterations (
int, opsional, default1) — Jumlah iterasi per batch (dilambangkan sebagai μ dalam algoritma). - epsilon (
float, opsional, default0.2) — Nilai epsilon untuk clipping. - epsilon_high (
float, opsional) — Nilai epsilon batas atas untuk clipping. Jika tidak ditentukan, nilainya secara default sama dengan nilai batas bawah yang ditentukan dalam argumenepsilon. Kertas DAPO merekomendasikan0.28. - reward_weights (
list[float], opsional) — Bobot untuk setiap fungsi reward. Harus sesuai dengan jumlah fungsi reward. JikaNone, semua reward diberi bobot yang sama dengan nilai1.0. - normalize_advantages (
bool, opsional, defaultFalse) — Apakah akan menormalisasi keuntungan. Normalisasi dilakukan per batch generasi agar memiliki rata-rata0.0dan deviasi standar1.0. - reward_clip_range (
tuple[float, float], opsional) — Rentang clip untuk reward sebagai (min, max). JikaNone, tidak ada clipping yang diterapkan. - mask_truncated_completions (
bool, opsional, defaultFalse) — Jika diaktifkan, completion yang terpotong akan dikecualikan dari perhitungan loss, sehingga mencegah mereka dihukum secara tidak tepat dan memperkenalkan noise selama pelatihan. Menurut paper DAPO, ini adalah praktik yang baik untuk stabilitas pelatihan. - sync_ref_model (
bool, opsional, defaultFalse) — Apakah model referensi akan disinkronkan dengan model aktif setiapref_model_sync_stepslangkah, menggunakan parameterref_model_mixup_alpha. Sinkronisasi ini berasal dari paper TR-DPO. - ref_model_mixup_alpha (
float, opsional, default0.6) — parameter α dari paper TR-DPO, yang mengontrol campuran antara kebijakan saat ini dan kebijakan referensi sebelumnya selama pembaruan. Kebijakan referensi diperbarui sesuai persamaan:π_ref = α * π_θ + (1 - α) * π_ref_prev. Untuk menggunakan parameter ini, Anda harus mengatursync_ref_model=True. - ref_model_sync_steps (
int, opsional, default512) — parameter τ dari paper TR-DPO, yang menentukan seberapa sering kebijakan saat ini disinkronkan dengan kebijakan referensi. Untuk menggunakan parameter ini, Anda harus mengatursync_ref_model=True.
Parameter yang mengontrol logging
- log_completions (
bool, opsional, defaultFalse) — Apakah akan mencatat sampel pasangan (prompt, completion) setiaplogging_stepslangkah. Jikarichterinstal, sampel tersebut akan dicetak. Jika loggingwandbdan/atautrackiodiaktifkan, sampel akan dicatat kewandbdan/atautrackio. - log_multimodal (
bool, opsional, defaultTrue) — Apakah akan mencatat konten multimodal (gambar, video, dll.) bersama dengan kompliti. Nonaktifkan ini untuk mengurangi ukuran log saat menggunakan data multimodal beresolusi tinggi. - num_completions_to_print (
int, opsional) — Jumlah completion yang dicetak denganrich. JikaNone, semua completion dicatat. - log_unique_prompts (
bool, opsional, defaultFalse) — Apakah akan mencatat prompt unik. JikaTrue, hanya prompt unik yang dicatat. JikaFalse, semua prompt dicatat.
Parameter yang mengontrol akselerasi generasi yang didukung oleh continuous batching dari transformers
- use_transformers_continuous_batching (
bool, opsional, defaultFalse) — Apakah akan menggunakan mesin continuous batching dari transformers untuk menghasilkan kelengkapan. Memerlukantransformers>=5.8.0. - transformers_continuous_batching_config (
dict, opsional) — Argumen kata kunci untukContinuousBatchingConfig.
Parameter yang tidak didukung lagi
Kelas konfigurasi untuk RLOOTrainer.
Kelas ini hanya mencakup parameter yang spesifik untuk pelatihan RLOO. Untuk daftar lengkap argumen pelatihan, silakan merujuk ke dokumentasi TrainingArguments. Perhatikan bahwa nilai default dalam kelas ini mungkin berbeda dari yang ada di TrainingArguments.
Dengan HfArgumentParser, kita dapat mengubah kelas ini menjadi argumen argparse yang dapat ditentukan di baris perintah.
Parameter-parameter ini memiliki nilai default yang berbeda dari TrainingArguments:
logging_steps: Bawaan adalah10alih-alih500.gradient_checkpointing: Beralih keTruesebagai nilai bawaan, bukanFalse.bf16: Beralih keTruejikafp16tidak diatur, alih-alihFalse.learning_rate: Bawaan adalah1e-6alih-alih5e-5.
Referensi
- Makalah RLOO
- Paper Kembali ke Dasar: Mengunjungi Ulang Optimasi Gaya REINFORCE untuk Pembelajaran dari Umpan Balik Manusia pada LLM
- Makalah - REINFORCE++: Pendekatan Sederhana dan Efisien untuk Menyelaraskan Model Bahasa Besar
- Artikel Blog - Mengembalikan RL ke RLHF
- Artikel Blog - Mengurai RLHF dan Variannya: Kemajuan dan Wawasan Teknik Praktis
- Youtube - RLOO: Optimasi yang Efisien Biaya untuk Pembelajaran dari Umpan Balik Manusia pada LLM
Panduan Migrasi dari implementasi lama (0.21 dan sebelumnya)
Dengan rilis versi 0.22.0, kami telah merombak RLOOTrainer agar lebih selaras dengan trainer online lainnya di pustaka ini, seperti GRPOTrainer. Implementasi baru ini memperkenalkan beberapa perubahan pada parameter konfigurasi dan struktur keseluruhan trainer. Berikut adalah ringkasan perubahan utama untuk RLOOConfig:
| TRL ≤ 0.21.x | TRL ≥ 0.22.0 |
|---|---|
rloo_k | diubah namanya menjadi num_generations |
cliprange | diubah namanya menjadi epsilon |
kl_coef | diubah namanya menjadi beta |
exp_name | diubah namanya menjadi run_name. Gunakan run_name = f"{exp_name}__{seed}__{int(time.time())}" untuk mereplikasi perilaku lama |
normalize_reward | diubah namanya menjadi normalize_advantages. Catatan: ini selalu menormalisasi keuntungan (meskipun namanya lama) |
num_ppo_epochs | diubah namanya menjadi num_iterations (default: 1) |
token_level_kl | dihapus – KL kini hanya dihitung pada level sekuens |
dataset_num_proc | dihapus – tidak digunakan |
num_mini_batches | diubah namanya menjadi steps_per_generation |
total_episodes | gunakan max_steps=total_episodes / gradient_accumulation_steps sebagai gantinya |
local_rollout_forward_batch_size | dihapus – sekarang secara otomatis diatur ke per_device_train_batch_size (atau per_device_eval_batch_size selama evaluasi) |
num_sample_generations | dihapus – gunakan logging_steps untuk mengatur frekuensi pencatatan log generasi |
response_length | diubah namanya menjadi max_completion_length (default: 512) |
stop_token | dihapus |
stop_token_id | dihapus – gunakan processing_class.eos_token_id sebagai gantinya |
missing_eos_penalty | dihapus – replikasi dengan fungsi reward kustom yang memeriksa apakah eos_token_id ada di completion_ids |
Berikut adalah ringkasan perubahan utama untuk RLOOTrainer:
| TRL ≤ 0.21.x | TRL ≥ 0.22.0 |
|---|---|
config | diubah namanya menjadi args |
reward_model | diubah namanya menjadi reward_funcs, yang kini mendukung model reward dan fungsi reward kustom |
policy | diubah namanya menjadi model |
ref_policy | dihapus – model referensi sekarang dibuat secara otomatis dari model |
data_collator | dihapus |