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)。它们可能包含相同的密钥,但格式不同 (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/text-reranking-nim-1.3.0.tgz --username='$oauthtoken' --password=$NGC_API_KEY
您可以使用 OpenTelemetry 监控您的容器。有关详细信息,请参阅 OpenTelemetry 参数。
命名空间#
您可以选择部署到任何合适的命名空间,但出于文档目的,我们将部署到名为 reranking-nim
的命名空间。
kubectl create namespace reranking-nim
创建 Secret#
使用以下步骤为该 Chart 创建 Secret。
添加一个镜像拉取 Secret,用于从 NVIDIA NGC 下载容器镜像。
kubectl create secret -n reranking-nim docker-registry ngc-secret \ --docker-server=nvcr.io \ --docker-username='$oauthtoken' \ --docker-password="${NGC_API_KEY}"
添加一个通用 Secret,容器使用它从 NVIDIA NGC 下载模型。
kubectl create -n reranking-nim secret generic ngc-api --from-literal=NGC_API_KEY=${NGC_API_KEY}
配置注意事项#
以下部署命令默认将创建一个使用 llama-3.2-nv-rerankqa-1b-v2 模型的单副本部署。可以使用以下选项来修改行为。有关 Helm 参数的描述,请参阅 参数。
image.repository
– 要部署的容器 (llama-3.2-nv-rerankqa-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
设置为 true。当您在 minikube 上使用 persistence.hostPath
时,这也是必要的。
如果您有一个现有的 PersistentVolumeClaim
,您希望将模型存储在该声明中,请在 persistence.exsitingClaimName
中传递该值。
有关 Helm 选项,请参阅 参数。
部署#
使用以下命令创建基本部署。
helm upgrade --install \
--namespace reranking-nim \
nemo-ranker \
--set persistence.class="local-nfs" \
text-reranking-nim-1.3.0.tgz
您还可以通过在 --namespace
之后添加以下内容来更改正在使用的模型版本
--set image.tag=1.3.0 \
部署后,检查 Pod 以确保其正在运行,初始镜像拉取和模型下载可能需要 15 分钟以上。
kubectl get pods -n reranking-nim
Pod 最终应处于运行状态。
NAME READY STATUS RESTARTS AGE
text-reranking-nim-0 1/1 Running 0 8m44s
检查事件以查找故障
kubectl get events -n reranking-nim
Minikube 的推荐配置#
默认情况下,Minikube 将使用此 Chart 创建基于 hostPath 的 PV 和 PVC。我们建议您将以下内容添加到您的 Helm 命令中。
--set persistence.class=standard
部署 Mistral 4B#
为 4B 模型的资源需求创建一个 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 upgrade --install \
--namespace reranking-nim \
-f values-mistral.yaml \
--set image.repository=nvcr.io/nim/nvidia/nv-rerankqa-mistral-4b-v3 \
--set image.tag=1.0.0 \
--set persistence.class="local-nfs" \
nemo-ranker \
text-reranking-nim-1.3.0.tgz
运行推理#
在前面的示例中,API 端点通过默认类型的 Kubernetes 服务在端口 8080 上公开,没有 Ingress,因为身份验证不是由 NIM 本身处理的。以下命令要求已部署 nvidia/nv-rerankqa-mistral-4b-v3
模型。
调整请求 JSON 正文中的 “model” 值以使用不同的模型。
使用以下命令将服务端口转发到您的本地计算机以测试推理。
kubectl port-forward -n reranking-nim service/text-reranking-nim 8080:8080
然后尝试一个请求
curl -X 'POST' \
'http://127.0.0.1:8080/v1/ranking' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"query": {"text": "which way should i go?"},
"model": "nvidia/nv-rerankqa-mistral-4b-v3",
"passages": [
{
"text": "two roads diverged in a yellow wood, and sorry i could not travel both and be one traveler, long i stood and looked down one as far as i could to where it bent in the undergrowth;"
},
{
"text": "then took the other, as just as fair, and having perhaps the better claim because it was grassy and wanted wear, though as for that the passing there had worn them really about the same,"
},
{
"text": "and both that morning equally lay in leaves no step had trodden black. oh, i marked the first for another day! yet knowing how way leads on to way i doubted if i should ever come back."
}
]
}'
查看日志消息#
使用以下命令查看 Docker 日志中的容器日志消息。
kubectl logs -f text-reranking-nim-0