TRL documentation

SDPO

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

SDPO

طُرِح تحسين سياسة التوزيع الذاتي (SDPO) في التعلم المعزز عبر التوزيع الذاتي بواسطة Jonas Hübotter وFrederike Lübeck وLejs Behric وAnton Baumann وMarco Bagatella وDaniel Marta وIdo Hakimi وIdan Shenfeld وThomas Kleine Buening وCarlos Guestrin وAndreas Krause.

تُدرَّب نماذج اللغة الكبيرة بشكل متزايد باستخدام التعلم المعزز في مجالات قابلة للتحقق مثل البرمجة والرياضيات. ومع ذلك، فإن الأساليب الحالية للتعلم المعزز بمكافآت قابلة للتحقق (RLVR) تتعلم فقط من مكافأة ناتج قياسية لكل محاولة، مما يخلق عنق زجاجة شديد في إسناد الفضل. توفر العديد من البيئات القابلة للتحقق في الواقع تغذية راجعة نصية غنية، مثل أخطاء وقت التشغيل أو تقييمات الحكام، توضح سبب فشل المحاولة. نُصيغ هذا السياق على أنه تعلم معزز بتغذية راجعة غنية، ونُقدّم تحسين سياسة التقطير الذاتي (SDPO)، الذي يحوّل التغذية الراجعة المُرمَّزة إلى إشارة تعلم كثيفة دون الحاجة إلى معلم خارجي أو نموذج مكافأة صريح. يعامل SDPO النموذج الحالي المشروط بالتغذية الراجعة كمعلم ذاتي، ويُقطّر توقعاته التالية للرموز المُستخلصة من التغذية الراجعة مرة أخرى إلى السياسة. وبهذه الطريقة، يستفيد SDPO من قدرة النموذج على تحديد أخطائه الخاصة بأثر رجعي ضمن السياق. عبر الاستدلال العلمي، واستخدام الأدوات، والبرمجة التنافسية على LiveCodeBench v6، يحسّن SDPO كفاءة العينات والدقة النهائية مقارنة بخطوط الأساس القوية للتعلم المعزز بمكافآت قابلة للتحقق. ومن اللافت للنظر أن SDPO يتفوق أيضًا على خطوط الأساس في بيئات التعلم المعزز بمكافآت قابلة للتحقق القياسية التي تُرجع فقط تغذية راجعة قياسية، من خلال استخدام التمريرات الناجحة كتغذية راجعة ضمنية للمحاولات الفاشلة. أخيرًا، تطبيق SDPO على أسئلة فردية في وقت الاختبار يُسرّع الاكتشاف في مهام المكافأة الثنائية الصعبة، محققًا نفس احتمال الاكتشاف مثل أخذ أفضل من k أو المحادثات متعددة الأدوار مع عدد محاولات أقل بثلاث مرات.

كيف يعمل

يستهدف SDPO التعلم المعزز بمكافآت قابلة للتحقق (RLVR)، حيث لا تُنتج كل محاولة سوى مكافأة قياسية متناثرة. ويحوّل ذلك إلى إشارة كثيفة على مستوى الرموز: فلكل موجه، تُعَيِّن السياسة num_generations من الإكمالات التي تُقيَّم بواسطة reward_funcs، وتصبح المحاولة الناجحة (إضافةً إلى تغذية راجعة اختيارية من privileged_context) موجهًا مُعادًا للمعلّم، ثم تُستخلص التوزيعات التي يستند إليها المعلّم بناءً على التغذية الراجعة حول الإكمال وتُدمج مجددًا في السياسة. والمعلّم والطالب هما نفس الشبكة، لذا لا حاجة إلى معلّم خارجي أو نموذج مكافآت إضافي سوى المُتحقِّق.

أنماط الخسارة والمعلم

يتحكم distillation_weight في كيفية دمج الإشارتين كمجموعة محدبة: حيث تكون الخسارة (1 - distillation_weight) * policy_loss + distillation_weight * distillation_loss. القيمة 1.0 (الافتراضية) تدرب حصريًا على خسارة التلقائي-التقطير، بينما 0.0 تعود إلى تدرج السياسة القياسي بنمط GRPO، والقيم الوسيطة تمزج بين الاثنين. أما هدف التقطير نفسه فيُحدد بواسطة distillation_mode — حيث يستخدم "sampled_token" (الافتراضي) عكس KL على مستوى الرمز ويتطلب distillation_alpha=1.0، بينما "full_logits" و"topk_logits" تقطّران على كامل مفردات اللغة أو أعلى distillation_topk رموز منها.

