Kubernetes#

本节不支持嵌入式平台。

NGC Helm 存储库中包含一个图表,旨在自动化 Kubernetes 集群的一键式部署。

Riva Speech AI Helm Chart 自动部署 ASR、NLP 和 TTS 服务。Helm Chart 执行多项功能

  • 从 NGC 拉取 Docker 镜像,用于 Riva Speech AI 服务器和实用程序容器,以下载和转换模型。

  • 从 NGC 下载请求的模型工件,如 values.yaml 文件中配置的那样。

  • 生成 Triton Inference Server 模型仓库。

  • 启动 Riva Speech AI 服务器,如 Kubernetes Pod 中配置的那样。

  • 将 Riva Speech AI 服务器作为配置的服务公开。

预训练模型的示例随 Riva 一起发布,用于每项服务。Helm Chart 预配置为下载和部署所有这些模型。

重要提示

可以通过修改 values.yaml 文件来修改 Helm Chart 配置以适应您的用例。在此文件中,您可以更改与要部署的模型、存储位置以及如何公开服务相关的设置。

注意

要部署 Riva,需要具有 GPU(NVIDIA Volta 或更高版本)的正常运行的 Kubernetes 环境。这可以是本地部署或云提供商,或者在托管的 Kubernetes 环境中,只要该环境启用了 GPU 支持。

使用 Helm 安装#

  1. 验证 Kubernetes 是否支持 NVIDIA GPU。

    NVIDIA 很好地支持带 GPU 的 Kubernetes。有关更多信息,请参阅 安装 Kubernetes 说明,以确保您的环境已正确设置。

    如果使用支持多实例 GPU (MIG) 的 NVIDIA A100 GPU,请参阅 Kubernetes 中的 MIG 支持

  2. 下载并修改 Helm Chart 以适应您的用例。

    export NGC_API_KEY=<your_api_key>
    helm fetch https://helm.ngc.nvidia.com/nvidia/riva/charts/riva-api-2.18.0.tgz \
            --username=\$oauthtoken --password=$NGC_API_KEY --untar
    

    以上命令在当前工作目录中创建一个名为 riva-api 的新目录。该目录中有一个 values.yaml 文件,可以对其进行修改以适合您的用例(请参阅Kubernetes 密钥Riva 设置 部分)。

  3. values.yaml 文件更新以反映部署要求后,可以将 Riva 部署到 Kubernetes 集群

    helm install riva-api riva-api
    

    或者,使用 --set 选项进行安装,而无需修改 values.yaml 文件。确保将 NGC API 密钥、电子邮件和 model_key_string 设置为适当的值。默认情况下,model_key_stringtlt_encode

    helm install riva-api \
        --set ngcCredentials.password=`echo -n $NGC_API_KEY` \
        --set ngcCredentials.email=your_email@your_domain.com \
        --set modelRepoGenerator.modelDeployKey=`echo -n model_key_string | base64 -w0` riva-api
    
  4. Helm 配置。以下各节重点介绍了 values.yaml 文件的关键区域以及部署注意事项。有关更多详细信息,请查阅各个服务的文档以及 Helm Chart 的 values.yaml 文件,其中包含解释配置选项的内联注释。

注意

根据启用的模型数量,可能需要为 deployment.yaml 中的启动探测设置更高的 failureThreshold 值,以适应增加的启动时间。

Kubernetes 密钥#

Helm 部署使用多个 Kubernetes 密钥来获取对 NGC 的访问权限

  • imagepullsecret:用于 Docker 镜像

  • modelpullsecret:用于模型工件

  • riva-model-deploy-key:用于加密模型

可以在 values.yaml 文件中修改密钥的名称,但是,如果您要部署到 NVIDIA EGX™ 或 NVIDIA Fleet Command™ 管理的环境中,则您的环境必须支持 imagepullsecretmodelpullsecret。这些密钥由 Chart 管理,可以通过设置 values.yamlngcCredentials 部分中的相应值来操作。

Riva 设置#

Riva 的 values.yaml 旨在为部署配置提供最大的灵活性。

replicaCount 字段用于配置已部署服务的相同实例(或 Pod)的数量。在适当的负载均衡情况下,增加此数量(在资源允许的情况下)可以实现水平扩展以增加负载。

Riva API 服务器和 Triton 服务器作为单独的 Pod 部署。在多 GPU 环境中,这允许模型跨 GPU 分布,以更好地利用 GPU。Triton 服务器 Pod 的数量可以与可用 GPU 的数量一样多。Triton 服务器 Pod 的数量由 modelRepoGenerator.ngcModelConfigs 下的条目数控制。对于每个 Triton 配置,enabled 标志控制是否启用或禁用 Triton Pod。每个 Triton 配置都有一个 replicaCount 字段来控制副本数。models 字段指定要加载的模型列表。默认情况下,单个 Triton 服务器 Pod modelRepoGenerator.ngcModelConfigs.tritonGroup0 配置为加载默认模型列表。

可以从 modelRepoGenerator.ngcModelConfigs.tritonGroup0.models 中的默认列表中删除部署不需要的预构建模型。我们建议您删除未使用的模型,以减少部署时间和 GPU 内存使用量。

