TRL documentation

ORPO 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

ORPO Eğiticisi

model badge model badge

Genel Bakış

Odds Ratio Preference Optimization (ORPO), Jiwoo Hong, Noah Lee ve James Thorne tarafından ORPO: Monolithic Preference Optimization without Reference Model makalesinde tanıtılmıştır.

Makalenin özeti aşağıdaki gibidir:

Son zamanlarda dil modelleri için tercih hizalama algoritmaları umut verici sonuçlar gösterse de, başarılı yakınsama elde etmek için denetimli ince ayar (SFT) hâlâ vazgeçilmezdir. Bu makalede, tercih hizalama bağlamında SFT'nin kritik rolünü incelemekte ve tercih hizalı SFT için tercih edilmeyen üretim tarzına yönelik küçük bir cezanın yeterli olduğunu vurgulamaktayız. Bu temele dayanarak, ek bir tercih hizalama aşamasına olan ihtiyacı ortadan kaldıran, basit ve yenilikçi, referans model gerektirmeyen monolitik olasılık oranı tercih optimizasyonu algoritması olan ORPO'yu tanıtmaktayız. Hem ampirik hem de teorik olarak, 125M'den 7B'ye kadar çeşitli boyutlarda SFT sırasında tercih edilen ve tercih edilmeyen tarzları karşılaştırmak için olasılık oranının makul bir seçim olduğunu gösteriyoruz. Özellikle, yalnızca UltraFeedback üzerinde ORPO ile Phi-2 (2.7B), Llama-2 (7B) ve Mistral (7B) modellerinin ince ayarının, 7B ve 13B'den fazla parametreye sahip en son dil modellerinin performansını geride bıraktığını gösteriyoruz: AlpacaEval_{2.0}'da (Şekil 1) %12.20'e kadar, IFEval'da (talimat düzeyinde gevşek, Tablo 6) %66.19 ve MT-Bench'te (Şekil 12) 7.32 puan elde edilmektedir. Mistral-ORPO-alpha (7B) ve Mistral-ORPO-beta (7B) için kod ve model kontrol noktalarını yayınlıyoruz.

Bu çalışma, tercih hizalama bağlamında SFT'nin kritik rolünü incelemektedir. Tercih verilerini kullanan yöntem, tercih edilmeyen üretim için küçük bir ceza ile birlikte, NLL kaybına eklenen basit bir log oran terimi aracılığıyla seçilen yanıt için güçlü bir uyum sinyalinin, tercih hizalı SFT için yeterli olduğunu öne sürmektedir.

Bu nedenle ORPO, ek bir tercih hizalama aşaması gereksinimini ortadan kaldıran, referans model gerektirmeyen bir tercih optimizasyon algoritmasıdır; bu sayede hesaplama ve bellek tasarrufu sağlar.

Resmi kod xfactlab/orpo adresinde bulunabilir.

Bu eğitim sonrası yöntemi Kashif Rasul, Lewis Tunstall ve Alvaro Bartolome tarafından katkı sağlanmıştır.

Hızlı başlangıç

Bu örnek, ORPO yöntemiyle bir modelin nasıl eğitileceğini göstermektedir. Temel model olarak Qwen 0.5B modelini kullanıyoruz. Tercih verisi olarak UltraFeedback veri setinden yararlanıyoruz. Veri setindeki verilere buradan göz atabilirsiniz:

Aşağıda modeli eğitmek için betik yer almaktadır:

# train_orpo.py
from datasets import load_dataset
from trl.experimental.orpo import ORPOConfig, ORPOTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2-0.5B-Instruct")
train_dataset = load_dataset("trl-lib/ultrafeedback_binarized", split="train")

training_args = ORPOConfig(output_dir="Qwen2-0.5B-ORPO")
trainer = ORPOTrainer(model=model, args=training_args, processing_class=tokenizer, train_dataset=train_dataset)
trainer.train()

Aşağıdaki komutu kullanarak betiği çalıştırın:

torchrun --nproc_per_node 8 train_orpo.py

8 GPU arasında dağıtılmış eğitim yaklaşık 30 dakika sürer. Eğitim ilerlemesini ödül grafiğini kontrol ederek doğrulayabilirsiniz. Ödül marjındaki artan eğilim, modelin zamanla iyileştiğini ve daha iyi yanıtlar ürettiğini gösterir.

orpo qwen2 reward margin

Eğitilen modelin performansını görmek için Transformers Chat CLI'yi kullanabilirsiniz.

$ transformers chat trl-lib/Qwen2-0.5B-ORPO
<quentin_gallouedec>:
What is the best programming language?

<trl-lib/Qwen2-0.5B-ORPO>:
It's challenging to determine the best programming language as no one language is perfect, as the complexity of a task and the type of project are significant factors. Some popular languages include Java, Python, JavaScript, and
C++. If you have specific needs or requirements for a specific project, it's important to choose the language that best suits those needs.