يختار teacher_model_kind أوزان المعلم: "ema" (الافتراضي) يتتبع الطالب بمتوسط متحرك أُسّي يُزامَن كل teacher_sync_steps خطوة بمعدل teacher_update_rate، و"live" يعيد استخدام الطالب الحالي مباشرة، و"base" يجمّد الأوزان الأولية. يُدار إعادة الطلب بواسطة use_successful_as_teacher وsuccess_reward_threshold وdont_reprompt_on_self_success وحقول reprompt_template / solution_template / feedback_template. يتم التوليد عبر transformers افتراضياً، أو عبر vLLM (وضع colocate أو وضع الخادم) عند use_vllm=True.

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

يجب أن يوفر كل مثال:

  • prompt: الأمر الموجَّه إلى الطالب
  • privileged_context: نص مميّز اختياري، مثل ملاحظات البيئة، يُستخدم عند include_environment_feedback=True

الاستخدام

from datasets import Dataset

from trl.experimental.sdpo import SDPOConfig, SDPOTrainer

dataset = Dataset.from_dict(
    {
        "prompt": [[{"role": "user", "content": "Solve 2+2."}]],
        "privileged_context": ["Your earlier answer used the wrong format."],
    }
)

training_args = SDPOConfig(
    output_dir="sdpo-model",
    distillation_mode="topk_logits",       # Explicitly select top-K logit distillation
    distillation_topk=100,                 # Required when using top-K logit distillation
    include_environment_feedback=True,     # Use dataset privileged_context for teacher reprompts
)

trainer = SDPOTrainer(
    model="Qwen/Qwen2.5-1.5B-Instruct",
    reward_funcs=reward_func,
    args=training_args,
    train_dataset=dataset,
)
trainer.train()

يتطلب SDPO دائمًا عمود prompt. لاستخدام ملاحظات البيئة، شمل أيضًا عمود privileged_context وقم بتعيين include_environment_feedback=True. سيقوم SDPO باستخدام التكرارات الناجحة و، عند تفعيلها، ذلك النص لبناء إعادة تلميحات المعلم للتبسيط الذاتي.

تقديم المعلم من خادم vLLM

عند استخدام teacher_model_kind="live" يكون المعلم هو الطالب الحالي، الذي تحتفظ أوزانه بالفعل بخادم server الخاص بـ vLLM (حيث تتم مزامنتها للتوليد في كل خطوة). اضبط use_teacher_server=True لتقييم احتمالات السجلات (log-probabilities) للمعلم على نفس الخادم بدلاً من تشغيل تمريرة أمامية محلية منفصلة للمعلم، مما يُزيل المعلم تماماً من خطوة التدريب:

training_args = SDPOConfig(
    output_dir="sdpo-model",
    use_vllm=True,
    vllm_mode="server",
    teacher_model_kind="live",
    use_teacher_server=True,
    distillation_weight=1.0,
    distillation_mode="sampled_token",
)

عند استخدام خادم المعلم:

  • use_vllm=True وvllm_mode="server" مطلوبان
  • يجب أن يكون teacher_model_kind هو "live" (حيث يحتفظ الخادم بأوزان الطالب الحالية)
  • يجب أن يكون distillation_weight مساوياً لـ 1.0 (التقطير النقي؛ حيث يتطلب المزج المحدب مع خسارة السياسة قيم logits كاملة للمفردات)
  • يجب أن يكون distillation_mode إما "sampled_token" (KL العكسي على الرمز المُنجَز) أو "topk_logits". تُرجع الخادم احتمالات السجل الخاصة به لأفضل k رمزًا، لذا فإن topk_logits يُجري التقطير على نطاق أفضل k رمزًا لدى المعلم (لا يمكنه استخدام نطاق الطالب، على عكس الهدف المحلي)؛ ومع معلم من نوع "live" يتطابق النطاقان تقريبًا. full_logits غير متوفر.

المكالمات العكسية

يُصدر المُدرِّب مجموعة صغيرة من خطافات الاستدعاء (callback hooks) المفيدة للتصحيح، والمراقبة، والاختبارات. وقد صُمِّمت هذه الخطافات كنقاط تكامل عملية لتدفقات العمل التجريبية للتقطير الذاتي.

خطافات التقطير الذاتي المشتركة:

  • on_self_distillation_batch_prepared: يُطلق عند اكتمال دفعة التلقائي التلقائي. تتضمن الحمولة prompt_ids وcompletion_ids وold_per_token_logps عندما تكون مدخلات قصّ أخذ العينات حسب الأهمية متاحة.
  • on_generation_batch_built: يُطلق عند إنشاء دفعة توليد مخزّنة جديدة. يتضمن الحمولة generate_every وsteps_per_generation.

