PEFT documentation
MiSS
MiSS
MiSS(Matrix Shard Sharing,矩阵分片共享)是一种 PEFT 方法,在模型性能与计算效率之间取得了良好的平衡。它仅需一个可训练矩阵,并引入了不同于 LoRA 的分片共享机制。
该论文的摘要如下:
参数高效微调(PEFT)方法,尤其是低秩适应(LoRA),能够有效减少大语言模型(LLM)中可训练参数的数量。然而,随着模型规模的持续增长,对计算资源的需求仍然是一个重大挑战。现有的 LoRA 变体往往难以在适应性(模型性能和收敛速度)与效率(计算开销、内存占用和初始化时间)之间取得最佳平衡。本文提出了 MiSS(矩阵分片共享),这是一种新颖的 PEFT 方法,通过简单的分片共享机制来解决这一权衡问题。MiSS 利用了这样一个洞察:通过将权重矩阵分解为多个片段矩阵并利用一个共享的可训练公共片段,可以实现低秩适应。该方法通过复制这些共享的、分区后的分片来构建低秩更新矩阵。我们还为 MiSS 提出了一种硬件高效且广泛适用的实现方案。在一系列任务上进行的广泛实验,以及对计算性能的系统分析,证明了 MiSS 的优越性。结果表明,MiSS 在模型性能指标和计算效率(包括初始化速度和训练吞吐量)方面均显著优于标准 LoRA 及其主要变体。通过有效平衡表达能力和资源利用率,MiSS 为高效适配大规模模型提供了一个极具吸引力的解决方案。
基准测试概览
何时使用 MiSS
在以下情况下,MiSS 是一个不错的选择:
- 您希望获得比使用昂贵配置(例如 PiSSA、LoRA-GA 或 OLoRA)的高级 LoRA 初始化方案更快的初始化速度和更高的训练吞吐量。
- 您希望使用一个即插即用的 LoRA 替代方案,且只需进行最少的配置更改。
如果需要以牺牲部分效率为代价来获得更强的表达能力,请考虑使用 bat 初始化变体(见下文)。
init_weights 模式
MiSS 通过 init_weights 参数支持三种初始化模式:
True(默认值):标准的 MiSS 初始化。对于大多数用例,这是最佳的起点。"bat":启用跨不同分片的非线性更新。与标准 MiSS 相比,能产生更好的结果,但占用更多内存,速度大约慢两倍。当性能优先于效率时,请使用此选项。"mini":在out_features维度上使用更小的秩,由mini_r控制。这会进一步减少可训练参数。使用此模式时,必须设置mini_r,且out_features必须能被mini_r整除。
快速入门
import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
torch_dtype=torch.bfloat16,
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id
# Standard MiSS
config = MissConfig(
r=64,
miss_dropout=0.01,
task_type="CAUSAL_LM"
)
# BAT variant — better performance, more memory
# config = MissConfig(
# r=64,
# init_weights="bat",
# task_type="CAUSAL_LM"
# )
# Mini variant — fewer trainable parameters
# config = MissConfig(
# r=64,
# init_weights="mini",
# mini_r=8,
# task_type="CAUSAL_LM"
# )
model = get_peft_model(model, config)
model.print_healthcheck()如需查看包含训练和推理的完整微调示例,请参阅 MiSS 微调示例。
API
MissConfig
类 peft.MissConfig
< 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )
参数
- r (
int) — MiSS 在不同层中的秩。最好将 ‘r’ 设置为偶数;否则,默认的初始化方法将无法正常工作。MiSS 的秩对应于沿 in_features 维度的低秩分解。 - miss_dropout (
float) — MiSS 层的 dropout 概率。 - mini_r (
int) — MiSS 的秩对应于沿 out_features 维度的低秩分解。当您将init_weights=mini设置为该值时,需要设置mini_r。请确保out_features能被mini_r整除。 - target_modules (
Optional[Union[List[str], str]]) — 要应用适配器(adapter)的模块名称。如果指定了此参数,则只有名称匹配的模块会被替换。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以列表中的任一字符串结尾。如果指定为 ‘all-linear’,则选择所有线性模块,但排除输出层。如果未指定,将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,应手动指定目标模块。 - exclude_modules (
Optional[Union[List[str], str]]) — 不应用适配器的模块名称。传入字符串时,将执行正则表达式匹配。传入字符串列表时,将执行精确匹配,或检查模块名称是否以传入的任一字符串结尾。 - init_weights (bool | Literal[“bat”, “mini”]) —
不同的初始化方式对应不同的 MiSS 变体。默认情况下(balance),将使用 MiSS 中最高效且通用的方法。‘bat’:在此模式下,您可以启用跨不同分片的非线性更新。‘mini’:在此模式下,您可以设置更小的秩以减少可训练参数,但建议保持
out_features % mini_r == 0。 - layers_to_transform (
Union[List[int], int]) — 要转换的层索引。如果传入一个整数列表,则会将适配器应用于该列表中指定的层索引。如果传入单个整数,则会对该索引处的层应用转换。 - layers_pattern (
str) — 层模式名称,仅在layers_to_transform不同于None时使用。 - bias (
str) — MiSS 的偏置类型。可以是'none'、'all'或'MiSS_only'。 - modules_to_save (
List[str]) — 除适配器层外,需要设置为可训练并在最终检查点中保存的模块列表。
这是用于存储 MissModel 配置的类。
MissModel
类 peft.MissModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
参数
- model (
torch.nn.Module) — 将附加适配器调优层的模型。 - config (MissConfig) — MiSS 模型的配置。
- adapter_name (
str) — 适配器的名称,默认为"default"。 - low_cpu_mem_usage (
bool,optional, defaults toFalse) — 在 meta 设备上创建空的适配器权重。有助于加快加载过程。
返回值
torch.nn.Module
MiSS 模型。
从预训练模型创建 Householder 反射适配(MiSS)模型。该方法在 https://huggingface.co/papers/2409.15371 中有详细描述。
示例:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig
>>> config_te = MissConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... init_weights=True,
... )
>>> config_unet = MissConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")属性:
- model (
~torch.nn.Module) — 要适配的模型。 - peft_config (MissConfig): MiSS 模型的配置。