重要提示
您正在查看 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)
迁移步骤#
使用 YAML 文件中
data
字段中的参数创建FineTuningDataModule
。 jsonl 文件应以与 NeMo 1.0 中相同的方式处理。 或者,使用提供的其中一个数据集,并让它为您自动处理。以与预训练相同的方式初始化训练器、模型、优化器、记录器。
而不是
MegatronGPTSFTModel.restore_from
,使用trainer.fit(..., ckpt_path=model.import_ckpt(...))