通过OSS URL自定义节点GPU驱动

不同类型和版本的ACK集群默认安装不同版本的NVIDIA驱动。如果您使用的CUDA库需要匹配更高版本的NVIDIA驱动,需要自定义安装节点的NVIDIA驱动。本文介绍如何基于节点池标签通过OSS URL自定义GPU节点的NVIDIA驱动版本。

注意事项

  • 对于GPU驱动版本与您业务应用的兼容性(GPU驱动版本与CDUA库版本的兼容性),ACK不保证两者之间兼容性,请您自行验证。

  • 对于已经安装GPU驱动、NVIDIA Container Runtime等GPU组件的自定义操作系统镜像,ACK无法保证其提供的GPU驱动与ACK其他GPU组件兼容(例如监控组件等),请您自行验证。

  • 通过节点池标签指定节点池中GPU节点的驱动版本时,由于安装驱动的过程是在添加节点时被触发,因此仅对新扩容或新添加的节点有效,对节点池中已经存在的节点无效。如果希望对已有节点有效,需要将该节点从节点池移除,再加入原节点池。具体操作,请参见移除节点添加已有节点

  • 如果您上传自己的GPU驱动到OSS中,使用自定义的GPU节点驱动方式,可能引发GPU驱动与操作系统版本、ECS实例类型、Container Runtime等不兼容,继而导致添加GPU节点失败。ACK无法保证节点添加的成功率,请您自行验证。

  • 机型ecs.gn7.xxxxx和ecs.ebmgn7.xxxx对510.xxx和515.xxx版本驱动存在兼容性问题,建议使用关闭GSP的510以下的驱动版本(例如:470.xxx.x1PINSGHEN xxx)或525.125.06及其以上的驱动版本。

  • NVIDIA各卡型(P100、T4、V100、A10等)对驱动版本的更详细的要求,请参见NVIDIA官方文档

步骤一:下载目标驱动

如果ACK支持的NVIDIA驱动版本列表未包含您的业务所需的驱动版本,您可以从NVIDIA官方网站下载目标驱动版本,本文以驱动版本515.86.01为例进行介绍。如下图所示,单击Search跳转至下载页面,将驱动文件NVIDIA-Linux-x86_64-515.86.01.run下载到本地。

image.png

步骤二:下载nvidia fabric manager

NVIDIA YUM官方仓库下载nvidia fabric manager,nvidia fabric manager的版本需和驱动版本一致。

wget https://developer.download.nvidia.cn/compute/cuda/repos/rhel7/x86_64/nvidia-fabric-manager-515.86.01-1.x86_64.rpm

步骤三:创建OSS Bucket

登录对象存储OSS控制台,创建OSS Bucket。具体操作,请参见创建存储空间

说明

建议OSS Bucket所在地域与目标ACK集群所在地域相同,为ACK节点安装GPU驱动时,可以通过内网OSS Bucket拉取驱动。

步骤四:上传驱动和nvidia-fabric-manager文件到OSS Bucket

  1. 登录对象存储OSS控制台,在左侧导航栏,单击Bucket列表,找到目标Bucket,上传NVIDIA-Linux-x86_64-515.86.01.run和nvidia-fabric-manager-515.86.01-1.x86_64.rpm至目标Bucket的根目录。

    具体操作,请参见上传文件

    重要

    请确保上传文件至OSS Bucket的根目录,不要上传至子目录。

  2. 在目标Bucket页面的左侧导航栏,单击文件管理 > 文件列表,单击已上传文件右侧操作列的详情,查看驱动文件的详情。

  3. 详情面板,关闭使用 HTTPS开关,取消使用HTTPS的配置。

    重要

    ACK创建集群时会通过URL拉取驱动文件,URL使用的协议为HTTP协议。但OSS默认使用HTTPS协议。因此,请关闭使用 HTTPS开关。

  4. 在目标Bucket详情页,单击左侧导航栏的概览,在页面下方获取内网访问地址。

    重要

    公网域名拉取驱动文件速度较慢,容易造成集群添加GPU节点失败,因此建议通过内网域名(带有-internal字段)或加速域名(带有oss-accelerate字段)拉取驱动文件。

步骤五:配置节点池标签

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 单击右上角的创建节点池,然后在创建节点池对话框配置相关参数。

    部分配置项说明如下。有关配置项的详细说明,请参见创建Kubernetes托管版集群

    1. 单击显示高级选项

    2. 节点标签参数栏添加标签,单击1图标。

      1. 输入第一个标签的ack.aliyun.com/nvidia-driver-oss-endpoint步骤四获取的OSS Bucket内网访问地址,本文示例为my-nvidia-driver.oss-cn-beijing-internal.aliyuncs.com

      2. 输入第二个标签的ack.aliyun.com/nvidia-driver-runfile步骤一下载的NVIDIA驱动的名称,本文示例为NVIDIA-Linux-x86_64-515.86.01.run

      3. 输入第三个标签的ack.aliyun.com/nvidia-fabricmanager-rpm步骤二下载的nvidia fabric manager的名称,本文示例为nvidia-fabric-manager-515.86.01-1.x86_64.rpm

    3. 参数配置完成后,单击确认配置

步骤六:验证节点池自定义安装NVIDIA驱动是否成功

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 在目标集群右侧的操作列,选择更多 > 通过CloudShell管理集群

  3. 执行以下命令,查看带有component: nvidia-device-plugin标签的Pod。

    kubectl get po -n kube-system -l component=nvidia-device-plugin -o wide

    预期输出:

    NAME                                            READY   STATUS    RESTARTS   AGE   IP              NODE                       NOMINATED NODE   READINESS GATES
    nvidia-device-plugin-cn-beijing.192.168.1.127   1/1     Running   0          6d    192.168.1.127   cn-beijing.192.168.1.127   <none>           <none>
    nvidia-device-plugin-cn-beijing.192.168.1.128   1/1     Running   0          17m   192.168.1.128   cn-beijing.192.168.1.128   <none>           <none>
    nvidia-device-plugin-cn-beijing.192.168.8.12    1/1     Running   0          9d    192.168.8.12    cn-beijing.192.168.8.12    <none>           <none>
    nvidia-device-plugin-cn-beijing.192.168.8.13    1/1     Running   0          9d    192.168.8.13    cn-beijing.192.168.8.13    <none>           <none>
    nvidia-device-plugin-cn-beijing.192.168.8.14    1/1     Running   0          9d   

    预期输出表示,NODE列的集群中刚添加的节点对应的Pod名称为nvidia-device-plugin-cn-beijing.192.168.1.128

  4. 执行以下命令查看节点的驱动版本是否符合预期。

    kubectl exec -ti nvidia-device-plugin-cn-beijing.192.168.1.128 -n kube-system -- nvidia-smi

    预期输出:

    image.png

    预期输出表明,驱动版本为515.86.01,即通过节点池自定义安装NVIDIA驱动成功。

其他方式

使用OpenAPI方式创建或者扩容集群时,可在目标节点池的配置中设置自定义驱动的OSS URL。示例代码如下:

{
  // 其他部分省略
  ......
    "tags": [
      {
              "key": "ack.aliyun.com/nvidia-driver-oss-endpoint",
              "value": "xxxx"
      },
      {
        "key": "ack.aliyun.com/nvidia-driver-runfile",
        "value": "xxxx"
      },
      {
        "key": "ack.aliyun.com/nvidia-fabricmanager-rpm",
        "value": "xxxx"
      }
    ],
  // 其他部分省略
  ......
}