TRL documentation
Genelleştirilmiş Bilgi Damıtma Eğiticisi
Genelleştirilmiş Bilgi Damıtma Eğiticisi
Genel Bakış
Genelleştirilmiş Bilgi Damıtımı (GKD), Rishabh Agarwal, Nino Vieillard, Yongchao Zhou, Piotr Stanczyk, Sabela Ramos, Matthieu Geist ve Olivier Bachem tarafından On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes makalesinde önerilmiştir.
Makalenin özeti aşağıdaki gibidir:
Bilgi damıtma (KD), daha küçük bir öğrenci modeli eğiterek öğretmen modelini sıkıştırmak ve çıkarım maliyetini ile bellek ayak izini azaltmak için yaygın olarak kullanılır. Ancak, otoregresif sıra modelleri için mevcut KD yöntemleri, eğitim sırasında görülen çıktı sıraları ile çıkarım sırasında öğrenci tarafından üretilenler arasındaki dağılım uyumsuzluğundan muzdariptir. Bu sorunu ele almak için Genel Bilgi Damıtması (GKD)'nı tanıtıyoruz. Sadece sabit bir çıktı sırası setine güvenmek yerine GKD, öğrenciyi, bu sıralar üzerindeki öğretmen geri bildirimlerinden yararlanarak kendi ürettiği çıktı sıraları üzerinde eğitir. Denetimli KD yaklaşımlarının aksine GKD, öğrencinin öğretmen dağılımını taklit edecek ifade gücüne sahip olmadığı durumlarda faydalı olabilecek, öğrenci ve öğretmen arasında alternatif kayıp fonksiyonlarının kullanılmasına da esneklik sunar. Ayrıca GKD, damıtmanın RL ince ayarı (RLHF) ile sorunsuz bir şekilde entegrasyonunu kolaylaştırır. GKD'nın özetleme, çeviri ve aritmetik akıl yürütme görevlerinde otoregresif dil modellerini damıtmadaki ve talimat ayarı için görev bağımsız damıtmadaki etkinliğini gösteriyoruz.
GKD'nin temel yönleri şunlardır:
- …
- GKD, öğrenci modelinin öğretmeni tam olarak taklit etme kapasitesine sahip olmadığı durumlarda faydalı olabilecek, öğrenci ve öğretmen modelleri arasındaki farklılık ölçülerini seçmede esneklik sağlar; bu, genelleştirilmiş Jensen-Shannon Divergence (JSD) aracılığıyla gerçekleştirilir.
Bu eğitim sonrası yöntemi Kashif Rasul ve Lewis Tunstall tarafından katkı sağlanmıştır.
Kullanım ipuçları
experimental.gkd.GKDTrainer, bir öğretmen modeli argümanı alan SFTTrainer sınıfının bir sarmalayıcısıdır. experimental.gkd.GKDConfig üzerinden ayarlanması gereken üç parametresi vardır:
lmbda: öğrenci veri oranını, yani on-policy öğrenci tarafından üretilen çıktıların oranını kontrol eder.lmbda=0.0olduğunda, kayıp, öğrencinin öğretmenin token düzeyindeki olasılıklarıyla eğitildiği denetimli JSD'ye indirgenir.lmbda=1.0olduğunda, kayıp, öğrencinin çıktı dizileri ürettiği ve bu diziler için öğretmenden token bazlı geri bildirim aldığı on-policy JSD'ye indirgenir. [0, 1] aralığındaki değerler için, her batch içinlmbdadeğerine göre ikisi arasında rastgele seçim yapılır.seq_kd: Sequence-Level KD'nin (öğretmen tarafından üretilen çıktılar üzerinde denetimli FT olarak görülebilir) uygulanıp uygulanmayacağını kontrol eder.seq_kd=Truevelmbda=0.0olduğunda, kayıp, öğretmenin çıktı dizileri ürettiği ve öğrencinin bu diziler için öğretmenden token bazlı geri bildirim aldığı denetimli JSD'ye indirgenir.beta: genelleştirilmiş Jensen-Shannon Sapması'ndaki interpolasyonu kontrol eder.beta=0.0olduğunda kayıp, ileri KL sapmasını yaklaşık olarak verir;beta=1.0olduğunda ise kayıp, ters KL sapmasını yaklaşık olarak verir. [0, 1] aralığındaki değerler için bu iki sapma arasında interpolasyon yapılır.
Yazarlar, on-policy verilerin (yüksek lmbda) daha iyi performans gösterdiğini ve optimal beta'nın görev ve değerlendirme yöntemine göre değiştiğini bulmuştur.
Gemma modellerini eğitirken
attn_implementation="kernels-community/flash-attn2"olduğundan emin olun. Aksi takdirde, bu mimarinin benimsediği yumuşak sınırlama tekniği nedeniyle logitlerde NaN değerleriyle karşılaşacaksınız.
Temel API şu şekildedir:
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()Beklenen veri seti türü
Veri seti, aşağıdaki anahtarlara sahip sözlüklerden oluşan bir liste olan “messages” (mesajlar) listesinin bir listesi olarak biçimlendirilmelidir:
role:system,assistantveyausercontent: mesaj içeriği
GKDTrainer
sınıf 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 )
Parametreler
- model (PreTrainedModel or
torch.nn.Moduleorstr, optional) — Model to be trained, or the string identifier of the model to be instantiated from a pretrained model. - teacher_model (PreTrainedModel veya
torch.nn.Moduleveyastr, isteğe bağlı) — Bilgi damıtması için öğretmen modeli veya önceden eğitilmiş bir modelden örneklenmesi istenen modelin dize tanımlayıcısı. - args (experimental.gkd.GKDConfig, isteğe bağlı) — Eğitim argümanları.
- data_collator (
DataCollator, isteğe bağlı) — Veri setinden örnekleri toplu işlemek için veri toplayıcı. Varsayılan olarakprocessing_classkullanılarakexperimental.utils.DataCollatorForChatMLkullanılır. - train_dataset (Dataset, isteğe bağlı) — Eğitim için veri seti.
- eval_dataset (Dataset veya Dataset içeren
dict, opsiyonel) — Değerlendirme için veri seti. - processing_class (PreTrainedTokenizerBase, BaseImageProcessor, FeatureExtractionMixin veya ProcessorMixin, isteğe bağlı) — Verileri işlemek için kullanılacak sınıf.
- compute_metrics (
Callable, isteğe bağlı) — Değerlendirme sırasında metrikleri hesaplamak için kullanılan işlev. Bir EvalPrediction alır ve string'ten float'a bir sözlük döndürmelidir. - callbacks (
listof TrainerCallback, opsiyonel) — Eğitim sırasında kullanılacak geri çağrılar. - optimizers (
tupleoftorch.optim.Optimizerandtorch.optim.lr_scheduler.LambdaLR, isteğe bağlı, varsayılan(None, None)) — Eğitim için kullanılacak optimizörü ve öğrenme oranı zamanlayıcısını içeren demet. - preprocess_logits_for_metrics (
Callable, isteğe bağlı) — Metrikler hesaplanmadan önce logits'leri ön işlemek için kullanılan fonksiyon.logitsvelabelsdeğerlerini almalı ve metrik hesaplama için kullanılacak logits'leri döndürmelidir. - peft_config (PeftConfig, isteğe bağlı) —
Eğitim için PEFT kullanmak üzere PEFT yapılandırması.
Noneise PEFT kullanılmaz. Verilirse,modelbelirtilen PEFT adaptörüyle sarılır. - formatting_func (
Callable, isteğe bağlı) — Veri setini biçimlendirmek için kullanılan işlev. Bir örnek almalı ve bir örnek döndürmelidir.
Dil modelleri için Genelleştirilmiş Bilgi Damıtması (GKD) eğiticisi.
GKD hakkında ayrıntılar için makaleye bakın: On-Policy Distillation of Language Models: Learning from Self-Generated Mistakes.
eğit
< 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
Parametreler
- resume_from_checkpoint (
strveyabool, isteğe bağlı) —strise, önceki birTrainerörneği tarafından kaydedilen bir kontrol noktasının yerel yolu.boolise veTruedeğerine eşitse, önceki birTrainerörneği tarafından args.output_dir içinde kaydedilen son kontrol noktasını yükler. Mevcutsa, eğitim burada yüklenen model/optimizör/zamanlayıcı durumlarından devam eder. - trial (
optuna.Trialveyadict[str, Any], isteğe bağlı) — Hiperparametre araması için deneme çalışması veya hiperparametre sözlüğü. - ignore_keys_for_eval (
list[str], isteğe bağlı) — Eğitim sırasında değerlendirme için tahminleri toplarken göz ardı edilmesi gereken, model çıktısındaki (bir sözlükse) anahtarların listesi.
Dönüş değeri
~trainer_utils.TrainOutput
Küresel adım sayısını, eğitim kaybını ve metrikleri içeren nesne.
Ana eğitim giriş noktası.
Modeli kaydeder, böylece from_pretrained() kullanarak yeniden yükleyebilirsiniz.
Yalnızca ana süreçten kaydedecektir.
push_to_hub
< source >( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )
Parametreler
- commit_message (
str, isteğe bağlı, varsayılan"End of training") — İterlerken gönderilecek mesaj. - blocking (
bool, isteğe bağlı, varsayılanTrue) — Fonksiyonun yalnızcagit pushişlemi tamamlandığında mı değer döndürmesi gerektiğini belirtir. - token (
str, isteğe bağlı, varsayılanNone) — Trainer'ın orijinal argümanlarını üzerine yazma iznine sahip jeton. - revision (
str, isteğe bağlı) — Commit'in alınacağı git revizyonu. Varsayılan olarak “main” dalının başıdır. - kwargs (
dict[str, Any], isteğe bağlı) —~Trainer.create_model_cardile birlikte iletilen ek anahtar kelime argümanları.
self.model ve self.processing_class öğelerini self.args.hub_model_id deposundaki 🤗 model hub'ına yükleyin.
GKDConfig
sınıf 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 )
Parametreler
- temperature (
float, isteğe bağlı, varsayılan0.9) — Örnekleme için sıcaklık. Sıcaklık ne kadar yüksekse, tamamlamalar o kadar rastgele olur. - lmbda (
float, isteğe bağlı, varsayılan0.5) — Öğrenci veri oranını (yani, politika üzerinde üretilen öğrenci çıktılarının oranını) kontrol eden Lambda parametresi. - beta (
float, isteğe bağlı, varsayılan0.5) — Genelleştirilmiş Jensen-Shannon Divergence kaybının0.0ile1.0arasındaki interpolasyon katsayısı. beta0.0olduğunda, kayıp KL divergence'dır. beta1.0olduğunda, kayıp Inverse KL Divergence'dır. - max_new_tokens (
int, isteğe bağlı, varsayılan128) — Tamamlama başına üretilecek maksimum token sayısı. - teacher_model_name_or_path (
str, isteğe bağlı) — Öğretmen modelinin adı veya yolu.Noneise, öğretmen modeli eğitilen modelle aynı olacaktır. - teacher_model_init_kwargs (
dict[str, Any], isteğe bağlı) — Bir dizgeden öğretmen modelini örneklerkenAutoModelForCausalLM.from_pretrainedfonksiyonuna iletilecek anahtar kelime argümanları - disable_dropout (
bool, isteğe bağlı, varsayılanTrue) — Modelde dropout'un devre dışı bırakılıp bırakılmayacağı. - seq_kd (
bool, isteğe bağlı, varsayılanFalse) — Sequence-Level KD'nin (öğretmen tarafından üretilen çıktı üzerinde denetimli FT olarak görülebilir) uygulanıp uygulanmayacağını kontrol eden Seq_kd parametresi.
experimental.gkd.GKDTrainer için yapılandırma sınıfı.
Bu sınıf yalnızca GKD eğitimine özgü parametreleri içerir. Eğitim argümanlarının tam listesi için lütfen TrainingArguments ve SFTConfig belgelerine başvurun.