缓存模型#

关于模型配置文件和缓存#

NVIDIA NIM 微服务的模型使用针对特定 NVIDIA GPU、GPU 数量、精度等进行调整的模型引擎。NVIDIA 为几种流行的组合生成模型引擎,这些引擎被称为模型配置文件

NIM 微服务支持自动配置文件选择,通过确定节点上的 GPU 型号和数量,并尝试匹配最佳模型配置文件。或者,NIM 微服务支持运行指定的模型配置文件,但这需要您查看配置文件并了解配置文件 ID。有关更多信息,请参阅 NVIDIA NIM for LLMs 文档中的 模型配置文件

Operator 通过以下方式补充 NIM 微服务的模型选择

  • 支持缓存和运行指定的模型配置文件 ID,就像 NIM 微服务一样。

  • 支持缓存所有模型配置文件。

  • 支持通过指定引擎、精度、张量并行度等来影响模型选择以进行匹配。NIM 缓存自定义资源提供了指定模型选择标准的方法。

缓存模型的优势#

NVIDIA 建议为 NVIDIA NIM 微服务缓存模型。通过缓存模型,可以缩短微服务的启动时间。对于扩展到多个 NIM 微服务 Pod 的部署,具有网络存储类的持久卷中的单个缓存模型可以为多个 Pod 提供服务。

对于单节点集群,来自 Rancher Labs 的本地路径 Provisioner 足以用于研究和开发。对于生产环境,NVIDIA 建议安装提供网络存储类的 Provisioner。

关于 NIM 缓存自定义资源定义#

NIM 缓存是 Kubernetes 自定义资源,nimcaches.apps.nvidia.com。您可以创建和删除 NIM 缓存资源来管理模型缓存。

当您创建 NIM 缓存资源时,NIM Operator 会启动一个 Pod,列出可用的模型配置文件。Operator 创建模型配置文件的 ConfigMap。

如果您指定一个或多个要缓存的模型配置文件 ID,Operator 将启动一个 Job,缓存您指定的模型配置文件。

如果您未指定模型配置文件 ID,但指定了 engine: tensorrt_llmengine: tensorrt,Operator 将尝试将模型配置文件与集群中节点上的 GPU 匹配。Operator 使用由 Node Feature Discovery 设置的 nvidia.com/gpu.product 节点标签的值。

您可以让 Operator 自动检测要缓存的模型配置文件,也可以通过为 spec.source.ngc.model 指定值来约束模型配置文件,例如引擎、GPU 型号等等,这些值必须与模型配置文件匹配。

如果您删除使用 spec.storage.pvc.create: true 创建的 NIM 缓存资源,NIM Operator 将删除持久卷 (PV) 和持久卷声明 (PVC)。

请参阅以下示例清单

apiVersion: apps.nvidia.com/v1alpha1
kind: NIMCache
metadata:
  name: meta-llama3-8b-instruct
spec:
  source:
    ngc:
      modelPuller: nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.3
      pullSecret: ngc-secret
      authSecret: ngc-api-secret
      model:
        engine: tensorrt_llm
        tensorParallelism: "1"
  storage:
    pvc:
      create: true
      storageClass: <storage-class-name>
      size: "50Gi"
      volumeAccessMode: ReadWriteMany
  resources: {}

请参阅下表,了解有关常用修改字段的信息

字段

描述

默认值

spec.certConfig

指定 HTTP 代理环境中可能需要的自定义 CA 证书。有关更多信息,请参阅 支持自定义 CA 证书

spec.env

为缓存 Job 指定环境变量名称和值。

spec.groupID

指定 Pod 的组。此值用于在 runAsGroupfsGroup 字段中设置 Pod 的安全上下文。

2000

spec.nodeSelector

指定节点选择器标签以调度缓存 Job。

spec.resources

指定 Pod 的资源需求。

spec.runtimeClassName

指定 Pod 的运行时类名称。

spec.source.ngc.model.engine

根据引擎指定模型缓存约束。常用值如下:

  • tensorrt_llm – 针对 NIM for LLMs 优化的引擎

  • vllm – 针对 NIM for LLMs 的社区引擎

  • tensorrt – 针对嵌入和重排序优化的引擎

  • onnx – 社区引擎

每个 NIM 微服务都确定支持的引擎。有关最新信息,请参阅微服务文档。

默认情况下,缓存 Job 匹配所有引擎的模型配置文件。

