PEFT 文档
BOFT
并获得增强的文档体验
开始使用
BOFT
正交蝶式 (BOFT) 是一种为微调基础模型而设计的通用方法。它从 Cooley-Tukey 快速傅里叶变换中汲取灵感,提高了正交微调 (OFT) 范式的参数效率,在微调不同基础模型(包括大型视觉 Transformer、大型语言模型和文本到图像扩散模型)方面显示出良好的效果。
论文摘要如下:
大型基础模型正变得无处不在,但从零开始训练它们的成本高得令人望而却步。因此,如何高效地将这些强大的模型应用于下游任务变得越来越重要。在本文中,我们研究了一种有原则的微调范式——正交微调 (OFT)——用于下游任务的适配。尽管 OFT 表现出良好的泛化能力,但由于正交矩阵的高维度,它仍然使用相当多的可训练参数。为了解决这个问题,我们首先从信息传输的角度审视 OFT,然后确定了一些能够提高参数效率的关键期望特性。受 Cooley-Tukey 快速傅里叶变换算法如何实现高效信息传输的启发,我们提出了一种使用蝶式结构的高效正交参数化方法。我们将这种参数化应用于 OFT,创造了一种新颖的参数高效微调方法,称为正交蝶式 (BOFT)。通过将 OFT 作为一个特例,BOFT 引入了一个广义的正交微调框架。最后,我们对将大型视觉 Transformer、大型语言模型和文本到图像扩散模型适配到视觉和语言领域的各种下游任务进行了广泛的实证研究。.
BOFTConfig
class peft.BOFTConfig
< 源代码 >( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False boft_block_size: int = 4 boft_block_num: int = 0 boft_n_butterfly_factor: int = 1 target_modules: Optional[Union[list[str], str]] = None exclude_modules: Optional[Union[list[str], str]] = None boft_dropout: float = 0.0 fan_in_fan_out: bool = False bias: str = 'none' modules_to_save: Optional[list[str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None )
参数
- boft_block_size (
int
) — 不同层之间的 BOFT 块大小。 - boft_block_num (
int
) — 每个注入层的 BOFT 块数量。 - boft_n_butterfly_factor (
int
) — 不同层之间的蝶式因子数量。 - target_modules (
Union[List[str],str]
) — 应用适配器的模块名称。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块名称是否以任何传递的字符串结尾。 - boft_dropout (
float
) — 乘性丢弃概率,通过在训练期间将 OFT 块设置为单位矩阵,类似于 LoRA 中的丢弃层。 - fan_in_fan_out (
bool
) — 如果要替换的层存储权重的方式是 (fan_in, fan_out),则设置为 True。例如,gpt-2 使用Conv1D
,它存储权重的方式是 (fan_in, fan_out),因此应将此设置为True
。 - bias (
str
) — BOFT 的偏置类型。可以是 'none'、'all' 或 'boft_only'。如果为 'all' 或 'boft_only',相应的偏置将在训练期间更新。请注意,这意味着即使禁用了适配器,模型的输出也不会与未经适配的基础模型相同。 - modules_to_save (
List[str]
) — 除了 BOFT 层之外,要设置为可训练并保存在最终检查点中的模块列表。 - layers_to_transform (
Union[List[int],int]
) — 要转换的层索引,如果指定了此参数,它将在该列表中指定的层索引上应用 BOFT 转换。如果传递单个整数,它将在该索引的层上应用 BOFT 转换。 - layers_pattern (
Optional[Union[List[str], str]]
) — 层模式名称,仅当layers_to_transform
不为None
且层模式不在常见层模式中时使用。这应针对模型的nn.ModuleList
,通常称为'layers'
或'h'
。
这是用于存储 BOFTModel 配置的配置类。
BOFTModel
class peft.BOFTModel
< 源代码 >( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
从预训练的 Transformer 模型创建 BOFT 和 OFT 模型。论文:https://huggingface.ac.cn/papers/2311.06243 https://huggingface.ac.cn/papers/2306.07280
示例
>>> import transformers >>> from transformers import AutoModelForSeq2SeqLM, BOFTConfig >>> from peft import
BOFTConfig, get_peft_model
>>> config = BOFTConfig( ... boft_block_size=8, ... boft_n_butterfly_factor=1, ... target_modules=["query",
"value", "key", "output.dense", "mlp.fc1", "mlp.fc2"], ... boft_dropout=0.1, ... bias="boft_only", ...
modules_to_save=["classifier"], ... )
>>> model = transformers.Dinov2ForImageClassification.from_pretrained( ... "facebook/dinov2-large", ...
num_labels=100, ... ) >>> boft_model = get_peft_model(model, config)
属性:
- model ([transformers.PreTrainedModel]) — 待适配的模型。
- peft_config ([BOFTConfig]): BOFT 模型的配置。
删除一个现有的适配器。
merge_and_unload
< 源代码 >( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[list[str]] = None )
此方法将 BOFT 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要此方法。
通过移除所有 boft 模块而不进行合并,来恢复基础模型。这将返回原始的基础模型。