TRL documentation

مدرب ORPO

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

model badge model badge

نظرة عامة

طُرِح تحسين التفضيل بنسبة الاحتمالات (ORPO) في ORPO: Monolithic Preference Optimization without Reference Model بواسطة Jiwoo Hong وNoah Lee وJames Thorne.

المستخلص من الورقة البحثية هو كالتالي:

في حين أظهرت خوارزميات محاذاة التفضيلات الحديثة لنماذج اللغة نتائج واعدة، يبقى الضبط الدقيق الإشرافي (SFT) أمرًا حاسمًا لتحقيق التقارب الناجح. في هذه الورقة، ندرس الدور الحاسم لـ SFT في سياق محاذاة التفضيلات، مع التأكيد على أن عقوبة طفيفة لأسلوب التوليد غير المفضل تكفي لـ SFT المُحاذاة مع التفضيلات. وبناءً على هذا الأساس، نطرح خوارزمية بسيطة ومبتكرة لتحسين نسبة الاحتمالات (odds ratio) التفضيلية أحادية النموذج دون الحاجة إلى نموذج مرجعي، وهي ORPO، مما يلغي الحاجة إلى مرحلة إضافية لمحاذاة التفضيلات. نُثبت، تجريبيًا ونظريًا، أن نسبة الاحتمالات خيار منطقي للتباين بين الأساليب المفضلة وغير المفضلة أثناء SFT عبر الأحجام المتنوعة من 125M إلى 7B. على وجه التحديد، يتفوق الضبط الدقيق لـ Phi-2 (2.7B) وLlama-2 (7B) وMistral (7B) باستخدام ORPO على بيانات UltraFeedback وحدها على أداء نماذج اللغة الرائدة التي تحتوي على أكثر من 7B و13B من المعاملات: حيث يحقق حتى 12.20% على AlpacaEval_{2.0} (الشكل 1)، و66.19% على IFEval (مستوى التعليمات المرنة، الجدول 6)، و7.32 في MT-Bench (الشكل 12). ننشر الكود ونقاط التفتيش للنماذج الخاصة بـ Mistral-ORPO-alpha (7B) وMistral-ORPO-beta (7B).

تدرس الدور الحاسم لـ SFT في سياق محاذاة التفضيلات. باستخدام بيانات التفضيلات، تفترض الطريقة أن عقوبة طفيفة على التوليد غير المفضل، إلى جانب إشارة تكيّف قوية نحو الاستجابة المختارة عبر حد نسبة الاحتمال اللوغاريتمي البسيط المضاف إلى خسارة NLL، كافية لتحقيق محاذاة التفضيلات في SFT.

وبالتالي، فإن ORPO هو خوارزمية تحسين تفضيلات لا تعتمد على نموذج مرجعي، مما يلغي الحاجة إلى مرحلة مواءمة تفضيلات إضافية، وبالتالي يوفر في الحساب والذاكرة.

يمكن العثور على الكود الرسمي في xfactlab/orpo.

تمت مساهمة طريقة ما بعد التدريب هذه من قِبل Kashif Rasul وLewis Tunstall وAlvaro Bartolome.

البدء السريع

يُظهر هذا المثال كيفية تدريب نموذج باستخدام طريقة ORPO. نستخدم نموذج Qwen 0.5B كنموذج أساسي. نستخدم بيانات التفضيل من مجموعة بيانات UltraFeedback. يمكنك عرض البيانات في مجموعة البيانات هنا:

فيما يلي السكربت لتدريب النموذج:

# 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()

نفّذ السكربت باستخدام الأمر التالي:

torchrun --nproc_per_node 8 train_orpo.py

عند التوزيع على 8 وحدات معالجة رسومية (GPU)، يستغرق التدريب حوالي 30 دقيقة. يمكنك التحقق من تقدم التدريب عن طريق فحص مخطط المكافأة. يشير الاتجاه التصاعدي في هامش المكافأة إلى أن النموذج يتحسن ويولّد استجابات أفضل مع مرور الوقت.

orpo qwen2 reward margin

لرؤية أداء النموذج المدرَّب، يمكنك استخدام Transformers Chat CLI.

$ 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.

نوع مجموعة البيانات المتوقع

يتطلب ORPO مجموعة بيانات تفضيلات. يدعم experimental.orpo.ORPOTrainer كلا من صيغة مجموعة البيانات المحادثية وصيغة المعيارية. عند تقديم مجموعة بيانات محادثية، سيطبّق المدرب قالب المحادثة على مجموعة البيانات تلقائيًا.

على الرغم من أن experimental.orpo.ORPOTrainer يدعم الأوامر الصريحة وغير الصريحة، فإننا نوصي باستخدام الأوامر الصريحة. إذا تم تقديم مجموعة بيانات بأوامر غير صريحة، فسيقوم المدرب باستخراج الأمر تلقائيًا من العمودين "chosen" و"rejected". لمزيد من المعلومات، راجع قسم أسلوب التفضيل.

نصائح للاستخدام

لنماذج مزيج الخبراء: تفعيل الخسارة المساعدة

تكون نماذج MOE الأكثر كفاءة عندما يكون الحمل موزّعاً بالتساوي تقريباً بين الخبراء.
ولضمان تدريب نماذج MOE بشكل مشابه أثناء ضبط التفضيلات، من المفيد إضافة الخسارة المساعدة من موازن الحمل إلى الخسارة النهائية.

تُفعَّل هذه الخيارات من خلال تعيين output_router_logits=True في إعدادات النموذج (مثل MixtralConfig).
ولتحديد مقدار مساهمة الخسارة المساعدة في الخسارة الإجمالية، استخدم معامل الضبط router_aux_loss_coef=... (الافتراضي: 0.001) في إعدادات النموذج.

المقاييس المسجّلة

أثناء التدريب والتقييم، نسجّل المقاييس التالية:

  • rewards/chosen: متوسط احتمالات السجل (log probabilities) لنموذج السياسة (policy model) للردود المختارة، مضروبًا في معامل بيتا (beta)
  • rewards/rejected: متوسط احتمالات السجل (log probabilities) لنموذج السياسة (policy model) للردود المرفوضة، مضروبًا في معامل بيتا (beta)
  • rewards/accuracies: متوسط تكرار كون المكافآت المختارة > من المكافآت المرفوضة المقابلة
  • rewards/margins: متوسط الفرق بين المكافآت المختارة والمكافآت المرفوضة المقابلة
  • log_odds_chosen: متوسط نسبة اللوغاريتمية (log odds) للاستجابات المختارة مقارنة بالاستجابات المرفوضة
  • log_odds_ratio: متوسط log(sigmoid(log_odds_chosen))
  • nll_loss: متوسط خسارة الاحتمالية السالبة (negative log likelihood) من جزء SFT في الخسارة عبر الاستجابات المختارة

ORPOTrainer

فئة 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 )

