在 Kubernetes 上部署#

Helm chart 简化了 NIM 在 Kubernetes 上的部署。该 chart 支持使用各种可能的集群、GPU 和存储配置进行部署。

NIM 微服务在配备 NVIDIA GPU 的主机上运行。GPU 型号和数量取决于模型。要使用 Helm,您必须拥有一个带有 GPU 节点的 Kubernetes 集群。

为了简化 GPU 驱动程序安装的集群管理,请考虑安装 NVIDIA GPU Operator 来管理驱动程序的安装和生命周期。

Helm Chart 部署的优势#

Helm Chart 的优势如下

  • 帮助管理微服务的部署和生命周期。

  • 为 chart 使用集中式分发机制。这些 chart 托管在 NVIDIA NGC 上。

  • 允许您在指定自定义 values 文件时自定义部署。

设置环境#

如果您尚未设置您的 NGC API 密钥,并且不确切知道要下载和部署哪个 NIM,请参阅用户指南中的信息。

此 helm chart 要求您拥有一个包含您的 NGC API 密钥的 secret,用于下载私有镜像,以及一个包含您的 NGC API 密钥的 secret(以下称为 ngc-api)。这些 secret 可能包含相同的密钥,但它们将具有不同的格式 (dockerconfig.json vs opaque)。请参阅下面的创建 Secret

这些说明将假定您已在环境中导出了您的 NGC_API_KEY

export NGC_API_KEY="<YOUR NGC API KEY>"

获取 Helm Chart#

您可以通过执行以下命令从 NGC 获取 helm chart

helm fetch https://helm.ngc.nvidia.com/nim/nvidia/charts/nvidia-nim-llama-32-nv-embedqa-1b-v2-1.3.0.tgz --username='$oauthtoken' --password=$NGC_API_KEY

您可以使用 OpenTelemetry 监控您的容器。 有关详细信息,请参阅OpenTelemetry 参数

命名空间#

您可以选择部署到任何合适的命名空间,但出于文档目的,我们将部署到名为 embedding-nim 的命名空间。

kubectl create namespace embedding-nim

创建 Secret#

使用以下步骤为此 chart 创建 secret。

  1. 添加一个镜像拉取 secret,用于从 NVIDIA NGC 下载容器镜像。

    kubectl create secret -n embedding-nim docker-registry ngc-secret \
     --docker-server=nvcr.io \
     --docker-username='$oauthtoken' \
     --docker-password="${NGC_API_KEY}"
    
  2. 添加一个通用 secret,容器使用它从 NVIDIA NGC 下载模型。

    kubectl create -n embedding-nim secret generic ngc-api --from-literal=NGC_API_KEY=${NGC_API_KEY}
    

配置注意事项#

以下部署命令默认情况下将创建一个单副本部署,使用 llama-3.2-nv-embedqa-1b-v2 模型。以下选项可用于修改行为。有关 Helm 参数的描述,请参阅参数

  • image.repository – 要部署的容器 (llama-3.2-nv-embedqa-1b-v2)

  • image.tag – 该容器的版本 (1.3.0)

  • 存储选项,基于所使用的环境和集群

  • resources – 当模型需要的 GPU 超过默认的一个时,请使用此选项。有关支持矩阵和资源要求,请参见下文。

  • env – 如果需要高级配置,这是一个传递给容器的环境变量数组

存储#

此 NIM 使用持久存储来存储下载的模型。这些说明要求您在集群中安装了 local-nfs 存储类 provisioner。

helm repo add nfs-ganesha-server-and-external-provisioner https://kubernetes-sigs.github.io/nfs-ganesha-server-and-external-provisioner/
helm install nfs-server nfs-ganesha-server-and-external-provisioner/nfs-server-provisioner --set storageClass.name=local-nfs

高级存储配置#

在设置 NIM 时,存储是一个特别需要关注的问题。模型可能非常大,您可能会将磁盘空间填满,因为下载内容到 emptyDirs 或 pod 镜像周围的其他位置。我们建议您在 pod 上挂载某种类型的持久存储。

