用于快速开发语音和语言模型的神经模块

NV Blog
157 0 2019-09-16

作为构建最先进的语音和语言模型的研究人员,您需要能够快速地试验新的网络体系结构。这种试验可能侧重于修改现有的网络体系结构以提高性能,也可能是将语音和语言模型结合起来构建端到端应用程序的高级试验。

这类工作的典型起点包括查看来自模型动物园的示例代码和预训练模型——但是以这种方式重用代码和预训练模型可能非常棘手。

这些模型中的输入和输出、编码风格和数据处理层可能彼此不兼容。更糟糕的是,您可能能够将这些模型连接到代码中,使其在技术上“工作”,但实际上在语义上是错误的。因此,为了确保安全地重用模型,需要花费大量的时间、精力和重复的代码。

随着模型复杂性和模型重用的增加,这种方法变得不可持续。

现在让我们将其与构建复杂软件应用程序的方式进行比较。在这里,历史是一个不断增加的抽象层次:从机器码到汇编语言,到使用编译器和类型系统的结构化编程,最后是面向对象编程。有了这些高级工具,就有了更好的护栏和更好的代码重用。

深度学习库也经历了类似的演变,从提供高性能的底层工具CUDA和cuDNN,到提供灵活性但以人为代价的TensorFlow,再到Keras等更高级别的工具。然而,Tensor和简单操作/层仍然是Keras和PyTorch等高级库的中心对象。

介绍神经模块工具包

神经模块是一个新的开源工具包,它将这些抽象进一步推进了一步,使得使用可重用组件轻松、安全地组合复杂的神经网络体系结构成为可能。神经模块也是为速度而建立的。它可以将训练扩展到多个gpu和多个节点。它还可以利用混合精度进一步加快训练速度。它目前支持pytorch后端,并且可以扩展以支持其他后端。

神经模块工具箱框图


工具包的核心是神经模块的概念。神经模块接受一组输入并计算一组输出。它可以被看作是介于一层和一个完整的神经网络之间的抽象。通常,模块对应于神经网络的概念部分,如:编码器、解码器、语言模型、声学模型等。

神经模块的输入/输出具有神经类型,它描述语义、轴序和输入/输出张量的维数。这种类型允许将神经模块安全地链接在一起来构建应用程序,如下面的ASR示例所示。

神经模块工具包还提供了一个可扩展的ASR和NLP模块集合。这些集合为数据加载、预处理和训练不同的网络体系结构(如Jasper和BERT)提供api。它们还包括用于转移学习的预训练模型。我们计划将这些集合扩展到其他领域,如计算机视觉、文本到语音,以及用于传感器融合的工具。

这个工具包源于我们的英伟达应用研究团队所面临的挑战。通过开源这项工作,我们希望与更广泛的演讲和NLP研究人员分享它的好处,并鼓励合作。


举例

让我们构建一个简单的ASR模型,看看使用神经模块是多么容易。您将了解神经类型如何提供语义安全检查,以及该工具如何以最小的工作量扩展到多个gpu。

开始

GitHub repo概述了一般需求和安装说明。存储库还包含一个Dockerfile,该文件可用于构建一个Docker映像,其中安装了随时可以运行的神经模块。我们将使用这个Dockerfile和一个示例Jupyter notebook来演示Jasper ASR模型的培训。

为了建立这个环境,首先克隆神经模块:

git clone https://github.com/NVIDIA/NeMo.git

接下来,下载用于训练的数据集。我们将把这个数据集放在NeMo树之外,以避免庞大的Docker构建上下文。在本例中,我们使用$HOME/nemo-data/LibriSpeech。根据需要调整你的路径。

cd NeMo

mkdir-p $HOME/nemo-data/LibriSpeech

python scripts/get_librispeech_data.py \

            --data_root=$HOME/nemo-data/LibriSpeech\

            --data_set=dev_clean,train_clean_100

# This downloads 26GB of data... plenty of time for a coffee

现在构建Docker映像:

docker build-t nemo-demo.

然后运行容器,在上面使用的数据目录中进行映射。例如:

docker run--runtime=nvidia--rm-it--ipc=host \

   -v $HOME/nemo-data/LibriSpeech:/workspace/nemo/data \ 

nemo-demo

一旦进入正在运行的Docker容器,使用start-jupyter.sh脚本启动JupyterLab。在浏览器中打开JupyterLab web界面,并启动examplesasr/NeMo-ASR-Tutorial-blog.ipynb notebook开始。

Jasper

在这个ASR示例中,我们将使用一个名为Jasper的网络。Jasper是一个端到端的ASR模型,这意味着它可以在不需要任何额外对齐信息的情况下转录语音样本。

该模型的训练管道由以下块组成。每一个逻辑块对应一个神经模块。


Jupyter Notebook

这个模型的整体结构是这样的:


正如您所看到的,这非常简单,因为我们正在处理更高级别的抽象。

您可以按照Jupyter笔记本中的步骤来探索这个示例,包括训练Jasper模型以及启用混合精度和多gpu训练。

结束

我们对这种模块化的深度学习方法如何提高从业者的生产力感到兴奋。我们刚刚开始这个旅程,并计划每月发布带有新功能的版本。

更多信息请查看我们的GitHub repo,我们很乐意听到您的反馈!