PEFT 文档
OFT
并获得增强的文档体验
开始使用
OFT
Orthogonal Finetuning (OFT) 是一种为调整文本到图像扩散模型而开发的方法。它的工作原理是用正交矩阵重新参数化预训练的权重矩阵,以保留预训练模型中的信息。为了减少参数数量,OFT 在正交矩阵中引入了块对角结构。
论文摘要如下:
大型文本到图像扩散模型在从文本提示生成照片级真实图像方面具有令人印象深刻的能力。如何有效地引导或控制这些强大的模型来执行不同的下游任务已成为一个重要的开放性问题。为了应对这一挑战,我们引入了一种有原则的微调方法——正交微调 (OFT),用于调整文本到图像扩散模型以适应下游任务。与现有方法不同,OFT 可以证明性地保留超球面能量,这种能量表征了单位超球面上的成对神经元关系。我们发现,这种性质对于保留文本到图像扩散模型的语义生成能力至关重要。为了提高微调的稳定性,我们进一步提出了约束正交微调 (COFT),它对超球面施加了额外的半径约束。具体而言,我们考虑两个重要的文本到图像微调任务:主题驱动生成,其目标是在给定主题的几张图像和文本提示的情况下生成特定于主题的图像;以及可控生成,其目标是使模型能够接收额外的控制信号。经验结果表明,我们的 OFT 框架在生成质量和收敛速度方面优于现有方法。.
OFTConfig
class peft.OFTConfig
< 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 r: int = 8 oft_block_size: int = 0 module_dropout: float = 0.0 target_modules: Optional[Union[list[str], str]] = None fan_in_fan_out: bool = False bias: Literal['none', 'all', 'oft_only'] = 'none' exclude_modules: Optional[Union[list[str], str]] = None init_weights: bool = True layers_to_transform: Optional[Union[list[int], int]] = None layers_pattern: Optional[Union[list[str], str]] = None modules_to_save: Optional[list[str]] = None coft: bool = False eps: float = 6e-05 block_share: bool = False )
参数
- r (
int
) — OFT 秩,每个注入层的 OFT 块数。 - oft_block_size (
int
) — 跨不同层的 OFT 块大小。 - module_dropout (
float
) — 乘法 dropout 概率,通过在训练期间将 OFT 块设置为恒等,类似于 LoRA 中的 dropout 层。 - target_modules (
Optional[Union[list[str], str]]
) — 要应用适配器的模块名称。如果指定此项,则只会替换具有指定名称的模块。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块的名称是否以任何传递的字符串结尾。如果将其指定为“all-linear”,则会选择所有线性模块,排除输出层。如果未指定此项,则将根据模型架构选择模块。如果架构未知,则会引发错误——在这种情况下,您应该手动指定目标模块。 - fan_in_fan_out (
bool
) — 如果要替换的层存储的权重像 (fan_in, fan_out) 一样,请将其设置为 True。 - bias (
str
) — OFT 的 Bias 类型。可以是 'none'、'all' 或 'oft_only'。如果是 'all' 或 'oft_only',则将在训练期间更新相应的 biases。请注意,这意味着,即使禁用适配器,模型也不会产生与没有适配的基础模型相同的输出。 - exclude_modules (
Optional[Union[List[str], str]]
) — 不应用适配器的模块名称。当传递字符串时,将执行正则表达式匹配。当传递字符串列表时,将执行精确匹配,或者检查模块的名称是否以任何传递的字符串结尾。 - init_weights (
bool
) — 是否执行 OFT 权重的初始化。 - layers_to_transform (
Union[List[int], int]
) — 要转换的层索引。如果传递一个整数列表,它将把适配器应用于此列表中指定的层索引。如果传递单个整数,它将在此索引处的层上应用转换。 - layers_pattern (
Optional[Union[List[str], str]]
) — 层模式名称,仅当layers_to_transform
与None
不同时使用。这应该针对模型的 `nn.ModuleList`,它通常被称为 `'layers'` 或 `'h'`。 - modules_to_save (
List[str]
) — 除适配器层之外,要设置为可训练并在最终检查点中保存的模块列表。 - coft (
bool
) — 是否使用 OFT 的约束变体,默认关闭。 - eps (
float
) — COFT 的控制强度。旋转的自由度。仅当coft
设置为 True 时才有效。 - block_share (
bool
) — 是否在块之间共享 OFT 参数。默认值为 `False`。
这是用于存储 OFTModel 配置的配置类。
检查 kwargs 对于配置是否有效。
OFTModel
class peft.OFTModel
< source >( model config adapter_name low_cpu_mem_usage: bool = False ) → torch.nn.Module
参数
- model (
torch.nn.Module
) — 将要附加适配器调整器层的模型。 - config (OFTConfig) — OFT 模型的配置。
- adapter_name (
str
) — 适配器的名称,默认为 “default”。 - low_cpu_mem_usage (
bool
, 可选, 默认为False
) — 在 meta 设备上创建空的适配器权重。有助于加速加载过程。
返回
torch.nn.Module
OFT 模型。
从预训练模型创建正交微调模型。该方法在 https://arxiv.org/abs/2306.07280 中描述。
示例
>>> from diffusers import StableDiffusionPipeline
>>> from peft import OFTModel, OFTConfig
>>> config_te = OFTConfig(
... r=8,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = OFTConfig(
... r=8,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... module_dropout=0.0,
... init_weights=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = OFTModel(model.text_encoder, config_te, "default")
>>> model.unet = OFTModel(model.unet, config_unet, "default")
属性:
- model (
~torch.nn.Module
) — 要适配的模型。 - peft_config (OFTConfig): OFT 模型的配置。
删除现有适配器。
merge_and_unload
< source >( progressbar: bool = False safe_merge: bool = False adapter_names: typing.Optional[typing.List[str]] = None )
此方法将 OFT 层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。
通过删除所有 oft 模块但不合并,返回基础模型。这将返回原始基础模型。