spec.source.ngc.model.gpus

指定模型缓存约束列表,以使用指定的 GPU 型号(按 PCI ID 或产品名称)。

默认情况下,缓存 Job 检测集群中的所有 GPU 型号,并匹配所有 GPU 的模型配置文件。

以下部分规范请求与 NVIDIA L40S 兼容的模型配置文件。

spec:
  source:
    ngc:
      model:
        ...
        gpus:
        - ids:
          - "26b5"

如果 GPU Operator 或 Node Feature Discovery 在您的集群上运行,您可以通过查看以 feature.node.kubernetes.io/pci-10de- 开头的节点标签来确定节点上 GPU 型号的 PCI ID。或者,如果您知道设备名称,您可以从 GitHub 上的 NVIDIA Open Kernel Modules 存储库中的表格中查找 PCI ID。

以下部分规范请求与 NVIDIA A100 兼容的模型配置文件。

spec:
  source:
    ngc:
      model:
        ...
        gpus:
        - product: "a100"

产品名称(例如 h100a100l40s)必须与模型配置文件匹配,如 NVIDIA NIM for LLMs 文档中 list-model-profiles 命令所示。该值不区分大小写。

spec.source.ngc.model.lora

设置为 true 时,指定缓存与 LoRA 兼容的模型配置文件。

有关更多信息,请参阅 使用 LoRA 模型和适配器

false

spec.source.ngc.model.precision

指定要匹配的模型配置文件量化。常用值包括 fp16bf16fp8。与 GPU 产品名称字段一样,该值必须与模型配置文件匹配,如 list-model-profiles 命令所示。

spec.source.ngc.model.profiles

指定要缓存的模型配置文件数组。

当您指定此字段时,自动配置文件选择将被禁用,并且所有其他 source.ngc.model 字段将被忽略。

以下部分规范请求特定的模型配置文件。

spec:
  source:
    ngc:
      model:
        modelPuller: nvcr.io/nim/meta/llama3-8b-instruct:1.0.3
        profiles:
        - 8835c31...

您可以通过运行 list-model-profiles 命令来确定模型配置文件。

您可以指定 all 来下载所有模型配置文件。

spec.source.ngc.model.qosProfile

指定要匹配的模型配置文件服务质量。值为 latencythroughput

spec.source.ngc.model.tensorParallelism

指定要匹配的模型配置文件张量并行度。运行 NIM 微服务并为模型提供服务的节点必须至少具有指定数量的 GPU。常用值为 "1""2""4"

spec.source.ngc.modelPuller

指定可以缓存模型配置文件的容器镜像。

spec.storage.pvc.create

设置为 true 时,Operator 将创建 PVC。如果您删除 NIM 缓存资源并且此字段设置为 true,则 Operator 将删除 PVC 和缓存的模型。

false

spec.storage.pvc.name

指定 PVC 名称。

如果您指定 create: false,则此字段为必填字段。

带有 -pvc 后缀的 NIM 缓存资源名称。

spec.storage.pvc.size

指定要创建的 PVC 的大小,单位为 Gi。

如果您指定 create: true,则此字段为必填字段。

spec.storage.pvc.storageClass

指定要创建的 PVC 的存储类。

spec.storage.pvc.subPath

指定在 PVC 上创建子路径并在目录中缓存模型配置文件。

spec.storage.pvc.volumeAccessMode

指定要创建的 PVC 的访问模式

spec.tolerations

指定缓存 Job 的 容忍度

spec.userID

指定 Pod 的用户 ID。此值用于在 runAsUser 字段中设置 Pod 的安全上下文。

1000

先决条件#

  • 已安装 NVIDIA NIM Operator。

  • 使用网络存储(如 NFS、S3、vSAN 等)的持久卷 Provisioner。模型被下载并存储在持久存储中。

    您可以创建 PVC 并在创建 NIM 缓存资源时指定名称,也可以请求 Operator 创建 PVC。

  • NGC API 密钥。Pod 使用 API 密钥作为镜像拉取密钥,从 NVIDIA NGC 下载容器镜像和模型。有关更多信息,请参阅 NVIDIA NGC 用户指南中的 生成您的 NGC API 密钥

  • 示例清单显示了 spec.source.ngc.modelPuller 字段常用的容器镜像。要缓存替代模型,请考虑以下方法来了解容器镜像名称:

