TRL documentation

Kustomisasi pelatihan

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Kustomisasi pelatihan

TRL dirancang dengan modularitas sehingga pengguna dapat menyesuaikan loop pelatihan secara efisien sesuai kebutuhan mereka. Di bawah ini adalah contoh cara menerapkan dan menguji berbagai teknik.

Meskipun contoh-contoh ini menggunakan DPOTrainer, metode kustomisasi ini berlaku untuk sebagian besar (jika tidak semua) trainer di TRL.

Gunakan optimizer dan scheduler yang berbeda

Secara default, DPOTrainer membuat optimizer torch.optim.AdamW. Anda dapat membuat dan mendefinisikan optimizer yang berbeda lalu meneruskannya ke DPOTrainer sebagai berikut:

from datasets import load_dataset
from torch import optim
from transformers import AutoModelForCausalLM
from trl import DPOTrainer

dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
optimizer = optim.SGD(model.parameters(), lr=1e-6)

trainer = DPOTrainer(
    model=model,
    train_dataset=dataset,
    optimizers=(optimizer, None),
)
trainer.train()

Tambahkan penjadwal laju pembelajaran

Anda juga dapat menambahkan penjadwal laju pembelajaran dengan meneruskan optimizer dan scheduler:

from torch import optim

optimizer = optim.AdamW(model.parameters(), lr=1e-6)
lr_scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1)

trainer = DPOTrainer(..., optimizers=(optimizer, lr_scheduler))

Model referensi 8-bit

Karena trl mendukung semua argumen kata kunci saat memuat model dari transformers menggunakan from_pretrained, Anda juga dapat memanfaatkan load_in_8bit dari transformers untuk fine-tuning yang lebih hemat memori.

Baca lebih lanjut tentang pemuatan model 8-bit di transformers Load in 8bit or 4bit.

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
ref_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct", quantization_config=quantization_config)

trainer = DPOTrainer(..., ref_model=ref_model)

Tambahkan callback kustom

Anda dapat menyesuaikan loop pelatihan dengan menambahkan callback untuk logging, monitoring, atau early stopping. Callback memungkinkan Anda untuk menjalankan kode kustom pada titik-titik tertentu selama pelatihan.

from transformers import TrainerCallback


class CustomLoggingCallback(TrainerCallback):
    def on_log(self, args, state, control, logs=None, **kwargs):
        if logs is not None:
            print(f"Step {state.global_step}: {logs}")


trainer = DPOTrainer(..., callbacks=[CustomLoggingCallback()])

Tambahkan metrik evaluasi kustom

Anda dapat mendefinisikan metrik evaluasi kustom untuk dilacak selama pelatihan. Hal ini berguna untuk memantau kinerja model pada tugas tertentu.

def compute_metrics(eval_preds):
    logits, labels = eval_preds
    # Add your metric computation here
    return {"custom_metric": 0.0}


training_args = DPOConfig(..., eval_strategy="steps", eval_steps=100)

trainer = DPOTrainer(..., eval_dataset=eval_dataset, compute_metrics=compute_metrics)

Gunakan pelatihan presisi campuran

Pelatihan presisi campuran dapat mempercepat pelatihan secara signifikan dan mengurangi penggunaan memori. Anda dapat mengaktifkannya dengan mengatur bf16=True atau fp16=True dalam konfigurasi pelatihan.

# Use bfloat16 precision (recommended for modern GPUs)
training_args = DPOConfig(..., bf16=True)

Catatan: Gunakan bf16=True untuk GPU Ampere (A100, RTX 30xx) atau yang lebih baru, dan fp16=True untuk GPU yang lebih lama.

Gunakan akumulasi gradien

Saat melatih dengan memori GPU terbatas, akumulasi gradien memungkinkan Anda mensimulasikan ukuran batch yang lebih besar dengan mengakumulasi gradien selama beberapa langkah sebelum memperbarui bobot.

# Simulate a batch size of 32 with per_device_train_batch_size=4 and gradient_accumulation_steps=8
training_args = DPOConfig(
    ...,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=8,
)

Ubah tujuan pelatihan

Membuat subclass dari trainer adalah cara termudah untuk menyesuaikan pelatihan. Loss didefinisikan dalam metode compute_loss, sehingga untuk melatih dengan tujuan yang berbeda, buat subclass dari trainer dan override metode tersebut. Persiapan data, generasi, logging, dan checkpointing diwarisi, sehingga subclass hanya berisi bagian yang benar-benar berubah.

import torch

from trl import DPOTrainer
from trl.trainer.utils import selective_log_softmax


class MyDPOTrainer(DPOTrainer):
    def compute_loss(self, model, inputs, return_outputs=False, num_items_in_batch=None):
        # In this example: the hinge loss from https://huggingface.co/papers/2309.06657
        input_ids, attention_mask = inputs["input_ids"], inputs["attention_mask"]
        shift_labels, shift_completion_mask = input_ids[:, 1:], inputs["completion_mask"][:, 1:]
        logits = model(input_ids=input_ids, attention_mask=attention_mask).logits
        with torch.no_grad():
            ref_logits = self.ref_model(input_ids=input_ids, attention_mask=attention_mask).logits

        # Sum the log-probs over the completion tokens, for the policy and for the reference model
        logps = (selective_log_softmax(logits[:, :-1], shift_labels) * shift_completion_mask).sum(dim=1)
        ref_logps = (selective_log_softmax(ref_logits[:, :-1], shift_labels) * shift_completion_mask).sum(dim=1)

        chosen_logps, rejected_logps = logps.chunk(2, dim=0)  # batch is [chosen, rejected]
        ref_chosen_logps, ref_rejected_logps = ref_logps.chunk(2, dim=0)
        delta = (chosen_logps - ref_chosen_logps) - (rejected_logps - ref_rejected_logps)
        return torch.relu(1 - self.beta * delta).mean()

Tambahkan parameter ke config

Subclass config untuk mendeklarasikan parameter yang dibutuhkan loss Anda:

from dataclasses import dataclass, field

from trl import DPOConfig


@dataclass
class MyDPOConfig(DPOConfig):
    my_coef: float = field(default=0.1, metadata={"help": "Coefficient of the custom term."})

Ubah format batch

Ketika loss membutuhkan input yang tidak dihasilkan oleh collator default, berikan collator Anda sendiri, dan override _prepare_dataset agar dataset tetap tidak diubah jika sudah dalam format yang diharapkan:

class MyDPOTrainer(DPOTrainer):
    def _prepare_dataset(self, dataset, *args, **kwargs):
        return dataset


trainer = MyDPOTrainer(..., data_collator=my_collator)

Contoh lengkap

Contoh SFT block-diffusion examples/sft_diffusion_gemma/sft_diffusion_gemma.py menggabungkan ketiganya: DiffusionGemmaSFTConfig memperluas SFTConfig dengan parameter canvas dan corruption, dan DiffusionGemmaSFTTrainer memperluas SFTTrainer serta mengganti cross-entropy autoregressive dengan tujuan denoising block-diffusion. Keduanya tidak memerlukan perubahan pada library.

Antidoom, sebuah alat open-source dari Liquid AI, memperluas DPOTrainer dengan Final Token Preference Optimization (Antislop), yaitu loss preferensi pada satu posisi token yang mengurangi loop pengulangan pada model penalaran.

Update on GitHub