这篇文章最初发表在 NVIDIA 技术博客上。
从初创企业到大型企业,企业都使用云市场来寻找快速转型所需的新解决方案。云市场是在线店面,客户可以在这里购买具有灵活计费模式的软件和服务,包括现收现付、订阅和私人协商优惠。企业进一步受益于以折扣价承诺的支出,以及节省时间和资源的单一账单和发票来源。
NVIDIA Riva 是最先进的语音和翻译人工智能服务,在最大的云服务提供商(CSP)市场上:
公司可以快速找到高性能的语音和翻译人工智能,这些人工智能可以完全定制,以最适合对话管道,如问答服务、智能虚拟助理、数字化身和不同语言的联络中心代理助理。
组织可以在公共云上快速运行 Riva ,或将其与云提供商服务集成,从而获得更大的信心和更好的投资回报。有了云计算中的 NVIDIA Riva ,您现在可以通过浏览器即时访问 Riva 语音和翻译 AI------即使您目前没有自己的内部部署 GPU ------加速的基础设施。
您可以从市场购买 NVIDIA Riva ,或使用现有的云信用。联系 NVIDIA ,通过 Amazon Web Services,Google Cloud Platform 或 Microsoft Azure 获取私人报价。
在这篇文章和相关视频中,以西班牙语到英语的语音转换(S2S)为例,您将学习如何在单个 CSP 节点上原型和测试 Riva 。本文还介绍了在托管的 Kubernetes 集群上大规模部署 Riva 。
在单个节点上进行原型和测试 Riva
在使用 Riva 启动和扩展会话应用程序之前,在单个节点上进行原型和测试,以发现缺陷和改进区域,并确保完美的生产性能。
- 在公共 CSP 上选择并启动 Riva 虚拟机映像(VMI)
- 访问 NVIDIA GPU Cloud(NGC)目录上的 Riva 容器
- 配置 NGC CLI
- 编辑 Riva Skills 快速入门配置脚本并部署 Riva 服务器
- 开始使用教程 Jupyter 笔记本的 Riva
- 运行语音对语音(S2S)翻译推理
视频 1 解释了如何从 Riva VMI 启动 GCP 虚拟机实例并从终端连接到它。
视频 1。GCP 上的 NVIDIA Riva -第 1 部分:设置和连接到 GCP 虚拟机实例
视频 2 展示了如何启动 Riva 服务器并在虚拟机实例中运行西班牙语到英语的语音到语音翻译。
视频 2。GCP 上的 NVIDIA Riva第 2 部分:西班牙语到英语 S2T 和 S2S 的翻译
在公共 CSP 上选择并启动 Riva VMI
Riva VMI 提供了一个自包含的环境,使您能够在公共云服务的单个节点上运行 Riva 。您可以通过以下步骤快速启动。
转到您选择的 CSP:
选择适当的按钮开始配置 VM 实例。
- 设置计算区域、 GPU 和 CPU 类型以及网络安全规则。S2S 翻译演示程序应该只占用 13-14 GB 的 GPU 内存,并且应该能够在 16 GB 的 T4 GPU 上运行。
- 如有必要,生成 SSH 密钥对。
部署 VM 实例并在必要时对其进行进一步编辑。使用 SSH 和本地终端中的密钥文件连接到 VM 实例(这是最安全的方法)。
使用 SSH 和密钥文件连接到 GCP VM 实例需要gcloudCLI 而不是内置的 SSH 工具。使用以下命令格式:
xml
gcloud compute ssh --project=<Project_ID> --zone=<Zone> <VM_Name> -- -L 8888:localhost:8888
如果您已经添加项目_ID和计算区价值观gcloudconfig,您可以在命令中省略这些标志。这个-L标志启用端口转发,使您能够在虚拟机实例上启动 Jupyter,并在本地浏览器中访问它,就像 Jupyter 服务器在本地运行一样。
图 1。 Riva 的预计月度成本
访问 NGC 上的 Riva 容器
NGC catalog 是一套精心策划的 GPU 加速人工智能模型和 SDK,可帮助您将人工智能快速融入应用程序。
将 Riva 容器和所需模型下载到 VM 实例中的最简单方法是下载 Riva Skills Quick Start,它具有适当的资源文件夹和 ngc 命令。然后,编辑提供的配置 .sh 脚本,并运行 Riva _init.sh 和 Riva _start.sh 脚本。
Riva VMI 用户的额外福利是可以访问 NVIDIA AI Enterprise Catalog on NGC。
配置 NGC CLI 以访问资源
NGC CLI 配置可确保您可以访问 NVIDIA 软件资源。该配置还确定您可以访问哪个容器注册表空间。
Riva VMI 已经提供了 NGC CLI,所以您不必下载或安装它。您仍然需要配置它。
如有必要,生成一个 NGC API 密钥。在右上角,选择你的名字和组织的 设置 ,然后选择 获取 API 密钥 和 生成 API 密钥。请确保将新生成的 API 密钥复制并保存到安全的位置。
跑ngc 配置集并粘贴到您的 API 密钥中。设置对 NGC CLI 的调用结果的输出格式,并设置您的组织、团队和 ACE。
编辑 Riva Skills 快速入门配置脚本并部署 Riva 服务器
图 2: Riva 技能快速入门资源文件夹
Riva 包含快速入门脚本,可帮助您开始使用 Riva 语音和翻译 AI 服务:
- 自动语音识别(ASR)
- 文本到语音(TTS)
- 几种自然语言处理(NLP)任务
- 神经机器翻译
在资产的 NGC 概览页面上,选择 下载 。如果要将相应的 NGC CLI 命令复制到 VM 实例的终端中,请选择 CLI:
arduino
ngc registry resource download-version "nvidia/riva/riva_quickstart:2.12.1"
在出版时,2.12.1 是 Riva 的最新版本。有关最新版本号,请查看 NGC 目录或 Riva 文档页面。
在 VM 实例的终端中下载 Riva Skills Quick Start 资源文件夹后,实现西班牙语到英语的语音转换(S2S)管道。
在 Riva 技能快速入门主目录中,编辑配置.sh脚本来告诉 Riva 要启用哪些服务以及要下载.rmir 格式的哪些模型文件。
设置service_enabled_nlp=false但将其他服务保留为真的。您需要西班牙语 ASR、西班牙语到英语 NMT 和英语 TTS。不需要 NLP。
要启用西班牙语 ASR,请更改language_code=("en-US")到language_code=("es US").
取消注释包含rmir_megatronnmt_any_en_500m以实现从西班牙语(以及 30 多种其他语言中的任何一种)到英语的 NMT。
要下载所需的.rmir 文件并进行部署,请运行以下命令。Riva _init.sh包裹在Riva -部署命令
arduino
bash riva_init.sh config.sh
要启动 Riva 服务器,请运行以下命令:
arduino
bash riva_start.sh config.sh
如果服务器没有启动,请将相关的 Docker 日志输出到一个文件中:
docker logs riva-speech &> docker-logs-riva-speech.txt
检查文件。如果您看到任何 CUDA 内存不足错误,那么您的模型管道对于 GPU 来说太大了。
通过 Jupyter 笔记本教程开始使用 Riva
开始使用 Riva 的最佳方法之一是在 /nvidia-riva/tutorials GitHub 上进行尝试。
bash
git clone https://github.com/nvidia-riva/tutorials.git
VMI 已经包含一个 miniconda Python 分发版,其中包括 Jupyter。从安装依赖项的基本(默认)环境创建一个新的 conda 环境,然后启动 Jupyter。
克隆基本(默认)环境:
css
conda create --name conda-riva-tutorials --clone base
激活新环境:
conda activate conda-riva-tutorials
为新环境安装一个 i Python 内核:
css
ipython kernel install --user --name=conda-riva-tutorials
启动 Jupyter 实验室:
css
jupyter lab --allow-root --ip 0.0.0.0 --port 8888
如果使用连接到 VM 实例时设置端口转发gcloud 计算 ssh,选择包含的链接127.0.0.1在本地浏览器中运行 Jupyter Lab。如果没有,请在浏览器栏中输入以下内容以运行 Jupyter 实验室:
- 您的 VM 实例的外部 IP 地址
- 冒号(:)
- 端口号(大概8888)
- /实验室?token=
如果您不想在浏览器栏中复制和粘贴令牌,浏览器会要求您在对话框中输入令牌。
运行语音到语音的翻译演示
此语音对语音(S2S)演示由nmt- Python -basics.ipynb教程笔记本。要执行此操作,请执行以下步骤。
导入必要的模块:
javascript
import IPython.display as ipd
import numpy as np
import riva.client
创建一个 Riva 客户端并连接到 Riva server:
ini
auth = riva.client.Auth(uri="localhost:50051")
riva_nmt_client = riva.client.NeuralMachineTranslationClient(auth)
加载音频文件:
ini
my_wav_file = "ASR-Demo-2-Spanish-Non-Native-Elena.wav"
音频文件包含一段同事阅读米格尔·德·塞万提斯著名小说中一行的片段堂吉诃德"Cuando la vida misma parece lunática,?quién sabe dónde estála locora?"
这可以翻译成英语,"当生活本身看起来很疯狂时,谁知道疯狂在哪里?"
设置音频块迭代器,即将音频文件划分为不大于给定帧数的块:
ini
audio_chunk_iterator = riva.client.AudioChunkFileIterator(my_wav_file, chunk_n_frames=4800)
定义由 ASR、NMT 和 TTS 配置序列组成的 S2S 配置:
ini
s2s_config = riva.client.StreamingTranslateSpeechToSpeechConfig(
asr_config = riva.client.StreamingRecognitionConfig(
config=riva.client.RecognitionConfig(
encoding=riva.client.AudioEncoding.LINEAR_PCM,
language_code='es-US', # Spanish ASR model
max_alternatives=1,
profanity_filter=False,
enable_automatic_punctuation=True,
verbatim_transcripts=not True,
sample_rate_hertz=16000,
audio_channel_count=1,
),
interim_results=True,
),
translation_config = riva.client.TranslationConfig(
source_language_code="es-US", # Source language is Spanish
target_language_code='en-US', # Target language is English
model_name='megatronnmt_any_en_500m',
),
tts_config = riva.client.SynthesizeSpeechConfig(
encoding=1,
sample_rate_hz=44100,
voice_name="English-US.Female-1", # Default EN female voice
language_code="en-US",
),
)
向 Riva 语音 API 服务器发出 gRPC 请求:
ini
responses = riva_nmt_client.streaming_s2s_response_generator(
audio_chunks=audio_chunk_iterator,
streaming_config=s2s_config)
收听流媒体响应:
php
# Create an empty array to store the receiving audio buffer
empty = np.array([])
# Send requests and listen to streaming response from the S2S service
for i, rep in enumerate(responses):
audio_samples = np.frombuffer(rep.speech.audio, dtype=np.int16) / (2**15)
print("Chunk: ",i)
try:
ipd.display(ipd.Audio(audio_samples, rate=44100))
except:
print("Empty response")
empty = np.concatenate((empty, audio_samples))
# Full translated synthesized speech
print("Final synthesis:")
ipd.display(ipd.Audio(empty, rate=44100))
这就产生了合成语音的片段和最终的完全组装的片段。最后剪辑中的合成声音应该是这样的:"当生活本身看起来很疯狂时,谁知道疯狂在哪里?"
在托管 Kubernetes 平台上部署 Riva
在启动 Riva VMI 并访问企业目录后,您还可以将 Riva 部署到各种受支持的托管 Kubernetes 平台,如 AKS、 Amazon EKS 和 GKE。这些托管 Kubernetes 平台是生产级部署的理想选择,因为它们能够实现无缝的自动化部署、轻松的可扩展性和高效的可操作性。
为了帮助您入门,本文将引导您完成 Riva 在 GKE 集群上的示例部署。通过结合 Terraform 和 Helm 的力量,您可以快速建立生产级部署。
- 使用 NVIDIA Terraform 模块在托管的 Kubernetes 平台上建立 Kubernete 集群
- 使用 Helm 图在 Kubernetes 集群上部署 Riva 服务器
- 在 Kubernetes 集群上与 Riva 交互
视频 3 介绍了如何使用 Terraform 在 Google Kubernetes Engine(GKE)上设置和运行 Riva 。
视频 3。GKE 上的 NVIDIA Riva -第 1 部分:使用 Terraform 将 Kubernetes 集群部署到 Google Kubernete 引擎(GKE)
视频 4 展示了如何通过使用 Helm 在 Kubernetes 集群上部署 Riva 来扩大和扩大语音 AI 推理。
视频 4。GKE 上的 NVIDIA Riva --第 2 部分:在带有 Helm 的 Kubernetes 集群上部署 Riva
使用 NVIDIA Terraform 模块设置 GKE 集群
NVIDIA Terraform 模块使部署 Riva 就绪的 GKE 集群变得容易。想要了解更多信息,请访问 nvidia-terraform-modules GitHub。
要开始,请克隆 repo 并在计算机上安装必备组件:
- kubectl
- gcloud CLI
- 请确保您已经通过运行 gcloud 组件安装 gke gcloud auth 插件
- 您的 GCP 账户应具有Kubernetes Engine Admin权限
- Terraform ( CLI )
从内部NVIDIA 地形模块/gke目录中,请确保使用 gcloud CLI 设置了活动凭据。
使现代化地形.tfvar通过取消注释集群名称和区域并填写特定于您项目的值。默认情况下,此模块会将集群部署到一个新的 VPC 中。要将集群部署到现有的 VPC 中,还必须取消注释并设置existing_vpc_details变量
或者,可以通过以下任何方式更改任何变量名或参数:
- 将它们直接添加到变量.tf.
- 使用-var旗帜
- 将它们作为环境变量传入。
- 出现提示时,从命令行传递它们。
在里面变量.tf,更新以下变量以供 Riva 使用: GPU 类型和区域。
选择支持的 GPU 类型:
ini
variable "gpu_type" {
default = "nvidia-tesla-t4"
description = "GPU SKU To attach to Holoscan GPU Node (eg. nvidia-tesla-k80)"
}
(可选)选择您所在的地区:
ini
variable "region" {
default = "us-west1"
description = "The Region resources (VPC, GKE, Compute Nodes) will be created in"
}
运行 gcloud 身份验证应用程序默认登录,使您的 Google 凭据可用于地球化可执行文件。有关详细信息,请参阅 Terraform 文档中的 为根模块变量分配值。
- 地形初始化:初始化配置。
- 地形平面图:查看将应用的内容。
- 地形应用:针对 GKE 环境应用代码。
使用连接到群集库贝克特尔通过在创建集群后运行以下命令:
ini
gcloud container clusters get-credentials <CLUSTER_NAME> --region=<REGION>
要删除 Terraform 提供的云基础设施,请运行地形破坏.
NVIDIA Terraform 模块也可以用于其他 CSP 中的部署,并遵循类似的模式。有关部署 AKS 和 EKS 集群的更多信息,请参阅 NVIDIA/nvidia-terraform-modules GitHub。
使用 Helm 图表部署 Riva 语音技能 API
Riva 语音技能 Helm 图表旨在自动部署到 Kubernetes 集群。下载 Helm 图表后,对图表进行一些小的调整,使其适应本文其余部分使用 Riva 的方式。
首先下载并取消标记 Riva API Helm 图表。2.12.1 版本是截至本文发布的最新版本。要下载不同版本的 Helm 图表,请替换版本标签以下代码示例中需要特定版本:
ini
export NGC_CLI_API_KEY=<your NGC API key>
export VERSION_TAG="2.12.1"
helm fetch https://helm.ngc.nvidia.com/nvidia/riva/charts/riva-api-${VERSION_TAG}.tgz --username='$oauthtoken' --password=$NGC_CLI_API_KEY
tar -xvzf riva-api-${VERSION_TAG}.tgz
在Riva -api文件夹中,按照说明修改以下文件。
在values.yaml文件,在modelRepGenerator.ngcModelConfigs.tritonGroup0,根据需要对特定模型进行注释或取消注释,或更改语言代码。
对于之前使用的 S2S 管道:
- 将 ASR 模型中的语言代码从美式英语更改为拉丁美洲西班牙语,以便rmir_asr_conformer_en_us_str_thr变成rmir_asr_conformer_es_us_str_thr.
- 取消注释包含rmir_megatronnmt_any_en_500m.
- 确保服务类型设置为群集 IP而不是负载平衡器。这只会将服务公开给集群中的其他服务,例如本文稍后安装的代理服务。
在templates/deployment.yaml文件,然后添加节点选择器约束以确保 Riva 仅部署在正确的 GPU 资源上。将其附加到节点池(在 Amazon EKS 中称为节点组)。您可以从 GCP 控制台或通过在终端中运行适当的 gcloud 命令来获取此信息:
css
$ gcloud container clusters list
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
riva-in-the-cloud-blog-demo us-west1 1.27.3-gke.100 35.247.68.177 n1-standard-4 1.27.3-gke.100 3 RUNNING
$ gcloud container node-pools list --cluster=riva-in-the-cloud-blog-demo --location=us-west1
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION
tf-riva-in-the-cloud-blog-demo-cpu-pool n1-standard-4 100 1.27.3-gke.100
tf-riva-in-the-cloud-blog-demo-gpu-pool n1-standard-4 100 1.27.3-gke.100
在里面spec.template.spec,在前面的节点池名称中添加以下内容:
yaml
nodeSelector:
cloud.google.com/gke-nodepool: tf-riva-in-the-cloud-blog-demo-gpu-pool
请确保您所在的工作目录/ Riva -api作为子目录,然后安装 Riva Helm 图表。可以显式重写values.yaml文件
bash
helm install riva-api riva-api/ \
--set ngcCredentials.password=`echo -n $NGC_CLI_API_KEY | base64 -w0` \
--set modelRepoGenerator.modelDeployKey=`echo -n tlt_encode | base64 -w0`
Helm 图表按顺序运行两个容器:
- A.Riva -模型初始化下载和部署模型的容器。
- A.Riva -语音 api容器来启动语音服务 API。
根据模型的数量,初始模型部署可能需要一个小时或更长时间。要监视部署,请使用库贝克特尔描述Riva -apiPod 和查看容器日志。
bash
export pod=`kubectl get pods | cut -d " " -f 1 | grep riva-api`
kubectl describe pod $pod
kubectl logs -f $pod -c riva-model-init
kubectl logs -f $pod -c riva-speech-api
现在已经部署了 Riva 服务器。
与 GKE 集群上的 Riva 交互
虽然这种与服务器交互的方法可能不太适合生产环境,但您可以通过将调用中的 URI 更改为Riva .client.Auth以使 Riva Python 客户端向Riva -api服务,而不是本地主机。使用获取适当的 URI库贝克特尔:
scss
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.155.240.1 <none> 443/TCP 1h
riva-api LoadBalancer 10.155.243.119 34.127.90.22 8000:30623/TCP,8001:30542/TCP,8002:32113/TCP,50051:30842/TCP 1h
这里没有港口转运。要从集群外的 Jupyter 笔记本在 GKE 集群上运行西班牙语到英语的 S2S 翻译管道,请更改以下行:
ini
auth = riva.client.Auth(uri="localhost:50051")
这是所需的行:
ini
auth = riva.client.Auth(uri="<riva-api IP address>:50051")
有多种方式可以与服务器进行交互。其中一种方法涉及通过在 Helm 的 Traefik Edge 路由器上部署入口路线。有关详细信息,请参阅 部署 Traefik 边缘路由器。
NVIDIA 还通过语音 AI 工作流提供了一个有主见的生产部署配方,包括音频转录和智能虚拟助手。有关详细信息,请参阅技术简报。
总结
NVIDIA Riva 可在 Amazon Web Services,Google Cloud 和 Microsoft Azure 市场上找到。通过快速部署的 VMI,在单个节点上开始在云中进行原型设计和测试 Riva。有关详细信息,请参阅 NVIDIA Riva on GCP 视频。
使用 NVIDIA Terraform 模块,可以非常容易地在 Kubernetes 上托管生产级的 Riva 部署。有关详细信息,请参阅 NVIDIA Riva on GKE 视频。
通过从 CSP 市场购买许可证,在具有云信用的 CSP 计算资源上部署 Riva :
您也可以通过 Amazon Web Services,Google Cloud 或 Microsoft Azure 获取私人优惠折扣定价表格。