步骤#

  1. 创建命名空间

    $ kubectl create namespace nim-service
    
  2. 添加使用您的 NGC API 密钥的 Secret。

    • 添加 Docker 注册表 Secret,用于从 NVIDIA NGC 下载 NIM 容器镜像

      $ kubectl create secret -n nim-service docker-registry ngc-secret \
          --docker-server=nvcr.io \
          --docker-username='$oauthtoken' \
          --docker-password=<ngc-api-key>
      
    • 添加通用 Secret,模型拉取器 init 容器使用该 Secret 从 NVIDIA NGC 下载模型

      $ kubectl create secret -n nim-service generic ngc-api-secret \
          --from-literal=NGC_API_KEY=<ngc-api-key>
      
  3. 创建一个文件,例如 cache-all.yaml,内容如下例所示

    apiVersion: apps.nvidia.com/v1alpha1
    kind: NIMCache
    metadata:
      name: meta-llama3-8b-instruct
    spec:
      source:
        ngc:
          modelPuller: nvcr.io/nim/meta/llama-3.1-8b-instruct:1.3.3
          pullSecret: ngc-secret
          authSecret: ngc-api-secret
          model:
            engine: tensorrt_llm
            tensorParallelism: "1"
      storage:
        pvc:
          create: true
          storageClass: <storage-class-name>
          size: "50Gi"
          volumeAccessMode: ReadWriteMany
      resources: {}
    ---
    apiVersion: apps.nvidia.com/v1alpha1
    kind: NIMCache
    metadata:
      name: nv-embedqa-e5-v5
    spec:
      source:
        ngc:
          modelPuller: nvcr.io/nim/nvidia/llama-3.2-nv-embedqa-1b-v2:1.3.1
          pullSecret: ngc-secret
          authSecret: ngc-api-secret
          model:
            profiles:
            - all
      storage:
        pvc:
          create: true
          storageClass: <storage-class-name>
          size: "50Gi"
          volumeAccessMode: ReadWriteMany
      resources: {}
    ---
    apiVersion: apps.nvidia.com/v1alpha1
    kind: NIMCache
    metadata:
      name: nv-rerankqa-mistral-4b-v3
    spec:
      source:
        ngc:
          modelPuller: nvcr.io/nim/nvidia/llama-3.2-nv-rerankqa-1b-v2:1.3.1
          pullSecret: ngc-secret
          authSecret: ngc-api-secret
          model:
            profiles:
            - all
      storage:
        pvc:
          create: true
          storageClass: <storage-class-name>
          size: "50Gi"
          volumeAccessMode: ReadWriteMany
      resources: {}
    
  4. 应用清单

    $ kubectl apply -n nim-service -f cache-all.yaml
    
  5. 可选:查看有关缓存进度的信息。

    • 确认已创建持久卷和声明

      $ kubectl get -n nim-service pvc,pv
      

      示例输出

      NAME                                                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
      persistentvolumeclaim/meta-llama3-8b-instruct-pvc   Bound    pvc-1d3f8d48-660f-4e44-9796-c80a4ed308ce   50Gi       RWO            nfs-client     <unset>                 10m
      
      NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
      persistentvolume/pvc-1d3f8d48-660f-4e44-9796-c80a4ed308ce   50Gi       RWO            Delete           Bound    nim-service/meta-llama3-8b-instruct-pvc   nfs-client     <unset>                          10m
      
    • 查看 NIM 缓存资源以查看状态

      $ kubectl get nimcaches.apps.nvidia.com -n nim-service
      

      示例输出

      NAME                        STATUS   PVC                             AGE
      meta-llama3-8b-instruct     Ready    meta-llama3-8b-instruct-pvc     2024-09-19T13:20:53Z
      nv-embedqa-e5-v5            Ready    nv-embedqa-e5-v5-pvc            2024-09-18T21:11:37Z
      nv-rerankqa-mistral-4b-v3   Ready    nv-rerankqa-mistral-4b-v3-pvc   2024-09-18T21:11:37Z
      

显示 NIM 缓存状态#

  • 显示 NIM 缓存状态

    $ kubectl get nimcaches.apps.nvidia.com -n nim-service
    

    示例输出

    NAME                        STATUS    PVC                             AGE
    meta-llama3-8b-instruct     Ready     meta-llama3-8b-instruct         2024-08-09T20:54:28Z
    nv-embedqa-e5-v5            Ready     nv-embedqa-e5-v5-pvc            2024-08-09T20:54:28Z
    nv-rerankqa-mistral-4b-v3   Ready     nv-rerankqa-mistral-4b-v3-pvc   2024-08-09T20:54:28Z
    

