PEFT 文档
模型
并获得增强的文档体验
开始使用
模型
PeftModel 是用于指定基础 Transformer 模型和配置以应用 PEFT 方法的基础模型类。基础 `PeftModel` 包含从 Hub 加载和保存模型的方法。
PeftModel
类 peft.PeftModel
< 源代码 >( model: PreTrainedModel peft_config: PeftConfig adapter_name: str = 'default' autocast_adapter_dtype: bool = True low_cpu_mem_usage: bool = False )
参数
- model (PreTrainedModel) — 用于 Peft 的基础 transformer 模型。
- peft_config (PeftConfig) — Peft 模型的配置。
- adapter_name (
str
, 可选) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, 可选) — 是否自动转换适配器 dtype。默认为True
。目前,这只会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响选择的 PEFT 调谐器。 - low_cpu_mem_usage (
bool
,optional
, 默认为False
) — 在 meta 设备上创建空的适配器权重。有助于加速加载过程。当为训练创建新的 PEFT 适配器时,请勿使用
low_cpu_mem_usage=True
。
包含各种 Peft 方法的基础模型。
属性:
- base_model (
torch.nn.Module
) — 用于 Peft 的基础 transformer 模型。 - peft_config (PeftConfig) — Peft 模型的配置。
- modules_to_save (
str
列表) — 保存模型时要保存的子模块名称列表。 - prompt_encoder (PromptEncoder) — 如果使用 PromptLearningConfig,则用于 Peft 的 prompt 编码器。
- prompt_tokens (
torch.Tensor
) — 如果使用 PromptLearningConfig,则用于 Peft 的虚拟 prompt 令牌。 - transformer_backbone_name (
str
) — 如果使用 PromptLearningConfig,则基础模型中 transformer backbone 的名称。 - word_embeddings (
torch.nn.Embedding
) — 如果使用 PromptLearningConfig,则基础模型中 transformer backbone 的词嵌入。
添加适配器
< 源代码 >( adapter_name: str peft_config: PeftConfig low_cpu_mem_usage: bool = False )
参数
- adapter_name (
str
) — 要添加的适配器的名称。 - peft_config (PeftConfig) — 要添加的适配器的配置。
- low_cpu_mem_usage (
bool
,optional
, 默认为False
) — 在 meta 设备上创建空的适配器权重。有助于加速加载已保存的适配器的过程。当为训练创建新的 PEFT 适配器时,请勿使用此选项。
根据传递的配置向模型添加适配器。
此适配器未经过训练。要加载经过训练的适配器,请查看 PeftModel.load_adapter()。
新适配器的名称应该是唯一的。
新适配器不会自动设置为活动适配器。使用 PeftModel.set_adapter() 设置活动适配器。
更新或创建模型卡片以包含有关 peft 的信息
- 添加
peft
库标签 - 添加 peft 版本
- 添加基础模型信息
- 如果使用了量化,则添加量化信息
禁用适配器模块的上下文管理器。使用此管理器在基础模型上运行推理。
模型的前向传播。
from_pretrained
< source >( model: torch.nn.Module model_id: Union[str, os.PathLike] adapter_name: str = 'default' is_trainable: bool = False config: Optional[PeftConfig] = None autocast_adapter_dtype: bool = True ephemeral_gpu_offload: bool = False low_cpu_mem_usage: bool = False **kwargs: Any )
参数
- model (
torch.nn.Module
) — 要适配的模型。对于 🤗 Transformers 模型,该模型应该使用 from_pretrained 初始化。 - model_id (
str
或os.PathLike
) — 要使用的 PEFT 配置的名称。可以是以下之一:- 字符串,Hugging Face Hub 上模型仓库中托管的 PEFT 配置的
模型 ID
。 - 包含使用
save_pretrained
方法保存的 PEFT 配置文件 的目录路径 (./my_peft_config_directory/
)。
- 字符串,Hugging Face Hub 上模型仓库中托管的 PEFT 配置的
- adapter_name (
str
, 可选, 默认为"default"
) — 要加载的适配器的名称。这对于加载多个适配器很有用。 - is_trainable (
bool
, 可选, 默认为False
) — 适配器是否应该是可训练的。如果为False
,则适配器将被冻结,并且只能用于推理。 - config (PeftConfig, 可选) — 要使用的配置对象,而不是自动加载的配置。此配置对象与
model_id
和kwargs
互斥。当配置已在调用from_pretrained
之前加载时,此参数很有用。 - autocast_adapter_dtype (
bool
, 可选) — 是否自动转换适配器 dtype。默认为True
。仅与特定的适配器类型相关。 - ephemeral_gpu_offload (
bool
, 可选) — 是否对部分加载的模块使用临时 GPU 卸载。默认为False
。当模型和/或组件(如适配器)的部分内容保存在 CPU 内存中直到需要时,此参数很有用。与在小数据上执行昂贵的操作不同,数据按需传输到 GPU,执行操作,并将结果移回 CPU 内存。这会带来轻微的瞬时 VRAM 开销,但在某些情况下可以提供数量级的加速。 - low_cpu_mem_usage (
bool
,optional
, 默认为False
) — 在加载已保存的权重之前,在 meta 设备上创建空的适配器权重。有助于加速该过程。 - torch_device (
str
, 可选, 默认为 None) — 加载适配器的设备。如果为None
,则将推断设备。 - kwargs — (
可选
): 传递给特定 PEFT 配置类的其他关键字参数。
从预训练模型和加载的 PEFT 权重实例化 PEFT 模型。
请注意,传递的 model
可能会被就地修改。
返回基础模型。
get_layer_status
< source >( ) → listpeft.peft_model.TunerLayerStatus
参数
- model (~PeftModel) — 要从中获取适配器层状态的模型。
返回
listpeft.peft_model.TunerLayerStatus
一个数据类列表,每个数据类都包含相应适配器层的状态。
获取模型中每个适配器层的状态。
此方法返回 TunerLayerStatus
数据类实例的列表,每个实例都包含以下属性
name
(str
): 适配器层的名称,例如model.encoder.block.0.layer.0.SelfAttention.q
。module_type
(str
): 适配器层的类型,例如lora.Linear
。enabled
(bool
): 适配器层是否已启用。active_adapters
(list[str]
): 活动适配器的名称(如果有),例如["default"]
。merged_adapters
(list[str]
): 合并适配器的名称(如果有),例如["default"]
。available_adapters
(list[str]
): 可用适配器的名称,例如["default"]
。
get_model_status
< source >( ) → peft.peft_model.TunerModelStatus
获取模型调谐器的状态。
此方法返回一个 TunerModelStatus
数据类实例,其中包含以下属性
base_model_type
(str
): 基础模型的类型,例如T5Model
。adapter_model_type
(str
): 适配器模型的类型,例如LoraModel
。peft_types
(dict[str, str]
): 适配器名称到适配器类型的映射,例如{"default": "LORA"}
。trainable_params
(int
): 模型中可训练参数的数量。total_params
(int
): 模型中参数的总数。num_adapter_layers
(int
): 模型中适配器层的数量。enabled
(bool
,Literal["irregular"]
): 是否所有适配器层都已启用。如果某些已启用而某些未启用,则这将为"irregular"
。这意味着您的模型处于不一致的状态,可能无法按预期工作。active_adapters
(list[str]
,Literal["irregular"]
): 活动适配器的名称。如果活动适配器在所有层中不一致,则这将为"irregular"
,这意味着您的模型处于不一致的状态,可能无法按预期工作。merged_adapters
(list[str]
,Literal["irregular"]
): 合并适配器的名称。如果合并的适配器在所有层中不一致,则这将为"irregular"
,这意味着您的模型处于不一致的状态,可能无法按预期工作。available_adapters
(list[str]
): 可用适配器的名称,例如["default"]
。
返回模型中可训练参数的数量和所有参数的数量。
返回用于 Peft 的虚拟提示。仅在使用提示学习方法时适用。
返回保存模型时要保存的提示嵌入。仅在使用提示学习方法时适用。
load_adapter
< source >( model_id: Union[str, os.PathLike] adapter_name: str is_trainable: bool = False torch_device: Optional[str] = None autocast_adapter_dtype: bool = True ephemeral_gpu_offload: bool = False low_cpu_mem_usage: bool = False **kwargs: Any )
参数
- model_id (
str
或os.PathLike
) — 要使用的 PEFT 配置的名称。可以是以下之一:- 字符串,Hugging Face Hub 上模型仓库中托管的 PEFT 配置的
模型 ID
。 - 包含使用
save_pretrained
方法保存的 PEFT 配置文件的目录路径 (./my_peft_config_directory/
)。
- 字符串,Hugging Face Hub 上模型仓库中托管的 PEFT 配置的
- adapter_name (
str
) — 要添加的适配器的名称。 - is_trainable (
bool
, 可选, 默认为False
) — 适配器是否应该是可训练的。如果为False
,则适配器将被冻结,并且只能用于推理。 - torch_device (
str
, 可选, 默认为 None) — 加载适配器的设备。如果为None
,则将推断设备。 - autocast_adapter_dtype (
bool
, 可选, 默认为True
) — 是否自动转换适配器数据类型。默认为True
。目前,这只会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且只会影响部分 PEFT 调谐器。 - ephemeral_gpu_offload (
bool
, 可选, 默认为False
) — 是否对部分加载的模块使用临时 GPU 卸载。默认为False
。 - low_cpu_mem_usage (
bool
,可选
, 默认为False
) — 在加载已保存的权重之前,在元设备上创建空的适配器权重。有助于加速该过程。 - kwargs — (
可选
): 用于修改适配器加载方式的其他参数,例如 Hugging Face Hub 的 token。
将训练好的适配器加载到模型中。
新适配器的名称应该是唯一的。
新适配器不会自动设置为活动适配器。使用 PeftModel.set_adapter() 设置活动适配器。
打印模型中可训练参数的数量。
注意:print_trainable_parameters() 使用 get_nb_trainable_parameters(),这与 huggingface/transformers 中的 num_parameters(only_trainable=True) 不同。get_nb_trainable_parameters() 返回 Peft 模型的(可训练参数,所有参数),其中包括修改后的骨干 Transformer 模型。对于像 LoRA 这样的技术,骨干 Transformer 模型通过 LoRA 模块就地修改。但是,对于 prompt tuning,骨干 Transformer 模型是未修改的。num_parameters(only_trainable=True) 返回骨干 Transformer 模型的可训练参数数量,这可能有所不同。
save_pretrained
< source >( save_directory: str safe_serialization: bool = True selected_adapters: Optional[list[str]] = None save_embedding_layers: Union[str, bool] = 'auto' is_main_process: bool = True path_initial_model_for_weight_conversion: Optional[str] = None **kwargs: Any )
参数
- save_directory (
str
) — 将在其中保存适配器模型和配置文件目录(如果不存在将创建)。 - safe_serialization (
bool
, 可选) — 是否以 safetensors 格式保存适配器文件,默认为True
。 - selected_adapters (
List[str]
, 可选) — 要保存的适配器列表。如果为None
,则默认为所有适配器。 - save_embedding_layers (
Union[bool, str]
, 可选, 默认为"auto"
) — 如果为True
,则除了适配器权重外,还保存嵌入层。如果为auto
,则检查配置的target_modules
中常见的嵌入层peft.utils.other.EMBEDDING_LAYER_NAMES
(如果可用)。并自动设置布尔标志。这仅适用于 🤗 transformers 模型。 - is_main_process (
bool
, 可选) — 调用此过程是否为主进程。默认为True
。如果不在主进程上,则不会保存检查点,这对于多设备设置(例如 DDP)非常重要。 - path_initial_model_for_weight_conversion (
str, *可选*
) — 初始化适配器的路径,该适配器在用 PiSSA/CorDA/OLoRA 初始化模型之后且在执行任何训练之前获得。当path_initial_model_for_weight_conversion
不为 None 时,将计算微调前后适配器的差异。这种差异可以表示为标准 LoRA 适配器的参数。使用此转换后的适配器不需要更改基础模型,因此可以方便地将多个 PiSSA/CorDA/OLoRA 适配器与 LoRA 适配器一起使用,以及激活或停用任何适配器。请注意,如果rslora
与rank_pattern
或alpha_pattern
结合使用,则不支持此转换。 - kwargs (其他关键字参数,可选) — 传递给
push_to_hub
方法的其他关键字参数。
此函数将适配器模型和适配器配置文件保存到目录中,以便可以使用 PeftModel.from_pretrained() 类方法重新加载,也可以供 PeftModel.push_to_hub()
方法使用。
设置激活的适配器。
一次只能激活一个适配器。
此外,此函数会将指定的适配器设置为可训练(即,requires_grad=True)。如果不需要这样做,请使用以下代码。
PeftModelForSequenceClassification
用于序列分类任务的 PeftModel
。
class peft.PeftModelForSequenceClassification
< source >( model: torch.nn.Module peft_config: PeftConfig adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 Transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, 可选) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, 可选) — 是否自动转换适配器数据类型。默认为True
。目前,这只会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且只会影响部分 PEFT 调谐器。
用于序列分类任务的 Peft 模型。
属性:
- config (PretrainedConfig) — 基础模型的配置对象。
- cls_layer_name (
str
) — 分类层的名称。
示例
>>> from transformers import AutoModelForSequenceClassification
>>> from peft import PeftModelForSequenceClassification, get_peft_config
>>> config = {
... "peft_type": "PREFIX_TUNING",
... "task_type": "SEQ_CLS",
... "inference_mode": False,
... "num_virtual_tokens": 20,
... "token_dim": 768,
... "num_transformer_submodules": 1,
... "num_attention_heads": 12,
... "num_layers": 12,
... "encoder_hidden_size": 768,
... "prefix_projection": False,
... "postprocess_past_key_value_function": None,
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased")
>>> peft_model = PeftModelForSequenceClassification(model, peft_config)
>>> peft_model.print_trainable_parameters()
trainable params: 370178 || all params: 108680450 || trainable%: 0.3406113979101117
PeftModelForTokenClassification
用于 token 分类任务的 PeftModel
。
class peft.PeftModelForTokenClassification
< source >( model: torch.nn.Module peft_config: PeftConfig = None adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 Transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, 可选) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, optional) — 是否自动转换适配器数据类型。默认为True
。目前,这仅会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响部分 PEFT 调优器。
用于 token 分类任务的 Peft 模型。
属性:
- config (PretrainedConfig) — 基础模型的配置对象。
- cls_layer_name (
str
) — 分类层的名称。
示例
>>> from transformers import AutoModelForSequenceClassification
>>> from peft import PeftModelForTokenClassification, get_peft_config
>>> config = {
... "peft_type": "PREFIX_TUNING",
... "task_type": "TOKEN_CLS",
... "inference_mode": False,
... "num_virtual_tokens": 20,
... "token_dim": 768,
... "num_transformer_submodules": 1,
... "num_attention_heads": 12,
... "num_layers": 12,
... "encoder_hidden_size": 768,
... "prefix_projection": False,
... "postprocess_past_key_value_function": None,
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModelForTokenClassification.from_pretrained("bert-base-cased")
>>> peft_model = PeftModelForTokenClassification(model, peft_config)
>>> peft_model.print_trainable_parameters()
trainable params: 370178 || all params: 108680450 || trainable%: 0.3406113979101117
PeftModelForCausalLM
用于因果语言建模的 PeftModel
。
class peft.PeftModelForCausalLM
< source >( model: torch.nn.Module peft_config: PeftConfig adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, optional) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, optional) — 是否自动转换适配器数据类型。默认为True
。目前,这仅会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响部分 PEFT 调优器。
用于因果语言建模的 Peft 模型。
示例
>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModelForCausalLM, get_peft_config
>>> config = {
... "peft_type": "PREFIX_TUNING",
... "task_type": "CAUSAL_LM",
... "inference_mode": False,
... "num_virtual_tokens": 20,
... "token_dim": 1280,
... "num_transformer_submodules": 1,
... "num_attention_heads": 20,
... "num_layers": 36,
... "encoder_hidden_size": 1280,
... "prefix_projection": False,
... "postprocess_past_key_value_function": None,
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModelForCausalLM.from_pretrained("gpt2-large")
>>> peft_model = PeftModelForCausalLM(model, peft_config)
>>> peft_model.print_trainable_parameters()
trainable params: 1843200 || all params: 775873280 || trainable%: 0.23756456724479544
PeftModelForSeq2SeqLM
用于序列到序列语言建模的 PeftModel
。
class peft.PeftModelForSeq2SeqLM
< source >( model: torch.nn.Module peft_config: PeftConfig adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, optional) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, optional) — 是否自动转换适配器数据类型。默认为True
。目前,这仅会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响部分 PEFT 调优器。
用于序列到序列语言建模的 Peft 模型。
示例
>>> from transformers import AutoModelForSeq2SeqLM
>>> from peft import PeftModelForSeq2SeqLM, get_peft_config
>>> config = {
... "peft_type": "LORA",
... "task_type": "SEQ_2_SEQ_LM",
... "inference_mode": False,
... "r": 8,
... "target_modules": ["q", "v"],
... "lora_alpha": 32,
... "lora_dropout": 0.1,
... "fan_in_fan_out": False,
... "enable_lora": None,
... "bias": "none",
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
>>> peft_model = PeftModelForSeq2SeqLM(model, peft_config)
>>> peft_model.print_trainable_parameters()
trainable params: 884736 || all params: 223843584 || trainable%: 0.3952474242013566
PeftModelForQuestionAnswering
用于问答的 PeftModel
。
class peft.PeftModelForQuestionAnswering
< source >( model: torch.nn.Module peft_config: PeftConfig adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, optional) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, optional) — 是否自动转换适配器数据类型。默认为True
。目前,这仅会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响部分 PEFT 调优器。
用于抽取式问答的 Peft 模型。
属性:
- config (PretrainedConfig) — 基础模型的配置对象。
- cls_layer_name (
str
) — 分类层的名称。
示例
>>> from transformers import AutoModelForQuestionAnswering
>>> from peft import PeftModelForQuestionAnswering, get_peft_config
>>> config = {
... "peft_type": "LORA",
... "task_type": "QUESTION_ANS",
... "inference_mode": False,
... "r": 16,
... "target_modules": ["query", "value"],
... "lora_alpha": 32,
... "lora_dropout": 0.05,
... "fan_in_fan_out": False,
... "bias": "none",
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModelForQuestionAnswering.from_pretrained("bert-base-cased")
>>> peft_model = PeftModelForQuestionAnswering(model, peft_config)
>>> peft_model.print_trainable_parameters()
trainable params: 592900 || all params: 108312580 || trainable%: 0.5473971721475013
PeftModelForFeatureExtraction
用于从 transformer 模型中提取特征/嵌入的 PeftModel
。
class peft.PeftModelForFeatureExtraction
< source >( model: torch.nn.Module peft_config: PeftConfig adapter_name: str = 'default' **kwargs )
参数
- model (PreTrainedModel) — 基础 transformer 模型。
- peft_config (PeftConfig) — Peft 配置。
- adapter_name (
str
, optional) — 适配器的名称,默认为"default"
。 - autocast_adapter_dtype (
bool
, optional) — 是否自动转换适配器数据类型。默认为True
。目前,这仅会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响部分 PEFT 调优器。
用于从 transformer 模型中提取特征/嵌入的 Peft 模型
属性:
- config (PretrainedConfig) — 基础模型的配置对象。
示例
>>> from transformers import AutoModel
>>> from peft import PeftModelForFeatureExtraction, get_peft_config
>>> config = {
... "peft_type": "LORA",
... "task_type": "FEATURE_EXTRACTION",
... "inference_mode": False,
... "r": 16,
... "target_modules": ["query", "value"],
... "lora_alpha": 32,
... "lora_dropout": 0.05,
... "fan_in_fan_out": False,
... "bias": "none",
... }
>>> peft_config = get_peft_config(config)
>>> model = AutoModel.from_pretrained("bert-base-cased")
>>> peft_model = PeftModelForFeatureExtraction(model, peft_config)
>>> peft_model.print_trainable_parameters()
PeftMixedModel
用于混合不同适配器类型(例如 LoRA 和 LoHa)的 PeftModel
。
class peft.PeftMixedModel
< source >( model: nn.Module peft_config: PeftConfig adapter_name: str = 'default' )
用于加载混合不同类型适配器以进行推理的 PeftMixedModel。
此类不支持加载/保存,通常不应直接初始化。而是使用参数 mixed=True
调用 get_peft_model
。
阅读 混合适配器类型 指南,了解有关使用不同适配器类型的更多信息。
示例
>>> base_model = ... # load the base model, e.g. from transformers
>>> peft_model = PeftMixedModel.from_pretrained(base_model, path_to_adapter1, "adapter1").eval()
>>> peft_model.load_adapter(path_to_adapter2, "adapter2")
>>> peft_model.set_adapter(["adapter1", "adapter2"]) # activate both adapters
>>> peft_model(data) # forward pass using both adapters
添加适配器
< source >( adapter_name: str peft_config: PeftConfig low_cpu_mem_usage: bool = False )
参数
- adapter_name (
str
) — 要添加的适配器的名称。 - peft_config (PeftConfig) — 要添加的适配器的配置。
- low_cpu_mem_usage (
bool
,optional
, defaults toFalse
) — 在 meta 设备上创建空的适配器权重。当加载已保存的适配器时,这对于加速该过程很有用。当为训练创建新的 PEFT 适配器时,请勿使用
low_cpu_mem_usage=True
(通常不鼓励对 PeftMixedModel 进行训练,且未经测试)。
根据传递的配置向模型添加适配器。
此适配器未经过训练。要加载经过训练的适配器,请查看 PeftModel.load_adapter()。
新适配器的名称应该是唯一的。
新适配器不会自动设置为活动适配器。使用 PeftModel.set_adapter() 设置活动适配器。
禁用适配器模块。
模型的前向传播。
from_pretrained
< source >( model: nn.Module model_id: str | os.PathLike adapter_name: str = 'default' is_trainable: bool = False config: Optional[PeftConfig] = None **kwargs: Any )
参数
- model (
nn.Module
) — 要适配的模型。 - model_id (
str
或os.PathLike
) — 要使用的 PEFT 配置的名称。可以是以下之一:- 一个字符串,即托管在 Hugging Face Hub 的模型仓库内的 PEFT 配置的
model id
。 - 一个目录的路径,其中包含使用
save_pretrained
方法保存的 PEFT 配置文件 (./my_peft_config_directory/
)。
- 一个字符串,即托管在 Hugging Face Hub 的模型仓库内的 PEFT 配置的
- adapter_name (
str
, optional, defaults to"default"
) — 要加载的适配器的名称。这对于加载多个适配器非常有用。 - is_trainable (
bool
, optional, defaults toFalse
) — 适配器是否应该是可训练的。如果为False
,适配器将被冻结并用于推理 - config (PeftConfig, optional) — 用于代替自动加载的配置的配置对象。此配置对象与
model_id
和kwargs
互斥。当配置在调用from_pretrained
之前已加载时,这非常有用。 - low_cpu_mem_usage (
bool
,optional
, defaults toFalse
) — 在加载已保存的权重之前,在 meta 设备上创建空的适配器权重。这对于加速该过程很有用。 - kwargs — (
optional
): 传递给特定 PEFT 配置类的其他关键字参数。
从预训练模型和加载的 PEFT 权重实例化 PEFT 混合模型。
请注意,传递的 model
可能会被就地修改。
生成输出。
返回模型中可训练参数的数量和所有参数的数量。
load_adapter
< source >( model_id: str adapter_name: str *args: Any **kwargs: Any )
参数
- adapter_name (
str
) — 要添加的适配器的名称。 - peft_config (PeftConfig) — 要添加的适配器的配置。
- is_trainable (
bool
, optional, defaults toFalse
) — 适配器是否应该是可训练的。如果为False
,适配器将被冻结,并且只能用于推理。 - torch_device (
str
, optional, defaults to None) — 加载适配器的设备。如果为None
,将推断设备。 - autocast_adapter_dtype (
bool
, optional, defaults toTrue
) — 是否自动转换适配器 dtype。默认为True
。目前,这只会将使用 float16 和 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且只会影响选定的 PEFT 调谐器。 - ephemeral_gpu_offload (
bool
, optional, defaults toFalse
) — 是否对部分加载的模块使用临时 GPU 卸载。默认为False
。 - low_cpu_mem_usage (
bool
,optional
, defaults toFalse
) — 在加载已保存的权重之前,在 meta 设备上创建空的适配器权重。这对于加速该过程很有用。 - kwargs — (
optional
): 用于修改适配器加载方式的其他参数,例如 Hugging Face Hub 的令牌。
将训练好的适配器加载到模型中。
新适配器的名称应该是唯一的。
新适配器不会自动设置为活动适配器。使用 PeftModel.set_adapter() 设置活动适配器。
merge_and_unload
< source >( *args: Any **kwargs: Any )
此方法将适配器层合并到基础模型中。如果有人想将基础模型用作独立模型,则需要这样做。
打印模型中可训练参数的数量。
注意:print_trainable_parameters() 使用 get_nb_trainable_parameters(),这与 huggingface/transformers 中的 num_parameters(only_trainable=True) 不同。get_nb_trainable_parameters() 返回 Peft 模型的(可训练参数,所有参数),其中包括修改后的骨干 Transformer 模型。对于像 LoRA 这样的技术,骨干 Transformer 模型通过 LoRA 模块就地修改。但是,对于 prompt tuning,骨干 Transformer 模型是未修改的。num_parameters(only_trainable=True) 返回骨干 Transformer 模型的可训练参数数量,这可能有所不同。
set_adapter
< source >( adapter_name: Union[str, list[str]] )
设置模型的活动适配器。
请注意,前向传播期间应用适配器的顺序可能与将它们传递给此函数的顺序不同。 相反,前向传播期间的顺序由适配器加载到模型中的顺序决定。 活动适配器仅确定在前向传播期间哪些适配器处于活动状态,但不确定应用它们的顺序。
此外,此函数会将指定的适配器设置为可训练(即,requires_grad=True)。 如果不需要这样做,请使用以下代码。
通过移除所有适配器模块但不合并来恢复基础模型。 这会返回原始基础模型。
实用工具
peft.cast_mixed_precision_params
< source >( model dtype )
将模型的所有非可训练参数转换为给定的 dtype
。 dtype
可以是 torch.float16
或 torch.bfloat16
,具体取决于您执行的混合精度训练。 可训练参数将转换为全精度。 这旨在通过对非可训练参数使用半精度数据类型来减少使用 PEFT 方法时的 GPU 内存使用量。 将可训练参数保持为全精度可在使用自动混合精度训练时保持训练稳定性。
torch.bfloat16
,具体取决于您执行的混合精度训练。
peft.get_peft_model
< source >( model: PreTrainedModel peft_config: PeftConfig adapter_name: str = 'default' mixed: bool = False autocast_adapter_dtype: bool = True revision: Optional[str] = None low_cpu_mem_usage: bool = False )
参数
- model (transformers.PreTrainedModel) — 要包装的模型。
- peft_config (PeftConfig) — 包含 Peft 模型参数的配置对象。
- adapter_name (
str
,optional
, 默认为"default"
) — 要注入的适配器的名称,如果未提供,则使用默认适配器名称(“default”)。 - mixed (
bool
,optional
, 默认为False
) — 是否允许混合使用不同的(兼容的)适配器类型。 - autocast_adapter_dtype (
bool
, 可选) — 是否自动转换适配器数据类型。 默认为True
。 目前,这只会将使用 float16 或 bfloat16 的适配器权重转换为 float32,因为这通常是稳定训练所必需的,并且仅影响选定的 PEFT 调谐器。 - revision (
str
,optional
, 默认为main
) — 基础模型的修订版本。 如果未设置,则保存的 peft 模型将加载基础模型的main
修订版本 - low_cpu_mem_usage (
bool
,optional
, 默认为False
) — 在 meta 设备上创建空适配器权重。 有助于加速加载过程。 如果您打算训练模型,请将此设置保留为 False,除非适配器权重将在训练开始前被不同的权重替换。
从模型和配置返回 Peft 模型对象,其中模型将被就地修改。
peft.inject_adapter_in_model
< source >( peft_config: PeftConfig model: torch.nn.Module adapter_name: str = 'default' low_cpu_mem_usage: bool = False )
一个简单的 API,用于创建适配器并就地注入到模型中。 目前,该 API 不支持提示学习方法和自适应提示。 确保在 peft_config
对象中设置了正确的 target_names
。 该 API 在底层调用 get_peft_model
,但将仅限于非提示学习方法。
peft.get_peft_model_state_dict
< source >( model state_dict = None adapter_name = 'default' unwrap_compiled = False save_embedding_layers = 'auto' )
参数
- model (PeftModel) — Peft 模型。 当使用 torch.nn.DistributedDataParallel、DeepSpeed 或 FSDP 时,模型应为底层模型/解包模型(即 model.module)。
- state_dict (
dict
, optional, 默认为None
) — 模型的 state dict。 如果未提供,将使用传递模型的 state dict。 - adapter_name (
str
, 可选, 默认为"default"
) — 要返回状态字典的适配器的名称。 - unwrap_compiled (
bool
, 可选, 默认为False
) — 如果使用了torch.compile
,是否解包模型。 - save_embedding_layers (
Union[bool, str]
, , 可选, 默认为auto
) — 如果为True
,则除了适配器权重外,还保存嵌入层。如果为auto
,则在配置的target_modules
中检查常见的嵌入层peft.utils.other.EMBEDDING_LAYER_NAMES
(如果可用)。根据它设置布尔标志。这仅适用于 🤗 transformers 模型。
获取 Peft 模型的状态字典。
peft.prepare_model_for_kbit_training
< source >( model use_gradient_checkpointing = True gradient_checkpointing_kwargs = None )
参数
- model (
transformers.PreTrainedModel
) — 从transformers
加载的模型 - use_gradient_checkpointing (
bool
, 可选, 默认为True
) — 如果为 True,则使用梯度检查点以节省内存,但会牺牲较慢的后向传递速度。 - gradient_checkpointing_kwargs (
dict
, 可选, 默认为None
) — 传递给梯度检查点函数的关键字参数,有关您可以传递给该方法的参数的更多详细信息,请参阅torch.utils.checkpoint.checkpoint
的文档。请注意,这仅在最新的 transformers 版本(> 4.34.1)中可用。
请注意,此方法仅适用于 transformers
模型。
此方法封装了在运行训练之前准备模型的整个协议。这包括:1- 将 layernorm 转换为 fp32 2- 使输出嵌入层需要梯度 3- 添加 lm head 到 fp32 的类型转换 4- 冻结基础模型层以确保在训练期间不更新它们
peft.get_layer_status
< source >( model: torch.nn.Module ) → listpeft.peft_model.TunerLayerStatus
获取模型中每个适配器层的状态。
此函数返回 TunerLayerStatus
数据类实例的列表,每个实例都包含以下属性
name
(str
): 适配器层的名称,例如model.encoder.block.0.layer.0.SelfAttention.q
。module_type
(str
): 适配器层的类型,例如lora.Linear
。enabled
(bool
): 适配器层是否已启用。active_adapters
(list[str]
): 活动适配器的名称(如果有),例如["default"]
。merged_adapters
(list[str]
): 合并适配器的名称(如果有),例如["default"]
。- requires_grad : dict[str, bool | Literal[“irregular”]] 每个适配器模块的参数的 requires_grad 状态。理想情况下,它应该是
True
或False
。如果 requires_grad 状态在所有参数中不一致,则该值将设置为"irregular"
。 available_adapters
(list[str]
): 可用适配器的名称,例如["default"]
。devices
(dict[str, list[str]]
): 给定适配器的参数存储的设备,例如["cuda"]
。
peft.get_model_status
< source >( model: torch.nn.Module ) → peft.peft_model.TunerModelStatus
获取模型调谐器的状态。
此函数返回 TunerModelStatus
数据类实例,其中包含以下属性
base_model_type
(str
): 基础模型的类型,例如T5Model
。adapter_model_type
(str
): 适配器模型的类型,例如LoraModel
。peft_types
(dict[str, str]
): 适配器名称到适配器类型的映射,例如{"default": "LORA"}
。trainable_params
(int
): 模型中可训练参数的数量。total_params
(int
): 模型中参数的总数。num_adapter_layers
(int
): 模型中适配器层的数量。enabled
(bool
,Literal["irregular"]
): 是否所有适配器层都已启用。如果某些已启用而某些未启用,则这将为"irregular"
。这意味着您的模型处于不一致的状态,可能无法按预期工作。active_adapters
(list[str]
,Literal["irregular"]
): 活动适配器的名称。如果活动适配器在所有层中不一致,则这将为"irregular"
,这意味着您的模型处于不一致的状态,可能无法按预期工作。merged_adapters
(list[str]
,Literal["irregular"]
): 合并适配器的名称。如果合并的适配器在所有层中不一致,则这将为"irregular"
,这意味着您的模型处于不一致的状态,可能无法按预期工作。requires_grad
(dict[str, bool | Literal["irregular"]]
): 对于给定的适配器,所有适配器层是否都将requires_grad
设置为True
或False
。如果存在混合情况,则会将其设置为"irregular"
,这意味着您的模型处于不一致的状态,可能无法按预期工作。available_adapters
(list[str]
): 可用适配器的名称,例如["default"]
。devices
(dict[str, list[str]]
): 给定适配器的参数存储的设备,例如["cuda"]
。