From 962e0f0d355bf24786f4e6983ea291a38cbd9791 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Mon, 16 Mar 2026 11:35:26 +0000 Subject: [PATCH] Fix TrainingArguments to config conversion in _backwards_compatible_trainer The isinstance guard checked against TrainingArguments, but all TRL config classes (DPOConfig, GRPOConfig, SFTConfig, etc.) inherit from it, so the check was always True and the conversion branch was never reached. When a user passed plain TrainingArguments to DPOTrainer, it was forwarded as-is, causing AttributeError on config-specific attributes like padding_value. Check against config_class instead so plain TrainingArguments is properly converted while already-correct configs pass through unchanged. This preserves the GRPO/RLOO mutual-exclusivity guard since those configs are not re-initialized. Fixes #4155 --- unsloth/trainer.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/unsloth/trainer.py b/unsloth/trainer.py index 65abe6801f..10750dfc28 100644 --- a/unsloth/trainer.py +++ b/unsloth/trainer.py @@ -302,11 +302,14 @@ def _backwards_compatible_trainer(trainer_class, config_class): # Reinitialising config class with parameters (that were none initially but populated on first init) # causes the 2nd init to fail as there are mutual exclusive checks on pairs of parameters. # Refer: https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_config.py#L499-L502 for example - # So we only create config class if the previous init was not TrainingArguments - if not isinstance(training_args, TrainingArguments): - config = config_class(**config_dict) - else: + # So we only create config class if training_args is not already the correct type. + # We check against config_class (not TrainingArguments) because all TRL configs + # (DPOConfig, GRPOConfig, etc.) are subclasses of TrainingArguments, so isinstance + # against TrainingArguments is always True and never triggers conversion. + if isinstance(training_args, config_class): config = training_args + else: + config = config_class(**config_dict) # Reconstruct kwargs for Trainer kwargs = trainer_kwargs