NIM 缓存对象可以报告以下状态

状态

描述

失败

Job 未能下载和缓存模型配置文件。

进行中

Job 正在从 NGC 下载模型配置文件。

未就绪

Job 未就绪。创建 NIM 缓存资源后不久可能会报告此状态,此时 Pod 的镜像正在从 NGC 下载。

有关更多信息,请运行 kubectl describe nimcache -n nim-service <nim-cache-name>

待处理

Job 已创建,但尚未启动并变为活动状态。

PVC-已创建

如果您设置 spec.storage.pvc.create: true,Operator 将为模型配置文件缓存创建 PVC。

就绪

Job 已下载并缓存模型配置文件。

已启动

Operator 创建一个 Job,从 NGC 下载模型配置文件。

显示缓存的模型配置文件#

  • 查看自定义资源的 .status.profiles 字段

    $ kubectl get nimcaches.apps.nvidia.com -n nim-service \
        meta-llama3-8b-instruct -o=jsonpath="{.status.profiles}" | jq .
    

    示例输出

    [
      {
        "config": {
          "feat_lora": "false",
          "llm_engine": "vllm",
          "precision": "fp16",
          "tp": "2"
        },
        "model": "meta/llama3-8b-instruct",
        "name": "19031a45cf096b683c4d66fff2a072c0e164a24f19728a58771ebfc4c9ade44f",
        "release": "1.0.3"
      }
    ]
    

在气隙环境中缓存模型#

您可以在具有网络访问权限的主机上运行 NIM 微服务容器,缓存模型,创建一个包含模型缓存的容器,然后运行一个 Job 将模型缓存复制到 PVC。

有关以下步骤中运行 NIM 容器和下载模型配置文件的更多信息,请参阅 NVIDIA NIM for LLMs 文档中的 从本地资产提供模型服务

以下部分展示了一种缓存模型并将其添加到 PVC 的方法。

支持自定义 CA 证书#

如果您的集群具有需要自定义证书的 HTTP 代理,您可以在 ConfigMap 中添加这些证书,并将它们挂载到 NIM 缓存 Job 中。您可以使用自签名或自定义 CA 证书。

  1. 创建包含证书的 ConfigMap

    $ kubectl create configmap -n nim-service ca-certs --from-file=<path-to-cert-file-1> --from-file=<path-to-cert-file-2>
    
  2. 当您创建 NIM 缓存 Job 时,指定 ConfigMap 的名称和要在容器中挂载它们的路径,并指定代理信息

    spec:
      certConfig:
        name: ca-certs
        mountPath: /usr/local/share/ca-certificates/
      env:
      - name: HTTPS_PROXY
        value: http://<example.proxy.com:port>
      - name: HTTP_PROXY
        value: http://<example.proxy.com:port>
      - name: NO_PROXY
        value: <example.com>
      - name: https_proxy
        value: http://<example.proxy.com:port>
      - name: http_proxy
        value: http://<example.proxy.com:port>
      - name: no_proxy
        value: <example.com>
    
  3. 对于 OpenShift Container Platform 安装,您必须启用证书注入。

    1. 创建一个文件,例如 ca-inject.yaml,内容如下例所示

      apiVersion: v1
      data: {}
      kind: ConfigMap
      metadata:
        labels:
          config.openshift.io/inject-trusted-cabundle: "true"
        name: ca-inject-cm
        namespace: nim-service
      
    2. 应用清单

      $ oc apply -n nim-service -f ca-inject.yaml
      

    有关更多信息,请参阅 OpenShift Container Platform 文档中的 使用 Operator 进行证书注入

