PEFT 文档
BOFT
并获得增强的文档体验
开始使用
BOFT
正交蝴蝶 (BOFT) 是一种为微调基础模型而设计的通用方法。它通过借鉴 Cooley-Tukey 快速傅里叶变换,改进了微调范式的参数效率——正交微调 (OFT),并在微调不同的基础模型(包括大型视觉 Transformer 模型、大型语言模型和文本到图像扩散模型)中显示出良好的结果。
论文摘要如下:
大型基础模型正变得无处不在,但从头开始训练它们非常昂贵。因此,高效地将这些强大的模型适配到下游任务变得越来越重要。在本文中,我们研究了一种有原则的微调范式——正交微调 (OFT)——用于下游任务适配。尽管 OFT 展示了良好的泛化能力,但由于正交矩阵的高维度,它仍然使用了相当多的可训练参数。为了解决这个问题,我们首先从信息传输的角度检查 OFT,然后确定了一些能够实现更好参数效率的关键要素。受到 Cooley-Tukey 快速傅里叶变换算法如何实现高效信息传输的启发,我们提出了一种使用蝴蝶结构的高效正交参数化方法。我们将这种参数化应用于 OFT,创建了一种新型的参数高效微调方法,称为正交蝴蝶 (BOFT)。通过将 OFT 作为一种特殊情况包含在内,BOFT 引入了一个广义的正交微调框架。最后,我们对大型视觉 Transformer 模型、大型语言模型和文本到图像扩散模型在视觉和语言的各种下游任务中的适配进行了广泛的实证研究.
BOFTConfig
class peft.BOFTConfig
< source >( 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
) — 乘法 dropout 概率,通过在训练期间将 OFT 块设置为恒等,类似于 LoRA 中的 dropout 层。 - fan_in_fan_out (
bool
) — 如果要替换的层以 (fan_in, fan_out) 的形式存储权重,则设置为 True。例如,gpt-2 使用Conv1D
,它以 (fan_in, fan_out) 的形式存储权重,因此应将其设置为True
。 - bias (
str
) — BOFT 的 bias 类型。可以是 ‘none’、‘all’ 或 ‘boft_only’。如果为 ‘all’ 或 ‘boft_only’,则将在训练期间更新相应的 bias。请注意,这意味着即使禁用适配器,模型也不会产生与未进行适配的基础模型相同的输出。 - 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
< source >( model config adapter_name low_cpu_mem_usage: bool = False ) → torch.nn.Module
从预训练的 transformers 模型创建 BOFT 和 OFT 模型。论文:https://arxiv.org/abs/2311.06243 https://arxiv.org/abs/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
< source >( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[typing.List[str]] = None )
此方法将 BOFT 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。
通过移除所有 boft 模块但不合并,返回基础模型。这将返回原始的基础模型。