TRL documentation
تخصيص التدريب
تخصيص التدريب
صُمم TRL مع مراعاة قابلية التخصيص، مما يتيح للمستخدمين تخصيص حلقة التدريب بكفاءة وفقاً لاحتياجاتهم. فيما يلي أمثلة على كيفية تطبيق تقنيات مختلفة واختبارها.
على الرغم من أن هذه الأمثلة تستخدم DPOTrainer، فإن طرق التخصيص هذه تنطبق على معظم (إن لم يكن جميع) المدربين في TRL.
استخدام محسّنات وجدولة مختلفة
بشكل افتراضي، ينشئ DPOTrainer مُحسِّناً من نوع torch.optim.AdamW. يمكنك إنشاء وتعريف مُحسِّن مختلف ومروره إلى DPOTrainer على النحو التالي:
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()إضافة جدول جدولة معدل التعلم
يمكنك أيضًا إضافة مجدوليات معدل التعلم عن طريق تمرير المُحسِّن والمجدول معًا:
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))نماذج مرجعية بدقة 8 بت
بما أن trl يدعم جميع معاملات الكلمات المفتاحية عند تحميل نموذج من transformers باستخدام from_pretrained، يمكنك أيضًا الاستفادة من load_in_8bit من transformers للحصول على ضبط دقيق أكثر كفاءة في استخدام الذاكرة.
اقرأ المزيد حول تحميل النماذج بدقة 8 بت في transformers التحميل بدقة 8 بت أو 4 بت.
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)إضافة استدعاءات مخصصة
يمكنك تخصيص حلقة التدريب عن طريق إضافة استدعاءات مستدعاة (callbacks) للتسجيل أو المراقبة أو التوقف المبكر. تتيح لك الاستدعاءات المستدعاة تنفيذ أكواد مخصصة في نقاط محددة أثناء التدريب.
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()])إضافة مقاييس تقييم مخصصة
يمكنك تحديد مقاييس تقييم مخصصة لتتبعها أثناء التدريب. وهذا مفيد لمراقبة أداء النموذج في مهام محددة.
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)استخدام التدريب بدقة مختلطة
يمكن لتدريب الدقة المختلطة أن يسرّع التدريب بشكل كبير ويقلل من استهلاك الذاكرة. يمكنك تفعيله عن طريق تعيين bf16=True أو fp16=True في إعدادات التدريب.
# Use bfloat16 precision (recommended for modern GPUs)
training_args = DPOConfig(..., bf16=True)ملاحظة: استخدم bf16=True لبطاقات Ampere (A100، RTX 30xx) أو الأحدث، وfp16=True لبطاقات أقدم.
استخدام تراكم التدرجات
عند التدريب مع ذاكرة GPU محدودة، يتيح لك تراكم التدرّجات محاكاة أحجام دفع أكبر عن طريق تراكم التدرّجات عبر خطوات متعددة قبل تحديث الأوزان.
# 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,
)تغيير هدف التدريب
إن إنشاء فئة فرعية من المدرب هو أبسط طريقة لتخصيص التدريب. يُعرَّف الخسارة في طريقة compute_loss، لذا، لتدريب النموذج بهدف مختلف، أنشئ فئة فرعية من المدرب وأعد تعريف هذه الطريقة. تُورَّث إعدادات البيانات، والتوليد، والتسجيل، وحفظ النقاط، لذا تحتوي الفئة الفرعية فقط على ما يتغير فعليًا.
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()إضافة معلمات إلى الإعداد
Subclass الإعدادات لإعلان المعلمات التي يحتاجها دالة الخسارة:
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."})تغيير تنسيق الدفعة
عندما تتطلب الخسارة مدخلات لا ينتجها مُجمِّع البيانات الافتراضي، مرِّر مُجمِّعك الخاص، وأعد تعريف _prepare_dataset لتبقى مجموعة البيانات كما هي عندما تكون بالفعل بالصيغة المتوقعة:
class MyDPOTrainer(DPOTrainer):
def _prepare_dataset(self, dataset, *args, **kwargs):
return dataset
trainer = MyDPOTrainer(..., data_collator=my_collator)مثال كامل
يجمع مثال SFT للانتشار على مستوى الكتل examples/sft_diffusion_gemma/sft_diffusion_gemma.py بين العناصر الثلاثة: حيث يمتد DiffusionGemmaSFTConfig من SFTConfig بإضافة معلمات اللوحة والتلف، بينما يمتد DiffusionGemmaSFTTrainer من SFTTrainer ويستبدل إنتروبيا التداخل الذاتية التوليدية بهدف إزالة الضوضاء للانتشار على مستوى الكتل. ولا يتطلب أي منهما إجراء تغيير على المكتبة.
Antidoom، وهو أداة مفتوحة المصدر من Liquid AI، يوسّع DPOTrainer بإضافة تحسين تفضيلات الرمز النهائي (Antislop)، وهو خسارة تفضيلات على موضع رمز واحد يقلل من حلقات التكرار في نماذج الاستدلال.
Update on GitHub