下载模型#

  1. 将您的 NGC API 密钥导出为环境变量

    export NGC_API_KEY=M2...
    
  2. 在本地运行 NIM 容器镜像,列出模型配置文件,并下载模型配置文件。

    • 启动容器

      $ mkdir cache
      
      $ docker run --rm -it \
          -v ./cache:/opt/nim/.cache \
          -u $(id -u):$(id -g) \
          -e NGC_API_KEY \
          nvcr.io/nim/meta/llama3-8b-instruct:1.0.3 \
          bash
      

      将容器镜像和标签替换为您要为其缓存模型的 NIM 微服务。

    • 列出模型配置文件

      $ list-model-profiles
      

      部分输出

      ...
      MODEL PROFILES
      - Compatible with system and runnable:
       - 19031a45cf096b683c4d66fff2a072c0e164a24f19728a58771ebfc4c9ade44f (vllm-fp16-tp2)
      ...
      
    • 下载并缓存模型配置文件

      $ download-to-cache --profile 1903...
      
    • 退出容器

      $ exit
      

将模型复制到容器#

  1. 创建一个 Dockerfile,将模型配置文件复制到容器中

    FROM nvcr.io/nvidia/base/ubuntu:22.04_20240212
    
    COPY cache /cache
    
  2. 构建包含模型配置文件的容器并将其推送到气隙集群可以访问的容器注册表

    $ docker build <private-registry-name>/<model-name>:<tag>
    
    $ docker push <private-registry-name>/<model-name>:<tag>
    

将模型从容器复制到 PVC#

  1. 可选:如果您还没有 PVC,请创建一个 PVC

    • 创建一个清单文件,例如 model-cache-pvc.yaml,内容如下例所示

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: model-cache-pvc
        namespace: nim-service
      spec:
        storageClassName: <storage-class>
        resources:
          requests:
            storage: 10Gi
      
    • 应用清单

    $ kubectl apply -f model-cache-pvc.yaml
    
  2. 创建一个 Job,将模型配置文件复制到 PVC。

    • 创建一个清单文件,例如 copy-cache-job.yaml,内容如下例所示

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: copy-cache
        namespace: nim-service
      spec:
        ttlSecondsAfterFinished: 3600
        template:
          spec:
            restartPolicy: Never
            containers:
            - name: copy-cache
              command:
              - "/bin/sh"
              args:
              - "-c"
              - "cd /cache && cp -R . /model-store && find /model-store"
              image: <private-registry-name>/<model-name>:<tag>
              imagePullPolicy: IfNotPresent
              securityContext:
                allowPrivilegeEscalation: false
                runAsGroup: 2000
                runAsNonRoot: true
                runAsUser: 1000
              volumeMounts:
              - mountPath: /model-store
                name: nim-cache-volume
                readOnly: false
            imagePullSecrets:
            - name: my-secret
            securityContext:
              fsGroup: 2000
              runAsNonRoot: true
              runAsUser: 1000
            volumes:
            - name: nim-cache-volume
              persistentVolumeClaim:
                claimName: model-cache-pvc
        backoffLimit: 4
      
    • 应用清单

      $ kubectl apply -f copy-cache-job.yaml
      

使用 LoRA 模型和适配器#

NVIDIA NIM for LLMs 支持由 NeMo Framework 和 Hugging Face Transformers 库训练的 LoRA 参数高效微调 (PEFT) 适配器。

您必须手动下载 LoRA 适配器,并使其可用于 NIM 微服务。以下步骤描述了一种满足此要求的方法。

  1. 在您应用的 NIM 缓存清单中指定 lora: true

    kind: NIMCache
    metadata:
      name: meta-llama3-8b-instruct
    spec:
      source:
        ngc:
          modelPuller: nvcr.io/nim/meta/llama3-8b-instruct:1.0.3
          pullSecret: ngc-secret
          authSecret: ngc-api-secret
          model:
            tensorParallelism: "1"
            lora: true
            gpus:
            - product: "a100"
      storage:
        pvc:
          create: true
          size: "50Gi"
          storageClass: <storage-class>
          volumeAccessMode: ReadWriteMany
      resources: {}
    

    应用清单并等待直到 kubectl get nimcache -n nim-service meta-llama3-8b-instruct 显示 NIM 缓存为 Ready

  2. 使用 NGC CLI 或 Hugging Face CLI 下载 LoRA 适配器。

    • 构建一个包含 CLI 的容器,如下例所示

      FROM nvcr.io/nvidia/base/ubuntu:22.04_20240212
      ARG NGC_CLI_VERSION=3.50.0
      
      RUN apt-get update && DEBIAN_FRONTEND=noninteractive && \
            apt-get install --no-install-recommends -y \
            wget \
            unzip \
            python3-pip
      
      RUN useradd -m -s /bin/bash -u 1000 ubuntu
      USER ubuntu
      
      RUN wget --content-disposition --no-check-certificate \
            https://api.ngc.nvidia.com/v2/resources/nvidia/ngc-apps/ngc_cli/versions/${NGC_CLI_VERSION}/files/ngccli_linux.zip -O /tmp/ngccli_linux.zip && \
          unzip /tmp/ngccli_linux.zip -d ~ && \
          rm /tmp/ngccli_linux.zip
      
      ENV PATH=/home/ubuntu/ngc-cli:$PATH
      
      RUN pip install -U "huggingface_hub[cli]"
      

      将容器推送到集群中节点可以访问的注册表。

    • 应用类似于以下示例的清单,该清单运行容器。

      当您创建清单时,请参阅 Pod 规范的关键注意事项

      • 挂载 NIM 微服务访问模型的同一 PVC。

      • 指定 NIM 缓存容器使用的同一用户 ID 和组 ID。以下清单显示了默认值。

      • 指定 NGC_CLI_API_KEYNGC_CLI_ORG 环境变量。组织的价值可能有所不同。

      • nim-service 命名空间中启动 Pod,以便 Pod 可以访问 ngc-secret Secret。

      apiVersion: v1
      kind: Pod
      metadata:
        name: ngc-cli
      spec:
        containers:
        - env:
          - name: NGC_CLI_API_KEY
            valueFrom:
              secretKeyRef:
                key: NGC_API_KEY
                name: ngc-api-secret
          - name: NGC_CLI_ORG
            value: "nemo-microservices/ea-participants"
          - name: NIM_PEFT_SOURCE
            value: "/model-store/loras"
          image: <private-registry>/<image-name>:<image-tag>
          command: ["sleep"]
          args: ["inf"]
          name: ngc-cli
          securityContext:
            capabilities:
              drop:
              - ALL
            runAsNonRoot: true
          volumeMounts:
          - mountPath: /model-store
            name: model-store
        restartPolicy: Never
        securityContext:
          fsGroup: 2000
          runAsGroup: 2000
          runAsUser: 1000
          seLinuxOptions:
            level: s0:c28,c2
        volumes:
        - name: model-store
          persistentVolumeClaim:
            claimName: meta-llama3-8b-instruct-pvc
      
  3. 访问 Pod

    $ kubectl exec -it -n nim-service ngc-cli -- bash
    

    Pod 可能会报告 groups: cannot find name for group ID 2000。您可以忽略此消息。

  4. 从 Pod 中的终端,下载 LoRA 适配器。

    • 为 LoRA 适配器创建一个目录

      $ mkdir $NIM_PEFT_SOURCE
      $ cd $NIM_PEFT_SOURCE
      
    • 下载适配器

      $ ngc registry model download-version "nim/meta/llama3-8b-instruct-lora:nemo-math-v1"
      $ ngc registry model download-version "nim/meta/llama3-8b-instruct-lora:nemo-squad-v1"
      
    • 重命名目录以匹配 LoRA 模型目录结构的命名约定

      $ mv llama3-8b-instruct-lora_vnemo-math-v1 llama3-8b-math
      $ mv llama3-8b-instruct-lora_vnemo-squad-v1 llama3-8b-squad
      
    • 按 Ctrl+D 退出 Pod,然后运行 kubectl delete pod -n nim-service ngc-cli

当您创建 NIM 服务实例时,指定 NIM_PEFT_SOURCE 环境变量

apiVersion: apps.nvidia.com/v1alpha1
kind: NIMService
metadata:
  name: meta-llama3-8b-instruct
spec:
  ...
  env:
  - name: NIM_PEFT_SOURCE
    value: "/model-store/loras"

NIM 微服务运行后,监控日志中是否有如下记录

{"level": "INFO", ..., "message": "LoRA models synchronizer successfully initialized!"}
{"level": "INFO", ..., "message": "Synchronizing LoRA models with local LoRA directory ..."}
{"level": "INFO", ..., "message": "Done synchronizing LoRA models with local LoRA directory"}

上述步骤是用于下载 NeMo 格式 LoRA 适配器的示例命令。有关使用 Hugging Face Transformers 格式、模型目录结构、其他模型的适配器等信息,请参阅 NVIDIA NIM for LLMs 文档中的 参数高效微调

故障排除#

NIM 缓存报告无状态#

