TRL documentation
SDPO
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 noSDPOConfig
فئة trl.experimental.sdpo.SDPOConfig
< source >( 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 toFalse) — 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
< source >( 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).
تدريب
< 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
المعاملات
- 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
كائن يحتوي على عدد الخطوات العالمية، وخسارة التدريب، والمقاييس.
نقطة الدخول الرئيسية للتدريب.
سيحفظ النموذج، بحيث يمكنك إعادة تحميله باستخدام from_pretrained().
سيتم الحفظ من العملية الرئيسية فقط.
push_to_hub
< source >( 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.