خطاف خاص بـ SDPO:

  • on_teacher_context_built: تُطلق بعد أن يبني SDPO المدخلات المشروطة على المعلم. تتضمن الحمولة teacher_input_ids، وteacher_attention_mask، وcompletion_mask، وself_distillation_mask.

مثال على السكربت

استخدم examples/sdpo_math/sdpo_math.py لإطلاق تدريب SDPO من سطر الأوامر. يدعم هذا السكربت مكافآت رياضية قابلة للتحقق، وتغذية راجعة من البيئة عبر --feedback_column، وPEFT/LoRA عبر أعلام ModelConfig القياسية.

python examples/sdpo_math/sdpo_math.py \
    --model_name_or_path Qwen/Qwen2.5-Math-1.5B-Instruct \
    --dataset_name openai/gsm8k \
    --dataset_config main \
    --output_dir outputs/sdpo-qwen35-2b-gsm8k \
    --learning_rate 5e-5 \
    --dtype bfloat16 \
    --bf16 true \
    --max_completion_length 128 \
    --use_peft \
    --lora_target_modules q_proj k_proj v_proj o_proj gate_proj up_proj down_proj \
    --per_device_train_batch_size 1 \
    --gradient_accumulation_steps 2 \
    --num_generations 8 \
    --generation_batch_size 32 \
    --distillation_alpha 1.0 \
    --distillation_mode sampled_token \
    --distillation_weight 0.5 \
    --report_to none \
    --eval_strategy steps \
    --eval_steps 1000 \
    --save_strategy no

SDPOConfig

فئة trl.experimental.sdpo.SDPOConfig

< >

( output_dir: str | None = Noneper_device_train_batch_size: int = 8num_train_epochs: float = 3.0max_steps: int = -1learning_rate: float = 5e-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 = Falselabel_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] | None = Nonetrust_remote_code: bool = Falsedisable_dropout: bool = Truemax_prompt_length: int | None = 512num_generations: int = 8num_generations_eval: int | None = Nonemax_completion_length: int | None = 256ds3_gather_for_generation: bool = Trueshuffle_dataset: bool = Truegeneration_batch_size: int | None = Nonesteps_per_generation: int | None = Nonetemperature: float = 1.0top_p: float = 1.0top_k: int = 0min_p: float | None = Nonegeneration_kwargs: dict[str, typing.Any] | None = Nonechat_template_kwargs: dict[str, typing.Any] | None = Nonerepetition_penalty: float = 1.0cache_implementation: str | None = Noneuse_vllm: bool = Falseuse_teacher_server: bool = Falsevllm_mode: str = 'colocate'vllm_model_impl: str = 'vllm'vllm_enable_sleep_mode: bool = Falsevllm_server_base_url: str | None = Nonevllm_server_host: str = '0.0.0.0'vllm_server_port: int = 8000vllm_group_port: int = 51216vllm_server_timeout: float = 240.0vllm_tensor_parallel_size: int = 1vllm_gpu_memory_utilization: float = 0.3vllm_max_model_length: int | None = Nonenum_iterations: int = 1loss_type: str = 'dapo'mask_truncated_completions: bool = Falsedont_reprompt_on_self_success: bool = Truebeta: float = 0.0epsilon: float = 0.2epsilon_high: float | None = Noneimportance_sampling_level: str = 'token'reward_weights: list[float] | None = Nonescale_rewards: str = 'group'distillation_alpha: float = 1.0distillation_mode: typing.Literal['sampled_token', 'full_logits', 'topk_logits'] = 'sampled_token'distillation_topk: int | None = Nonedistillation_is_clip: float | None = 2.0distillation_add_tail: bool = Falsedistillation_weight: float = 1.0teacher_model_kind: str = 'ema'teacher_update_rate: float = 0.05teacher_sync_steps: int = 1max_reprompt_len: int = 10240use_successful_as_teacher: bool = Truesuccess_reward_threshold: float = 1.0reprompt_template: str = '{prompt}{solution}{feedback}\n\nCorrectly solve the original question.\n'solution_template: str = '\nCorrect solution:\n\n{successful_previous_attempt}\n\n'feedback_template: str = '\nThe following is feedback from your unsuccessful earlier attempt:\n\n{feedback_raw}\n\n'include_environment_feedback: bool = Falseenvironment_feedback_only_without_solution: bool = Falseremove_thinking_from_demonstration: bool = Falsediagnostics_warning_interval: int = 10diagnostics_flat_tolerance: float = 1e-08 )