如果您运行 kubectl get nimcache -n nim-service 并且输出未报告状态,请执行以下操作以获取更多信息

  • 确定缓存 Job 的状态

    $ kubectl get jobs -n nim-service
    

    示例输出

    NAME                            COMPLETIONS   DURATION   AGE
    meta-llama3-8b-instruct-job     1/1           8s         2m57s
    

    使用类似 kubectl logs -n nim-service job/meta-llama3-8b-instruct-job 的命令查看 Job 的日志。

    如果缓存 Job 不再可用,请删除 NIM 缓存资源并重新应用清单。

  • 描述 NIM 缓存资源并查看条件

    $ kubectl describe nimcache -n nim-service <nim-cache-name>
    

    部分输出

    Status:
      Conditions:
        Last Transition Time:  2024-09-19T13:20:53Z
        Message:               The PVC has been created for caching NIM model
        Reason:                PVCCreated
        Status:                True
        Type:                  NIM_CACHE_PVC_CREATED
        Last Transition Time:  2024-09-19T13:26:24Z
        Message:
        Reason:                Reconciled
        Status:                False
        Type:                  NIM_CACHE_RECONCILE_FAILED
        Last Transition Time:  2024-09-19T13:24:36Z
        Message:               The Job to cache NIM has been created
        Reason:                JobCreated
        Status:                True
        Type:                  NIM_CACHE_JOB_CREATED
        Last Transition Time:  2024-09-19T13:25:50Z
        Message:               The Job to cache NIM is in pending state
        Reason:                JobPending
        Status:                True
        Type:                  NIM_CACHE_JOB_PENDING
        Last Transition Time:  2024-09-19T13:25:50Z
        Message:               The Job to cache NIM has successfully completed
        Reason:                JobCompleted
        Status:                True
        Type:                  NIM_CACHE_JOB_COMPLETED
    

    上述输出显示了一个 NIM 缓存资源,该资源最终成功下载并缓存了模型配置文件。

    在 Operator 创建缓存 Job 的时间间隔内报告了 NIM_CACHE_RECONCILE_FAILED 条件,但在 Pod 运行之前,因为镜像正在从 NGC 下载。在输出中,该条件的状态设置为 False,表示该条件不再准确。

  • 通过运行 kubectl logs -n nim-operator -l app.kubernetes.io/name=k8s-nim-operator 查看 Operator 日志。

未选择任何配置文件进行缓存#

如果 NIM 缓存控制器未自动选择要缓存的模型配置文件,您可以使用两种方法查看可用的模型配置文件

  • 缓存控制器将模型配置文件复制到 ConfigMap 中。您可以使用类似以下示例的命令查看 ConfigMap,以识别使用社区后端(如 vLLM 或 ONNX)的模型配置文件。

    $ kubectl get cm -n nim-service meta-llama3-8b-instruct-manifest -o yaml | less
    
  • 在配置了 Docker、NVIDIA Container Toolkit 和 NVIDIA GPU 的主机上运行容器。请参阅 NVIDIA NIM for LLMs 文档中的 list-model-profiles 命令。

在您确定与您的 GPU 兼容的模型配置文件后,在 spec.source.ngc.model.profiles 字段中指定模型配置文件 ID,然后重新应用清单。

删除 NIM 缓存#

要删除 NIM 缓存,请执行以下步骤。

  1. 查看 NIM 缓存自定义资源

    $ kubectl get nimcaches.apps.nvidia.com -A
    

    示例输出

    NAMESPACE     NAME                      STATUS   PVC           AGE
    nim-service   meta-llama3-8b-instruct   ready    model-store   2024-08-08T13:14:30Z
    
  2. 删除自定义资源

    $ kubectl delete nimcache -n nim-service meta-llama3-8b-instruct
    

    如果 Operator 在您创建 NIM 缓存时创建了 PVC,则 Operator 将删除 PVC 和缓存的模型配置文件。您可以通过运行类似以下示例的命令来确定 Operator 是否创建了 PVC

    $ kubectl get nimcaches.apps.nvidia.com -n nim-service \
       -o=jsonpath='{range .items[*]}{.metadata.name}: {.spec.storage.pvc.create}{"\n"}{end}'
    

    示例输出

    meta-llama3-8b-instruct: true
    

后续步骤#

  • 通过添加 NIM 服务 自定义资源或在单个 NIM 管道 自定义资源中管理多个服务来部署 NIM 微服务。