重要

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

神经模块#

NeMo 构建于神经模块之上,神经模块是神经网络的概念块,它接受类型化的输入并产生类型化的输出。这些模块通常表示数据层、编码器、解码器、语言模型、损失函数或组合激活的方法。NeMo 使组合和重用这些构建块变得容易,同时通过其神经类型系统提供一定程度的语义正确性检查。

注意

所有神经模块都继承自 ``torch.nn.Module``,因此与 PyTorch 生态系统兼容。

神经模块有 3 种类型

  • 常规模块

  • 数据集/可迭代数据集

  • 损失函数

NeMo 中的每个神经模块都必须继承自 nemo.core.classes.module.NeuralModule 类。

class nemo.core.classes.module.NeuralModule(*args: Any, **kwargs: Any)#

抽象类,提供所有 PyTorch 神经模块之间共享的接口。

每个神经模块都继承 nemo.core.classes.common.Typing 接口,并且需要为其输入和输出定义神经类型。这是通过定义两个属性来完成的:input_typesoutput_types。每个属性应返回一个“端口名称”->“端口神经类型”对的有序字典。这是来自 ConvASREncoder 类的示例

@property
def input_types(self):
    return OrderedDict(
        {
            "audio_signal": NeuralType(('B', 'D', 'T'), SpectrogramType()),
            "length": NeuralType(tuple('B'), LengthsType()),
        }
    )

@property
def output_types(self):
    return OrderedDict(
        {
            "outputs": NeuralType(('B', 'D', 'T'), AcousticEncodedRepresentation()),
            "encoded_lengths": NeuralType(tuple('B'), LengthsType()),
        }
    )

@typecheck()
def forward(self, audio_signal, length=None):
    ...
上面的代码片段意味着 nemo.collections.asr.modules.conv_asr.ConvASREncoder 期望两个参数
  • 第一个参数名为 audio_signal,形状为 [batch, dimension, time],元素表示频谱图值。

  • 第二个参数名为 length,形状为 [batch],元素表示相应信号的长度。

这也意味着 .forward(...)__call__(...) 方法各自产生两个输出
  • 第一个输出形状为 [batch, dimension, time],但元素表示编码后的表示 (AcousticEncodedRepresentation 类)。

  • 第二个输出形状为 [batch],对应于它们的长度。

提示

在您的模块准备好供他人使用后,定义类型并将 @typecheck() 装饰器添加到您的 .forward() 方法是一个好习惯。

注意

.forward(...) 方法的输出将始终是 torch.Tensor 类型或张量容器,并且可以与任何其他 Pytorch 代码一起使用。类型信息附加到每个输出张量。如果将没有类型的张量传递给您的模块,它不会失败,但类型将不会被检查。因此,建议为您的所有模块定义输入/输出类型,从数据层开始,并将 @typecheck() 装饰器添加到它们。

注意

要临时禁用类型检查,您可以将您的代码括在 `with typecheck.disable_checks():` 语句中。

动态层冻结#

您可以通过在 config yaml 中指定冻结计划来选择性地冻结 Nemo 模型内的任何模块。冻结会停止对该模块的任何梯度更新,因此其权重在该步骤中不会更改。这对于对抗灾难性遗忘非常有用,例如在小数据集上微调大型预训练模型时。

默认方法是在前 N 个训练步骤中冻结模块,但您也可以为特定步骤范围启用冻结,例如,从步骤 20 到 100,甚至从某个 N 激活冻结直到训练结束。您也可以在整个训练过程中冻结模块。动态冻结是在训练步骤中指定的,而不是 epochs。

要启用冻结,请将以下内容添加到您的配置中

model:
  ...
  freeze_updates:
    enabled: true  # set to false if you want to disable freezing

    modules:   # list all of the modules you want to have freezing logic for
      encoder: 200       # module will be frozen for the first 200 training steps
      decoder: [50, -1]  # module will be frozen at step 50 and will remain frozen until training ends
      joint: [10, 100]   # module will be frozen between step 10 and step 100 (step >= 10 and step <= 100)
      transcoder: -1     # module will be frozen for the entire training run