TRL documentation

Genelleştirilmiş Bilgi Damıtma Eğiticisi

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Genelleştirilmiş Bilgi Damıtma Eğiticisi

model badge

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:

  1. …
  2. 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.0 olduğunda, kayıp, öğrencinin öğretmenin token düzeyindeki olasılıklarıyla eğitildiği denetimli JSD'ye indirgenir. lmbda=1.0 olduğ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çin lmbda değ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=True ve lmbda=0.0 olduğ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.0 olduğunda kayıp, ileri KL sapmasını yaklaşık olarak verir; beta=1.0 olduğ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, assistant veya user
  • content: mesaj içeriği

GKDTrainer

sınıf trl.experimental.gkd.GKDTrainer

< >

( 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.Module or str, 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.Module veya str, 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 olarak processing_class kullanılarak experimental.utils.DataCollatorForChatML kullanı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 (list of TrainerCallback, opsiyonel) — Eğitim sırasında kullanılacak geri çağrılar.
  • optimizers (tuple of torch.optim.Optimizer and torch.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. logits ve labels değ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ı. None ise PEFT kullanılmaz. Verilirse, model belirtilen 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

< >

( 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 (str veya bool, isteğe bağlı) — str ise, önceki bir Trainer örneği tarafından kaydedilen bir kontrol noktasının yerel yolu. bool ise ve True değerine eşitse, önceki bir Trainer ö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.Trial veya dict[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ı.

save_model

< >

( output_dir: str | None = None_internal_call: bool = False )

Modeli kaydeder, böylece from_pretrained() kullanarak yeniden yükleyebilirsiniz.

Yalnızca ana süreçten kaydedecektir.

push_to_hub

< >

( 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ılan True) — Fonksiyonun yalnızca git push işlemi tamamlandığında mı değer döndürmesi gerektiğini belirtir.
  • token (str, isteğe bağlı, varsayılan None) — 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_card ile 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

< >

( 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ılan 0.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ılan 0.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ılan 0.5) — Genelleştirilmiş Jensen-Shannon Divergence kaybının 0.0 ile 1.0 arasındaki interpolasyon katsayısı. beta 0.0 olduğunda, kayıp KL divergence'dır. beta 1.0 olduğunda, kayıp Inverse KL Divergence'dır.
  • max_new_tokens (int, isteğe bağlı, varsayılan 128) — Tamamlama başına üretilecek maksimum token sayısı.
  • teacher_model_name_or_path (str, isteğe bağlı) — Öğretmen modelinin adı veya yolu. None ise, öğretmen modeli eğitilen modelle aynı olacaktır.
  • teacher_model_init_kwargs (dict[str, Any], isteğe bağlı) — Bir dizgeden öğretmen modelini örneklerken AutoModelForCausalLM.from_pretrained fonksiyonuna iletilecek anahtar kelime argümanları
  • disable_dropout (bool, isteğe bağlı, varsayılan True) — Modelde dropout'un devre dışı bırakılıp bırakılmayacağı.
  • seq_kd (bool, isteğe bağlı, varsayılan False) — 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.

Update on GitHub