PEFT documentation
GLoRA
GLoRA
广义低秩适应(GLoRA)是一种 PEFT 方法,它推广了 LoRA 及相关方法。GLoRA 将更新分解为可配置的路径(A、B、C、D、E),其中每条路径可根据其自身情况采用低秩、向量、常数或禁用参数化。
每条路径支持四种参数化模式之一。它们在参数数量与表达能力(更新可以有多丰富)之间进行权衡:
"lora":低秩分解(类似于标准 LoRA)。使用r * (out + in)个参数,可以表达秩为r的修正。表达能力最强,参数也最多。"vector":单个向量(例如形状为(out, 1)),在矩阵上进行广播。使用O(out)个参数;仅支持按通道的缩放或偏移。"constant":在所有元素间共享的单个标量。使用 1 个参数;在可训练选项中表达能力最弱。"none":零值且无可训练参数;完全禁用该路径。
并非每条路径都支持所有模式(例如,config_D_E 不支持 "lora")。在更多路径上选择 "lora" 会增加容量和可训练参数;而 "vector"、"constant" 或 "none" 则会减少这两者。
GLoRA 特别适用于研究和高级应用,在这些场景中,您希望尝试结构化的更新模式,并在单个层中组合多种适配机制。
从高层次来看,GLoRA 通过以下方式修改冻结的线性层:
其中每条路径都是独立参数化的。
GloraConfig
类 peft.GloraConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falser: int = 8target_modules: list[str] | str | None = Nonebias: str = 'none'modules_to_save: list[str] | None = Noneconfig_A_B: typing.Literal['lora', 'vector', 'constant', 'none'] = 'lora'config_C: typing.Literal['lora', 'vector', 'none'] = 'lora'config_D_E: typing.Literal['vector', 'constant', 'none'] = 'constant'init_weights: bool = True )
参数
- r (
int) — 当配置设置为lora时,所使用的低秩分解的秩。 - target_modules (
Optional[Union[List[str], str]]) — 要应用 Glora 的模块名称。 - config_A_B (
str) — A 矩阵和 B 矩阵的参数化方式(权重乘法和加法修正)。有效值:lora、vector、constant、none。 - config_C (
str) — C 矩阵的参数化方式(权重到偏置的耦合:b += W0 @ C)。 有效值:lora、vector、none。 - config_D_E (
str) — D 和 E 标量(偏置乘法和加法校正)的参数化方式。由于 D 和 E 是偏置大小的向量而非矩阵,因此不支持lora。有效值:vector、constant、none。 - init_weights (
bool) — 如果为 True(默认值),则将 GLoRA 初始化为无操作(零值)。如果为 False,则使用 kaiming 初始化,使适配器不是无操作。
这是用于存储 GloraModel 配置的类。
Glora 对冻结的线性层 W0 进行如下修改:W_eff = W0 + W0 * A + B 以及 b_eff = b0 + b0 * D + E + W0 @ C。
每个矩阵(A、B、C、D、E)都可以独立进行参数化。配置值控制所使用的参数量以及它们可以表达的形状:
lora:低秩分解Xd @ Xu,形状为(out, r)和(r, in)。使用r * (out + in)个参数, 可以表示任意秩为 r 的修正。与标准 LoRA 类似。vector:形状为(out, 1)的单个列向量,在整个矩阵上进行广播。使用out个参数;仅支持按输出通道的缩放或偏移。constant:在所有元素间共享的单个标量。使用 1 个参数;约束最强。none:零,没有可训练参数。实际上禁用了此路径。
主要配置选项
r:当路径配置为"lora"时使用的秩(默认值:8)。target_modules:要适配的模块名称列表或正则表达式(例如["q_proj", "v_proj"])。config_A_B:A 和 B 的路径类型(“lora”、“vector”、“constant”、“none”)。config_C:C 的路径类型(“lora”、“vector”、“none”)。config_D_E:D 和 E 的路径类型(“constant”、“vector”、“none”)。bias:偏差处理("none"、"all"或"glora_only")。init_weights:如果为True(默认值),GLoRA 将初始化为无操作。如果为False,则使用 kaiming 初始化。
注意事项:
config_D_E不支持"lora"。- 对于支持的模型类型,可以省略
target_modules(将使用 PEFT 的默认映射)。
GloraModel
类 peft.GloraModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )
从预训练的 transformers 模型创建广义低秩适配器(GLoRA)模型。
- 封装基础模型,并将 GLoRA 适配器注入到指定的模块中。
- 支持多个适配器、适配器切换、合并/取消合并以及混合批次推理。
- 使用
set_adapter、merge_and_unload及相关方法进行适配器管理。
GloraLayer 和 GloraLinear
包装稠密 ~torch.nn.Linear base_layer 的 GLoRA 适配器。
GloraLayer是广义低秩适配的核心逻辑,支持多个适配器以及灵活的路径配置。GloraLinear是nn.Linear的直接替代品,支持 GLoRA。- GLoRA 目前支持普通的
torch.nn.Linear基础层。
使用示例
from transformers import AutoModelForCausalLM
from peft import GloraConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("your-model-id")
glora_config = GloraConfig(
r=8,
target_modules=["q_proj", "v_proj"],
config_A_B="lora",
config_C="vector",
config_D_E="constant",
task_type="CAUSAL_LM",
)
model = get_peft_model(model, glora_config)
model.print_healthcheck()
# Switch adapters, merge, etc.
model.set_adapter("default")
model.merge_and_unload()备注
- GLoRA 是 LoRA 的超集:将所有路径设置为“lora”即可恢复标准的 LoRA。
- 您可以为 A/B/C/D/E 使用不同的路径类型,以尝试新的适配策略。
- GLoRA 支持所有标准的 PEFT 适配器管理功能(添加、删除、切换、合并等)。