المعاملات التي تتحكم في هدف السياسة عبر الإنترنت

  • beta (float، اختياري، القيمة الافتراضية 0.0) — معامل KL. إذا كانت القيمة 0.0 (الافتراضية)، فلن يتم تحميل النموذج المرجعي، مما يقلل من استهلاك الذاكرة ويحسّن سرعة التدريب. يستخدم DeepSeek-R1 incentivizes reasoning in LLMs through reinforcement learning قيمة 0.001.
  • epsilon (float، اختياري، القيمة الافتراضية 0.2) — قيمة إيبسلون للقص.
  • epsilon_high (float, اختياري) — قيمة إبسيلون الحد الأعلى للتقليم. إذا لم يتم تحديدها، فإن القيمة الافتراضية هي نفس قيمة الحد الأدنى المحددة في الحجة epsilon. يوصي الورق DAPO بقيمة 0.28.
  • importance_sampling_level (str, اختياري، القيمة الافتراضية "token") — يتحكم في ما إذا كانت نسب أخذ العينات المهمة تُحسب على مستوى 'token' أو 'sequence'. 'token' يحافظ على نسب احتمالات السجل الخام لكل رمز (وزن واحد لكل رمز). 'sequence' يحسب متوسط نسب احتمالات السجل عبر الرموز الصالحة لإنتاج نسبة واحدة لكل تسلسل. تُظهر ورقة GSPO أن أخذ العينات على مستوى التسلسل غالباً ما يؤدي إلى تدريب أكثر استقراراً ومواءمة أفضل مع المكافآت على مستوى التسلسل.
  • reward_weights (list[float], اختياري) — أوزان لكل دالة مكافأة. يجب أن تتطابق مع عدد دوال المكافأة. إذا كانت None، فجميع المكافآت موزونة بالتساوي مع وزن 1.0.
  • scale_rewards (str أو bool، اختياري، القيمة الافتراضية "group") — يحدد استراتيجية توسيع المكافآت. القيم المدعومة هي: True أو 'group' (الافتراضي): يتم توسيع المكافآت بناءً على الانحراف المعياري داخل كل مجموعة، مما يضمن تبايناً لوحدياً داخل المجموعة. 'batch': يتم توسيع المكافآت بناءً على الانحراف المعياري عبر الدفعة (batch) بأكملها، كما هو موصى به في ورقة PPO Lite. False أو 'none': لا يتم تطبيق أي توسيع. توصي ورقة Dr. GRPO بعدم توسيع المكافآت، لأن التوسيع بناءً على الانحراف المعياري يُدخل تحيزاً في صعوبة مستوى السؤال.

المعاملات التي تتحكم في خسارة SDPO

  • distillation_weight (float، اختياري، القيمة الافتراضية 1.0) — وزن التوليف المحدب بين هدف السياسة وهدف التلقين الذاتي. تكون الدالة الخسارة (1 - distillation_weight) * policy_loss + distillation_weight * distillation_loss. يجب أن تكون القيمة ضمن [0, 1]. القيمة 1.0 (الافتراضية) تعني التدريب حصرياً على التلقين الذاتي، بينما 0.0 تعني العودة إلى تدرج السياسة القياسي بنمط GRPO، والقيم الوسيطة تمزج بين الهدفين.
  • distillation_alpha (float، اختياري، القيمة الافتراضية 1.0) — معامل استيفاء التباعد. يتطلب SDPO للرموز المُستخرجة إعداد reverse-KL الرسمي distillation_alpha=1.0.
  • distillation_mode (Literal["sampled_token", "full_logits", "topk_logits"]، اختياري، القيمة الافتراضية "sampled_token") — وضع هدف التقطير. sampled_token هو وضع SDPO الافتراضي ويتطلب distillation_alpha=1.0.
  • distillation_topk (int, اختياري) — تقريب Top-k لمستوى اللوجيتات في SDPO. يجب تعيينه عند distillation_mode=topk_logits وتركه غير معيّن في الحالات الأخرى.
  • distillation_is_clip (float، اختياري، القيمة الافتراضية 2.0) — معامل القصّ لعينة الأهمية في التلقائي. تعطيل None القصّ.
  • distillation_add_tail (bool، اختياري، القيمة الافتراضية False) — ما إذا كان يجب إضافة دلو ذيل لكتلة الاحتمال غير الأعلى-ك.

