From cbd48a079b08e8a3434102378a2b4b028604182a Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Thu, 27 Mar 2025 17:21:18 +1030 Subject: [PATCH 1/7] 1st sine lora --- src/peft/tuners/lora/layer.py | 14 ++++++++------ src/peft/tuners/lora/variants.py | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/peft/tuners/lora/layer.py b/src/peft/tuners/lora/layer.py index 8ff0ff6a04..9b3a38ae8d 100644 --- a/src/peft/tuners/lora/layer.py +++ b/src/peft/tuners/lora/layer.py @@ -785,14 +785,16 @@ def __init__( lora_bias=lora_bias, ) - def resolve_lora_variant(self, *, use_dora: bool, **kwargs) -> Optional[LoraVariant]: - if not use_dora: + def resolve_lora_variant(self, *, use_dora: bool, use_sine_lora:bool,**kwargs) -> Optional[LoraVariant]: + if use_dora: + from .variants import DoraEmbeddingVariant + return DoraEmbeddingVariant() + elif use_sine_lora: + from .variants import SineLoraLinearVariant + return SineLoraLinearVariant() + else: return None - from .variants import DoraEmbeddingVariant - - return DoraEmbeddingVariant() - def update_layer( self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, lora_bias ): diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 042d5ee1a7..9709926a97 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -285,3 +285,22 @@ class DoraConv3dVariant(_DoraConvNdVariant): def init(module: Conv3d, adapter_name: str) -> None: dora_layer = DoraConv3dLayer(fan_in_fan_out=False) _DoraConvNdVariant.init_convd_variant(module, adapter_name, dora_layer=dora_layer) + + +class SineLoraLinearVariant(LoraVariant): + @staticmethod + def init(module: Linear, adapter_name:str) -> None: + module.freq = + + if module.sine_scaling is None: + import math + module.sine_scaling = math.sqrt(module.in_features) + + @staticmethod + def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: + + lora_A = module.lora_A[active_adapter] + lora_B = module.lora_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + sine_output = x @ torch.sin(module.freq * lora_B.weight.T @ lora_A.weight) / module.sine_scaling * lora_scaling + result = result + sine_output \ No newline at end of file From d98ab16a84da901899203b867f329c2b9194ad15 Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Fri, 28 Mar 2025 14:40:14 +1030 Subject: [PATCH 2/7] update sine_lora code --- =3 | 5 +++++ src/peft/tuners/lora/config.py | 30 ++++++++++++++++++++++++++++++ src/peft/tuners/lora/model.py | 3 +++ src/peft/tuners/lora/variants.py | 1 - tests/test_custom_models.py | 3 ++- 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 =3 diff --git a/=3 b/=3 new file mode 100644 index 0000000000..1d0d62d1a8 --- /dev/null +++ b/=3 @@ -0,0 +1,5 @@ +Collecting oauthlib + Using cached oauthlib-3.2.2-py3-none-any.whl.metadata (7.5 kB) +Using cached oauthlib-3.2.2-py3-none-any.whl (151 kB) +Installing collected packages: oauthlib +Successfully installed oauthlib-3.2.2 diff --git a/src/peft/tuners/lora/config.py b/src/peft/tuners/lora/config.py index 8424e9dd5b..adbda13e73 100644 --- a/src/peft/tuners/lora/config.py +++ b/src/peft/tuners/lora/config.py @@ -297,6 +297,10 @@ class LoraConfig(PeftConfig): ranks. Right now, DoRA only supports linear and Conv2D layers. DoRA introduces a bigger overhead than pure LoRA, so it is recommended to merge weights for inference. For more information, see https://arxiv.org/abs/2402.09353. + use_sine_lora (`bool`): + Enable 'Sine Activated Low-Rank Adaptation' (Sine-LoRA). This technique introduce to apply sine activation + on the low-rank adaptor. This can be beneficial for rank boosting for low-rank matrices and enhancing its + capacity. For more information, see https://arxiv.org/pdf/2403.19243. layer_replication (`List[Tuple[int, int]]`): Build a new stack of layers by stacking the original model layers according to the ranges specified. This allows expanding (or shrinking) the model without duplicating the base model weights. The new layers will @@ -493,6 +497,31 @@ class LoraConfig(PeftConfig): ) }, ) + use_sinelora: bool = field( + default=False, + metadata={ + "help": ( + "Enable This technique introduce to apply sine activation on the low-rank adaptor." + "This can be beneficial for rank boosting for low-rank matrices and enhancing its capacity, especially at low ranks." + ) + }, + ) + sinelora_frequency: float = field( + default=200.0, + metadata={ + "help": ( + "The frequency factor for the sine activation. If not specified, it will be set to the default value of 200." + ) + }, + ) + sinelora_scaling: float = field( + default=None, + metadata={ + "help": ( + "The scaling factor for the sine activation. If not specified, it will be set to the default value of sqrt(in_features)." + ) + }, + ) # Enables replicating layers in a model to expand it to a larger model. layer_replication: Optional[list[tuple[int, int]]] = field( default=None, @@ -597,6 +626,7 @@ def __post_init__(self): ) if self.use_dora: raise ValueError("The argument lora_bias=True is not supported for DoRA, please pass use_dora=False") + # Using post training conversion of modified base weights to restore their initial values PiSSA/CorDA/OLoRA cannot # be correctly done when using rslora + rank_pattern/alpha_pattern. We can't really know if the user intends diff --git a/src/peft/tuners/lora/model.py b/src/peft/tuners/lora/model.py index afa6929819..3c9bdccc26 100644 --- a/src/peft/tuners/lora/model.py +++ b/src/peft/tuners/lora/model.py @@ -199,6 +199,9 @@ def _create_and_replace( "init_lora_weights": lora_config.init_lora_weights, "use_rslora": lora_config.use_rslora, "use_dora": lora_config.use_dora, + "use_sinelora": lora_config.use_sinelora, + "sinelora_frequency": lora_config.sinelora_frequency, + "sinelora_scaling": lora_config.sinelora_scaling, "ephemeral_gpu_offload": lora_config.runtime_config.ephemeral_gpu_offload, "lora_bias": lora_config.lora_bias, "loaded_in_8bit": getattr(self.model, "is_loaded_in_8bit", False), diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 25d391e778..cffcf0d47c 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -292,7 +292,6 @@ def init(module: Conv3d, adapter_name: str, **kwargs: Any) -> None: class SineLoraLinearVariant(LoraVariant): @staticmethod def init(module: Linear, adapter_name:str) -> None: - module.freq = if module.sine_scaling is None: import math diff --git a/tests/test_custom_models.py b/tests/test_custom_models.py index 69358d018d..59edcdc358 100644 --- a/tests/test_custom_models.py +++ b/tests/test_custom_models.py @@ -68,7 +68,8 @@ ("Vanilla MLP 1 LoRA", "MLP", LoraConfig, {"target_modules": "lin0"}), ("Vanilla MLP 2 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0"]}), ("Vanilla MLP 3 LoRA", "MLP", LoraConfig, {"target_modules": ["lin1"]}), - ("Vanilla MLP 4 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"]}), + ("Vanilla MLP 4 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"],"use_sine_lora": True}), + ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"]}), ("Vanilla MLP 5 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0"], "modules_to_save": ["lin1"]}), ( "Vanilla MLP 6 LoRA", From f27ef972865c56838bcfde298f11bcef8a0d6d69 Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Fri, 28 Mar 2025 14:49:59 +1030 Subject: [PATCH 3/7] updated sine lora --- src/peft/tuners/lora/variants.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index cffcf0d47c..5c90603ec8 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -293,9 +293,9 @@ class SineLoraLinearVariant(LoraVariant): @staticmethod def init(module: Linear, adapter_name:str) -> None: - if module.sine_scaling is None: + if module.sinelora_scaling is None: import math - module.sine_scaling = math.sqrt(module.in_features) + module.sinelora_scaling = math.sqrt(module.in_features) @staticmethod def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: @@ -303,5 +303,5 @@ def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch. lora_A = module.lora_A[active_adapter] lora_B = module.lora_B[active_adapter] lora_scaling = module.scaling[active_adapter] - sine_output = x @ torch.sin(module.freq * lora_B.weight.T @ lora_A.weight) / module.sine_scaling * lora_scaling + sine_output = x @ torch.sin(module.sinelora_frequency * lora_B.weight.T @ lora_A.weight) / module.sinelora_scaling * lora_scaling result = result + sine_output \ No newline at end of file From 8ed09c4cc36b6f8379669af98957314d061a89e9 Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Sat, 29 Mar 2025 12:42:23 +1030 Subject: [PATCH 4/7] updated --- posters/.$Untitled Diagram.drawio.dtmp | 76 +++++++++++++++++++++++++ posters/Untitled Diagram.drawio | 76 +++++++++++++++++++++++++ posters/Untitled Diagram.drawio.pdf | Bin 0 -> 75078 bytes src/peft/tuners/lora/config.py | 11 +++- src/peft/tuners/lora/layer.py | 39 ++++++++----- src/peft/tuners/lora/variants.py | 21 +++++-- tests/test_custom_models.py | 7 ++- 7 files changed, 206 insertions(+), 24 deletions(-) create mode 100644 posters/.$Untitled Diagram.drawio.dtmp create mode 100644 posters/Untitled Diagram.drawio create mode 100644 posters/Untitled Diagram.drawio.pdf diff --git a/posters/.$Untitled Diagram.drawio.dtmp b/posters/.$Untitled Diagram.drawio.dtmp new file mode 100644 index 0000000000..27e621b607 --- /dev/null +++ b/posters/.$Untitled Diagram.drawio.dtmp @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/posters/Untitled Diagram.drawio b/posters/Untitled Diagram.drawio new file mode 100644 index 0000000000..fde54ae017 --- /dev/null +++ b/posters/Untitled Diagram.drawio @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/posters/Untitled Diagram.drawio.pdf b/posters/Untitled Diagram.drawio.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92b168a4c2daded3bae5a448565cb0969f2f5794 GIT binary patch literal 75078 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%0D@9P4u(KP}{yk&_JE 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 This technique introduce to apply sine activation on the low-rank adaptor." - "This can be beneficial for rank boosting for low-rank matrices and enhancing its capacity, especially at low ranks." + "Enable 'Sine Activated Low-Rank Adaptation' (Sine-LoRA). This technique introduce to apply sine activation " + "on the low-rank adaptor. This can be beneficial for rank boosting for low-rank matrices and enhancing its " + "capacity. For more information, see https://arxiv.org/pdf/2403.19243. " ) }, ) diff --git a/src/peft/tuners/lora/layer.py b/src/peft/tuners/lora/layer.py index eb65432111..c84b481864 100644 --- a/src/peft/tuners/lora/layer.py +++ b/src/peft/tuners/lora/layer.py @@ -158,7 +158,7 @@ def __init__(self, base_layer: nn.Module, ephemeral_gpu_offload: bool = False, * self.in_features = in_features self.out_features = out_features - def resolve_lora_variant(self, *, use_dora: bool, **kwargs) -> Optional[LoraVariant]: + def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: """Return a matching LoRA variant for this layer type. Given the init arguments of this layer, return the correct LoRA variant, if any. E.g., if `use_dora=True`, this @@ -170,6 +170,9 @@ def resolve_lora_variant(self, *, use_dora: bool, **kwargs) -> Optional[LoraVari convention, and not here. """ + if use_sinelora: + from .variants import SineLoraLinearVariant + return SineLoraLinearVariant() return None def update_layer( @@ -181,6 +184,7 @@ def update_layer( init_lora_weights, use_rslora, use_dora: bool = False, + use_sinelora: bool = False, lora_bias: bool = False, ): # collect the kwargs @@ -191,7 +195,7 @@ def update_layer( if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") - lora_variant = self.resolve_lora_variant(use_dora=use_dora) + lora_variant = self.resolve_lora_variant(use_dora=use_dora,use_sinelora=use_sinelora) if lora_variant is not None: self.lora_variant[adapter_name] = lora_variant @@ -590,13 +594,18 @@ def __init__( ) self.is_target_conv_1d_layer = is_target_conv_1d_layer - def resolve_lora_variant(self, *, use_dora: bool, **kwargs) -> Optional[LoraVariant]: - if not use_dora: - return None + def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: + if use_dora: + from .variants import DoraLinearVariant + return DoraLinearVariant() + + elif use_sinelora: + from .variants import SineLoraLinearVariant + return SineLoraLinearVariant() + + return None - from .variants import DoraLinearVariant - return DoraLinearVariant() def merge(self, safe_merge: bool = False, adapter_names: Optional[list[str]] = None) -> None: """ @@ -792,18 +801,18 @@ def __init__( lora_bias=lora_bias, ) - def resolve_lora_variant(self, *, use_dora: bool, use_sine_lora:bool,**kwargs) -> Optional[LoraVariant]: + def resolve_lora_variant(self, *, use_dora: bool, use_sinelora:bool,**kwargs) -> Optional[LoraVariant]: if use_dora: from .variants import DoraEmbeddingVariant return DoraEmbeddingVariant() - elif use_sine_lora: - from .variants import SineLoraLinearVariant - return SineLoraLinearVariant() + elif use_sinelora: + from .variants import SineLoraEmbeddingVariant + return SineLoraEmbeddingVariant() else: return None def update_layer( - self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, lora_bias + self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, use_sinelora,lora_bias ): # collect the kwargs kwargs = locals().copy() @@ -812,7 +821,7 @@ def update_layer( if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") - lora_variant = self.resolve_lora_variant(use_dora=use_dora) + lora_variant = self.resolve_lora_variant(use_dora=use_dora,use_sinelora=use_sinelora) if lora_variant is not None: self.lora_variant[adapter_name] = lora_variant @@ -1065,7 +1074,7 @@ def __init__( ) def update_layer( - self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, lora_bias + self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, use_sinelora, lora_bias ): # collect the kwargs kwargs = locals().copy() @@ -1074,7 +1083,7 @@ def update_layer( if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") - lora_variant = self.resolve_lora_variant(use_dora=use_dora) + lora_variant = self.resolve_lora_variant(use_dora=use_dora,use_sinelora=use_sinelora) if lora_variant is not None: self.lora_variant[adapter_name] = lora_variant diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 5c90603ec8..65f3ea975c 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -14,7 +14,7 @@ from __future__ import annotations from typing import Any - +import math import torch from accelerate.utils.imports import is_xpu_available from torch import nn @@ -292,9 +292,7 @@ def init(module: Conv3d, adapter_name: str, **kwargs: Any) -> None: class SineLoraLinearVariant(LoraVariant): @staticmethod def init(module: Linear, adapter_name:str) -> None: - if module.sinelora_scaling is None: - import math module.sinelora_scaling = math.sqrt(module.in_features) @staticmethod @@ -304,4 +302,19 @@ def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch. lora_B = module.lora_B[active_adapter] lora_scaling = module.scaling[active_adapter] sine_output = x @ torch.sin(module.sinelora_frequency * lora_B.weight.T @ lora_A.weight) / module.sinelora_scaling * lora_scaling - result = result + sine_output \ No newline at end of file + result = result + sine_output + +class SineLoraEmbeddingVariant(SineLoraLinearVariant): + @staticmethod + def init(module: Linear, adapter_name:str) -> None: + if module.sinelora_scaling is None: + module.sinelora_scaling = math.sqrt(module.in_features) + + @staticmethod + def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: + lora_embedding_A = module.lora_embedding_A[active_adapter] + lora_embedding_B = module.lora_embedding_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + sine_output = module._embed(x) @ torch.sin(module.sinelora_frequency * lora_embedding_B.weight.T @ lora_embedding_A.weight) / module.sinelora_scaling * lora_scaling + result = result + sine_output + return result \ No newline at end of file diff --git a/tests/test_custom_models.py b/tests/test_custom_models.py index 59edcdc358..ab3c62e704 100644 --- a/tests/test_custom_models.py +++ b/tests/test_custom_models.py @@ -68,8 +68,7 @@ ("Vanilla MLP 1 LoRA", "MLP", LoraConfig, {"target_modules": "lin0"}), ("Vanilla MLP 2 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0"]}), ("Vanilla MLP 3 LoRA", "MLP", LoraConfig, {"target_modules": ["lin1"]}), - ("Vanilla MLP 4 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"],"use_sine_lora": True}), - ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"]}), + ("Vanilla MLP 4 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"]}), ("Vanilla MLP 5 LoRA", "MLP", LoraConfig, {"target_modules": ["lin0"], "modules_to_save": ["lin1"]}), ( "Vanilla MLP 6 LoRA", @@ -500,6 +499,10 @@ TrainableTokensConfig, {"target_modules": ["emb"], "token_indices": [0, 1, 3], "init_weights": False}, ), + ################### + # LoRA + SineLoRA # + ################### + ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"],"use_sinelora": True}), ] # For this test matrix, each tuple consists of: From f9ae3e9466623c0fbded98cd89c6433518a5432c Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Tue, 1 Apr 2025 01:09:15 +1030 Subject: [PATCH 5/7] updated --- =3 | 5 -- .../finetune_fp4_opt_bnb_peft.py | 2 +- posters/.$Untitled Diagram.drawio.dtmp | 76 ------------------ posters/Untitled Diagram.drawio | 76 ------------------ posters/Untitled Diagram.drawio.pdf | Bin 75078 -> 0 bytes src/peft/peft_model.py | 6 +- src/peft/tuners/lora/config.py | 7 +- src/peft/tuners/lora/eva.py | 2 +- src/peft/tuners/lora/layer.py | 46 ++++++++--- src/peft/tuners/lora/variants.py | 41 +++++++--- src/peft/utils/integrations.py | 2 +- tests/test_custom_models.py | 2 +- tests/test_initialization.py | 2 +- 13 files changed, 74 insertions(+), 193 deletions(-) delete mode 100644 =3 delete mode 100644 posters/.$Untitled Diagram.drawio.dtmp delete mode 100644 posters/Untitled Diagram.drawio delete mode 100644 posters/Untitled Diagram.drawio.pdf diff --git a/=3 b/=3 deleted file mode 100644 index 1d0d62d1a8..0000000000 --- a/=3 +++ /dev/null @@ -1,5 +0,0 @@ -Collecting oauthlib - Using cached oauthlib-3.2.2-py3-none-any.whl.metadata (7.5 kB) -Using cached oauthlib-3.2.2-py3-none-any.whl (151 kB) -Installing collected packages: oauthlib -Successfully installed oauthlib-3.2.2 diff --git a/examples/fp4_finetuning/finetune_fp4_opt_bnb_peft.py b/examples/fp4_finetuning/finetune_fp4_opt_bnb_peft.py index fa91eb8fc3..8e47864076 100755 --- a/examples/fp4_finetuning/finetune_fp4_opt_bnb_peft.py +++ b/examples/fp4_finetuning/finetune_fp4_opt_bnb_peft.py @@ -41,7 +41,7 @@ max_memory = f"{free_in_GB - 2}GB" n_gpus = torch.cuda.device_count() -max_memory = {i: max_memory for i in range(n_gpus)} +max_memory = dict.fromkeys(range(n_gpus), max_memory) model = AutoModelForCausalLM.from_pretrained( "facebook/opt-350m", diff --git a/posters/.$Untitled Diagram.drawio.dtmp b/posters/.$Untitled Diagram.drawio.dtmp deleted file mode 100644 index 27e621b607..0000000000 --- a/posters/.$Untitled Diagram.drawio.dtmp +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/posters/Untitled Diagram.drawio b/posters/Untitled Diagram.drawio deleted file mode 100644 index fde54ae017..0000000000 --- a/posters/Untitled Diagram.drawio +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/posters/Untitled Diagram.drawio.pdf b/posters/Untitled Diagram.drawio.pdf deleted file mode 100644 index 92b168a4c2daded3bae5a448565cb0969f2f5794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75078 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%0D@9P4u(KP}{yk&_JE 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 None: super().__init__() @@ -591,21 +590,22 @@ def __init__( use_rslora=use_rslora, use_dora=use_dora, lora_bias=lora_bias, + use_sinelora=use_sinelora, ) self.is_target_conv_1d_layer = is_target_conv_1d_layer def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: if use_dora: from .variants import DoraLinearVariant + return DoraLinearVariant() elif use_sinelora: from .variants import SineLoraLinearVariant - return SineLoraLinearVariant() - - return None + return SineLoraLinearVariant() + return None def merge(self, safe_merge: bool = False, adapter_names: Optional[list[str]] = None) -> None: """ @@ -779,6 +779,7 @@ def __init__( use_rslora: bool = False, use_dora: bool = False, lora_bias: bool = False, + use_sinelora: bool = False, **kwargs, ) -> None: if lora_bias: @@ -798,21 +799,33 @@ def __init__( init_lora_weights=init_lora_weights, use_rslora=use_rslora, use_dora=use_dora, + use_sinelora=use_sinelora, lora_bias=lora_bias, ) - def resolve_lora_variant(self, *, use_dora: bool, use_sinelora:bool,**kwargs) -> Optional[LoraVariant]: + def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: if use_dora: from .variants import DoraEmbeddingVariant + return DoraEmbeddingVariant() elif use_sinelora: from .variants import SineLoraEmbeddingVariant + return SineLoraEmbeddingVariant() else: return None def update_layer( - self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, use_sinelora,lora_bias + self, + adapter_name, + r, + lora_alpha, + lora_dropout, + init_lora_weights, + use_rslora, + use_dora, + use_sinelora, + lora_bias, ): # collect the kwargs kwargs = locals().copy() @@ -821,7 +834,7 @@ def update_layer( if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") - lora_variant = self.resolve_lora_variant(use_dora=use_dora,use_sinelora=use_sinelora) + lora_variant = self.resolve_lora_variant(use_dora=use_dora, use_sinelora=use_sinelora) if lora_variant is not None: self.lora_variant[adapter_name] = lora_variant @@ -1074,7 +1087,16 @@ def __init__( ) def update_layer( - self, adapter_name, r, lora_alpha, lora_dropout, init_lora_weights, use_rslora, use_dora, use_sinelora, lora_bias + self, + adapter_name, + r, + lora_alpha, + lora_dropout, + init_lora_weights, + use_rslora, + use_dora, + use_sinelora, + lora_bias, ): # collect the kwargs kwargs = locals().copy() @@ -1083,7 +1105,7 @@ def update_layer( if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") - lora_variant = self.resolve_lora_variant(use_dora=use_dora,use_sinelora=use_sinelora) + lora_variant = self.resolve_lora_variant(use_dora=use_dora, use_sinelora=use_sinelora) if lora_variant is not None: self.lora_variant[adapter_name] = lora_variant diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 65f3ea975c..1c686be6b3 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -13,8 +13,9 @@ # limitations under the License. from __future__ import annotations -from typing import Any import math +from typing import Any + import torch from accelerate.utils.imports import is_xpu_available from torch import nn @@ -291,30 +292,46 @@ def init(module: Conv3d, adapter_name: str, **kwargs: Any) -> None: class SineLoraLinearVariant(LoraVariant): @staticmethod - def init(module: Linear, adapter_name:str) -> None: - if module.sinelora_scaling is None: - module.sinelora_scaling = math.sqrt(module.in_features) - + def init(module: Linear, adapter_name: str, **kwargs) -> None: + module.sinelora_frequency = kwargs['sinelora_frequency'] + + sinelora_scaling = kwargs.get('sinelora_scaling') + if sinelora_scaling is not None: + module.sinelora_scaling = sinelora_scaling + @staticmethod def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: lora_A = module.lora_A[active_adapter] lora_B = module.lora_B[active_adapter] lora_scaling = module.scaling[active_adapter] - sine_output = x @ torch.sin(module.sinelora_frequency * lora_B.weight.T @ lora_A.weight) / module.sinelora_scaling * lora_scaling + sine_output = ( + x + @ torch.sin(module.sinelora_frequency * lora_B.weight.T @ lora_A.weight) + / module.sinelora_scaling + * lora_scaling + ) result = result + sine_output + class SineLoraEmbeddingVariant(SineLoraLinearVariant): @staticmethod - def init(module: Linear, adapter_name:str) -> None: - if module.sinelora_scaling is None: - module.sinelora_scaling = math.sqrt(module.in_features) + def init(module: Embedding, adapter_name: str, **kwargs) -> None: + module.sinelora_frequency = kwargs['sinelora_frequency'] - @staticmethod + sinelora_scaling = kwargs.get('sinelora_scaling') + if sinelora_scaling is not None: + module.sinelora_scaling = sinelora_scaling + @staticmethod def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: lora_embedding_A = module.lora_embedding_A[active_adapter] lora_embedding_B = module.lora_embedding_B[active_adapter] lora_scaling = module.scaling[active_adapter] - sine_output = module._embed(x) @ torch.sin(module.sinelora_frequency * lora_embedding_B.weight.T @ lora_embedding_A.weight) / module.sinelora_scaling * lora_scaling + sine_output = ( + module._embed(x) + @ torch.sin(module.sinelora_frequency * lora_embedding_B.weight.T @ lora_embedding_A.weight) + / module.sinelora_scaling + * lora_scaling + ) result = result + sine_output - return result \ No newline at end of file + return result diff --git a/src/peft/utils/integrations.py b/src/peft/utils/integrations.py index 7d472870df..e8571d7f71 100644 --- a/src/peft/utils/integrations.py +++ b/src/peft/utils/integrations.py @@ -145,7 +145,7 @@ def get_layer_device_map(model): return None if len(execution_device_map) == 1 and "" in execution_device_map: - return {idx: execution_device_map[""] for idx in range(model.config.num_hidden_layers)} + return dict.fromkeys(range(model.config.num_hidden_layers), execution_device_map[""]) layer_device_map = {} for layer in execution_device_map: diff --git a/tests/test_custom_models.py b/tests/test_custom_models.py index ab3c62e704..2df0552fc3 100644 --- a/tests/test_custom_models.py +++ b/tests/test_custom_models.py @@ -502,7 +502,7 @@ ################### # LoRA + SineLoRA # ################### - ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"],"use_sinelora": True}), + ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"], "use_sinelora": True}), ] # For this test matrix, each tuple consists of: diff --git a/tests/test_initialization.py b/tests/test_initialization.py index 5bd2b8defe..e50efc617e 100644 --- a/tests/test_initialization.py +++ b/tests/test_initialization.py @@ -2653,7 +2653,7 @@ def fn(x, *args): if prepare_layer_inputs_keys is None: prepare_layer_inputs_fn = fn else: - prepare_layer_inputs_fn = {k: fn for k in prepare_layer_inputs_keys} + prepare_layer_inputs_fn = dict.fromkeys(prepare_layer_inputs_keys, fn) shuffled_dataset = dataset.shuffle(seed=0) dataloader = self.get_dataloader(shuffled_dataset) From e4e3608b60dd292e40b96ab5288b35f0c8b3064d Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Wed, 2 Apr 2025 00:08:23 +1030 Subject: [PATCH 6/7] updated --- src/peft/tuners/lora/layer.py | 20 ++++++++++++++++++++ src/peft/tuners/lora/variants.py | 17 +++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/peft/tuners/lora/layer.py b/src/peft/tuners/lora/layer.py index cb09608dd6..29e1cb24ba 100644 --- a/src/peft/tuners/lora/layer.py +++ b/src/peft/tuners/lora/layer.py @@ -183,12 +183,18 @@ def update_layer( use_rslora, use_dora: bool = False, use_sinelora: bool = False, + sinelora_frequency: float = 200.0, + sinelora_scaling: Optional[float] = None, lora_bias: bool = False, ): # collect the kwargs kwargs = locals().copy() del kwargs["self"] + if use_sinelora: + self.sinelora_frequency = sinelora_frequency + self.sinelora_scaling = sinelora_scaling + # This code works for linear layers, override for other layer types if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") @@ -572,6 +578,8 @@ def __init__( init_lora_weights: Union[bool, str] = True, use_rslora: bool = False, use_dora: bool = False, + sinelora_frequency: float = 200.0, + sinelora_scaling: Optional[float] = None, lora_bias: bool = False, use_sinelora: bool = False, **kwargs, @@ -591,6 +599,8 @@ def __init__( use_dora=use_dora, lora_bias=lora_bias, use_sinelora=use_sinelora, + sinelora_frequency=sinelora_frequency, + sinelora_scaling=sinelora_scaling, ) self.is_target_conv_1d_layer = is_target_conv_1d_layer @@ -780,6 +790,8 @@ def __init__( use_dora: bool = False, lora_bias: bool = False, use_sinelora: bool = False, + sinelora_frequency=200.0, + sinelora_scaling: Optional[float] = None, **kwargs, ) -> None: if lora_bias: @@ -801,6 +813,8 @@ def __init__( use_dora=use_dora, use_sinelora=use_sinelora, lora_bias=lora_bias, + sinelora_frequency=sinelora_frequency, + sinelora_scaling=sinelora_scaling, ) def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: @@ -826,11 +840,17 @@ def update_layer( use_dora, use_sinelora, lora_bias, + sinelora_frequency, + sinelora_scaling, ): # collect the kwargs kwargs = locals().copy() del kwargs["self"] + if use_sinelora: + self.sinelora_frequency = sinelora_frequency + self.sinelora_scaling = sinelora_scaling + if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 1c686be6b3..584eae5254 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -295,9 +295,9 @@ class SineLoraLinearVariant(LoraVariant): def init(module: Linear, adapter_name: str, **kwargs) -> None: module.sinelora_frequency = kwargs['sinelora_frequency'] - sinelora_scaling = kwargs.get('sinelora_scaling') - if sinelora_scaling is not None: - module.sinelora_scaling = sinelora_scaling + module.sinelora_scaling = kwargs['sinelora_scaling'] + if module.sinelora_scaling is None: + module.sinelora_scaling = math.sqrt(module.in_features) @staticmethod def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: @@ -307,7 +307,7 @@ def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch. lora_scaling = module.scaling[active_adapter] sine_output = ( x - @ torch.sin(module.sinelora_frequency * lora_B.weight.T @ lora_A.weight) + @ torch.sin(module.sinelora_frequency * lora_A.weight.T @ lora_B.weight.T) / module.sinelora_scaling * lora_scaling ) @@ -319,9 +319,10 @@ class SineLoraEmbeddingVariant(SineLoraLinearVariant): def init(module: Embedding, adapter_name: str, **kwargs) -> None: module.sinelora_frequency = kwargs['sinelora_frequency'] - sinelora_scaling = kwargs.get('sinelora_scaling') - if sinelora_scaling is not None: - module.sinelora_scaling = sinelora_scaling + sinelora_scaling = kwargs['sinelora_scaling'] + if sinelora_scaling is None: + module.sinelora_scaling = math.sqrt(module.in_features) + @staticmethod def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: lora_embedding_A = module.lora_embedding_A[active_adapter] @@ -329,7 +330,7 @@ def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: tor lora_scaling = module.scaling[active_adapter] sine_output = ( module._embed(x) - @ torch.sin(module.sinelora_frequency * lora_embedding_B.weight.T @ lora_embedding_A.weight) + @ torch.sin(module.sinelora_frequency * lora_embedding_A.weight.T @ lora_embedding_B.weight.T) / module.sinelora_scaling * lora_scaling ) From 8d4db0cb8d2fafe1d9337a71a69190beb9f8a770 Mon Sep 17 00:00:00 2001 From: Yiping Ji Date: Wed, 21 May 2025 14:06:41 +0930 Subject: [PATCH 7/7] latest --- src/peft/tuners/lora/layer.py | 21 +++--- src/peft/tuners/lora/variants.py | 121 ++++++++++++++++++++++++++++--- tests/test_custom_models.py | 3 + 3 files changed, 122 insertions(+), 23 deletions(-) diff --git a/src/peft/tuners/lora/layer.py b/src/peft/tuners/lora/layer.py index 29e1cb24ba..77eac8cb64 100644 --- a/src/peft/tuners/lora/layer.py +++ b/src/peft/tuners/lora/layer.py @@ -838,10 +838,10 @@ def update_layer( init_lora_weights, use_rslora, use_dora, - use_sinelora, lora_bias, - sinelora_frequency, - sinelora_scaling, + use_sinelora: bool = False, + sinelora_frequency: float = 200.0, + sinelora_scaling: Optional[float] = None, ): # collect the kwargs kwargs = locals().copy() @@ -850,7 +850,7 @@ def update_layer( if use_sinelora: self.sinelora_frequency = sinelora_frequency self.sinelora_scaling = sinelora_scaling - + if r <= 0: raise ValueError(f"`r` should be a positive integer value but the value passed is {r}") @@ -1027,7 +1027,7 @@ def _embed(self, input: torch.Tensor, weight: torch.Tensor) -> torch.Tensor: norm_type=base_layer.norm_type, scale_grad_by_freq=base_layer.scale_grad_by_freq, sparse=base_layer.sparse, - ) + ) def forward(self, x: torch.Tensor, *args: Any, **kwargs: Any) -> torch.Tensor: # TODO: no dtype conversion here, unlike in Linear, is that correct? @@ -1371,13 +1371,12 @@ def __init__(self, *args, **kwargs): raise ValueError(f"Conv1d layer kernel must have 3 dimensions, not {self._kernel_dim}") self.conv_fn = F.conv1d - def resolve_lora_variant(self, *, use_dora: bool, **kwargs) -> Optional[LoraVariant]: + def resolve_lora_variant(self, *, use_dora: bool, use_sinelora: bool, **kwargs) -> Optional[LoraVariant]: if not use_dora: - return None - - from .variants import DoraConv1dVariant - - return DoraConv1dVariant() + from .variants import DoraConv1dVariant + elif use_sinelora: + from .variants import SineLoraConv1dVariant + return None class Conv3d(_ConvNd): diff --git a/src/peft/tuners/lora/variants.py b/src/peft/tuners/lora/variants.py index 584eae5254..59a94571f9 100644 --- a/src/peft/tuners/lora/variants.py +++ b/src/peft/tuners/lora/variants.py @@ -24,6 +24,7 @@ from .dora import DoraConv2dLayer, DoraConv3dLayer, DoraEmbeddingLayer, DoraLinearLayer from .layer import Conv2d, Conv3d, Embedding, Linear, LoraVariant, _ConvNd +from transformers.pytorch_utils import Conv1D class DoraLinearVariant(LoraVariant): @@ -293,15 +294,53 @@ def init(module: Conv3d, adapter_name: str, **kwargs: Any) -> None: class SineLoraLinearVariant(LoraVariant): @staticmethod def init(module: Linear, adapter_name: str, **kwargs) -> None: - module.sinelora_frequency = kwargs['sinelora_frequency'] + module.sinelora_frequency = kwargs["sinelora_frequency"] - module.sinelora_scaling = kwargs['sinelora_scaling'] + module.sinelora_scaling = kwargs["sinelora_scaling"] if module.sinelora_scaling is None: module.sinelora_scaling = math.sqrt(module.in_features) @staticmethod + def unmerge(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> torch.Tensor: + lora_A = module.lora_A[active_adapter] + lora_B = module.lora_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + delta_weight = ( + torch.sin(module.sinelora_frequency * lora_A.weight.T @ lora_B.weight.T).T + / module.sinelora_scaling + * lora_scaling + ) + unmerged_weight = orig_weight - delta_weight + return unmerged_weight + @staticmethod + def merge_safe(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> torch.Tensor: + lora_A = module.lora_A[active_adapter] + lora_B = module.lora_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + delta_weight = ( + torch.sin(module.sinelora_frequency * (lora_A.weight.T @ lora_B.weight.T)).T + / module.sinelora_scaling + * lora_scaling + ) + merged_weight = orig_weight + delta_weight + if not torch.isfinite(merged_weight).all(): + raise ValueError(f"NaNs detected in merged weights for adapter {active_adapter}") + module._cache_store(f"{active_adapter}-delta_weight", delta_weight) + return merged_weight + @staticmethod + def merge_unsafe(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> None: + lora_A = module.lora_A[active_adapter] + lora_B = module.lora_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + delta_weight = ( + torch.sin(module.sinelora_frequency * (lora_A.weight.T @ lora_B.weight.T)).T + / module.sinelora_scaling + * lora_scaling + ) + module._cache_store(f"{active_adapter}-delta_weight", delta_weight) + orig_weight.data += delta_weight + @staticmethod def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: - lora_A = module.lora_A[active_adapter] lora_B = module.lora_B[active_adapter] lora_scaling = module.scaling[active_adapter] @@ -312,27 +351,85 @@ def forward(module: Linear, active_adapter: str, x: torch.Tensor, result: torch. * lora_scaling ) result = result + sine_output + return result - -class SineLoraEmbeddingVariant(SineLoraLinearVariant): +class SineLoraEmbeddingVariant(LoraVariant): @staticmethod def init(module: Embedding, adapter_name: str, **kwargs) -> None: - module.sinelora_frequency = kwargs['sinelora_frequency'] + module.sinelora_frequency = kwargs["sinelora_frequency"] - sinelora_scaling = kwargs['sinelora_scaling'] + sinelora_scaling = kwargs["sinelora_scaling"] if sinelora_scaling is None: module.sinelora_scaling = math.sqrt(module.in_features) - @staticmethod - def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: + def unmerge(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> torch.Tensor: lora_embedding_A = module.lora_embedding_A[active_adapter] lora_embedding_B = module.lora_embedding_B[active_adapter] lora_scaling = module.scaling[active_adapter] - sine_output = ( - module._embed(x) - @ torch.sin(module.sinelora_frequency * lora_embedding_A.weight.T @ lora_embedding_B.weight.T) + delta_weight = ( + torch.sin(module.sinelora_frequency * lora_embedding_A.T @ lora_embedding_B.T) + / module.sinelora_scaling + * lora_scaling + ) + unmerged_weight = orig_weight - delta_weight + return unmerged_weight + @staticmethod + def merge_safe(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> torch.Tensor: + lora_embedding_A = module.lora_embedding_A[active_adapter] + lora_embedding_B = module.lora_embedding_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + delta_weight = ( + torch.sin(module.sinelora_frequency * (lora_embedding_A.T @ lora_embedding_B.T)) + / module.sinelora_scaling + * lora_scaling + ) + merged_weight = orig_weight + delta_weight + if not torch.isfinite(merged_weight).all(): + raise ValueError(f"NaNs detected in merged weights for adapter {active_adapter}") + module._cache_store(f"{active_adapter}-delta_weight", delta_weight) + return merged_weight + @staticmethod + def merge_unsafe(module: Linear, active_adapter: str, orig_weight: torch.Tensor) -> None: + lora_embedding_A = module.lora_embedding_A[active_adapter] + lora_embedding_B = module.lora_embedding_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + delta_weight = ( + torch.sin(module.sinelora_frequency * (lora_embedding_A.T @ lora_embedding_B.T)) / module.sinelora_scaling * lora_scaling ) + module._cache_store(f"{active_adapter}-delta_weight", delta_weight) + orig_weight.data += delta_weight + @staticmethod + def forward(module: Embedding, active_adapter: str, x: torch.Tensor, result: torch.Tensor) -> torch.Tensor: + lora_embedding_A = module.lora_embedding_A[active_adapter] + lora_embedding_B = module.lora_embedding_B[active_adapter] + lora_scaling = module.scaling[active_adapter] + sine_output = ( + module._embed(x, + torch.sin(module.sinelora_frequency * lora_embedding_A.T @ lora_embedding_B.T)/ module.sinelora_scaling * lora_scaling) + ) result = result + sine_output return result + +class DoraEmbeddingLayer(DoraLinearLayer): + def forward(self, x, *, lora_A, lora_B, scaling, base_layer, embed_fn): + """ + For DoRA, calculate the extra output from LoRA with DoRA applied. This should be added on top of the base layer + output. + """ + lora_weight = (lora_A @ lora_B).T + magnitude = self.weight + weight = base_layer.weight + weight_norm = self.get_weight_norm(weight, lora_weight.detach(), scaling) + # see section 4.3 of DoRA (https://arxiv.org/abs/2402.09353) + # "[...] we suggest treating ||V +∆V ||_c in + # Eq. (5) as a constant, thereby detaching it from the gradient + # graph. This means that while ||V + ∆V ||_c dynamically + # reflects the updates of ∆V , it won’t receive any gradient + # during backpropagation" + weight_norm = weight_norm.detach() + mag_norm_scale = magnitude / weight_norm + result_dora = mag_norm_scale * (embed_fn(x, lora_A) @ lora_B) * scaling + return mag_norm_scale, result_dora + diff --git a/tests/test_custom_models.py b/tests/test_custom_models.py index 2df0552fc3..2c1aa0f5fa 100644 --- a/tests/test_custom_models.py +++ b/tests/test_custom_models.py @@ -503,6 +503,9 @@ # LoRA + SineLoRA # ################### ("Vanilla MLP LoRA + SineLoRA", "MLP", LoraConfig, {"target_modules": ["lin0", "lin1"], "use_sinelora": True}), + ("Embedding + transformers Conv1D LoRA + SineLoRA", "EmbConv1D", LoraConfig, {"target_modules": ["emb"], "use_sinelora": True}), + + ] # For this test matrix, each tuple consists of: