重要提示
您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库,NeMo Run。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档。
NeMo 基础知识#
在此页面中,我们将深入了解 NeMo 的工作原理,为您有效使用 NeMo 以满足您的特定用例提供坚实的基础。
NeMo 模型#
NVIDIA NeMo 是一个强大的框架,用于构建和部署神经网络模型,包括用于生成式 AI、语音识别和自然语言处理的模型。NeMo 代表“神经模块 (Neural Modules)”,它是使用此平台创建的模型的构建块。NeMo 包括以下所有组件,并将其封装成一个单一的、有凝聚力的单元
神经网络架构
数据集和数据加载器
输入数据预处理和模型输出后处理
损失函数、优化器和调度器
任何其他支持基础设施,例如分词器、语言模型配置和数据增强
NeMo 模型构建于 PyTorch 之上,其许多组件都是 torch.nn.Module
的子类。此外,NeMo 模型利用 PyTorch Lightning (PTL) 进行训练,这有助于减少所需的样板代码。
NeMo 模型还被设计为易于配置;通常使用 YAML 文件完成此操作。下面我们展示了以伪代码定义的 NeMo 模型和以 YAML 定义的配置的简化示例。我们突出显示了从 YAML 文件读取 Python 配置参数的行。
NeMo 模型定义(Python 伪代码)#
1class ExampleEncDecModel:
2 # cfg is passed so it only contains "model" section
3 def __init__(self, cfg, trainer):
4 self.tokenizer = init_from_cfg(cfg.tokenizer)
5
6
7 self.encoder = init_from_cfg(cfg.encoder)
8
9
10 self.decoder = init_from_cfg(cfg.decoder)
11
12
13 self.loss = init_from_cfg(cfg.loss)
14
15
16 # optimizer configured via parent class
17
18
19 def setup_training_data(self, cfg):
20 self.train_dl = init_dl_from_cfg(cfg.train_ds)
21
22 def forward(self, batch):
23 # forward pass defined,
24 # as is standard for PyTorch models
25 ...
26
27 def training_step(self, batch):
28 log_probs = self.forward(batch)
29 loss = self.loss(log_probs, labels)
30 return loss
|
实验配置 (YAML)#
1#
2# configuration of the NeMo model
3model:
4 tokenizer:
5 ...
6
7 encoder:
8 ...
9
10 decoder:
11 ...
12
13 loss:
14 ...
15
16 optim:
17 ...
18
19
20 train_ds:
21 ...
22
23# configuration of the
24# PyTorch Lightning trainer object
25trainer:
26 ...
|
配置和训练 NeMo 模型#
在模型初始化期间,配置的“model”部分被传递到模型的构造函数中(作为变量 cfg
,请参见上面左侧面板的第 3 行)。模型类将从 cfg
变量中读取关键参数以配置模型(请参见上面左侧面板中突出显示的行)。
传递到模型构造函数的另一个对象是 PyTorch Lightning trainer
对象,它管理训练过程。训练器处理标准的训练样板。对于非标准任务,PyTorch Lightning (PTL) 依赖于在我们的 NeMo 模型中定义的特定方法。例如,PTL 强制每个模型都必须有一个指定的 training_step
方法(左侧面板上方,第 27 行)。
训练器的配置也在配置中指定(右侧面板上方,第 25 行之后)。这包括诸如 accelerator
、(数量)devices
、max_steps
、(数值)precision
和 更多参数。
示例训练脚本#
下面是我们的 ExampleEncDecModel
模型的示例训练脚本。我们突出显示了最重要的三行,它们将上一节中讨论的所有内容结合在一起
1import lightning.pytorch as pl
2from nemo.collections.path_to_model_class import ExampleEncDecModel
3from nemo.core.config import hydra_runner
4
5@hydra_runner(
6 config_path="config_file_dir_path",
7 config_name="config_file_name"
8)
9def main(cfg):
10 trainer = pl.Trainer(**cfg.trainer)
11 model = ExampleEncDecModel(cfg.model, trainer)
12 trainer.fit(model)
13
14if __name__ == '__main__':
15 main(cfg)
让我们来看一下代码
第 1-3 行:import 语句(第二个是为示例而编造的)。
第 5-8 行:装饰器将在
{config_path}/{config_name}.yaml
查找配置文件,并将其内容加载到cfg
对象中,该对象在第 9 行传递到main
函数中。此功能由 Hydra 提供。除了 YAML 文件之外,我们还可以将默认配置指定为数据类,并将其传递到@hydra_runner
装饰器中。第 10 行:使用配置的
trainer
部分中指定的参数初始化 PTL 训练器对象。第 11 行:初始化 NeMo 模型,传入配置的
model
部分中的参数,以及 PTLtrainer
对象。第 12 行:在模型上调用
trainer.fit
。这一行不起眼的代码将执行我们的整个训练过程。PTL 将确保我们迭代数据并为每个批次调用我们定义的training_step
(以及可能已定义的任何其他 PTL 回调)。
覆盖配置#
上面脚本中的 cfg
对象是一个类似字典的对象,其中包含我们的配置参数。具体来说,它是一个 OmegaConf DictConfig
对象。这些对象具有特殊功能,例如点符号 访问、变量插值以及设置 强制值的能力。
您可以通过运行以下命令来运行上面的脚本
python run_example_training.py
该脚本将使用在 @hydra_runner
装饰器内部指定的默认配置文件。
要指定不同的配置文件,您可以像这样调用脚本
python run_example_training.py \
+ --config_path="different_config_file_dir_path" \
+ --config_name="different_config_file_name"
您还可以通过像这样调用脚本来覆盖、删除或添加配置中的元素
python run_example_training.py \
--config_path="different_config_file_dir_path" \
--config_name="different_config_file_name" \
+ model.optim.lr=0.001 \ # overwriting
+ model.train_ds.manifest_filepath="your_train_data.json" \ # overwriting
+ ~trainer.max_epochs \ # deleting
+ +trainer.max_steps=1000 # adding
运行 NeMo 脚本#
NeMo 脚本通常采用上面显示的形式,其中 Python 脚本依赖于配置对象,该对象具有一些指定的默认值,您可以选择覆盖这些默认值。
NeMo examples 目录提供了许多用于训练和推理各种现有 NeMo 模型的脚本。重要的是要注意,这些脚本包括模型、优化和训练参数的默认配置,这些配置已由 NeMo 团队通过大量的 GPU 小时的实验进行了微调。因此,我们建议使用这些默认配置作为您自己实验的起点
NeMo 推理脚本#
examples 脚本目录还包含许多推理脚本,例如 transcribe_speech.py。这些推理脚本在结构上通常与训练脚本不同,因为它们包含用于文件 I/O(读取和保存文件)的附加实用程序。虽然推理脚本仍然使用配置(configs),但它们不需要 trainer
和 model
部分。此外,推理脚本的默认配置通常指定为数据类而不是单独的文件。您还可以通过命令行修改元素。
指定训练数据#
只要您将数据放入预期的输入格式,NeMo 就会为您处理数据加载器的创建。在开始训练之前,您可能还需要训练分词器。要了解有关数据格式的更多信息,请参阅 LLM、多模态、语音 AI 和 视觉模型。
模型检查点#
在整个训练过程中,模型 检查点 将保存在 .nemo
文件中。这些是包含恢复可用模型所需的所有必要组件的存档文件。例如
模型权重(
.ckpt
文件)模型配置(
.yaml
文件)分词器文件
NeMo 团队还发布了预训练模型,您可以在 NGC 和 HuggingFace Hub 上浏览。
微调#
NeMo 允许您微调模型以及从头开始训练模型。
您可以通过使用随机权重初始化模型,然后用预训练模型的权重替换部分或全部权重来实现此目的。之后,像往常一样继续训练,可能会进行微小的调整,例如降低学习率或冻结特定的模型参数。
下一步去哪里?#
以下是一些选项
特定领域文档
NeMo Primer:本教程提供 NeMo、PyTorch Lightning 和 OmegaConf 的实践介绍。它涵盖了如何使用、修改、保存和恢复 NeMo 模型。
NeMo 模型:在本教程中,您将学习创建 NeMo 模型的基础知识。
NeMo Core 文档:探索 NeMo Core 文档,了解 NeMo 框架的内部工作原理。