PEFT 文档
可训练的 Tokens
并获得增强的文档体验
开始
可训练的 Tokens
可训练的 Tokens 方法提供了一种针对特定 token embeddings 进行微调的方式,而无需训练完整的 embedding 矩阵或在 embedding 矩阵上使用 adapter。它基于 此处 的初始实现。
该方法仅针对特定 token,并选择性地训练您指定的 token 索引。因此,所需的 RAM 将更低,并且磁盘内存也比存储完整微调的 embedding 矩阵显著降低。
使用 此脚本 获得的一些初步基准测试表明,对于 gemma-2-2b
(它有一个相当大的 embedding 矩阵),与完全微调 embedding 矩阵相比,您可以使用可训练的 Tokens 节省约 4 GiB VRAM。虽然 LoRA 将使用相当数量的 VRAM,但它也可能针对您不想更改的 token。请注意,这些只是指示,不同的 embedding 矩阵大小可能会稍微扭曲这些数字。
请注意,此方法不会为您添加 token,您必须自己将 token 添加到 tokenizer,并相应地调整模型的 embedding 矩阵大小。此方法仅会重新训练您指定的 token 的 embeddings。此方法也可以与 LoRA 层结合使用!请参阅 LoRA 开发者指南。
TrainableTokensConfig
class peft.TrainableTokensConfig
< 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 token_indices: list[int] = <factory> target_modules: Optional[Union[list[str], str]] = None init_weights: bool = True )
参数
- token_indices (
list[int]
) — 整数列表,表示您要训练的 token 的索引。要使用 tokenizer 查找 token 的索引,您可以对字符串进行 token 化,并查看返回的input_ids
。索引数量越接近 token 总数,此方法的效率就越低。 - target_modules (
Optional[Union[list[str], str]]
) — 要用我们的TrainableTokensLayer
替换的模块名称列表或模块名称的正则表达式。如果未定义,它将尝试获取模型的输入 embedding 层(如果模型具有get_input_embeddings
方法,transformer 模型通常会这样做),如果失败,则默认值为 ‘embed_tokens’。其他示例目标包括embedding
、encoder.embeddings
或decoder.embeddings
。 - init_weights (
bool
) — 默认情况下,新的 token 权重初始化为与各自的 token embeddings 相同。这使得 TrainableTokens 在未训练时不起作用。如果设置为False
,则权重将为随机值。除非您确切知道自己在做什么,否则请勿更改此设置。
TrainableTokens
方法的配置。
允许训练新的 token(和重新训练现有的 token),而无需训练完整的 embedding 矩阵。通过标记一些选定的 token(由其索引标识)为可训练,并保持其余部分不变,此方法可用于添加新的 token 或更改现有 token 的 embedding,同时节省内存。与完全训练 embedding 矩阵相比,存储空间和工作内存使用量都减少了。
请注意,训练与 FSDP/DeepSpeed 可能尚未完全支持。
TrainableTokensModel
class peft.TrainableTokensModel
< source >( model config adapter_name low_cpu_mem_usage: bool = False )
merge_and_unload
< source >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法将训练后的 token 合并到基础模型的目标 embedding 层中。如果有人想将基础模型用作独立模型,则需要这样做。
set_adapter
< source >( adapter_name: str | list[str] )
设置活动的 adapter。
此外,此函数会将指定的 adapters 设置为可训练(即,requires_grad=True)。如果不需要这样做,请使用以下代码。
通过移除所有可训练的 tokens 模块但不进行合并,返回基础模型。