المعاملات التي تتحكم في المعلم

  • teacher_model_kind (str، اختياري، القيمة الافتراضية "ema") — اختيار المعلم الدلالي. يستخدم base الطالب الأولي، ويستخدم live الطالب الحالي، بينما يستخدم ema معلمًا متوسطًا أُسّيًا.
  • teacher_update_rate (float، اختياري، القيمة الافتراضية 0.05) — معدل تحديث المعلم المستخدم لمزامنة المعلم EMA.
  • teacher_sync_steps (int، اختياري، القيمة الافتراضية 1) — تكرار مزامنة نموذج المعلم EMA.

المعاملات التي تتحكم في إعادة الطلب

  • use_successful_as_teacher (bool، اختياري، القيمة الافتراضية True) — استخدام المسارات الناجحة كإشارة ضمنية للتقطير الذاتي.
  • success_reward_threshold (float، اختياري، القيمة الافتراضية 1.0) — أدنى مكافأة يجب أن يحققها التمرين حتى يُعتبر عرضًا ناجحًا.
  • dont_reprompt_on_self_success (bool، اختياري، القيمة الافتراضية True) — تخطي إعادة الطلب عندما يولّد النموذج إجابة صحيحة.
  • max_reprompt_len (int، اختياري، القيمة الافتراضية 10240) — الحد الأقصى لطول إعادة التوجيه في التوزيع الذاتي.
  • reprompt_template (str، اختياري، القيمة الافتراضية "{prompt}{solution}{feedback}\n\nCorrectly solve the original question.\n") — قالب لإعادة توجيه المعلم مع عرض ناجح.
  • solution_template (str، اختياري، القيمة الافتراضية "\nCorrect solution -- \n\n{successful_previous_attempt}\n\n"): قالب لتنسيق نص العرض الناجح.
  • feedback_template (str، اختياري، القيمة الافتراضية "\nThe following is feedback from your unsuccessful earlier attempt -- \n\n{feedback_raw}\n\n"): قالب لتنسيق ملاحظات البيئة لإعادة الطلب.
  • include_environment_feedback (bool، اختياري، القيمة الافتراضية False) — ما إذا كان يجب تضمين ملاحظات البيئة في إعادة التوجيهات للمعلم عندما تكون متاحة.
  • environment_feedback_only_without_solution (bool، اختياري، القيمة الافتراضية False) — ما إذا كان سيتم استخدام الملاحظات فقط عندما لا يتوفر حل ناجح.
  • remove_thinking_from_demonstration (bool، اختياري، القيمة الافتراضية False) — ما إذا كان يجب إزالة كتل <think>…</think> من نص العرض.

المعاملات التي تتحكم في التشخيص

  • diagnostics_warning_interval (int، اختياري، القيمة الافتراضية 10) — إصدار تشخيصات المتدرّب المتكررة كل N خطوات متتالية متدهورة. اضبطها على 0 لتعطيلها.
  • diagnostics_flat_tolerance (float، اختياري، القيمة الافتراضية 1e-8) — الحدّ المسموح به المستخدم لتحديد ما إذا كانت تباين المكافأة أو نشاط إعادة الطلب صفرًا فعليًا.

المعاملات التي تتحكم في النموذج

  • model_init_kwargs (dict[str, Any], اختياري) — حجج الكلمات المفتاحية لـ transformers.AutoModelForCausalLM.from_pretrained، تُستخدم عندما يُقدَّم الحجة model لـ SDPOTrainer كنص. كما يُستخدم قيمة revision عند تحميل فئات المعالجة.
  • trust_remote_code (bool, optional, defaults to False) — Whether to allow loading models and tokenizers that ship custom Python code from the Hub. Forwarded to from_pretrained and from_pretrained. Also applied to reward-model and reward-tokenizer loads.
  • disable_dropout (bool، اختياري، القيمة الافتراضية True) — ما إذا كان سيتم تعطيل إسقاط العينة (dropout) في النموذج. هذا مفيد للتدريب مع نموذج مرجعي، حيث يمنع النموذج من توليد احتمالات سجلات (logprobs) مختلفة لنفس المدخل.

المعاملات التي تتحكم في المعالجة المسبقة للبيانات

  • remove_unused_columns (bool، اختياري، القيمة الافتراضية False) — ما إذا كان يجب الإبقاء على العمود ‘prompt’ فقط في مجموعة البيانات. إذا كنت تستخدم دالة مكافأة مخصصة تتطلب أي عمود غير ‘prompts’ و ‘completions’، فيجب عليك إبقاء هذا الإعداد على False.
  • max_prompt_length (int، اختياري، القيمة الافتراضية 512) — الحد الأقصى لطول الاستدعاء. يتم اقتطاع الاستدعاءات الأطول من الجهة اليسرى.
  • shuffle_dataset (bool، اختياري، القيمة الافتراضية True) — ما إذا كان سيتم خلط مجموعة بيانات التدريب.

