在 Kubernetes 上部署#

Helm chart 简化了 NIM 在 Kubernetes 上的部署。该 chart 支持使用各种可能的集群、GPU 和存储配置进行部署。该 chart 下载模型并启动服务以开始运行。

NIM 旨在搭载 NVIDIA GPU 的系统上运行,GPU 的类型和数量取决于模型。要使用 helm,您必须拥有一个具有适当 GPU 节点且安装了 GPU Operator 的 Kubernetes 集群。

Helm Chart 部署的优势#

使用 helm chart

  • 能够使用 Kubernetes 节点并水平扩展服务

  • 封装了直接运行 Docker 命令的复杂性

  • 能够监控来自 NIM 的指标

设置环境#

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

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

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

export NGC_API_KEY="<YOUR NGC API KEY>"

Hive 获取下载模型的凭据并将其导出。

export NIM_REPOSITORY_OVERRIDE="s3://..."
export AWS_REGION="..."
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."

获取 Helm Chart#

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

helm fetch https://helm.ngc.nvidia.com/nim/nvidia/charts/multimodal-safety-nim-1.0.0.tgz --username='$oauthtoken' --password=$NGC_API_KEY

命名空间#

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

kubectl create namespace nvidia-nims

创建 Secret#

使用以下脚本为此 helm chart 创建预期的 secret。

DOCKER_CONFIG='{"auths":{"nvcr.io":{"username":"$oauthtoken", "password":"'${NGC_API_KEY}'" }}}'
echo -n $DOCKER_CONFIG | base64 -w0
NGC_REGISTRY_PASSWORD=$(echo -n $DOCKER_CONFIG | base64 -w0 )

cat <<EOF > imagepull.yaml
apiVersion: v1
kind: Secret
metadata:
  name: ngc-secret
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: ${NGC_REGISTRY_PASSWORD}
EOF

kubectl apply -n nvidia-nims -f imagepull.yaml

kubectl create -n nvidia-nims secret generic nim-secrets \
--from-literal=NIM_REPOSITORY_OVERRIDE=${NIM_REPOSITORY_OVERRIDE} \
--from-literal=AWS_REGION=${AWS_REGION} \
--from-literal=AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
--from-literal=AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}

配置注意事项#

以下部署命令默认情况下将创建一个单副本部署,使用 ai-generated-image-detection 模型。以下选项可用于修改行为。有关 Helm 参数的描述,请参阅 参数

  • image.repository – 要部署的容器 (ai-generated-image-detection)

  • image.tag – 该容器的版本 (1.0.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 选项。

部署#

基于您要部署的模型,创建包含以下条目的 custom-values.yaml 文件。示例值在大多数集群中都有效。

image:
    repository: nvcr.io/nim/hive/ai-generated-image-detection # container location
    tag: 1.0.0 # NIM version you want to deploy

imagePullSecrets:
- name: ngc-secret # name of a secret used to pull nvcr.io images
image:
    repository: nvcr.io/nim/hive/deepfake-image-detection # container location
    tag: 1.0.0 # NIM version you want to deploy

imagePullSecrets:
- name: ngc-secret # name of a secret used to pull nvcr.io images

有关 GPU 专用优化模型配置,请参阅 模型

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

helm upgrade --install \
  --namespace nvidia-nims \
  -f custom-values.yaml \
  multimodal-safety-nim \
  --set persistence.class="local-nfs" \
  multimodal-safety-nim-1.0.0.tgz

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

kubectl get pods -n nvidia-nims

等待 pod 处于运行状态。

NAME              READY   STATUS    RESTARTS   AGE
multimodal-safety-nim-0   1/1     Running   0          8m44s

检查事件以查找故障

kubectl get events -n nvidia-nims

运行推理#

在前面的示例中,API 端点通过默认类型的 Kubernetes 服务在端口 8003 上公开,没有入口,因为身份验证不是由 NIM 本身处理的。以下命令假定已部署 ai-generated-image-detection 模型。

使用以下命令将服务端口转发到本地计算机以执行推理。

kubectl port-forward -n nvidia-nims service/multimodal-safety-nim 8003:8003

然后尝试请求

invoke_url="http://127.0.0.1:8003/v1/infer"
input_image_path="input.jpg"

# download an example image
curl https://assets.ngc.nvidia.com/products/api-catalog/sdxl/sdxl1.jpg > $input_image_path

image_b64=$(base64 $input_image_path)
length=${#image_b64}

echo '{
    "input": ["data:image/png;base64,'${image_b64}'"]
}' > payload.json

curl $invoke_url \
-H "Content-Type: application/json" \
-d @payload.json
invoke_url="http://127.0.0.1:8003/v1/infer"
input_image_path="input.jpg"

# download an example image
curl https://assets.ngc.nvidia.com/products/api-catalog/deepfake-image-detection/input/deepfake.jpg > $input_image_path

image_b64=$(base64 $input_image_path)
length=${#image_b64}

echo '{
    "input": ["data:image/png;base64,'${image_b64}'"]
}' > payload.json

curl $invoke_url \
-H "Content-Type: application/json" \
-d @payload.json

查看日志消息#

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

kubectl logs -f multimodal-safety-nim-0