重要提示

您正在查看 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、(数量)devicesmax_steps、(数值)precision更多参数。

示例训练脚本#

下面是我们的 ExampleEncDecModel 模型的示例训练脚本。我们突出显示了最重要的三行,它们将上一节中讨论的所有内容结合在一起

run_example_training.py#
 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 部分中的参数,以及 PTL trainer 对象。

  • 第 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),但它们不需要 trainermodel 部分。此外,推理脚本的默认配置通常指定为数据类而不是单独的文件。您还可以通过命令行修改元素。

指定训练数据#

只要您将数据放入预期的输入格式,NeMo 就会为您处理数据加载器的创建。在开始训练之前,您可能还需要训练分词器。要了解有关数据格式的更多信息,请参阅 LLM多模态语音 AI视觉模型

模型检查点#

在整个训练过程中,模型 检查点 将保存在 .nemo 文件中。这些是包含恢复可用模型所需的所有必要组件的存档文件。例如

  • 模型权重(.ckpt 文件)

  • 模型配置(.yaml 文件)

  • 分词器文件

NeMo 团队还发布了预训练模型,您可以在 NGCHuggingFace Hub 上浏览。

微调#

NeMo 允许您微调模型以及从头开始训练模型。

您可以通过使用随机权重初始化模型,然后用预训练模型的权重替换部分或全部权重来实现此目的。之后,像往常一样继续训练,可能会进行微小的调整,例如降低学习率或冻结特定的模型参数。

下一步去哪里?#

以下是一些选项

  • 探索示例或教程:通过探索我们的 示例教程 深入了解 NeMo

  • 特定领域文档

    • 对于大型语言模型 (LLM),请查看 LLM 文档。

    • 对于多模态任务,请参阅 多模态 文档。

    • 如果您对自动语音识别 (ASR) 感兴趣,请探索 ASR 文档。

    • 对于文本到语音 (TTS),请在 TTS 文档中查找详细信息。

    • 对于视觉模型,请查阅 视觉模型 文档。

  • NeMo Primer:本教程提供 NeMo、PyTorch Lightning 和 OmegaConf 的实践介绍。它涵盖了如何使用、修改、保存和恢复 NeMo 模型。

  • NeMo 模型:在本教程中,您将学习创建 NeMo 模型的基础知识。

  • NeMo Core 文档:探索 NeMo Core 文档,了解 NeMo 框架的内部工作原理。