重要提示
您正在查看 NeMo 2.0 文档。此版本对 API 和新的库 NeMo Run 进行了重大更改。我们目前正在将 NeMo 1.0 的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
快速入门指南#
快速入门指南概述了 NeMo 中的 PEFT 工作流程。
术语:PEFT 与适配器#
本教程使用“PEFT”来描述整体参数高效微调方法,使用“适配器”来描述注入到冻结的基础模型的附加模块。每个 PEFT 模型可以使用一种或多种类型的适配器。
其中一种 PEFT 方法有时被称为“适配器”,因为它最初是适配器模块在 NLP 中的最早应用之一。这种 PEFT 方法将被称为“规范”适配器,以区分这两种用法。
PEFT 在 NeMo 模型中的工作原理#
每种 PEFT 方法都有一种或多种类型的适配器,需要注入到基础模型中。在 NeMo 模型中,适配器逻辑和适配器权重已内置到子模块中,但在默认情况下,对于普通训练和微调,它们是禁用的。
在进行 PEFT 时,当调用 model.add_adapter(peft_cfg)
时,可以启用适配器逻辑路径。在此函数中,模型扫描当前 PEFT 方法适用的每个适配器及其每个子模块,以查找可以启用的适配器逻辑路径。然后,基础模型权重被冻结,而新添加的适配器权重被解冻,并允许在微调期间更新,从而实现微调参数数量的效率。
PEFT 配置类#
每种 PEFT 方法都由 PEFTConfig
类指定,该类存储适用于 PEFT 方法的适配器类型,以及初始化这些适配器模块所需的超参数。目前支持以下四种 PEFT 方法
适配器(规范):
CanonicalAdaptersPEFTConfig
LoRA:
LoraPEFTConfig
IA3:
IA3PEFTConfig
P-Tuning:
PtuningPEFTConfig
这些配置类使得尝试不同的适配器就像更改配置类一样容易。
此外,可以在 NeMo 中组合使用 PEFT 方法,因为它们彼此正交。这可以通过将 PEFTConfig
对象列表传递给 add_adapter
而不是单个对象来轻松完成。例如,常见的流程是将 P-Tuning 和适配器组合在一起,这可以通过 model.add_adapter([PtuningPEFTConfig(model_cfg), CanonicalAdaptersPEFTConfig(model_cfg)])
来实现
基础模型类#
NeMo 中的 PEFT 是使用不属于任何特定模型的混合类构建的。这意味着相同的接口可用于不同的 NeMo 模型。目前,NeMo 支持 GPT 风格模型的 PEFT,例如 GPT 3、Nemotron、LLaMa 1/2 (MegatronGPTSFTModel
),以及 T5 (MegatronT5SFTModel
)。
完整微调与 PEFT#
您可以通过删除对 add_adapter
和 load_adapter
的调用来在完整微调和 PEFT 之间切换。
下面的代码片段说明了完整微调和 PEFT 的核心 API。
trainer = MegatronTrainerBuilder(config).create_trainer()
model_cfg = MegatronGPTSFTModel.merge_cfg_with(config.model.restore_from_path, config)
### Training API ###
model = MegatronGPTSFTModel.restore_from(restore_path, model_cfg, trainer) # restore from pretrained ckpt
+ peft_cfg = LoraPEFTConfig(model_cfg)
+ model.add_adapter(peft_cfg)
trainer.fit(model) # saves adapter weights only
### Inference API ###
# Restore from base then load adapter API
model = MegatronGPTSFTModel.restore_from(restore_path, trainer, model_cfg)
+ model.load_adapters(adapter_save_path, peft_cfg)
model.freeze()
trainer.predict(model)