TRL documentation
Pelatih Distilasi Pengetahuan yang Digeneralisasi
Pelatih Distilasi Pengetahuan yang Digeneralisasi
Ikhtisar
Generalized Knowledge Distillation (GKD) diusulkan dalam On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes oleh Rishabh Agarwal, Nino Vieillard, Yongchao Zhou, Piotr Stanczyk, Sabela Ramos, Matthieu Geist, dan Olivier Bachem.
Abstrak dari makalah tersebut adalah sebagai berikut:
Knowledge distillation (KD) banyak digunakan untuk mengompresi model guru guna mengurangi biaya inferensi dan jejak memorinya, dengan melatih model siswa yang lebih kecil. Namun, metode KD saat ini untuk model sekuens auto-regresif mengalami ketidakcocokan distribusi antara sekuens output yang dilihat selama pelatihan dan yang dihasilkan oleh siswa selama inferensi. Untuk mengatasi masalah ini, kami memperkenalkan Generalized Knowledge Distillation (GKD). Alih-alih hanya mengandalkan set sekuens output yang tetap, GKD melatih siswa pada sekuens output yang dihasilkan sendiri oleh siswa dengan memanfaatkan umpan balik dari guru pada sekuens tersebut. Berbeda dengan pendekatan KD yang diawasi, GKD juga menawarkan fleksibilitas untuk menggunakan fungsi loss alternatif antara siswa dan guru, yang dapat berguna ketika siswa tidak memiliki ekspresivitas untuk meniru distribusi guru. Selain itu, GKD memfasilitasi integrasi mulus antara distilasi dengan penyesuaian halus RL (RLHF). Kami mendemonstrasikan efektivitas GKD untuk mendistilasi model bahasa auto-regresif pada tugas ringkasan, terjemahan, dan penalaran aritmatika, serta distilasi yang tidak bergantung pada tugas untuk penyetelan instruksi.
Aspek-aspek utama dari GKD adalah:
- Hal ini mengatasi ketidakcocokan distribusi antara pelatihan dan inferensi pada model sekuens auto-regresif dengan melatih model siswa pada sekuens output yang dihasilkan oleh dirinya sendiri.
- GKD memberikan fleksibilitas dalam memilih berbagai ukuran divergensi antara model siswa dan model guru melalui Generalized Jensen-Shannon Divergence (JSD), yang dapat berguna ketika model siswa tidak memiliki kapasitas untuk sepenuhnya meniru model guru.
Metode pasca-pelatihan ini disumbangkan oleh Kashif Rasul dan Lewis Tunstall.
Tips penggunaan
experimental.gkd.GKDTrainer adalah pembungkus di sekitar kelas SFTTrainer yang menerima argumen model guru. Ia membutuhkan tiga parameter untuk diatur melalui experimental.gkd.GKDConfig, yaitu:
lmbda: mengontrol fraksi data student, yaitu proporsi output yang dihasilkan student secara on-policy. Ketikalmbda=0.0, loss berkurang menjadi JSD supervised di mana student dilatih dengan probabilitas tingkat token dari teacher. Ketikalmbda=1.0, loss berkurang menjadi JSD on-policy, di mana student menghasilkan urutan output dan umpan balik spesifik token pada urutan tersebut dari teacher. Untuk nilai di antara [0, 1], prosesnya acak di antara keduanya berdasarkan nilailmbdauntuk setiap batch.seq_kd: mengontrol apakah akan melakukan Sequence-Level KD (dapat dipandang sebagai supervised FT pada output yang dihasilkan teacher). Ketikaseq_kd=Truedanlmbda=0.0, loss berkurang menjadi supervised JSD, di mana teacher menghasilkan sekuens output dan student menerima umpan balik spesifik token pada sekuens tersebut dari teacher.beta: mengontrol interpolasi dalam Divergensi Jensen-Shannon yang digeneralisasi. Ketikabeta=0.0, loss mendekati divergensi KL forward, sedangkan untukbeta=1.0, loss mendekati divergensi KL reverse. Untuk nilai di antara [0, 1], loss melakukan interpolasi di antara keduanya.
Para penulis menemukan bahwa data on-policy (dengan lmbda tinggi) memberikan hasil yang lebih baik, dan nilai optimal beta bervariasi tergantung pada tugas dan metode evaluasi.
Pastikan
attn_implementation="kernels-community/flash-attn2"saat melatih model Gemma. Jika tidak, Anda akan menemui nilai NaN pada logits karena teknik soft capping yang diadopsi oleh arsitektur ini.
API dasarnya adalah sebagai berikut:
from datasets import Dataset
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl.experimental.gkd import GKDConfig, GKDTrainer
NUM_DUMMY_SAMPLES = 100
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
# The model to optimise
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
# The teacher model to calculate the KL divergence against
teacher_model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-1.5B-Instruct")
train_dataset = Dataset.from_dict(
{
"messages": [
[
{"role": "user", "content": "Hi, how are you?"},
{"role": "assistant", "content": "I'm great thanks"},
]
]
* NUM_DUMMY_SAMPLES
}
)
eval_dataset = Dataset.from_dict(
{
"messages": [
[
{"role": "user", "content": "What colour is the sky?"},
{"role": "assistant", "content": "The sky is blue"},
]
]
* NUM_DUMMY_SAMPLES
}
)
training_args = GKDConfig(output_dir="gkd-model", per_device_train_batch_size=1)
trainer = GKDTrainer(
model=model,
teacher_model=teacher_model,
args=training_args,
processing_class=tokenizer,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()Jenis dataset yang diharapkan
Dataset harus diformat sebagai daftar “messages” di mana setiap message adalah daftar kamus dengan kunci-kunci berikut:
role: salah satu darisystem,assistant, atauusercontent: isi pesan
GKDTrainer
kelas trl.experimental.gkd.GKDTrainer
< source >( model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str, NoneType] = Noneteacher_model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str] = Noneargs: trl.experimental.gkd.gkd_config.GKDConfig | None = Nonedata_collator: collections.abc.Callable[[list[typing.Any]], dict[str, typing.Any]] | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | dict[str, datasets.arrow_dataset.Dataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.image_processing_utils.BaseImageProcessor | transformers.feature_extraction_utils.FeatureExtractionMixin | transformers.processing_utils.ProcessorMixin | None = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalPrediction], dict] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR] = (None, None)preprocess_logits_for_metrics: collections.abc.Callable[[torch.Tensor, torch.Tensor], torch.Tensor] | None = Nonepeft_config: PeftConfig | None = Noneformatting_func: collections.abc.Callable | None = None )
Parameter
- model (PreTrainedModel atau
torch.nn.Moduleataustr, opsional) — Model yang akan dilatih, atau pengidentifikasi string dari model yang akan diinstansiasi dari model pretrained. - teacher_model (PreTrainedModel atau
torch.nn.Moduleataustr, opsional) — Model guru untuk knowledge distillation, atau pengidentifikasi string dari model yang akan diinstansiasi dari model pretrained. - args (experimental.gkd.GKDConfig, opsional) — Argumen pelatihan.
- data_collator (
DataCollator, opsional) — Data collator untuk membuat batch sampel dari dataset. Nilainya secara default adalahexperimental.utils.DataCollatorForChatMLyang menggunakanprocessing_class. - train_dataset (Dataset, opsional) — Dataset untuk pelatihan.
- eval_dataset (Dataset atau
dictdari Dataset, opsional) — Dataset untuk evaluasi. - processing_class (PreTrainedTokenizerBase, BaseImageProcessor, FeatureExtractionMixin atau ProcessorMixin, opsional) — Kelas untuk memproses data.
- compute_metrics (
Callable, opsional) — Fungsi untuk menghitung metrik saat evaluasi. Harus menerima EvalPrediction dan mengembalikan dictionary string ke float. - callbacks (
listdari TrainerCallback, opsional) — Callback yang digunakan selama pelatihan. - optimizers (
tupledaritorch.optim.Optimizerdantorch.optim.lr_scheduler.LambdaLR, opsional, default(None, None)) — Tuple yang berisi optimizer dan learning rate scheduler yang akan digunakan untuk pelatihan. - preprocess_logits_for_metrics (
Callable, opsional) — Fungsi untuk memproses ulang logits sebelum menghitung metrik. Harus menerimalogitsdanlabelsserta mengembalikan logits yang akan digunakan untuk perhitungan metrik. - peft_config (PeftConfig, opsional) —
Konfigurasi PEFT untuk menggunakan PEFT dalam pelatihan. Jika
None, PEFT tidak digunakan. Jika disediakan,modelakan dibungkus dengan adapter PEFT yang ditentukan. - formatting_func (
Callable, opsional) — Fungsi untuk memformat dataset. Harus menerima satu contoh dan mengembalikan satu contoh.
Trainer untuk Generalized Knowledge Distillation (GKD) dari model bahasa.
Untuk detail tentang GKD, lihat makalah: On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes.
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.
GKDConfig
kelas trl.experimental.gkd.GKDConfig
< source >( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 2e-05lr_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 = Truelabel_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 = Nonechat_template_path: str | None = Nonedataset_text_field: str = 'text'dataset_kwargs: dict[str, typing.Any] | str | None = Nonedataset_num_proc: int | None = Noneeos_token: str | None = Nonemax_length: int | None = 1024truncation_mode: str = 'keep_start'shuffle_dataset: bool = Falsepacking: bool = Falsepacking_strategy: str = 'bfd'padding_free: bool = Falsepad_to_multiple_of: int | str | None = 'auto'eval_packing: bool | None = Nonecompletion_only_loss: bool | None = Noneassistant_only_loss: bool = Falseloss_type: str = 'nll'activation_offloading: bool = Falsepad_token: str | None = Nonetemperature: float = 0.9lmbda: float = 0.5beta: float = 0.5max_new_tokens: int = 128teacher_model_name_or_path: str | None = Noneteacher_model_init_kwargs: dict[str, typing.Any] | str | None = Nonedisable_dropout: bool = Trueseq_kd: bool = False )
Parameter
- temperature (
float, opsional, default0.9) — Suhu untuk sampling. Semakin tinggi suhu, semakin acak hasil pelengkapannya. - lmbda (
float, opsional, default0.5) — Parameter Lambda yang mengontrol fraksi data student (yaitu, proporsi output yang dihasilkan student secara on-policy). - beta (
float, opsional, default0.5) — Koefisien interpolasi antara0.0dan1.0untuk loss Generalized Jensen-Shannon Divergence. Ketika beta adalah0.0, loss-nya adalah KL divergence. Ketika beta adalah1.0, loss-nya adalah Inverse KL Divergence. - max_new_tokens (
int, opsional, defaultnya128) — Jumlah maksimum token yang akan dihasilkan per penyelesaian. - teacher_model_name_or_path (
str, opsional) — Nama atau path dari model teacher. JikaNone, model teacher akan sama dengan model yang sedang dilatih. - teacher_model_init_kwargs (
dict[str, Any], opsional) — Argumen kata kunci untuk diteruskan keAutoModelForCausalLM.from_pretrainedsaat menginstansiasi model teacher dari string. - disable_dropout (
bool, opsional, defaultTrue) — Apakah akan menonaktifkan dropout pada model. - seq_kd (
bool, opsional, defaultFalse) — Parameter seq_kd yang mengontrol apakah akan melakukan Sequence-Level KD (dapat dipandang sebagai supervised FT pada output yang dihasilkan teacher).
Kelas konfigurasi untuk experimental.gkd.GKDTrainer.
Kelas ini hanya mencakup parameter yang spesifik untuk pelatihan GKD. Untuk daftar lengkap argumen pelatihan, silakan merujuk ke dokumentasi TrainingArguments dan SFTConfig.