المعاملات التي تتحكم في التوليد

  • num_generations (int، اختياري، القيمة الافتراضية 8) — عدد الأجيال التي سيتم أخذ عينات منها. يجب أن يكون حجم الدفعة الفعّال (num_processes per_device_batch_size gradient_accumulation_steps) قابلاً للقسمة على هذا القيمة دون باقي.
  • num_generations_eval (int, اختياري) — عدد الأجيال التي سيتم أخذ عينات منها أثناء التقييم. يتيح ذلك استخدام عدد أقل من الأجيال أثناء التقييم لتوفير الحسابات. إذا كان None، يتم استخدام قيمة num_generations.
  • max_completion_length (int، اختياري، القيمة الافتراضية 256) — الحد الأقصى لطول الإكمال المولّد.
  • temperature (float، اختياري، القيمة الافتراضية 1.0) — درجة الحرارة للعينات. كلما زادت درجة الحرارة، زادت عشوائية المكملات.
  • top_p (float، اختياري، القيمة الافتراضية 1.0) — قيمة عشرية تتحكم في الاحتمال التراكمي لأعلى الرموز المراد أخذها في الاعتبار. يجب أن تكون ضمن المجال (0، 1]. اضبطها على 1.0 لاعتبار جميع الرموز.
  • top_k (int، اختياري، القيمة الافتراضية 0) — عدد رموز المفردات ذات أعلى احتمالات التي يجب الاحتفاظ بها لتصفية top-k. إذا كانت القيمة 0، يتم تعطيل تصفية top-k وتُعتبر جميع الرموز.
  • min_p (float, اختياري) — أدنى احتمال للرمز، والذي يُضرب في احتمال الرمز الأكثر احتمالاً. يجب أن يكون قيمة بين 0.0 و 1.0. القيم النموذجية تقع ضمن نطاق 0.01-0.2.
  • repetition_penalty (float، اختياري، القيمة الافتراضية 1.0) — قيمة عشرية تعاقب الرموز الجديدة بناءً على ما إذا كانت تظهر في الاستعلام والنص المولَّد حتى الآن. القيم > 1.0 تشجع النموذج على استخدام رموز جديدة، بينما القيم < 1.0 تشجع النموذج على تكرار الرموز.
  • cache_implementation (str، اختياري) — تنفيذ طريقة التخزين المؤقت لتسريع التوليد عند ضبط use_vllm على False.
  • generation_kwargs (dict[str, Any], اختياري) — معلمات إضافية بالكلمات المفتاحية تُمرَّر إلى GenerationConfig (في حال استخدام transformers) أو SamplingParams (في حال استخدام vLLM) عند أخذ عينات من المكملات. يمكن استخدام هذا لتخصيص سلوك التوليد بشكل أكبر، مثل ضبط suppress_tokens، num_beams، وما إلى ذلك. إذا احتوى على مفاتيح تتعارض مع معلمات التوليد الأخرى (مثل min_p، top_p، وما إلى ذلك)، فستتجاوزها.
  • chat_template_kwargs (dict[str, Any]، اختياري) — معلمات إضافية بالكلمات المفتاحية تُمرَّر إلى دالة apply_chat_template عند توليد الإكمالات.
  • ds3_gather_for_generation (bool، اختياري، القيمة الافتراضية True) — تنطبق هذه الإعدادات على DeepSpeed ZeRO-3. إذا تم تفعيلها، يتم تجميع أوزان نموذج السياسة للتوليد، مما يحسّن سرعة التوليد. ومع ذلك، فإن تعطيل هذا الخيار يتيح تدريب نماذج تتجاوز سعة ذاكرة VRAM لبطاقة رسومات واحدة، على الرغم من أن ذلك يأتي على حساب بطء التوليد. لا يتوافق تعطيل هذا الخيار مع توليد vLLM.

