如何使用 Riva NMT 多语言模型和 Nvidia NeMo 执行合成数据生成#

本教程将引导您了解如何使用 Riva NMT 多语言模型和 Nvidia NeMo 执行合成数据生成。生成的合成数据反过来可以用于进一步微调模型。

NVIDIA Riva 概述#

NVIDIA Riva 是一个 GPU 加速的 SDK,用于构建针对您的用例定制并提供实时性能的语音 AI 应用程序。
Riva 提供了一系列丰富的语音和自然语言理解服务,例如

  • 自动语音识别 (ASR)

  • 文本到语音合成 (TTS)

  • 神经机器翻译 (NMT)

  • 一系列自然语言处理 (NLP) 服务,例如命名实体识别 (NER)、标点符号和意图分类。

在本教程中,我们将使用 Riva NMT 多语言模型和 Nvidia NeMo 执行数据生成。
要了解 Riva NMT API 的基础知识,请参阅“如何将 Riva NMT API 与开箱即用模型一起执行语言翻译?”教程,位于 Riva NMT 教程

有关 Riva 的更多信息,请参阅 Riva 开发者文档
有关 Riva NMT 的更多信息,请参阅 Riva NMT 文档

NVIDIA NeMo 概述#

NVIDIA NeMo 是一个用于构建新的最先进的对话式 AI 模型的工具包。 NeMo 为自动语音识别 (ASR)、自然语言处理 (NLP) 和文本到语音 (TTS) 模型提供了单独的集合。每个集合都包含预构建的模块,其中包括在您的数据上进行训练所需的一切。每个模块都可以轻松地进行自定义、扩展和组合,以创建新的对话式 AI 模型架构。

有关 NeMo 的更多信息,请参阅 NeMo 产品页面文档。开源 NeMo 存储库可以在 此处 找到。

使用 NVIDIA NeMo 和 Riva NMT 多语言模型生成合成数据#

在本教程中,我们将使用 Riva NMT 多语言 Any-to-En 模型在 Scielo 英西数据集上生成法语数据。

此处合成数据生成的过程可以分为以下步骤

  1. 要求和设置。

  2. 数据预处理(可能因您使用的实际数据而异,请遵循微调教程以获得更详细的预处理)。

  3. 使用 NeMo 运行 NMT 模型进行推理。

  4. 请参阅微调教程,了解如何使用此数据自定义 OOTB 模型。

让我们详细了解一下每个步骤。

步骤 1. 要求和设置#

本教程需要从 NeMo Docker 容器内部运行。如果您不是通过 NeMo Docker 容器运行本教程,请参阅 Riva NMT 教程 以开始使用。

在我们进入要求和设置之前,让我们先为我们的工作创建一个基本目录。

import os
base_dir = "NMTSynDataGeneration"
!mkdir $base_dir
base_dir=os.path.abspath("NMTSynDataGeneration")
  1. 克隆 NeMo github 存储库

NeMoBranch = "v1.17.0_pt_23.04"
!git clone -b $NeMoBranch https://github.com/NVIDIA/NeMo $base_dir/NeMo
!apt-get update && apt-get install -y libsndfile1 ffmpeg
!pip3 install "cython<3.0.0" wheel && pip3 install pyyaml==5.4.1 --no-build-isolation
%cd $base_dir/NeMo
!./reinstall.sh
!pip install torchmetrics==0.11.4
%cd ..
  1. 检查 CUDA 安装。

import torch
torch.cuda.is_available()
  1. 安装 Apex(如果未使用 NeMo 容器)

!git clone https://github.com/NVIDIA/apex.git
%cd apex
!git checkout a32d7a6dddcf4e39d241b0d139c222a97c91887d
!pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" --global-option="--fast_layer_norm" --global-option="--distributed_adam" --global-option="--deprecated_fused_adam" ./
%cd ..

数据下载#

让我们下载 Scielo 英西数据集。具体来说,我们将下载 Moses 版本的数据集,该数据集包含 2 个文件,en_es.enen_es.esen_es.en 文件中每个换行符分隔的条目都是 en_es.es 文件中相应条目的翻译,反之亦然。

data_dir = base_dir + "/data"
!mkdir $data_dir

# Download the Scielo dataset
!wget -P $data_dir https://figshare.com/ndownloader/files/14019287
# Untar the downloaded the Scielo dataset
!tar -xvf $data_dir/14019287 -C $data_dir

步骤 2. 数据预处理#

数据预处理包含多个步骤,以提高数据集的质量。NeMo 文档 提供了有关 NMT 的 8 步数据预处理的详细说明。 NeMo 还提供了一个 jupyter notebook,引导用户以编程方式完成不同的预处理步骤。请注意,根据数据集的不同,可以跳过部分或全部预处理步骤。

