在 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 支持两个常规类别
持久卷声明(通过
persistence.enabled
启用)hostPath(通过
persistences.hostPath
启用)
默认情况下,该 chart 使用 standard
存储类并创建 PersistentVolume
和 PersistentVolumeClaim
。
如果您没有创建 PersistentVolume
的 Storage 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
Minikube 的推荐配置#
默认情况下,Minikube 将使用此 chart 创建基于 hostPath 的 PV 和 PVC。我们建议您将以下内容添加到您的 helm 命令中。
--set persistence.class=standard
运行推理#
在前面的示例中,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.jsoninvoke_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