# Callbacks

[TrainerCallback](/docs/transformers/main/vi/main_classes/callback#transformers.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 thuận. Để thay đổi những gì [Trainer](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer) tính toán, hãy [sinh lớp con](./trainer_customize) 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.

```md
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_begin
```

## Tạo một callback

Kế thừa [TrainerCallback](/docs/transformers/main/vi/main_classes/callback#transformers.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_begin` in epoch hiện tại từ [TrainerState](/docs/transformers/main/vi/main_classes/callback#transformers.TrainerState) (một giá trị động) và tốc độ học từ [TrainingArguments](/docs/transformers/main/vi/main_classes/trainer#transformers.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à đặt `should_evaluate` trên [TrainerControl](/docs/transformers/main/vi/main_classes/callback#transformers.TrainerControl) (xem [TrainerControl](/docs/transformers/main/vi/main_classes/callback#transformers.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_end` in chỉ số tốt nhất và bước mà nó xuất hiện.

```python
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](/docs/transformers/main/vi/main_classes/trainer#transformers.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.

```python
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](./main_classes/callback) bổ sung sẽ ghi log lên các nền tảng như [Trackio](https://huggingface.co/docs/trackio/en/index).

### DefaultFlowCallback

[DefaultFlowCallback](/docs/transformers/main/vi/main_classes/callback#transformers.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](/docs/transformers/main/vi/main_classes/trainer#transformers.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](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer) tự động chọn giữa hai callback này dựa trên trường [disable_tqdm](/docs/transformers/main/vi/main_classes/trainer#transformers.TrainingArguments.disable_tqdm) trong [TrainingArguments](/docs/transformers/main/vi/main_classes/trainer#transformers.TrainingArguments).

- [ProgressCallback](/docs/transformers/main/vi/main_classes/callback#transformers.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](/docs/transformers/main/vi/main_classes/callback#transformers.PrinterCallback) được sử dụng khi `disable_tqdm=True`. Nó in từ điển log ra stdout ở mỗi sự kiện `on_log` mà 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()](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer.remove_callback) và [add_callback()](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer.add_callback).

```py
from transformers import PrinterCallback

trainer = Trainer(...)
trainer.remove_callback(ProgressCallback)
trainer.add_callback(PrinterCallback)
```

### EarlyStoppingCallback

[EarlyStoppingCallback](/docs/transformers/main/vi/main_classes/callback#transformers.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](/docs/transformers/main/vi/main_classes/callback#transformers.EarlyStoppingCallback) yêu cầu hai [TrainingArguments](/docs/transformers/main/vi/main_classes/trainer#transformers.TrainingArguments):

- `metric_for_best_model`, chỉ số đánh giá cần theo dõi
- `eval_strategy`, có đánh giá trên `"steps"` hay `"epoch"`

```py
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](./main_classes/callback) có sẵn để ghi log vào các trình theo dõi thí nghiệm.
- Hướng dẫn [Subclassing Trainer methods](./trainer_customize) bao gồm việc ghi đè các phương thức của [Trainer](/docs/transformers/main/vi/main_classes/trainer#transformers.Trainer) khi bạn cần thay đổi những gì vòng lặp huấn luyện tính toán.

