为自建的业务集群配置 GPU 节点
随着业务数据量的增加,尤其对于人工智能、数据分析等场景,您可能希望在自建的业务集中使用 GPU 功能以加速数据处理。对此,除了为集群节点准备 GPU 资源外,还应对其进行 GPU 配置。
本方案将集群中具备 GPU 计算能力的节点称为 GPU 节点。
说明:若无特指,操作步骤将同时适用于两类节点。驱动安装相关问题可参考 NVIDIA 官网安装文档 。
适用场景
-
如果您正准备创建集群,且已备有 GPU 节点,仅需分别为 GPU 节点 安装 GPU 驱动 ,然后可完成集群创建。集群创建过程中,平台将自动完成后续配置。
-
如果是已有集群,且创建集群时未准备 GPU 资源,集群创建完毕后希望在已有节点或新加入的节点上使用 GPU 能力,请完整执行本节所有操作。
前提条件
操作节点上已准备好 GPU 资源,即属于本节所说的 GPU 节点。
操作系统支持情况
| 操作系统 | 运行时组件 | 创建集群 | 已有非 GPU 集群 |
| CentOS 7.9 | Containerd |
安装 GPU 驱动
注意:如果 GPU 节点使用 NVIDIA MPS 插件则需确保该节点 GPU 架构为 Volta 及以上(Volta/Turing/Ampere/Hopper等)且驱动支持的 CUDA 版本大于等于 11.5 。
获取驱动下载地址
-
登录 GPU 节点,执行命令
lspci |grep -i NVIDIA查看节点的 GPU 型号。以下示例中 GPU 型号为:Tesla T4。
lspci | grep NVIDIA 00:08.0 3D controller: NVIDIA Corporation TU104GL [Tesla T4] (rev a1) -
前往 NVIDIA 官网 ,获取驱动下载地址。
-
在官网首页的顶部导航栏中,单击 驱动程序。
-
根据 GPU 节点的型号,填写驱动下载所需信息,如下图所示。
-
单击 搜索。
-
单击 下载。
-
右键单击 下载 > 复制链接地址,即可复制驱动的下载地址。
-
-
在 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 <驱动文件名称>
安装驱动
-
在 GPU 节点上执行以下命令行,安装当前操作系统对应的 gcc 和 kernel-devel 包。
sudo yum install dkms gcc kernel-devel-$(uname -r) -y -
依次执行以下命令,安装 GPU 驱动。
chmod a+x /home/gpu/<驱动文件名称> /home/gpu/<驱动文件名称> --dkms -
安装完成后,执行
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 容器运行时
-
在 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.时,表示添加成功。 -
安装 NVIDIA 容器运行时。
yum install nvidia-container-toolkit -y提示
Complete!时,表示安装成功。
物理 GPU 配置
在 GPU 业务集群上部署物理 GPU 插件
在 GPU 集群的管理界面 上,执行以下操作:
-
在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “物理GPU” 选项;
-
在 “节点” Tab 页, 勾选需要部署物理 GPU 的节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “pGPU”,点击确定;
-
在 “容器组” Tab 页,查看 nvidia-device-plugin-ds 对应容器组的运行状态是否有异常以及是否在指定节点上运行。
NVIDIA MPS 配置
在 GPU 业务集群上部署 NVIDIA MPS 插件
在 GPU 集群的管理界面 上,执行以下操作:
-
在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “MPS” 选项;
-
在 “节点” Tab 页, 勾选需要部署 NVIDIA MPS 的 GPU 节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “MPS”,点击确定;
-
在 “容器组” Tab 页,查看 nvidia-mps-device-plugin-daemonset 对应容器组的运行状态是否有异常以及是否在指定节点上运行。
GPU-Manager 配置
配置 kube-scheduler (kubernetes >= 1.23)
-
在 业务集群控制节点 上,检查调度器(Scheduler)中是否正确引用调度策略。
cat /etc/kubernetes/manifests/kube-scheduler.yaml检查项 期望结果 参数 –config 值 /etc/kubernetes/scheduler-config.yaml (即调度策略文件) 说明:上述参数和值为平台默认配置,如果您已自行修改,请将其改回默认值。原自定义配置可复制到调度策略文件中。
-
检查调度策略文件配置。
-
执行命令:
kubectl describe service kubernetes -n default |grep Endpoints。期望效果Endpoints: 192.168.130.240:6443 -
将所有 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
-
-
执行以下命令获取容器 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
-
-
使用上一步获取到的容器 ID 重启 Containerd 容器。
-
Containerd
crictl stop <容器 ID>
-
-
重启 Kubelet。
systemctl restart kubelet
在 GPU 业务集群上部署 GPU-Manager 插件
在 GPU 集群的管理界面 上,执行以下操作:
-
在 ”插件” Tab 页,点击部署 “GPU设备插件” 并打开 “GPU-Manager” 选项;
-
在 “节点” Tab 页, 勾选需要部署 GPU-Manager 的节点,然后点击 “标签和污点管理器”,为节点添加 “设备标签” 选择 “vGPU”,点击确定;
-
在 “容器组” 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 信息。