Transformers documentation
Callbacks
Callbacks
TrainerCallback can thiệp vào các sự kiện huấn luyện cụ thể (bắt đầu epoch, đánh giá, kết thúc huấn luyện) để thay đổi trạng thái huấn luyện hoặc điều khiển luồng thực thi. Sử dụng callback để ghi log các chỉ số vào các công cụ theo dõi thí nghiệm như Trackio, tùy chỉnh thời điểm lưu và đánh giá, hoặc thêm các hành vi tùy chỉnh khác. Kết hợp nhiều callback để gộp các tính năng.
Callback không thể sửa đổi chính vòng lặp huấn luyện, chẳng hạn như bước truyền thẳng. Để thay đổi những gì Trainer tính toán, hãy sinh lớp con các phương thức của nó.
Sơ đồ bên dưới cho thấy tất cả các sự kiện mà một callback có thể can thiệp vào.
on_train_begin
└─ for each epoch:
on_epoch_begin
└─ for each step:
on_step_begin
├─ for each gradient accumulation substep:
│ on_substep_end
on_pre_optimizer_step ← after gradient clipping, before optimizer.step()
on_optimizer_step ← after optimizer.step()
on_step_end
└─ (conditionally):
on_log
on_evaluate
on_save
on_epoch_end
on_train_end
on_predict / on_prediction_step
on_push_beginTạo một callback
Kế thừa TrainerCallback và ghi đè một hoặc nhiều phương thức sự kiện từ sơ đồ ở trên. Ví dụ dưới đây minh họa ba hook:
on_epoch_beginin epoch hiện tại từ TrainerState (một giá trị động) và tốc độ học từ TrainingArguments (một giá trị tĩnh).on_step_endđọc learning rate hiện tại từ lr_scheduler (được truyền qua**kwargs) và đặtshould_evaluatetrên TrainerControl (xem TrainerControl để có danh sách đầy đủ các đối tượng điều khiển) nhằm kích hoạt đánh giá khi nó giảm xuống dưới ngưỡng.on_train_endin chỉ số tốt nhất và bước mà nó xuất hiện.
from transformers import TrainerCallback
class EpochLoggerCallback(TrainerCallback):
def __init__(self, lr_eval_threshold=1e-5):
self.lr_eval_threshold = lr_eval_threshold
def on_epoch_begin(self, args, state, control, **kwargs):
print(f"Starting epoch {int(state.epoch) + 1}/{state.num_train_epochs} "
f"(lr={args.learning_rate})")
def on_step_end(self, args, state, control, **kwargs):
lr_scheduler = kwargs.get("lr_scheduler")
if lr_scheduler is not None:
current_lr = lr_scheduler.get_last_lr()[0]
if current_lr < self.lr_eval_threshold:
control.should_evaluate = True
def on_train_end(self, args, state, control, **kwargs):
print(f"Training complete! Best metric: {state.best_metric} at step {state.best_global_step}")Đăng ký callback với Trainer trong đối số callbacks. Bạn cũng có thể truyền nhiều callback dưới dạng một danh sách.
trainer = Trainer(
callbacks=[EpochLoggerCallback(lr_eval_threshold=1e-5)],
...,
)Các callback tích hợp sẵn
Transformers bao gồm một số callback tích hợp sẵn được kích hoạt mặc định. Các callback tích hợp bổ sung sẽ ghi log lên các nền tảng như Trackio.
DefaultFlowCallback
DefaultFlowCallback quản lý lịch trình ghi log, đánh giá và lưu checkpoint mặc định dựa trên các giá trị logging_strategy, eval_strategy và save_strategy trong TrainingArguments. Tại bước hoặc epoch phù hợp, nó đặt các cờ control tương ứng (should_log, should_evaluate, should_save). Nó cũng đặt should_training_stop khi global_step đạt đến max_steps.
Việc ghi đè callback này là cách chính để tùy chỉnh khi nào quá trình ghi log, đánh giá hoặc lưu trữ diễn ra.
ProgressCallback và PrinterCallback
Trainer tự động chọn giữa hai callback này dựa trên trường disable_tqdm trong TrainingArguments.
- ProgressCallback được sử dụng mặc định. Nó hiển thị thanh tiến trình tqdm trong quá trình huấn luyện và một thanh riêng trong quá trình đánh giá hoặc dự đoán, đồng thời in các chỉ số mới nhất ở mỗi sự kiện
on_log. Trong huấn luyện phân tán, nó chỉ chạy trên tiến trình chính để tránh đầu ra trùng lặp. - PrinterCallback được sử dụng khi
disable_tqdm=True. Nó in từ điển log ra stdout ở mỗi sự kiệnon_logmà không có thanh tiến trình.
Bạn cũng có thể thay đổi chúng thủ công bằng remove_callback() và add_callback().
from transformers import PrinterCallback
trainer = Trainer(...)
trainer.remove_callback(ProgressCallback)
trainer.add_callback(PrinterCallback)EarlyStoppingCallback
EarlyStoppingCallback dừng huấn luyện khi một chỉ số đánh giá không còn cải thiện. Sau mỗi lần đánh giá, nó kiểm tra xem chỉ số có cải thiện nhiều hơn early_stopping_threshold hay không. Nếu chỉ số không cải thiện trong early_stopping_patience lần đánh giá liên tiếp, quá trình huấn luyện sẽ dừng lại.
EarlyStoppingCallback yêu cầu hai TrainingArguments:
metric_for_best_model, chỉ số đánh giá cần theo dõieval_strategy, có đánh giá trên"steps"hay"epoch"
from transformers import EarlyStoppingCallback
trainer = Trainer(
...,
callbacks=[EarlyStoppingCallback(early_stopping_patience=3, early_stopping_threshold=0.001)],
)Các bước tiếp theo
- Xem tất cả callback tích hợp có sẵn để ghi log vào các trình theo dõi thí nghiệm.
- Hướng dẫn Subclassing Trainer methods bao gồm việc ghi đè các phương thức của Trainer khi bạn cần thay đổi những gì vòng lặp huấn luyện tính toán.