基于 CUDA 版本调度推理服务

简介

在 Kubernetes 集群中,不同 GPU 节点上的 GPU 型号和 CUDA 驱动版本不一致,会导致以下问题:

  1. 版本不匹配:应用程序使用的 CUDA Runtime 版本可能与某些节点上的 CUDA Driver 版本不兼容,从而导致失败或性能问题。

  2. 调度挑战:原生 Kubernetes 调度器无法感知 CUDA 版本依赖关系,不能保证应用程序被调度到具有兼容版本的 GPU 节点上。

  3. 维护开销高:手动管理节点与应用程序之间的 CUDA 版本依赖关系会增加运维复杂度。

本文将逐步介绍如何基于 CUDA Runtime 版本和 Nvidia Driver 版本调度推理服务。 通过这些设置,你可以在 Kubernetes 调度层面解决 CUDA Runtime 和 CUDA Driver 版本不匹配的问题,确保应用程序被调度到兼容的 GPU 节点上。

步骤

在节点标签中添加 CUDA 版本

  1. 在每个 GPU 节点上,运行以下命令以获取支持的 CUDA Runtime 版本:

    nvidia-smi | sed -n 's/.*CUDA Version: \([0-9.]\+\).*/\1/p'

    例如,输出可能为 12.4。

  2. 在控制节点上,为该 GPU 节点添加对应的主版本和次版本标签:

    kubectl label node <node-name> \
    nvidia.com/cuda.runtime.major=12 \
    nvidia.com/cuda.runtime.minor=4
TIP

如果你的集群中有很多 GPU 节点,手动为它们添加标签会比较困难。你可以安装 Node Feature Discovery 集群插件。 通过部署 Node Feature Discovery(NFD)集群插件并开启 GFD 扩展,GPU 节点会自动添加 CUDA 版本标签。 Node Feature Discovery 集群插件可以从 Customer Portal 获取。更多信息请联系 Consumer Support。

基于 CUDA 版本调度推理服务

从 Alauda AI 1.5 开始,产品将根据 CUDA 版本自动调度推理服务的 pod。对于更早的版本,你可以按照以下步骤操作:

  1. 在创建推理服务时,确定需要选择哪个 ClusterServingRuntime。
  2. 解析 ClusterServingRuntime 标签: 如果 cpaas.io/accelerator-type 为 nvidia,则进一步解析 cpaas.io/cuda-version(例如 11.8)。
  3. 在推理服务中添加 nodeAffinity 字段,例如:
    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    spec:
      predictor:
        affinity:
          nodeAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              preference:
                matchExpressions:
                - key: nvidia.com/cuda.runtime.major
                  operator: In
                  values: ["11"]
                - key: nvidia.com/cuda.runtime.minor
                  operator: Gt
                  values: ["7"] # Since the k8s operator only supports Gt, which means greater than but not equal to, we use the rt version minus one to meet the requirements.