Here are some other factors to consider when choosing a programming language for a project:

 • Language proficiency: A good programming language is more likely to be easy to understand and use, and will allow developers to collaborate on projects more efficiently.
 • Ease of use: There are tools and libraries available to make programming more accessible, so developers should choose a language that can help them get started easier.
 • Code readability: A clear and concise codebase should be easy to read and understand, especially when working with large projects.
 • Tool and framework support: There are numerous libraries available for Python, Java, and JavaScript, along with tools like IDEs and static code analysis tools.
 • Accessibility: Some languages and tools have features that make them more accessible to developers with disabilities, such as support for screen readers.
 • Version control: As your projects grow and complexity increases, version control tools can be beneficial for tracking changes.

Beklenen veri seti türü

ORPO bir tercih veri seti gerektirir. experimental.orpo.ORPOTrainer hem sohbet hem de standart veri seti biçimini destekler. Sohbet veri seti sağlandığında, eğitimci veri setine sohbet şablonunu otomatik olarak uygular.

experimental.orpo.ORPOTrainer hem açık hem de örtük istemleri desteklese de açık istemleri kullanmanızı öneririz. Örtük istem veri seti sağlanırsa, eğitimci istemi "chosen" ve "rejected" sütunlarından otomatik olarak çıkarır. Daha fazla bilgi için tercih stili bölümüne bakın.

Kullanım ipuçları

Uzmanlar Karışımı (Mixture of Experts) Modelleri için: Yardımcı kaybı (auxiliary loss) etkinleştirme

MOE'ler, yük uzmanlar arasında yaklaşık olarak eşit dağıtıldığında en verimli şekilde çalışır.
Tercih ayarlaması sırasında MOE'lerin benzer şekilde eğitilmesini sağlamak için, yük dengeleyiciden gelen yardımcı kaybın nihai kayba eklenmesi faydalıdır.

Bu seçenek, model yapılandırmasında output_router_logits=True olarak ayarlanarak etkinleştirilir (ör. MixtralConfig).
Yardımcı kaybın toplam kayba ne kadar katkıda bulunacağını ölçeklemek için model yapılandırmasında router_aux_loss_coef=... hiperparametresini kullanın (varsayılan: 0.001).

Kaydedilen metrikler

Eğitim ve değerlendirme sırasında aşağıdaki metrikleri kaydederiz:

  • rewards/chosen: seçilen yanıtlar için politika modelinin ortalama log olasılıkları, beta ile ölçeklenmiş
  • rewards/rejected: beta ile ölçeklendirilmiş, reddedilen yanıtlar için politika modelinin ortalama log olasılıkları
  • rewards/accuracies: seçilen ödülün, ilgili reddedilen ödülden > olma sıklığının ortalaması
  • rewards/margins: seçilen ve buna karşılık gelen reddedilen ödüller arasındaki ortalama fark
  • log_odds_chosen: seçilen yanıtların reddedilen yanıtlara oranının ortalama log oranı
  • log_odds_ratio: log(sigmoid(log_odds_chosen)) ifadesinin ortalaması
  • nll_loss: seçilen yanıtlar üzerinden, kaybın SFT kısmından gelen ortalama negatif log olma olasılığı kaybı

ORPOTrainer

sınıf trl.experimental.orpo.ORPOTrainer

< >

( model: typing.Union[transformers.modeling_utils.PreTrainedModel, torch.nn.Module, str, NoneType] = Noneargs: trl.experimental.orpo.orpo_config.ORPOConfig | 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 = Nonemodel_init: collections.abc.Callable[[], transformers.modeling_utils.PreTrainedModel] | 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 = Nonecompute_metrics: collections.abc.Callable[[transformers.trainer_utils.EvalLoopOutput], dict] | None = None )

Parametreler

  • model (PreTrainedModel) — Eğitilecek model, tercihen bir AutoModelForSequenceClassification.
  • args (experimental.orpo.ORPOConfig) — Eğitim için kullanılacak ORPO yapılandırma argümanları.
  • data_collator (DataCollator) — Eğitim için kullanılacak veri toplayıcı. None belirtilirse, çift dizilerden oluşan bir veri seti verildiğinde, dizileri batch içindeki dizilerin maksimum uzunluğuna kadar dolduran varsayılan veri toplayıcı (experimental.utils.DPODataCollatorWithPadding) kullanılacaktır.
  • train_dataset (Dataset) — Eğitim için kullanılacak veri seti.
  • eval_dataset (Dataset) — Değerlendirme için kullanılacak veri seti.
  • processing_class (PreTrainedTokenizerBase, BaseImageProcessor, FeatureExtractionMixin veya ProcessorMixin, isteğe bağlı) — Verileri işlemek için kullanılan işleme sınıfı. Sağlanırsa, model girdilerini otomatik olarak işlemek için kullanılır ve yarıda kalan bir eğitimi yeniden başlatmayı veya ince ayarlanmış modeli yeniden kullanmayı kolaylaştırmak amacıyla modelle birlikte kaydedilir.
  • model_init (Callable[[], transformers.PreTrainedModel]) — Eğitim için kullanılacak model başlatıcısı. None belirtilirse, varsayılan model başlatıcısı kullanılır.
  • callbacks (list[transformers.TrainerCallback]) — Eğitim için kullanılacak geri çağrılar.
  • optimizers (tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]) — Eğitim için kullanılacak optimizör ve zamanlayıcı.
  • preprocess_logits_for_metrics (Callable[[torch.Tensor, torch.Tensor], torch.Tensor]) — Metrikler hesaplanmadan önce logit'leri ön işlemek için kullanılacak işlev.
  • peft_config (PeftConfig, isteğe bağlı) — Eğitim için kullanılacak PEFT yapılandırması. Bir PEFT yapılandırması geçirirseniz, model bir PEFT modeliyle sarılır.
  • compute_metrics (Callable[[EvalPrediction], dict], isteğe bağlı) — Metrikleri hesaplamak için kullanılacak işlev. Bir EvalPrediction almalı ve metrik değerlerini içeren bir sözlük döndürmelidir.

