|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations |
|
|
|
import warnings |
|
from dataclasses import dataclass |
|
from typing import Optional |
|
|
|
from peft.config import PeftConfig |
|
from peft.utils.peft_types import PeftType |
|
|
|
|
|
@dataclass |
|
class XLoraConfig(PeftConfig): |
|
r""" |
|
This is the configuration class to store the configuration of a `XLoraModel`. When the config is reloaded, the |
|
paths of the `adapters` field is disregarded in favor of the saved adapters. As such, only the keys matter during |
|
loading. |
|
|
|
Args: |
|
hidden_size (`int`): |
|
Hidden size of the base model. |
|
adapters (`dict`): |
|
Mapping of adapter names to the LoRA adapter id, as per PeftModel.load_adapter. *They will be automatically |
|
loaded*, to use as LoRA experts. When using from_pretrained, pass the new adapters dict as a keyword |
|
argument. |
|
enable_softmax (`bool`, *optional*, defaults to `True`): |
|
Enable softmax application for the X-LoRA classifier. |
|
enable_softmax_topk (`bool`, *optional*, defaults to `False`): |
|
Enable softmax application for the top-k LoRA adapters. Mutually exclusive to `enable_softmax` and must |
|
only be set if `top_k_lora` is. |
|
softmax_temperature (`float`, *optional*, defaults to 1.0): |
|
Softmax temperature, lower yields sharper predictions |
|
layerwise_scalings (`bool`, *optional*, defaults to `False`): |
|
If True, generate scalings for each LoRA adapter (each layer). If this is False, then scalings will be |
|
broadcasted, the same, to each layer. |
|
top_k_lora (`int`, *optional*, defaults to None): |
|
Sparsely select the top_k LoRA experts instead of the default dense method. |
|
xlora_depth (`int`, *optional*, defaults to 1): |
|
Depth of the X-LoRA classifier. |
|
xlora_size (`int`, *optional*, defaults to 2048): |
|
Hidden size of the X-LoRA classifier, irrelevant if `xlora_depth=1`. |
|
xlora_dropout_p (`float`, *optional*, defaults to 0.2): |
|
Dropout probability of the X-LoRA classifier, irrelevant if `xlora_depth=1`. |
|
use_trainable_adapters (`bool`, *optional*, defaults to False): |
|
Make the adapters trainable. |
|
scaling_pass_value (`float`, *optional*, defaults to 0): |
|
Scaling pass value. |
|
global_scaling_weight (`float`, *optional*, defaults to 1): |
|
Weight to multiply output of each LoRA adapter by. |
|
""" |
|
|
|
hidden_size: int = None |
|
adapters: dict[str, str] = None |
|
enable_softmax: bool = True |
|
enable_softmax_topk: bool = False |
|
layerwise_scalings: bool = False |
|
xlora_depth: int = 1 |
|
xlora_size: int = 2048 |
|
xlora_dropout_p: float = 0.2 |
|
use_trainable_adapters: bool = False |
|
softmax_temperature: float = 1.0 |
|
top_k_lora: Optional[int] = None |
|
scaling_pass_value: float = 0.0 |
|
global_scaling_weight: float = 1.0 |
|
|
|
def __post_init__(self): |
|
super().__post_init__() |
|
self.peft_type = PeftType.XLORA |
|
|
|
if self.hidden_size is None: |
|
warnings.warn( |
|
"No value was provided for `hidden_size`. This will be set to 4096 by default, please ensure that this is correct." |
|
) |
|
self.hidden_size = 4096 |
|
if self.adapters is None: |
|
warnings.warn( |
|
"No value was provided for for `adapters`. This will be set to empty, please ensure that this is correct." |
|
) |
|
self.adapters = {} |
|
|
|
if self.enable_softmax_topk and self.top_k_lora is None: |
|
warnings.warn("`enable_softmax_topk` enabled `top_k_lora` is not set") |
|
|
|
if self.enable_softmax_topk and self.enable_softmax: |
|
warnings.warn( |
|
"`enable_softmax_topk` and `enable_softmax` are both enabled. This will result in worse performance." |
|
) |
|
|
|
if self.top_k_lora is not None and self.top_k_lora < 1: |
|
warnings.warn("`top_k_lora` value must be at least 1.") |
|
|