المعاملات

  • model (PreTrainedModel) — النموذج المراد تدريبه، ويُفضَّل أن يكون AutoModelForSequenceClassification.
  • args (experimental.orpo.ORPOConfig) — معاملات إعدادات ORPO المستخدمة للتدريب.
  • data_collator (DataCollator) — مجمّع البيانات (Data Collator) المستخدم للتدريب. إذا تم تحديد None، فسيتم استخدام مجمّع البيانات الافتراضي (experimental.utils.DPODataCollatorWithPadding) والذي سيملأ التسلسلات حتى الطول الأقصى للتسلسلات في الدفعة (batch)، معطياً مجموعة بيانات من التسلسلات المزدوجة.
  • train_dataset (Dataset) — مجموعة البيانات المستخدمة للتدريب.
  • eval_dataset (Dataset) — مجموعة البيانات المستخدمة للتقييم.
  • processing_class (PreTrainedTokenizerBase أو BaseImageProcessor أو FeatureExtractionMixin أو ProcessorMixin، اختياري) — فئة المعالجة المستخدمة لمعالجة البيانات. إذا تم توفيرها، فستُستخدم لمعالجة المدخلات تلقائيًا للنموذج، وستُحفظ مع النموذج لتسهيل إعادة تشغيل التدريب المقطوع أو إعادة استخدام النموذج المُحسَّن.
  • model_init (Callable[[], transformers.PreTrainedModel]) — مُهيِّئ النموذج الذي سيُستخدم للتدريب. إذا تم تحديد None، فسيتم استخدام مُهيِّئ النموذج الافتراضي.
  • callbacks (list[transformers.TrainerCallback]) — المستدعات (callbacks) المستخدمة للتدريب.
  • optimizers (tuple[torch.optim.Optimizer, torch.optim.lr_scheduler.LambdaLR]) — المُحسِّن ومجدول معدل التعلم المستخدمان للتدريب.
  • preprocess_logits_for_metrics (Callable[[torch.Tensor, torch.Tensor], torch.Tensor]) — الدالة المستخدمة لمعالجة القيم الأولية (logits) قبل حساب المقاييس.
  • peft_config (PeftConfig، اختياري) — إعدادات PEFT المستخدمة للتدريب. إذا قمت بتمرير إعدادات PEFT، فسيتم تغليف النموذج في نموذج PEFT.
  • compute_metrics (Callable[[EvalPrediction], dict], اختياري) — الدالة المستخدمة لحساب المقاييس. يجب أن تستقبل EvalPrediction وتعيد قاموسًا من السلاسل النصية إلى قيم المقاييس.

قم بتهيئة ORPOTrainer.

تدريب

< >

( resume_from_checkpoint: str | bool | None = Nonetrial: optuna.Trial | dict[str, Any] | None = Noneignore_keys_for_eval: list[str] | None = None ) → ~trainer_utils.TrainOutput

المعاملات

  • resume_from_checkpoint (str أو bool، اختياري) — إذا كان str، فهو المسار المحلي لنقطة تفتيش محفوظة بواسطة نسخة سابقة من Trainer. وإذا كان bool ويساوي True، يتم تحميل آخر نقطة تفتيش في args.output_dir كما حفظتها نسخة سابقة من Trainer. إذا كانت موجودة، فسيستأنف التدريب من حالات النموذج/المُحسِّن/المُجدوِل المحمَّلة هنا.
  • trial (optuna.Trial أو dict[str, Any]، اختياري) — التجربة أو قاموس المعاملات الفائقة للبحث في المعاملات الفائقة.
  • ignore_keys_for_eval (list[str]، اختياري) — قائمة بالمفاتيح في مخرجات النموذج الخاص بك (إذا كان قاموسًا) التي يجب تجاهلها عند جمع التوقعات للتقييم أثناء التدريب.

يعيد

~trainer_utils.TrainOutput

كائن يحتوي على عدد الخطوات العالمية، وخسارة التدريب، والمقاييس.

نقطة الدخول الرئيسية للتدريب.

save_model

< >

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

سيحفظ النموذج، بحيث يمكنك إعادة تحميله باستخدام from_pretrained().

سيتم الحفظ من العملية الرئيسية فقط.

push_to_hub

< >

( commit_message: str | None = 'End of training'blocking: bool = Truetoken: str | None = Nonerevision: str | None = None**kwargs )

المعاملات

  • commit_message (str، اختياري، الافتراضي "End of training") — الرسالة التي تُرسل عند الدفع.
  • blocking (bool، اختياري، الافتراضي True) — ما إذا كان ينبغي للدالة أن تُرجع فقط بعد اكتمال git push.
  • token (str، اختياري، القيمة الافتراضية None) — رمز (Token) يملك صلاحية الكتابة لتجاوز الحجج الأصلية الخاصة بـ Trainer.
  • revision (str، اختياري) — مراجعة git التي سيتم الالتزام منها. الافتراضي هو رأس فرع “main”.
  • kwargs (dict[str, Any]، اختياري) — معلمات إضافية تُمرَّر إلى ~Trainer.create_model_card.