此 chart 支持两个一般类别

  1. 持久卷声明(通过 persistence.enabled 启用)

  2. hostPath(通过 persistences.hostPath 启用)

默认情况下,该 chart 使用 standard 存储类并创建 PersistentVolumePersistentVolumeClaim

如果您没有创建 PersistentVolumeStorage Class Provisioner,请设置值 persistence.createPV=true。当您在 minikube 上使用 persistence.hostPath 时,这也是必要的。

如果您有一个现有的 PersistentVolumeClaim,您希望将模型存储在其中,请在 persistence.exsitingClaimName 中传递该值。

请参阅参数中的 Helm 选项。

部署#

使用以下命令创建基本部署。

helm upgrade --install \
  --namespace embedding-nim \
  nemo-embedder \
  --set persistence.class="local-nfs" \
  nvidia-nim-llama-32-nv-embedqa-1b-v2-1.3.0.tgz

您还可以在 --namespace 之后添加以下内容来更改正在使用的模型版本

--set image.tag=1.3.0 \

部署后,检查 pod 以确保它正在运行,初始镜像拉取和模型下载可能需要 15 分钟以上。

kubectl get pods -n embedding-nim

pod 最终应处于运行状态。

NAME              READY   STATUS    RESTARTS   AGE
nvidia-nim-llama-32-nv-embedqa-1b-v2-0   1/1     Running   0          8m44s

检查事件以查找故障

kubectl get events -n embedding-nim

部署 Snowflake Arctic Embedding#

使用以下参数运行 helm 命令,在 image.tag 中更新您的版本

helm fetch https://helm.ngc.nvidia.com/nim/nvidia/charts/text-embedding-nim-1.2.0.tgz --username='$oauthtoken' --password=<YOUR API KEY>

helm upgrade --install \
  --namespace embedding-nim \
  --set image.repository=nvcr.io/nim/snowflake/arctic-embed-l \
  --set image.tag=1.0.1 \
  --set persistence.class="local-nfs" \
  nemo-embedder \
  text-embedding-nim-1.2.0.tgz

部署 Mistral 7B#

为 7B 模型的资源要求创建一个 values 文件

# values-mistral.yaml
resources:
  limits:
    ephemeral-storage: 28Gi
    nvidia.com/gpu: 1
    memory: 32Gi
    cpu: "16000m"
  requests:
    ephemeral-storage: 28Gi
    nvidia.com/gpu: 1
    memory: 16Gi
    cpu: "4000m"

然后部署模型

helm fetch https://helm.ngc.nvidia.com/nim/nvidia/charts/text-embedding-nim-1.2.0.tgz --username='$oauthtoken' --password=<YOUR API KEY>

helm upgrade --install \
  --namespace embedding-nim \
  -f values-mistral.yaml \
  --set image.repository=nvcr.io/nim/nvidia/nv-embedqa-mistral-7b-v2 \
  --set image.tag=1.0.1 \
  --set persistence.class="local-nfs" \
  nemo-embedder \
  text-embedding-nim-1.2.0.tgz

运行推理#

在之前的示例中,API 端点通过 Kubernetes 服务的默认类型在端口 8000 上公开,没有 ingress,因为身份验证不是由 NIM 本身处理的。以下命令假定已部署 llama-3.2-nv-embedqa-1b-v2 模型。

调整请求 JSON 正文中的 “model” 值以使用不同的模型。

使用以下命令将服务端口转发到您的本地计算机以测试推理。

kubectl port-forward -n embedding-nim service/nemo-embedder-nvidia-nim-llama-32-nv-embedqa-1b-v2 8000:8000

然后尝试一个请求

curl -X 'POST' \
  'http://127.0.0.1:8000/v1/embeddings' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
    "input": "hello world",
    "model": "nvidia/llama-3.2-nv-embedqa-1b-v2",
    "input_type": "passage"
  }'

查看日志消息#

使用以下命令查看 docker 日志中的容器日志消息。

kubectl logs -f nvidia-nim-llama-32-nv-embedqa-1b-v2-0