From 7c80a1df9f46215eb92b4edc69933590aae39a16 Mon Sep 17 00:00:00 2001 From: Fix Author Date: Thu, 9 Apr 2026 14:15:40 +0800 Subject: [PATCH] [bugfix] Fix Qwen3.5 LoRA merge export producing wrong state_dict keys (#9046) In transformers>=5.5.0, `save_pretrained` calls `revert_weight_conversion` which incorrectly applies weight key renaming for composite models like Qwen3.5. The conversion mapping `^model.language_model -> model` causes keys like `model.language_model.layers.X.*` to be doubly prefixed as `model.language_model.language_model.language_model.layers.X.*`, and `model.visual.*` to become `model.language_model.visual.*`. Fix: Pass `save_original_format=False` to `save_pretrained` to skip the buggy `revert_weight_conversion` step. The in-memory state_dict already has correct keys matching the model's safetensors format. A version check via `inspect.signature` ensures backward compatibility with older transformers versions that lack this parameter. --- swift/model/utils.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/swift/model/utils.py b/swift/model/utils.py index 7eaa9f5535..6cf16b7bfb 100644 --- a/swift/model/utils.py +++ b/swift/model/utils.py @@ -296,7 +296,15 @@ def save_checkpoint(model: Optional[PreTrainedModel], additional_saved_files: Optional[List[str]] = None) -> None: if model is not None: if model.__class__.__name__ != 'SentenceTransformer': - model.save_pretrained(output_dir, safe_serialization=safe_serialization, max_shard_size=max_shard_size) + # Pass save_original_format=False to avoid transformers>=5.5 revert_weight_conversion bug + # that corrupts state_dict keys for composite models (e.g. Qwen3.5). + # See: https://github.com/modelscope/ms-swift/issues/9046 + save_kwargs = {} + import inspect + if 'save_original_format' in inspect.signature(model.save_pretrained).parameters: + save_kwargs['save_original_format'] = False + model.save_pretrained( + output_dir, safe_serialization=safe_serialization, max_shard_size=max_shard_size, **save_kwargs) else: model.save_pretrained(output_dir, safe_serialization=safe_serialization) # copy sentencetransformers files