为了简化 Riva NMT 程序中的流程,我们仅在数据生成之前执行语言 ID 过滤,以消除原始数据集中可能存在的任何噪声。这些脚本的输入将是并行语料库(即,源语言和目标语言)数据文件。在本教程中,我们使用 Moses 版本的 Scielo 数据集,该数据集直接为我们提供了源数据 (en_es.en) 和目标数据 (en_es.es) 文件。如果数据集未直接提供这些文件,那么我们首先需要从数据集中生成这两个文件,然后才能使用预处理脚本。

语言过滤#

语言过滤预处理脚本用于使用 Fasttext 语言识别模型 验证机器翻译数据集中的语言。如果在并行语料库上使用该脚本,它将验证源语言和目标语言。过滤后的数据存储到由 output_srcoutput-tgt 指定的文件中,删除的行放入由 removed_srcremoved-tgt 指定的文件中。如果无法检测到语言(例如日期),则会删除该行。

此脚本公开了许多参数,其中最常见的是

  • input-src:输入文件的路径,其中包含源语言的文本。

  • input-tgt:输入文件的路径,其中包含目标语言的文本。

  • output-src:源语言的过滤数据要保存到的文件路径。

  • output-tgt:目标语言的过滤数据要保存到的文件路径。

  • removed-src:要保存源语言中丢弃数据的文件路径。

  • removed-tgt:要保存目标语言中丢弃数据的文件路径。

  • source-lang:源语言的语言代码。

  • target-lang:目标语言的语言代码。

  • fasttext-model:fasttext 模型的路径。描述和下载链接在此处:here

# Let us first download the fasttext model.
!wget https://dl.fbaipublicfiles.com/fasttext/supervised-models/lid.176.bin -O $data_dir/lid.176.bin
# Running the language filtering preprocessing script.
!python $base_dir/NeMo/scripts/neural_machine_translation/filter_langs_nmt.py \
    --input-src $data_dir/en_es.en \
    --input-tgt $data_dir/en_es.es \
    --output-src $data_dir/en_es_preprocessed.en \
    --output-tgt $data_dir/en_es_preprocessed.es \
    --removed-src $data_dir/en_es_garbage.en \
    --removed-tgt $data_dir/en_es_garbage.es \
    --source-lang en \
    --target-lang es \
    --fasttext-model $data_dir/lid.176.bin

下载 ootb 模型以执行数据生成#

# Create directory to hold model
model_dir = base_dir + "/model"
!mkdir $model_dir

# Download the NMT model from NGC using wget command
!wget -O $model_dir/megatronnmt_en_any_500m_1.0.0.zip --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/nemo/megatronnmt_en_any_500m/versions/1.0.0/zip 

# Unzip the downloaded model zip file.
!unzip -o $model_dir/megatronnmt_en_any_500m_1.0.0.zip -d $model_dir/pretrained_ckpt

# Alternate way to download the model from NGC using NGC CLI (Please make sure to install and setup NGC CLI):
#!cd $model_dir && ngc registry model download-version "nvidia/nemo/megatronnmt_any_en_500m:1.0.0"

步骤 3. 使用 NeMo 运行 NMT 模型推理以进行数据生成#

!python $base_dir/NeMo/examples/nlp/machine_translation/nmt_transformer_infer_megatron.py \
     model_file=$model_dir/pretrained_ckpt/megatronnmt_en_any_500m.nemo \
     srctext=$data_dir/en_es_preprocessed.en \
     tgtout=$data_dir/en_fr2.fr \
     source_lang=en \
     target_lang=fr \
     batch_size=10 \
     trainer.precision=32
[NeMo W 2023-12-15 10:48:14 experimental:27] Module <class 'nemo.collections.nlp.data.language_modeling.megatron.megatron_batch_samplers.MegatronPretrainingRandomBatchSampler'> is experimental, not ready for production and is not fully supported. Use at your own risk.
[NeMo W 2023-12-15 10:48:14 experimental:27] Module <class 'nemo.collections.nlp.models.text_normalization_as_tagging.thutmose_tagger.ThutmoseTaggerModel'> is experimental, not ready for production and is not fully supported. Use at your own risk.
[NeMo W 2023-12-15 10:48:15 experimental:27] Module <class 'nemo.collections.asr.modules.audio_modules.SpectrogramToMultichannelFeatures'> is experimental, not ready for production and is not fully supported. Use at your own risk.
LexerNoViableAltException: \
                           ^
See https://hydra.cc/docs/next/advanced/override_grammar/basic for details

Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.

步骤 4. 请参阅微调教程,了解如何使用此数据自定义 OOTB 模型。#

最后,按照 Riva NMT 教程 中的步骤使用此数据自定义 OOTB 模型。