重要提示

您正在查看 NeMo 2.0 文档。此版本引入了对 API 的重大更改和一个新的库 NeMo Run。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。 有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

将 SFT 训练和推理从 NeMo 1.0 迁移到 NeMo 2.0#

NeMo 1.0(先前版本)#

在 NeMo 1.0 中,SFT 使用 megatron_gpt_finetuning_config.yaml 进行配置,并使用 megatron_gpt_finetuning.py 启动,这两者都与预训练脚本完全分离。 在内部,此脚本实例化不同的模型类 (MegatronGPTSFTModel),即使与预训练的唯一区别是数据管道。 这种设计一直是许多 NeMo 1.0 用户感到困惑的地方。

NeMo 2.0(新版本)#

在 NeMo 2.0 中,设计已得到改进以解决此问题。 数据模块和模型类现在是独立的构建块,可以直观地组合在一起,以提高通用性并最大限度地减少冗余。 对于 SFT,数据模块是 FineTuningDataModule,其余管道与预训练共享。

此外,我们提供了特定于数据集的数据模块,以方便用户开始训练,而无需担心数据下载和预处理。 支持的数据集可以在 此处 找到。

在 NeMo 2.0 中,可以像这样运行微调工作负载

from nemo import lightning as nl
from nemo.collections import llm

trainer = nl.Trainer(...)
model = llm.LlamaModel(...)
ckpt_path = model.import_ckpt("hf://meta-llama/Meta-Llama-3-8B")

# Option 1: custom dataset
data = llm.FineTuningDataModule(dataset_root, seq_length=2048, micro_batch_size=1, global_batch_size=128, ...)
# Option 2: provided dataset
data = llm.SquadDataModule(seq_length=2048, micro_batch_size=1, global_batch_size=128, ...)

trainer.fit(model, data, ckpt_path=ckpt_path)

使用带有 NeMo-Run 的 llm.finetune API

import nemo_run as run
sft = run.Partial(
     llm.finetune,
     model=llm.mistral,
     data=llm.squad,
     trainer=trainer,
     log=logger,
     optim=adam_with_cosine_annealing,
)
run.run(sft, name="mistral-sft", direct=True)

迁移步骤#

  1. 使用 YAML 文件中 data 字段中的参数创建 FineTuningDataModule。 jsonl 文件应以与 NeMo 1.0 中相同的方式处理。 或者,使用提供的其中一个数据集,并让它为您自动处理。

  2. 以与预训练相同的方式初始化训练器、模型、优化器、记录器。

  3. 而不是 MegatronGPTSFTModel.restore_from,使用 trainer.fit(..., ckpt_path=model.import_ckpt(...))