ارفع self.model وself.processing_class إلى مركز النماذج 🤗 في المستودع self.args.hub_model_id.

ORPOConfig

فئة 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 )

المعاملات

  • max_length (int أو None، اختياري، القيمة الافتراضية 1024) — الحد الأقصى لطول التسلسلات (الموجّه + الإكمال) في الدفعة. هذا الحُجج مطلوب إذا كنت ترغب في استخدام مُجمِّع البيانات الافتراضي.
  • max_completion_length (int، اختياري) — الحد الأقصى لطول الإكمال. هذا الحُجج مطلوب إذا كنت ترغب في استخدام مُجمِّع البيانات الافتراضي وكان نموذجك من نوع المُشفِّر-المُفكِّك (encoder-decoder).
  • beta (float, اختياري، القيمة الافتراضية 0.1) — معامل يتحكم في وزن نسبة الخسارة النسبية في خسارة ORPO. في الورقة البحثية، يُرمز له بـ λ. في الكود، يُرمز له بـ alpha.
  • disable_dropout (bool، اختياري، القيمة الافتراضية True) — ما إذا كان سيتم تعطيل إسقاط العينة (dropout) في النموذج.
  • padding_value (int، اختياري) — قيمة الحشو المستخدمة. إذا كانت None، تُستخدم قيمة الحشو الخاصة بمجزّئ النص.
  • generate_during_eval (bool، اختياري، القيمة الافتراضية False) — إذا كانت True، يتم توليد الإكمالات من النموذج وتسجيلها في W&B أو Comet أثناء التقييم.
  • is_encoder_decoder (bool، اختياري) — عند استخدام حجة model_init (دالة قابلة للاستدعاء) لإنشاء النموذج بدلاً من حجة model، تحتاج إلى تحديد ما إذا كان النموذج الذي تُرجعه الدالة القابلة للاستدعاء هو نموذج مُشفِّر-مُفكِّك (encoder-decoder).
  • model_init_kwargs (dict[str, Any], اختياري) — حجج الكلمات المفتاحية التي يتم تمريرها إلى AutoModelForCausalLM.from_pretrained عند إنشاء النموذج من نص. كما يُستخدم قيمة revision عند تحميل فئة المعالجة.
  • trust_remote_code (bool، اختياري، القيمة الافتراضية False) — ما إذا كان سيتم السماح بتحميل النماذج التي تتضمن كود Python مخصصًا من Hub. يتم تمرير هذا المعامل إلى from_pretrained.
  • dataset_num_proc (int، اختياري) — عدد العمليات المستخدمة لمعالجة مجموعة البيانات.

فئة التهيئة الخاصة بـ experimental.orpo.ORPOTrainer.

تتضمن هذه الفئة فقط المعلمات الخاصة بتدريب ORPO. للحصول على قائمة كاملة بحجج التدريب، يرجى الرجوع إلى توثيق TrainingArguments. لاحظ أن القيم الافتراضية في هذه الفئة قد تختلف عن تلك الموجودة في TrainingArguments.

باستخدام HfArgumentParser يمكننا تحويل هذه الفئة إلى حُجج argparse يمكن تحديدها على سطر الأوامر.

تتميز هذه المعلمات بقيم افتراضية مختلفة عن TrainingArguments:

  • logging_steps: القيمة الافتراضية هي 10 بدلاً من 500.
  • gradient_checkpointing: القيمة الافتراضية هي True بدلاً من False.
  • bf16: القيمة الافتراضية هي True إذا لم يتم تعيين fp16، بدلاً من False.
  • learning_rate: القيمة الافتراضية هي 1e-6 بدلاً من 5e-5.
Update on GitHub