重要提示

您正在查看 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 方法

  1. 适配器(规范):CanonicalAdaptersPEFTConfig

  2. LoRA:LoraPEFTConfig

  3. IA3:IA3PEFTConfig

  4. 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_adapterload_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)