默认情况下,模型从 NGC 下载,在服务启动之前针对 TensorRT 进行优化(如有必要),并存储在短期位置。当 Pod 终止时,这些模型工件将被删除,并且存储空间将被释放以用于其他工作负载。此行为由 modelDeployVolume 字段控制。有关可用于持久存储的替代选项,请参阅 Kubernetes 卷文档。对于横向扩展部署,跨 Pod 共享模型存储可以大大缩短扩展时间,因为模型是预构建的并且 Riva 容器已经可以使用。

  • 持久存储应仅用于 GPU 模型相同的同构部署中。

  • 目前,提供的模型几乎占满了 T4 的内存 (16 GB)。如果使用单个 GPU,我们建议运行模型/服务的子集。

使用 Helm 部署自定义 RMIR 模型#

如果您训练了自定义模型,则会生成一个 .rmir 文件。执行以下步骤以部署自定义 RMIR 模型。

  1. 指定模型仓库的挂载点。如果您使用主机路径,请更新 values.yaml 文件中的 modelRepoGenerator.modelDeployVolume.hostPath.path 参数。它使用 /data/riva 的默认值,您可以根据需要进行配置。如果您使用外部 PVC,请在 values.yaml 文件中将 persistentVolumeClaim.usePVC 参数设置为 true,并配置所需的字段以在容器内挂载外部 PVC 目录。对于这两种方法(主机路径或外部 PVC),目录都作为 /data 挂载在容器内。

  2. 在模型仓库卷内的 /data/rmir 处创建一个目录 rmir

  3. /data/rmir/ 下创建一个目录,用于存放自定义 RMIR 模型。目录名称应遵循 <model_name>_v<model_version> 格式。例如 /data/rmir/custom_asr_model_v1.0,其中模型名称为 custom_asr_model,版本为 1.0

  4. 将自定义 RMIR 模型文件复制到上一步创建的目录中。例如 /data/rmir/custom_asr_model_v1.0/model.rmir。RMIR 文件名可以是 <any>.rmir

  5. values.yamlmodelRepoGenerator.ngcModelConfigs.tritonGroup0.models 下添加模型条目。使用 <model_name>:<model_version> 作为命名格式。例如

    modelRepoGenerator:
      ngcModelConfigs:
        tritonGroup0:
          enabled: true
          models:
          - custom_asr_model:1.0
  1. 根据需要配置任何其他值,并按照使用 Helm 安装安装 Helm Chart。

为可扩展部署启用模型缓存#

模型缓存可用于可扩展部署。它可以帮助解决以下提到的问题。

  • 为目标 GPU 生成优化的模型需要时间,并会增加服务器启动时间。

  • 在没有模型缓存的情况下,默认情况下,模型仓库通过 modelRepoGenerator.modelDeployVolume.hostPath 存储在主机存储上,或者如果 persistentVolumeClaim.usePVC 设置为 true,则存储在持久卷上。除非主机存储和持久卷可在节点之间共享,否则 Triton Pod 无法跨节点扩展。

  • 部署到另一个集群需要重新生成优化的模型

使用 AWS S3 的基于云的模型缓存可以通过重用缓存中预生成的模型仓库来加速部署并提供灵活的扩展。请按照以下步骤启用模型缓存。

注意

优化的模型是 GPU 特定的。因此,模型缓存应仅用于同构 GPU 节点。

准备模型缓存#

  1. modelRepoGenerator.ngcModelConfigs 下的 Triton 组中指定所需的模型

  2. 首先,将 cacheConfig.cacheMode 设置为 “ReadWrite”,并根据目标 GPU 设置 cacheConfig.gpuProduct。这将执行一次所需模型的生成。cacheConfig.gpuProduct 值的设置确保在目标 GPU 上加载正确的模型集。可以使用在目标集群上执行以下命令来获得要为 cacheConfig.gpuProduct 设置的值。

    kubectl get node --label-columns nvidia.com/gpu.product
    
  3. 根据您的 AWS S3 存储桶配置在 awsCredentials 中设置参数。至少需要配置以下参数。

    • defaultRegion

    • accessKeyIdRW - 具有读 + 写权限

    • secretAccessKeyRW - 具有读 + 写权限

    • accessKeyIdRO - 具有读取权限。这可以与 accessKeyIdRW 相同。

    • secretAccessKeyRO - 具有读取权限。这可以与 secretAccessKeyRW 相同。

  4. 通过 Helm install 命令在具有目标 GPU 的节点上安装 Riva。这将为目标 GPU 生成优化的模型并将模型上传到 S3 存储桶。此步骤只需执行一次,并且只有在需要启用其他模型或目标 GPU 更改时才需要重复执行。

  5. 成功后卸载部署。

使用模型缓存进行部署#

  1. cacheConfig.cacheMode cacheMode 设置为 “ReadOnly”

  2. 保持其余配置与上一节相同

  3. 在具有目标 GPU 的节点上安装 Riva。每个 Triton 服务器都从 S3 下载所需的模型。不使用主机存储或持久卷。

Ingress 控制器#

有一个使用 Traefik 的简单 Ingress 控制器的基本配置。可以通过 values.yaml 进行配置,也可以替换为任何支持 http2grpc 的控制器。

Ingress 控制器在本地部署和云部署中都存在。为了使其正常工作,您必须使用任何机制(DNS、/etc/host 文件等)进行功能性名称解析。

对于任何类型的多 Pod 扩展,您都必须具有正确配置的 Ingress 控制器,该控制器执行 HTTP/2 或 gRPC 负载均衡,包括名称解析。

更多详细信息可以在 values.yaml 文件中的 ingress: 部分中找到。