使用 Helm 部署#
NIM 旨在搭载 NVIDIA GPU 的系统上运行,GPU 的类型和数量取决于模型。要使用 helm,您必须拥有一个 Kubernetes 集群,其中包含合适的 GPU 节点并安装了 GPU Operator。
有关要求,包括 GPU 的类型和数量,请参阅支持矩阵。
先决条件#
如果您尚未设置 NGC API 密钥,并且不确切知道要下载和部署哪个 NIM,请参阅入门指南中的信息。
一旦您设置了您的 NGC API 密钥,请转到 NGC Catalog 并选择 nim-vlm
helm chart 以选择版本。在大多数情况下,您应该选择最新版本。
使用以下命令下载 helm chart
helm fetch https://helm.ngc.nvidia.com/nim/charts/nim-vlm-<version_number>.tgz --username='$oauthtoken' --password=<YOUR API KEY>
这将 chart 下载为 .tgz
文件到您的本地计算机。
配置 helm#
- 以下 helm 选项是使用 Kubernetes 部署 NIM 时最重要的配置选项
image.repository
– 要部署的容器/NIMimage.tag
– 该容器/NIM 的版本存储选项,基于所使用的环境和集群
model.ngcAPISecret
和imagePullSecrets
用于与 NGC 通信resources
– 当模型需要的 GPU 超过默认的一个时,使用此选项。有关请求的 GPU 以满足可用硬件上模型的 GPU 内存要求的详细信息,请参阅支持矩阵。env
– 这是一个呈现给容器的环境变量数组,如果需要高级配置 - 注意:不要使用env
值设置以下环境变量。而是使用指示的 helm 选项环境变量
Helm 值
NIM_CACHE_PATH
model.nimCache
NGC_API_KEY
model.ngcAPISecret
NIM_SERVER_PORT
model.openaiPort
NIM_JSONL_LOGGING
model.jsonLogging
NIM_LOG_LEVEL
model.logLevel
在这些情况下,直接设置 helm 值,而不是依赖环境变量值。您可以将其他环境变量添加到 values 文件的
env
部分。
要使 chart 的部署行为适应您集群的需求,请参阅 helm chart 的 README,其中列出并描述了配置选项。此 README 在 helm 命令行上可用,但输出是纯 markdown。将其输出到文件并使用 markdown 渲染器打开,或使用命令行工具(例如 glow)在终端中渲染。
以下 helm 命令显示 chart README 并使用 glow
在终端中渲染它
helm show readme nim-vlm-<version_number>.tgz | glow -p -
要检查所有默认值,请运行以下命令
helm show values nim-vlm-<version_number>.tgz
最小示例#
此示例要求您已在部署命名空间中建立某些 Kubernetes 密钥才能继续。本文档的其余部分将假定为默认命名空间。
要下载 NIM 容器镜像,您必须设置镜像拉取密钥,在以下示例中为 ngc-secret
。要从 NGC 下载模型引擎或权重,chart 需要一个通用密钥,其中包含一个 NGC API 密钥作为存储在名为 NGC_API_KEY 的密钥中的值。以下示例创建了这两个值
kubectl create secret docker-registry ngc-secret --docker-server=nvcr.io --docker-username='$oauthtoken' --docker-password=$NGC_API_KEY
kubectl create secret generic ngc-api --from-literal=NGC_API_KEY=$NGC_API_KEY
创建文件 *custom-values.yaml*,其中包含以下条目。在上述密钥创建后,这些值将在大多数集群中起作用。
image:
# Adjust to the actual location of the image and version you want
repository: nvcr.io/nim/meta/llama-3.2-11b-vision-instruct # container location
tag: 1.1.1 # NIM version you want to deploy
model:
ngcAPISecret: ngc-api # name of a secret in the cluster that includes a key named NGC_API_KEY and is an NGC API key
persistence:
enabled: true
imagePullSecrets:
- name: ngc-secret # name of a secret used to pull nvcr.io images, see http://kubernetes.ac.cn/docs/tasks/configure-pod-container/pull-image-private-registry/
如果您的 GPU 集群中的 GPU 处于多实例 GPU 模式 (MIG),您必须以不同于默认值的方式指定资源。例如
resources:
limits:
nvidia.com/mig-4g.24gb: 2
您可以调整之前的配置来部署任何模型,例如 llama-3.2-90b-vision-instruct
,方法是根据模型的要求和大小进行调整。例如
image:
# Adjust to the actual location of the image and version you want
repository: nvcr.io/nim/meta/llama-3.2-90b-vision-instruct # container location
tag: 1.1.1 # NIM version you want to deploy
model:
ngcAPISecret: ngc-api
persistence:
enabled: true
size: 220Gi # the model files will be quite large
resources:
limits:
nvidia.com/gpu: 4 # much more GPU memory is required
imagePullSecrets:
- name: ngc-secret
请参阅支持矩阵部分,以确定您的硬件是否足以运行此 NIM。
存储#
设置 NIM 时,存储空间不足始终是一个需要关注的问题,而下载模型可能会延迟集群中的扩展。模型可能非常大,集群操作员在下载模型时可能会快速填满磁盘空间。请务必为 pod 上的模型缓存挂载某种类型的持久存储。在 emptyDir
的默认值之外存储对象时,您有以下互斥选项
持久卷声明(通过
persistence.enabled
启用)当
persistence.accessMode
设置为ReadWriteMany
时使用,其中多个 pod 可以共享一个 PVC。如果
statefulSet.enabled
设置为false
(默认为true
),这将使用 deployment 创建 PVC,但如果访问模式不是ReadWriteMany
,例如使用 NFS provisioner,则扩展到超过一个 pod 很可能会失败。
持久卷声明模板(通过
persistence.enabled
启用,并保持statefulSet.enabled
为默认值)对于使用扩展 StatefulSet 的策略来扩展以将模型下载到为所需的最大副本数创建的每个 PVC,然后再次缩减,留下这些 PVC 以允许快速扩展非常有用。
直接 NFS(通过
nfs.enabled
启用)Kubernetes 不允许在直接 NFS 上设置挂载选项,因此可能需要一些特殊的集群设置。
hostPath(通过
hostPath.enabled
启用)了解使用 hostPath 的安全隐患,并了解这也将 pod 绑定到一个节点。
多节点模型#
重要提示
多节点服务是可选的,因为 NVIDIA NIM for VLMs 当前支持的所有模型都可以在单个节点(例如,H100x8)中容纳。
重要提示
需要 helm chart 版本 1.1.2。
在 Kubernetes 上部署多节点 NIM 有两个选项:LeaderWorkerSets 和使用 MPI Operator 的 MPI Jobs。
LeaderWorkerSet#
重要提示
需要 Kubernetes 版本 >1.26
LeaderWorkerSet (LWS) 部署是使用 NIM 部署多节点模型的推荐方法。要启用 LWS 部署,请参阅LWS 文档中的安装说明。helm chart 默认使用 LWS 进行多节点部署。
使用 LWS 部署,您将看到 Leader
和 Worker
pod 协同运行您的多节点模型。
LWS 部署支持手动扩展和自动扩展,其中整组 pod 被视为单个副本。但是,在使用 LWS 部署时,扩展存在一些限制。如果手动扩展(未启用 autoscaling
),则无法扩展到高于 helm chart 中设置的初始副本数。
使用以下示例 values 文件,通过此方法部署 Llama 3.2 90B Vision Instruct 模型。请参阅支持矩阵部分,以确定您的硬件是否足以运行此模型。
image:
# Adjust to the actual location of the image and version you want
repository: nvcr.io/nim/meta/llama-3.2-90b-vision-instruct # container location
tag: 1.1.1 # NIM version you want to deploy
imagePullSecrets:
- name: ngc-secret
model:
name: meta/llama-3_2-90b-vision-instruct
ngcAPISecret: ngc-api
# NVIDIA recommends using an NFS-style read-write-many storage class.
# All nodes will need to mount the storage. In this example, we assume a storage class exists name "nfs".
persistence:
enabled: true
size: 220Gi
accessMode: ReadWriteMany
storageClass: nfs
annotations:
helm.sh/resource-policy: "keep"
# This should match `multiNode.gpusPerNode`
resources:
limits:
nvidia.com/gpu: 8
multiNode:
enabled: true
workers: 2
gpusPerNode: 8
# Downloading the model will take quite a long time. Give it as much time as ends up being needed.
startupProbe:
failureThreshold: 1500
MPI Job#
对于不支持 LeaderWorkerSet 的集群(Kubernetes 版本低于 v1.27),使用 MPI Operator 的 MPI Jobs 是另一种部署选项。要启用 MPI Jobs,请安装 MPI operator。这是一个禁用 LeaderWorkerSets
并启动 MPI Job 的 *custom-values.yaml* 文件示例
image:
# Adjust to the actual location of the image and version you want
repository: nvcr.io/nim/meta/llama-3.2-90b-vision-instruct # container location
tag: 1.1.1 # NIM version you want to deploy
imagePullSecrets:
- name: ngc-secret
model:
name: meta/llama-3_2-90b-vision-instruct
ngcAPISecret: ngc-api
# NVIDIA recommends using an NFS-style read-write-many storage class.
# All nodes will need to mount the storage. In this example, we assume a storage class exists name "nfs".
persistence:
enabled: true
size: 220Gi
accessMode: ReadWriteMany
storageClass: nfs
annotations:
helm.sh/resource-policy: "keep"
# This should match `multiNode.gpusPerNode`
resources:
limits:
nvidia.com/gpu: 8
multiNode:
enabled: true
leaderWorkerSet:
enabled: False
workers: 2
gpusPerNode: 8
# Downloading the model will take quite a long time. Give it as much time as ends up being needed.
startupProbe:
failureThreshold: 1500
对于 MPI Jobs,您将看到为您的模型部署的 launcher
pod 和一个或多个 worker
pod。launcher
pod 不需要任何 GPU,并且部署日志将通过 launcher
pod 提供。
使用 MPI Jobs 部署时,您可以设置副本数,但是如果不重新部署 helm chart,则不支持动态扩展。MPI Jobs 也不会自动重启,因此如果多节点集中的任何 pod 失败,则必须手动卸载并重新安装作业才能重新启动。
启用 Open Telemetry 追踪和指标#
env:
- name: NIM_ENABLE_OTEL
value: "1"
- name: OTEL_SERVICE_NAME
value: <name of the service>
- name: OTEL_TRACES_EXPORTER
value: otlp
- name: OTEL_METRICS_EXPORTER
value: otlp
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://$(HOST_IP):4318"
NVIDIA 建议在 Kubernetes 中安装 OpenTelemetry 收集器期间,您在自定义 *values.yaml* 文件中设置这些环境变量,以通过 OpenTelemetry 启用追踪和指标收集。此版本要求您配置收集器以使用主机端口运行,并将其作为 DaemonSet 安装。如果您在安装收集器时使用不同的配置,请将 OTEL_EXPORTER_OTLP_ENDPOINT 变量设置为正确的摄取 URL。
有关环境变量的详细说明,请参阅环境变量。
在 Kubernetes 中启动 NIM#
现在您可以启动 chart 了。
helm install my-nim nim-vlm-<version_number>.tgz -f path/to/your/custom-values.yaml
等待 pod 达到“Ready”状态。
运行推理#
在之前的示例中,OpenAI 兼容 API 端点通过默认类型且没有入口的 Kubernetes 服务在端口 8000 上公开,因为身份验证不是由 NIM 本身处理的。以下命令假定已部署 Llama 3.2 11B Vision Instruct 模型。调整请求 JSON 正文中的 model
值以使用不同的模型。
使用以下命令将服务端口转发到您的本地计算机以测试推理。
kubectl port-forward service/my-nim-nim-vlm 8000:http-openai
然后尝试一个请求
curl -X 'POST' \
'http://127.0.0.1:8000/v1/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "What is in this image?"
},
{
"type": "image_url",
"image_url":
{
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
]
}
],
"model": "meta/llama-3.2-11b-vision-instruct",
"temperature": 0.2,
"top_p": 0.7,
"max_tokens": 256,
"stream": true,
"frequency_penalty": 0.0
}'
故障排除 FAQ#
问:如果我的 pod 卡在“Pending”状态,我该怎么办? 答:尝试运行 kubectl describe pod <pod name>
,并检查 Events
部分以查看调度程序正在等待什么。可能需要容忍的节点污点、GPU 不足和存储挂载问题都是常见原因。
问:我尝试使用 statefulset.enabled: false
和 persistence.enabled: true
扩展或升级部署。为什么 pod 永远无法启动? 答:要在不使用 StatefulSet
PVC 模板的情况下进行扩展或升级(这在时间和存储方面效率都不高),您必须使用 ReadWriteMany
存储类,以便它可以挂载在不同的节点上,手动克隆 ReadOnlyMany
卷或类似直接 NFS 存储的东西。如果没有持久性,每个启动的 pod 都必须将其模型下载到 emptyDir
卷。诸如 NFS PVC provisioner 或 CephFS provisioner 之类的 ReadWriteMany
存储类是理想的。
问:最后一条日志消息之一是关于“准备模型工作区。此步骤可能会下载其他文件以运行模型。” 为什么在此期间失败? 答:很可能是模型权重尚未完成下载,但 Kubernetes 达到了启动探测的故障阈值。尝试增加 startupProbe.failureThreshold
。对于大型模型或非常慢的网络连接,这种情况尤其可能发生。
附加信息#
helm chart 的内部 README 包含以下参数。NVIDIA 建议您使用下载的 README 中的 chart 版本,因为它具有该 chart 版本的这些参数的最正确和最新的版本。
参数#
部署参数#
名称 |
描述 |
值 |
---|---|---|
|
部署的亲和性设置。 |
|
|
设置容器的特权和访问控制设置(仅影响主容器,不影响 pod 级别)。 |
|
|
使用此处列出的数组覆盖发送到 NIM 的命令行选项。 |
|
|
使用此处列出的数组覆盖 NIM 容器的命令行参数。 |
|
|
向主容器添加任意环境变量。 |
|
|
向部署集定义添加任意附加卷。 |
|
|
从 |
|
|
指定要部署的 NIM-VLM 镜像。 |
|
|
指定镜像标签或版本。 |
|
|
设置镜像拉取策略。 |
|
|
指定主容器和任何 init 容器所需的密钥名称列表。 |
|
|
指定模型 init 容器(如果需要)。 |
|
|
仅限旧版容器。实例化并配置 NGC init 容器。它应该预装 NGC CLI 或预装 |
|
|
完全指定您的用例所需的任何其他 init 容器。 |
|
|
指定健康检查端口。– 仅用于 |
|
|
设置 NIM 的节点选择器 – 例如 |
|
|
在主 deployment pod 上设置其他注释。 |
|
|
指定 pod 的安全上下文设置。 |
|
|
指定 pod 的用户 UID。 |
|
|
指定 pod 的组 ID。 |
|
|
指定文件系统所有者组 ID。 |
|
|
指定 deployment 的静态副本计数。 |
|
|
指定运行服务的资源限制和请求。 |
|
|
指定要呈现给运行服务的 GPU 数量。 |
|
|
指定是否应创建服务帐户。 |
|
|
设置要添加到服务帐户的注释。 |
|
|
指定要使用的服务帐户的名称。如果未设置且 create 为 |
|
|
启用 |
|
|
指定 pod 分配的容忍度。允许调度程序调度具有匹配污点的 pod。 |
自动扩展参数#
用于创建 Horizontal Pod Autoscaler
的值。如果未启用自动扩展,则其余参数将被忽略。NVIDIA 建议使用自定义指标 API,通常使用 prometheus-adapter 实现。CPU 和内存的标准指标在扩展 NIM 中的用途有限。
名称 |
描述 |
值 |
---|---|---|
|
启用水平 pod 自动扩展器。 |
|
|
指定自动扩展的最小副本数。 |
|
|
指定自动扩展的最大副本数。 |
|
|
自动扩展的指标数组。 |
|
Ingress 参数#
名称 |
描述 |
值 |
---|---|---|
|
启用 ingress。 |
|
|
指定 Ingress 的类名。 |
|
|
指定 ingress 的其他注释。 |
|
|
指定主机列表,每个主机包含路径列表。 |
|
|
指定主机名。 |
|
|
指定 ingress 路径。 |
|
|
指定路径类型。 |
|
|
指定服务类型。它可以是 nemo 或 openai – 确保您的模型服务于适当的端口。 |
|
|
指定 TLS secretName 和主机的配对列表。 |
|
探测参数#
名称 |
描述 |
值 |
---|---|---|
|
启用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
启用 |
|
|
就绪端点路径。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
启用 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
指标参数#
名称 |
描述 |
值 |
---|---|---|
|
在端口 8002 上打开 triton 推理服务器的指标端口。 |
|
|
启用指标端点 – 仅用于 |
|
|
用于 |
|
|
启用 |
|
|
指定 ServiceMonitor 的其他标签。 |
|
模型参数#
名称 |
描述 |
值 |
---|---|---|
|
用于挂载可写存储或 NIM 的预填充模型缓存的路径。 |
|
|
指定 API 中模型的名称(通常是 NIM 的名称)。这主要用于 helm 测试,通常在其他情况下是可选的。这必须与 |
|
|
预先存在的密钥的名称,该密钥具有名为 |
|
|
要用作 API 密钥和镜像拉取密钥的 NGC API 密钥文字值(设置后)。 |
|
|
指定 Open AI API 端口。 |
|
|
指定要添加到已部署 pod 的额外标签。 |
|
|
打开或关闭 JSON 行日志记录。默认为 true。 |
|
|
NIM 服务的日志级别。变量的可能值为 TRACE、DEBUG、INFO、WARNING、ERROR、CRITICAL。 |
|
已弃用和旧版模型参数#
名称 |
描述 |
值 |
---|---|---|
|
设置为 |
|
|
(已弃用)指定模型的 GPU 要求。 |
|
|
(已弃用)指定模型卷中要挂载的路径(如果不是根路径)– 默认值适用于 |
|
|
(已弃用)指定解压模型的location。 |
|
存储参数#
名称 |
描述 |
值 |
---|---|---|
|
如果启用了 |
|
|
启用持久卷的使用。 |
|
|
指定现有的持久卷声明。如果使用 |
|
|
指定持久卷存储类。如果设置为 |
|
|
指定 |
|
|
指定删除时的持久卷声明保留策略。仅与 Stateful Set 卷模板一起使用。 |
|
|
指定扩展时的持久卷声明保留策略。仅与 Stateful Set 卷模板一起使用。 |
|
|
指定持久卷声明的大小(例如 40Gi)。 |
|
|
向持久卷声明添加注释。 |
|
|
使用 |
|
|
启用 |
|
|
指定节点上用作 |
|
|
配置模型缓存以位于共享的直接挂载 NFS 上。注意:您无法使用直接 NFS 挂载为 pod 设置挂载选项,而无需节点安装的 nfsmount.conf。在大多数情况下,基于 NFS 的 |
|
|
启用直接 pod NFS 挂载。 |
|
|
指定 NFS 服务器上要挂载的路径。 |
|
|
指定 NFS 服务器地址。 |
|
|
设置为 true 以只读方式挂载。 |
|
服务参数#
名称 |
描述 |
值 |
---|---|---|
|
指定 deployment 的服务类型。 |
|
|
覆盖默认服务名称 |
|
|
指定服务的 Open AI 端口。 |
|
|
指定要添加到服务的其他注释。 |
|
|
指定要添加到服务的其他标签。 |
|
多节点参数#
目前,必须跨越多个节点的大型模型在仅使用 GPU Operator 的普通 Kubernetes 上无法工作。当自动或通过环境变量选择优化的 TensorRT 配置文件时,需要安装 LeaderWorkerSets 或 MPI Operator 的 MPIJobs
。由于 MPIJob
是一种批处理类型的资源,其设计并未考虑到服务稳定性和可靠性,因此如果您的集群版本允许,则应使用 LeaderWorkerSets。目前,多节点部署仅支持优化的配置文件。
名称 |
描述 |
值 |
---|---|---|
|
启用多节点部署。 |
|
|
设置等待工作节点启动的秒数,超过此时间将失败。 |
|
|
将呈现给每个 pod 的 GPU 数量。在大多数情况下,这应与 |
|
|
指定每个多节点副本要启动多少个工作 pod。 |
|
|
NVIDIA 建议您使用 |
|
|
将 MPI 的 SSH 私钥设置为现有密钥。否则,Helm chart 将在安装期间随机生成密钥。 |
|
|
仅应用于 |
|
|
仅应用于 |
|
|
启用优化的多节点部署(目前是唯一支持的选项)。 |
|