首页 / 常见问题 / 为自建的业务集群配置 GPU 节点

为自建的业务集群配置 GPU 节点

随着业务数据量的增加,尤其对于人工智能、数据分析等场景,您可能希望在自建的业务集中使用 GPU 功能以加速数据处理。对此,除了为集群节点准备 GPU 资源外,还应对其进行 GPU 配置。

本方案将集群中具备 GPU 计算能力的节点称为 GPU 节点

说明:若无特指,操作步骤将同时适用于两类节点。驱动安装相关问题可参考 NVIDIA 官网安装文档

适用场景

前提条件

操作节点上已准备好 GPU 资源,即属于本节所说的 GPU 节点。

操作系统支持情况

操作系统 运行时组件 创建集群 已有非 GPU 集群
CentOS 7.9 Containerd
  • 物理 GPU:✓
  • GPU-Manager:✓
  • NVIDIA MPS:✓
  • 物理 GPU:✓
  • GPU-Manager:✓
  • NVIDIA MPS:✓
  • 安装 GPU 驱动

    注意:如果 GPU 节点使用 NVIDIA MPS 插件则需确保该节点 GPU 架构为 Volta 及以上(Volta/Turing/Ampere/Hopper等)且驱动支持的 CUDA 版本大于等于 11.5 。

    获取驱动下载地址

    1. 登录 GPU 节点,执行命令 lspci |grep -i NVIDIA 查看节点的 GPU 型号。

      以下示例中 GPU 型号为:Tesla T4。

      lspci | grep NVIDIA
      00:08.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1)
    2. 前往 NVIDIA 官网 ,获取驱动下载地址。

      1. 在官网首页的顶部导航栏中,单击 驱动程序

      2. 根据 GPU 节点的型号,填写驱动下载所需信息,如下图所示。

      3. 单击 搜索

      4. 单击 下载

      5. 右键单击 下载 > 复制链接地址,即可复制驱动的下载地址。

    3. 在 GPU 节点上依次执行以下命令行,创建 /home/gpu 目录,并将驱动文件下载并保存至该目录下。

      # 创建 /home/gpu 目录
      mkdir -p /home/gpu
      cd /home/gpu/
      # 将驱动文件下载至 /home/gpu 目录下,示例:wget https://cn.download.nvidia.com/tesla/515.65.01/NVIDIA-Linux-x86_64-515.65.01.run
      wget <驱动下载地址>
      # 验证驱动文件是否下载成功,若返回驱动文件名称(例如:NVIDIA-Linux-x86_64-515.65.01.run)表明已下载成功
      ls <驱动文件名称>

    安装驱动

    1. 在 GPU 节点上执行以下命令行,安装当前操作系统对应的 gcc 和 kernel-devel 包。

      sudo yum install dkms gcc  kernel-devel-$(uname -r) -y
    2. 依次执行以下命令,安装 GPU 驱动。

      chmod a+x /home/gpu/<驱动文件名称>
      /home/gpu/<驱动文件名称> --dkms
    3. 安装完成后,执行 nvidia-smi 命令,若返回类似以下示例的 GPU 信息,说明驱动安装成功。

      # nvidia-smi
      Tue Sep 13 01:31:33 2022     
      +-----------------------------------------------------------------------------+
      | NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
      +-------------------------------+-----------------------+---------------------+
      | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
      | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
      |                               |                      |               MIG M. |
      |===============================+======================+======================|
      |   0  Tesla T4            Off  | 00000000:00:08.0 Off |                    0 |
      | N/A   55C    P0    28W /  70W |      2MiB / 15360MiB |      5%      Default |
      |                               |                      |                  N/A |
      +-------------------------------+-----------------------+---------------------+
      
      +-----------------------------------------------------------------------------+
      | Processes:                                                                  |
      |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
      |        ID   ID                                                   Usage      |
      |=============================================================================|
      |  No running processes found                                                 |
      +-----------------------------------------------------------------------------+

    安装 NVIDIA 容器运行时

    1. GPU 节点上,添加 NVIDIA yum 源。

      distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
      yum makecache -y

      提示 Metadata cache created. 时,表示添加成功。

    2. 安装 NVIDIA 容器运行时。

      yum install nvidia-container-toolkit -y

      提示 Complete! 时,表示安装成功。

    物理 GPU 配置

    在 GPU 业务集群上部署物理 GPU 插件

    GPU 集群的管理界面 上,执行以下操作:

    1. 在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “物理GPU” 选项;

    2. 在 “节点” Tab 页, 勾选需要部署物理 GPU 的节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “pGPU”,点击确定;

    3. 在 “容器组” Tab 页,查看 nvidia-device-plugin-ds 对应容器组的运行状态是否有异常以及是否在指定节点上运行。

    NVIDIA MPS 配置

    在 GPU 业务集群上部署 NVIDIA MPS 插件

    GPU 集群的管理界面 上,执行以下操作:

    1. 在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “MPS” 选项;

    2. 在 “节点” Tab 页, 勾选需要部署 NVIDIA MPS 的 GPU 节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “MPS”,点击确定;

    3. 在 “容器组” Tab 页,查看 nvidia-mps-device-plugin-daemonset 对应容器组的运行状态是否有异常以及是否在指定节点上运行。

    GPU-Manager 配置

    配置 kube-scheduler (kubernetes >= 1.23)

    1. 业务集群控制节点 上,检查调度器(Scheduler)中是否正确引用调度策略。

      cat /etc/kubernetes/manifests/kube-scheduler.yaml
      检查项 期望结果
      参数 –config
      /etc/kubernetes/scheduler-config.yaml (即调度策略文件)

      说明:上述参数和值为平台默认配置,如果您已自行修改,请将其改回默认值。原自定义配置可复制到调度策略文件中。

    2. 检查调度策略文件配置。

      1. 执行命令:kubectl describe service kubernetes -n default |grep Endpoints

        期望效果Endpoints:         192.168.130.240:6443
      2. 将所有 Master 节点的 /etc/kubernetes/scheduler-config.yaml 这个文件内容替换成如下内容,其中 ${kube-apiserver} 改为第一步的输出结果。

        apiVersion: kubescheduler.config.k8s.io/v1beta2
        kind: KubeSchedulerConfiguration
        clientConnection:
          kubeconfig: /etc/kubernetes/scheduler.conf
        extenders:
        - enableHTTPS: true
          filterVerb: predicates
          managedResources:
          - ignoredByScheduler: false
            name: tencent.com/vcuda-core
          nodeCacheCapable: false
          urlPrefix: https://${kube-apiserver}/api/v1/namespaces/kube-system/services/gpu-quota-admission/proxy/scheduler
          tlsConfig:
            insecure: false
            certFile: /etc/kubernetes/pki/apiserver-kubelet-client.crt
            keyFile: /etc/kubernetes/pki/apiserver-kubelet-client.key
            caFile: /etc/kubernetes/pki/ca.crt
    3. 执行以下命令获取容器 ID:

      • Containerd:执行 crictl ps |grep kube-scheduler,输出结果如下,第一列为容器 ID。

        1d113ccf1c1a9       03c72176d0f15       2 seconds ago       Running             kube-scheduler              3                   ecd054bbdd465       kube-scheduler-192.168.176.47
      • Docker:执行 docker ps |grep kube-scheduler,输出结果如下,第一列为容器 ID。

        30528a45a118   d8a9fef7349c    "kube-scheduler --au…"   37 minutes ago   Up 37 minutes     k8s_kube-scheduler_kube-scheduler-192.168.130.240_kube-system_3e9f7007b38f4deb6ffd1c7587621009_28
    4. 使用上一步获取到的容器 ID 重启 Containerd 容器。

      • Containerd

        crictl stop <容器 ID>
    5. 重启 Kubelet。

      systemctl restart kubelet

    在 GPU 业务集群上部署 GPU-Manager 插件

    GPU 集群的管理界面 上,执行以下操作:

    1. 在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “GPU-Manager” 选项;

    2. 在 “节点” Tab 页, 勾选需要部署 GPU-Manager 的节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “vGPU”,点击确定;

    3. 在 “容器组” Tab 页,查看 gpu-manager-daemonset 对应容器组的运行状态是否有异常以及是否在指定节点上运行。

    结果验证

    方式一:在业务集群的控制节点检查 GPU 节点上是否有可分配的 GPU 资源,执行以下命令:

    kubectl get node  ${nodeName} -o=jsonpath='{.status.allocatable}' 

    方式二:在平台上部署一个 GPU 应用,填写对应 GPU 的资源类型申请量,进行部署,然后进入对应容器中执行命令:

    # nvidia-smi
    Tue Sep 13 01:31:33 2022     
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 515.65.01    Driver Version: 515.65.01    CUDA Version: 11.7     |
    +-------------------------------+-----------------------+---------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla T4            Off  | 00000000:00:08.0 Off |                    0 |
    | N/A   55C    P0    28W /  70W |      2MiB / 15360MiB |      5%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+-----------------------+---------------------+
                                                                                    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

    检查是否可以获取正确的 GPU 信息。