ORPOTrainer'ı başlatın.

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.

ORPOConfig

sınıf trl.experimental.orpo.ORPOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 1e-06lr_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 = -1max_length: int | None = 1024max_completion_length: int | None = Nonebeta: float = 0.1disable_dropout: bool = Truepadding_value: int | None = Nonegenerate_during_eval: bool = Falseis_encoder_decoder: bool | None = Nonemodel_init_kwargs: dict[str, typing.Any] | str | None = Nonetrust_remote_code: bool = Falsedataset_num_proc: int | None = None )

Parametreler

  • max_length (int veya None, isteğe bağlı, varsayılan 1024) — Toplu işlemdeki dizilerin (istek + tamamlama) maksimum uzunluğu. Varsayılan veri toplayıcısını kullanmak istiyorsanız bu argüman gereklidir.
  • max_completion_length (int, isteğe bağlı) — Tamamlamanın (completion) maksimum uzunluğu. Varsayılan veri toplayıcısını (data collator) kullanmak ve modeliniz bir kodlayıcı-çözücü (encoder-decoder) ise bu argüman gereklidir.
  • beta (float, isteğe bağlı, varsayılan 0.1) — ORPO kaybında göreli oran kaybı ağırlığını kontrol eden parametre. makalede λ ile gösterilir. kodda ise alpha ile gösterilir.
  • disable_dropout (bool, isteğe bağlı, varsayılan True) — Modelde dropout'un devre dışı bırakılıp bırakılmayacağı.
  • padding_value (int, isteğe bağlı) — Kullanılacak dolgu değeri. None ise, tokenizer'ın dolgu değeri kullanılır.
  • generate_during_eval (bool, isteğe bağlı, varsayılan False) — True ise, değerlendirme sırasında modelden tamamlamalar üretilir ve W&B veya Comet'e kaydedilir.
  • is_encoder_decoder (bool, isteğe bağlı) — model argümanı yerine modeli örneklemek için model_init argümanını (callable) kullanırken, callable tarafından döndürülen modelin bir encoder-decoder modeli olup olmadığını belirtmeniz gerekir.
  • model_init_kwargs (dict[str, Any], isteğe bağlı) — Modelin bir dizgeden örneklenirken AutoModelForCausalLM.from_pretrained fonksiyonuna geçirilecek anahtar kelime argümanları. revision değeri, işleme sınıfı yüklenirken de kullanılır.
  • trust_remote_code (bool, isteğe bağlı, varsayılan False) — Hub'dan özel Python kodu içeren modellerin yüklenmesine izin verilip verilmeyeceğini belirtir. from_pretrained fonksiyonuna iletilir.
  • dataset_num_proc (int, isteğe bağlı) — Veri setini işlemek için kullanılacak süreç sayısı.

experimental.orpo.ORPOTrainer için yapılandırma sınıfı.

Bu sınıf yalnızca ORPO eğitimine özgü parametreleri içerir. Eğitim argümanlarının tam listesi için lütfen TrainingArguments belgelerine başvurun. Bu sınıftaki varsayılan değerlerin TrainingArguments içindeki değerlerden farklı olabileceğini unutmayın.

HfArgumentParser kullanarak bu sınıfı, komut satırında belirtilebilen argparse argümanlarına dönüştürebiliriz.

Bu parametrenin TrainingArguments'ten farklı varsayılan değerleri vardır:

  • logging_steps: Varsayılan olarak 500 yerine 10 değerine ayarlanır.
  • gradient_checkpointing: Varsayılan olarak False yerine True değerini alır.
  • bf16: fp16 ayarlanmadıysa varsayılan olarak True, False yerine.
  • learning_rate: Varsayılan olarak 5e-5 yerine 1e-6 olarak ayarlanır.
Update on GitHub