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