Skip to content

Commit 2cc9152

Browse files
FIX Broken PEFT adapter loading (#42187)
* FIX Broken PEFT adapter loading For some time now, loading PEFT adapters directly with transformers is broken when using revisions or subfolders. To check, run: RUN_SLOW=1 pytest tests/peft_integration/test_peft_integration.py -k test_peft_from_pretrained_hub_kwargs This PR makes the PEFT tests pass. The PR causing this is #41445 (bad commit: 1ee3b28, previous good comit: cad7449). However, that PR also caused other errors (see #41604), which is why this error was not immediately obvious. * Fix for adapter_kwargs being None
1 parent 8637f6e commit 2cc9152

File tree

4 files changed

+18
-15
lines changed

4 files changed

+18
-15
lines changed

src/transformers/integrations/peft.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -654,17 +654,18 @@ def maybe_load_adapters(
654654
token_from_adapter_kwargs = adapter_kwargs.pop("token", None)
655655

656656
if _adapter_model_path is None:
657+
peft_kwargs = adapter_kwargs.copy()
658+
for arg_name in ("cache_dir", "proxies", "subfolder"): # don't override revision
659+
if (arg_name not in peft_kwargs) and (arg_name in download_kwargs):
660+
peft_kwargs[arg_name] = download_kwargs[arg_name]
661+
if "commit_hash" in download_kwargs:
662+
peft_kwargs["_commit_hash"] = download_kwargs["commit_hash"]
663+
peft_kwargs["force_download"] = bool(download_kwargs.get("force_download", False))
664+
peft_kwargs["local_files_only"] = bool(download_kwargs.get("local_files_only", False))
665+
peft_kwargs["token"] = token or token_from_adapter_kwargs
657666
_adapter_model_path = find_adapter_config_file(
658667
pretrained_model_name_or_path,
659-
cache_dir=download_kwargs.get("cache_dir"),
660-
force_download=bool(download_kwargs.get("force_download", False)),
661-
proxies=download_kwargs.get("proxies"),
662-
token=token or token_from_adapter_kwargs,
663-
revision=download_kwargs.get("revision"),
664-
local_files_only=bool(download_kwargs.get("local_files_only", False)),
665-
subfolder=download_kwargs.get("subfolder", ""),
666-
_commit_hash=download_kwargs.get("commit_hash"),
667-
**adapter_kwargs,
668+
**peft_kwargs,
668669
)
669670

670671
if _adapter_model_path is not None and os.path.isfile(_adapter_model_path):

src/transformers/modeling_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3881,7 +3881,7 @@ def from_pretrained(
38813881
subfolder = kwargs.pop("subfolder", "")
38823882
commit_hash = kwargs.pop("_commit_hash", None)
38833883
variant = kwargs.pop("variant", None)
3884-
adapter_kwargs = kwargs.pop("adapter_kwargs", {})
3884+
adapter_kwargs = (kwargs.pop("adapter_kwargs", {}) or {}).copy()
38853885
adapter_name = kwargs.pop("adapter_name", "default")
38863886
generation_config = kwargs.pop("generation_config", None)
38873887
gguf_file = kwargs.pop("gguf_file", None)

src/transformers/models/auto/auto_factory.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,9 @@ def from_pretrained(cls, pretrained_model_name_or_path: Union[str, os.PathLike[s
288288
if is_peft_available():
289289
if adapter_kwargs is None:
290290
adapter_kwargs = {}
291-
if token is not None:
292-
adapter_kwargs["token"] = token
291+
adapter_kwargs = adapter_kwargs.copy() # avoid mutating original
292+
if token is not None:
293+
adapter_kwargs["token"] = token
293294

294295
maybe_adapter_path = find_adapter_config_file(
295296
pretrained_model_name_or_path, _commit_hash=commit_hash, **adapter_kwargs

tests/peft_integration/test_peft_integration.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,20 +699,21 @@ def test_peft_from_pretrained_hub_kwargs(self):
699699
with self.assertRaises(OSError):
700700
_ = AutoModelForCausalLM.from_pretrained(peft_model_id)
701701

702-
adapter_kwargs = {"revision": "test"}
703-
704702
# This should work
703+
adapter_kwargs = {"revision": "test"}
705704
model = AutoModelForCausalLM.from_pretrained(peft_model_id, adapter_kwargs=adapter_kwargs)
706705
self.assertTrue(self._check_lora_correctly_converted(model))
707706

707+
# note: always create new adapter_kwargs, avoid the test relying on the previous calls possibly mutating them
708+
adapter_kwargs = {"revision": "test"}
708709
model = OPTForCausalLM.from_pretrained(peft_model_id, adapter_kwargs=adapter_kwargs)
709710
self.assertTrue(self._check_lora_correctly_converted(model))
710711

711712
adapter_kwargs = {"revision": "main", "subfolder": "test_subfolder"}
712-
713713
model = AutoModelForCausalLM.from_pretrained(peft_model_id, adapter_kwargs=adapter_kwargs)
714714
self.assertTrue(self._check_lora_correctly_converted(model))
715715

716+
adapter_kwargs = {"revision": "main", "subfolder": "test_subfolder"}
716717
model = OPTForCausalLM.from_pretrained(peft_model_id, adapter_kwargs=adapter_kwargs)
717718
self.assertTrue(self._check_lora_correctly_converted(model))
718719

0 commit comments

Comments
 (0)