LoHa
低秩哈达玛积(LoHa),类似于 LoRA,但它使用更多低秩矩阵来近似大型权重矩阵,并使用哈达玛积将它们组合起来。这种方法比 LoRA 更加参数高效,并且可以实现相当的性能。
论文摘要如下:
在这项工作中,我们提出了一种通信效率高的参数化方法 FedPara,用于联邦学习 (FL),以克服频繁模型上传和下载带来的负担。我们的方法使用低秩权重,然后进行 Hadamard 积,对层的权重参数进行重新参数化。与传统的低秩参数化方法相比,我们的 FedPara 方法不受低秩约束的限制,因此具有更大的容量。此属性使 FedPara 方法能够在通信成本比原始层模型低 3 到 10 倍的情况下,实现相当的性能,这是传统低秩方法无法实现的。通过与其他高效的 FL 优化器相结合,可以进一步提高我们方法的效率。此外,我们将我们的方法扩展到个性化 FL 应用程序 pFedPara,它将参数分为全局参数和局部参数。我们证明 pFedPara 在参数数量少于竞争的个性化 FL 方法三倍以上的情况下,表现优于其他方法。.
LoHaConfig
class peft.LoHaConfig
< source >( peft_type: Union = None auto_mapping: Optional = None base_model_name_or_path: Optional = None revision: Optional = None task_type: Union = None inference_mode: bool = False rank_pattern: Optional[dict] = <factory> alpha_pattern: Optional[dict] = <factory> r: int = 8 alpha: int = 8 rank_dropout: float = 0.0 module_dropout: float = 0.0 use_effective_conv2d: bool = False target_modules: Union = None init_weights: bool = True layers_to_transform: Union = None layers_pattern: Optional = None modules_to_save: Optional = None )
参数
- r (
int
) — LoHa 秩。 - alpha (
int
) — LoHa 缩放的 alpha 参数。 - rank_dropout (
float
) — 训练期间秩维度的丢弃概率。 - module_dropout (
float
) — 训练期间禁用 LoHa 模块的丢弃概率。 - use_effective_conv2d (
bool
) — 对 ksize > 1 的 Conv2d 使用参数有效分解(FedPara 论文中的“命题 3”)。 - target_modules (
Optional[Union[List[str], str]]
) — 要应用适配器的模块名称。如果指定了此参数,则只会替换指定名称的模块。传递字符串时,将执行正则表达式匹配。传递字符串列表时,将执行精确匹配,或者检查模块名称是否以传递的任何字符串结尾。如果将此参数指定为“all-linear”,则将选择所有线性/Conv1D 模块,但不包括输出层。如果未指定此参数,则将根据模型架构选择模块。如果未知架构,则将引发错误 - 在这种情况下,您应该手动指定目标模块。 - init_weights (
bool
) — 是否执行适配器权重的初始化。默认为True
,不建议传递False
。 - layers_to_transform (
Union[List[int], int]
) — 要转换的层索引。如果传递的是整数列表,则会将适配器应用于此列表中指定的层索引。如果传递的是单个整数,则会将转换应用于此索引处的层。 - layers_pattern (
str
) — 层模式名称,仅在layers_to_transform
与None
不同时使用。 - rank_pattern (
dict
) — 将层名称或正则表达式映射到等级,这些等级不同于r
指定的默认等级。 - alpha_pattern (
dict
) — 将层名称或正则表达式映射到 alpha,这些 alpha 不同于alpha
指定的默认 alpha。 - modules_to_save (
Optional[List[str]]
) — 除适配器层之外,在最终检查点中设置为可训练且保存的模块列表。
这是一个配置类,用于存储 LoHaModel 的配置。
LoHaModel
class peft.LoHaModel
< source >( model config adapter_name low_cpu_mem_usage: bool = False ) → torch.nn.Module
参数
- model (
torch.nn.Module
) — 将适配器调谐层附加到的模型。 - config (LoHaConfig) — LoHa 模型的配置。
返回值
torch.nn.Module
LoHa 模型。
从预训练模型创建低秩哈达玛积模型。该方法在 https://arxiv.org/abs/2108.06098 中部分描述。当前的实现大量借鉴了 https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/loha.py
示例
>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoHaModel, LoHaConfig
>>> config_te = LoHaConfig(
... r=8,
... lora_alpha=32,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = LoHaConfig(
... r=8,
... lora_alpha=32,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... use_effective_conv2d=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = LoHaModel(model.text_encoder, config_te, "default")
>>> model.unet = LoHaModel(model.unet, config_unet, "default")
属性:
- model (
~torch.nn.Module
) — 要适应的模型。 - peft_config (LoHaConfig): LoHa 模型的配置。