المعاملات التي تتحكم في تسريع التوليد المدعوم بواسطة vLLM

  • use_vllm (bool، اختياري، القيمة الافتراضية False) — ما إذا كان سيتم استخدام vLLM لتوليد المكملات. إذا تم ضبطه على True، فسيستخدم المدرب vLLM للتوليد بدلاً من model.generate() الافتراضي. يتطلب تثبيت vllm.
  • use_teacher_server (bool، اختياري، القيمة الافتراضية False) — احسب احتمالات المعلم (logprobs) من خادم توليد vLLM قيد التشغيل بدلاً من تمرير محلي للمعلم. مدعوم فقط عند استخدام teacher_model_kind='live' مع use_vllm=True، vllm_mode='server'، distillation_weight=1.0 (تقطير نقي)، وdistillation_mode ضمن {‘sampled_token’، ‘topk_logits’} (يعيد الخادم احتمالات أعلى k للمعلم، وليس كامل المفردات؛ topk_logits يقوم بالتقطير على دعم أعلى k الخاص بالمعلم نفسه).
  • vllm_mode (str, اختياري، القيمة الافتراضية "colocate") — الوضع المستخدم لتكامل vLLM عند ضبط use_vllm على True. يجب أن يكون أحد 'server' أو 'colocate'. 'server': سيقوم المدرب بإرسال طلبات التوليد إلى خادم vLLM منفصل. تأكد من أن خادم vLLM قيد التشغيل (ابدأه باستخدام vllm serve). 'colocate': سيعمل vLLM في نفس العملية ويشارك وحدات معالجة الرسوميات الخاصة بالتدريب. هذا يتجنب الحاجة إلى خادم منفصل لكنه قد يسبب تنافساً على الموارد مع التدريب.
  • vllm_model_impl (str، اختياري، القيمة الافتراضية "vllm") — تنفيذ النموذج المستخدم في vLLM. يجب أن يكون أحد transformers أو vllm. transformers: استخدام خلفية transformers لتنفيذ النموذج. vllm: استخدام مكتبة vllm لتنفيذ النموذج.
  • vllm_enable_sleep_mode (bool، اختياري، القيمة الافتراضية False) — تفعيل وضع السكون في vLLM لتفريغ الأوزان/الذاكرة المؤقتة أثناء خطوة المُحسِّن. يُبقي استخدام ذاكرة وحدة معالجة الرسوميات منخفضًا، لكن استيقاظ المحرّك يضيف زمن انتقال بين المضيف والوحدة.
  • vllm_server_base_url (str, اختياري) — العنوان الأساسي لخادم vLLM (مثل ‘http://localhost:8000’). إذا تم تقديمه، يتم تجاهل vllm_server_host و vllm_server_port.
  • vllm_server_host (str، اختياري، القيمة الافتراضية "0.0.0.0") — عنوان مضيف خادم vLLM الذي سيتم الاتصال به. يتم تجاهل هذا المعامل إذا تم تقديم vllm_server_base_url.
  • vllm_server_port (int, اختياري، القيمة الافتراضية 8000) — منفذ خادم vLLM الذي يجب الاتصال به. يتم تجاهله إذا تم توفير vllm_server_base_url.
  • vllm_group_port (int، اختياري، القيمة الافتراضية 51216) — رقم المنفذ لمجموعة تحديث الأوزان. يُستخدم للتواصل مع خادم vLLM. ما لم يكن المنفذ مشغولاً، فلا حاجة لتغييره.
  • vllm_server_timeout (float, اختياري, القيمة الافتراضية 240.0) — المدة الإجمالية للوقت المحدد بالثواني للانتظار حتى يصبح خادم vLLM قيد التشغيل. إذا لم يكن الخادم قيد التشغيل بعد انتهاء المهلة، يتم رفع ConnectionError.
  • vllm_tensor_parallel_size (int, اختياري، القيمة الافتراضية 1) — التحكم في حجم التوازي للتensors في vLLM. لا تنطبق هذه الإعدادات إلا عندما تكون قيمة vllm_mode هي 'colocate'. إذا كنت تستخدم vllm_mode='server'، فيجب تمرير هذا المعامل بشكل منفصل عند إطلاق خادم vLLM عبر علم --vllm_tensor_parallel_size.
  • vllm_gpu_memory_utilization (float, اختياري، القيمة الافتراضية 0.3) — التحكم في استهلاك ذاكرة GPU في vLLM. لا تنطبق هذه الإعدادات إلا عندما تكون قيمة vllm_mode هي 'colocate'. إذا كنت تستخدم vllm_mode='server'، فيجب تمرير هذا المعامل بشكل منفصل عند إطلاق خادم vLLM عبر علم --vllm_gpu_memory_utilization.
  • vllm_max_model_length (int, اختياري) — نافذة السياق الخاصة بـ vLLM. اضبطه على الأقل على طول الإدخال الأقصى في مجموعة البيانات مضافًا إليه max_completion_length؛ وإذا تم تجاهله، فسيتم استنتاجه من إعدادات النموذج.

المعاملات التي تتحكم في التدريب

  • loss_type (str، اختياري، القيمة الافتراضية "dapo") — يحدد صيغة الدالة الخاسرة (loss) المستخدمة. القيم المدعومة هي ‘grpo’ و ‘bnpo’ و ‘dr_grpo’ و ‘dapo’. ‘grpo’: تجمع الخسائر على مستوى الرموز (tokens) عن طريق التطبيع على طول التسلسل. لا يُنصح باستخدامها بسبب انحياز الطول؛ فتنحاز هذه المنهجية إلى تفضيل الإكمالات الأقصر ذات المزايا الإيجابية والأطول ذات المزايا السلبية. ‘dapo’ (الافتراضي): تجمع الخسائر على مستوى الرموز عن طريق التطبيع على عدد الرموز النشطة في الدفعة المتراكمة عالمياً (global accumulated batch). تم تقديم هذه المنهجية في ورقة DAPO للقضاء على انحياز الطول. ‘dr_grpo’: تجمع الخسائر على مستوى الرموز عن طريق التطبيع على ثابت عالمي. تم تقديم هذه المنهجية في ورقة Dr. GRPO للقضاء على انحياز الطول. قيمة الثابت تتوافق مع max_completion_length. ‘bnpo’: تجمع الخسائر على مستوى الرموز عن طريق التطبيع على عدد الرموز النشطة في الدفعة المحلية (local batch). لاحظ أن التطبيع يتم على الدفعة المحلية فقط، لذا قد تختلف النتائج قليلاً اعتماداً على حجم الدفعة المحلية، على الرغم من ثبات حجم الدفعة الفعالة. عند استخدام per_device_train_batch_size==1، تكون الدالة الخاسرة مكافئة لدالة GRPO.
  • num_iterations (int، اختياري، القيمة الافتراضية 1) — عدد التكرارات لكل دفعة (يُرمز له بـ μ في الخوارزمية).
  • generation_batch_size (int، اختياري) — حجم الدفعة المستخدمة للتوليد. إذا كانت None، فإن القيمة الافتراضية هي حجم دفعة التدريب الفعلية: per_device_train_batch_size * num_processes * steps_per_generation.
  • steps_per_generation (int، اختياري) — عدد الخطوات لكل عملية توليد. إذا كانت None، فإن القيمة الافتراضية هي gradient_accumulation_steps.
  • mask_truncated_completions (bool، اختياري، القيمة الافتراضية False) — عند التفعيل، تُستبعد الإكمالات المقطوعة من حساب الخسارة، مما يمنع معاقبتها بشكل غير صحيح وتدخل ضوضاء أثناء التدريب. وفقًا لورقة DAPO، يُعد هذا ممارسة جيدة لاستقرار التدريب.

فئة التهيئة الخاصة بـ experimental.sdpo.SDPOTrainer.

SDPOTrainer

فئة trl.experimental.sdpo.SDPOTrainer

< >

( model: typing.Union[str, transformers.modeling_utils.PreTrainedModel, torch.nn.Module]reward_funcs: typing.Any | list[typing.Any] | None = Noneargs: trl.experimental.sdpo.sdpo_config.SDPOConfig | None = Nonetrain_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | None = Noneeval_dataset: datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset | dict[str, datasets.arrow_dataset.Dataset | datasets.iterable_dataset.IterableDataset] | None = Noneprocessing_class: transformers.tokenization_utils_base.PreTrainedTokenizerBase | transformers.processing_utils.ProcessorMixin | None = Nonereward_processing_classes: transformers.tokenization_utils_base.PreTrainedTokenizerBase | list[transformers.tokenization_utils_base.PreTrainedTokenizerBase] | None = Nonecallbacks: list[transformers.trainer_callback.TrainerCallback] | None = Noneoptimizers: tuple[typing.Optional[torch.optim.Optimizer], typing.Optional[torch.optim.lr_scheduler.LambdaLR]] = (None, None)peft_config = None )

Trainer لتحسين سياسة التوزيع الذاتي (SDPO).

يعزز SDPO التحسين على المسار (on-policy) عبر التلقين الذاتي (self-distillation) من المسارات عالية المكافأة الخاصة بالنموذج نفسه. وهو يحوّل الملاحظات المُرمَّزة (tokenized) إلى إشارة تعلّم كثيفة دون الحاجة إلى معلّم خارجي أو نموذج مكافأة صريح. ويعامل SDPO النموذج الحالي المشروط بالملاحظات كمعلّم ذاتي، ويستخلص توقعاته للرمز التالي المستندة إلى الملاحظات ليعيدها إلى السياسة (policy).

تدريب

< >

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

Update on GitHub