如何在 Riva Speech Skills 服务器上部署 NeMo 微调的 NMT 模型?
目录
如何在 Riva Speech Skills 服务器上部署 NeMo 微调的 NMT 模型?#
本教程将引导您完成如何在 Riva Speech Skills 服务器上部署 NeMo 微调的 NMT 模型的步骤。
NVIDIA Riva 概述#
NVIDIA Riva 是一个 GPU 加速的 SDK,用于构建针对您的用例定制并提供实时性能的语音 AI 应用程序。
Riva 提供了一系列丰富的语音和自然语言理解服务,例如:
自动语音识别 (ASR)
文本到语音合成 (TTS)
神经机器翻译 (NMT)
自然语言处理 (NLP) 服务集合,例如命名实体识别 (NER)、标点符号和意图分类。
在本教程中,我们将 NeMo 微调的 NMT 模型部署到 Riva Speech Skills 服务器上。
请参阅 Riva NMT 教程 中的“如何使用 Nvidia NeMo 微调 Riva NMT 双语模型”教程,了解有关微调 Riva NMT 模型的信息。
有关 Riva 的更多信息,请参阅 Riva 开发者文档。
有关 Riva NMT 的更多信息,请参阅 Riva NMT 文档
NVIDIA NeMo 概述#
NVIDIA NeMo 是一个用于构建新的最先进的对话式 AI 模型的工具包。 NeMo 为自动语音识别 (ASR)、自然语言处理 (NLP) 和文本到语音 (TTS) 模型提供了单独的集合。每个集合都包含预构建的模块,其中包括在您的数据上进行训练所需的一切。每个模块都可以轻松地进行自定义、扩展和组合,以创建新的对话式 AI 模型架构。
有关 NeMo 的更多信息,请参阅 NeMo 产品页面 和 文档。开源 NeMo 存储库可以在此处找到。
先决条件#
在开始之前,请确保您拥有
NVIDIA NGC 的访问权限,并且能够下载 Riva Quick Start 资源。
要部署的
.riva
模型文件。您可以使用nemo2riva
工具从.nemo
文件生成.riva
模型文件,如 Riva NMT 教程 中的“如何使用 Nvidia NeMo 微调 Riva NMT 双语模型”教程中所述。
Riva ServiceMaker#
Riva ServiceMaker 是一组工具,用于聚合 Riva 部署到目标环境所需的所有工件(模型、文件、配置和用户设置)。它有两个主要组件:
Riva-build#
此步骤有助于构建 Riva 就绪的模型版本。它唯一的输出是 Riva 中支持的服务的端到端管道的中间格式(称为 RMIR)。让我们考虑一个 Riva NMT 模型。
riva-build
负责将一个或多个导出的模型(.riva
文件)组合成一个包含中间格式的文件,该格式称为 Riva 模型中间表示 (Riva Model Intermediate Representation, .rmir
)。此文件包含整个端到端管道的部署无关规范,以及最终部署和推理所需的所有资产。有关更多信息,请参阅文档。
from version import __riva_version__
import os
# IMPORTANT: UPDATE THESE PATHS
# Riva Docker
RIVA_CONTAINER = "<add container name>"
# Example:
# RIVA_CONTAINER = f"nvcr.io/nvidia/riva/riva-speech:{__riva_version__}"
# Directory where the .riva model is stored
MODEL_LOC = "<add path to model location>"
# Example:
# import os
# MODEL_LOC = os.getcwd() + "/NMTFinetuning/model"
# Name of the .riva file
MODEL_NAME = "<add model name>"
# Example:
# MODEL_NAME = "en_es_24x6.riva"
# Key that model is encrypted with, while exporting with TAO
KEY = "<add encryption key used for trained model>"
# Example:
# KEY = "tlt_encode"
# Get the Riva docker
! docker pull $RIVA_CONTAINER
# Call riva-build command from the Riva Service Maker container.
# Example:
! docker run --rm --gpus 0 -v $MODEL_LOC:/data $RIVA_CONTAINER bash -c \
"riva-build translation --name en_es \
/data/en_es_24x6.rmir:key /data/en_es_24x6.riva:key"
Riva-deploy#
部署工具将一个或多个 Riva 模型中间表示 (RMIR) 文件和一个目标模型库目录作为输入。它创建一个集成配置,指定执行的管道,最后将所有这些资产写入输出模型库目录。
# Call riva-deploy command from the Riva Service Maker container.
#! docker run --rm --gpus 0 -v $MODEL_LOC:/data $RIVA_CONTAINER bash -c \
# "riva-deploy -f <rmir_filename>:$KEY <riva_model_target_repository>"
# Example:
! docker run --rm --gpus 0 -v $MODEL_LOC:/data $RIVA_CONTAINER bash -c \
"riva-deploy -f /data/en_es_24x6.rmir:key /data/models && chmod -R 777 /data"
启动 Riva 服务器#
生成模型库后,我们就可以启动 Riva 服务器了。首先,从 NGC 下载 Riva Quick Start 资源。
!ngc registry resource download-version "nvidia/riva/riva_quickstart:$__riva_version__"
接下来,我们将 Riva Quick Start 指南目录的路径设置在此处
RIVA_QSG_DIR = "<add path to quickstart location>"
# Example:
# RIVA_QSG_DIR = f"riva_quickstart_v${__riva_version__}"
接下来,我们修改 config.sh
文件以启用 Riva NMT 服务(通过将 service_enabled_nmt
设置为 true
),提供加密密钥,以及在上一步中生成的模型库的路径 (riva_model_loc
) 以及其他配置。
例如,如果上面的模型库在 $MODEL_LOC/models
生成,那么您可以将 riva_model_loc
指定为与 MODEL_LOC
相同的目录。
#### config.sh snippet -> DO NOT RUN THIS BLOCK
......
# Enable or Disable Riva Services
service_enabled_asr=false ## MAKE CHANGES HERE
service_enabled_nlp=false ## MAKE CHANGES HERE
service_enabled_tts=false ## MAKE CHANGES HERE
service_enabled_nmt=true ## MAKE CHANGES HERE
# Enable Riva Enterprise
# If enrolled in Enterprise, enable Riva Enterprise by setting configuration
# here. You must explicitly acknowledge you have read and agree to the EULA.
# RIVA_API_KEY=<ngc api key>
# RIVA_API_NGC_ORG=<ngc organization>
# RIVA_EULA=accept
# Language code to fetch models of a specify language
# Currently only ASR supports languages other than English
# Supported language codes: en-US, de-DE, es-US, ru-RU, zh-CN
# for any language other than English, set service_enabled_nlp and service_enabled_tts to False
# for multiple languages enter space separated language codes.
language_code=("en-US")
# Specify one or more GPUs to use
# specifying more than one GPU is currently an experimental feature, and may result in undefined behaviours.
gpus_to_use="device=0"
# Specify the encryption key to use to deploy models
MODEL_DEPLOY_KEY="tlt_encode" ## MAKE CHANGES HERE
# Locations to use for storing models artifacts
#
# If an absolute path is specified, the data will be written to that location
# Otherwise, a docker volume will be used (default).
#
# riva_init.sh will create a `rmir` and `models` directory in the volume or
# path specified.
#
# RMIR ($riva_model_loc/rmir)
# Riva uses an intermediate representation (RMIR) for models
# that are ready to deploy but not yet fully optimized for deployment. Pretrained
# versions can be obtained from NGC (by specifying NGC models below) and will be
# downloaded to $riva_model_loc/rmir by `riva_init.sh`
#
# Custom models produced by NeMo or TLT and prepared using riva-build
# may also be copied manually to this location $(riva_model_loc/rmir).
#
# Models ($riva_model_loc/models)
# During the riva_init process, the RMIR files in $riva_model_loc/rmir
# are inspected and optimized for deployment. The optimized versions are
# stored in $riva_model_loc/models. The riva server exclusively uses these
# optimized versions.
riva_model_loc="riva-model-repo" ## MAKE CHANGES HERE (Replace with MODEL_LOC)
.....
# Ensure you have permission to execute these scripts
! cd $RIVA_QSG_DIR && chmod +x ./riva_init.sh && chmod +x ./riva_start.sh
# Run Riva Init. This will fetch the containers/models
# YOU CAN SKIP THIS STEP IF YOU DID RIVA DEPLOY
! cd $RIVA_QSG_DIR && ./riva_init.sh config.sh
# Run Riva Start. This will deploy your model(s).
! cd $RIVA_QSG_DIR && ./riva_start.sh config.sh
运行推理#
一旦 Riva 服务器使用您的模型启动并运行,您就可以发送推理请求来查询服务器。
要发送 gRPC 请求,您可以为客户端安装 Riva Python API 绑定。这可以作为 Riva Quick Start 的 pip
.whl
文件获得。
要了解 Riva NMT API 的基础知识,请参阅 Riva NMT 教程 中的“如何使用 Riva NMT API 和开箱即用模型执行语言翻译?”教程。我们将使用本教程中的一个简单代码片段在 Riva 服务器上运行推理。
# Install the Client API Bindings
! pip install nvidia-riva-client
连接到 Riva 服务器并运行推理#
现在我们可以实际查询 Riva 服务器了。以下单元格查询 Riva 服务器(使用 gRPC)以产生结果。
import riva.client
auth = riva.client.Auth(uri='localhost:50051')
riva_nmt_client = riva.client.NeuralMachineTranslationClient(auth)
eng_text = "Molecular Biology is the field of biology that studies the composition, structure and interactions of cellular molecules – such as nucleic acids and proteins – that carry out the biological processes essential for the cell's functions and maintenance."
response = riva_nmt_client.translate([eng_text], 'en_es', 'en', 'es')
print("English Text: ", eng_text)
print("Translated Spanish Text: ", response.translations[0].text) # Fetch the translated text from the 1st entry of response.translations
您可以在关闭 Jupyter 内核之前停止所有 Docker 容器。注意:以下命令将停止所有正在运行的容器。
! docker stop $(docker ps -a -q)