k8s调度GPU

环境说明

工具版本备注
kubesphereV4.1k8s管理平台
kubernetesv1.23.7k8s
helm包管理
harbor镜像管理
docker镜像
nvidia显卡
CUDANVIDIA 推出的一种通用并行计算平台和编程模

显卡

安装

NVIDIA

查看显卡

1
lspci | grep NVIDIA

官网搜索对应的显卡下载

1.png 2.png 安装成功后,执行命令 nvidia-smi

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.127.05             Driver Version: 550.127.05     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| 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  NVIDIA GeForce RTX 3060        Off |   00000000:01:00.0 Off |                  N/A |
|  0%   24C    P8             10W /  170W |     223MiB /  12288MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      1039      G   /usr/lib/xorg/Xorg                             35MiB |
|    0   N/A  N/A     36553      G   /usr/lib/xorg/Xorg                             67MiB |
|    0   N/A  N/A     36731      G   /usr/bin/gnome-shell                          104MiB |
+-----------------------------------------------------------------------------------------+

CUDA

CUDA(Compute Unified Device Architecture) 是 NVIDIA 推出的一种通用并行计算平台和编程模型,允许开发人员使用 C、C++ 等编程语言编写高性能计算应用程序,它利用 GPU 的并行计算能力解决复杂的计算问题,特别是在深度学习、科学计算、图形处理等领域。所以一般情况下,安装完 NVIDIA 驱动后,CUDA 也可以一并安装上。 在下载 NVIDIA 驱动时,每个驱动版本都对应了一个 CUDA 版本,比如上面我们在下载驱动版本,它对应的 CUDA 版本为 12.4,所以我们就按照这个版本号来安装。首先进入 CUDA Toolkit Archive 页面,这里列出了所有的 CUDA 版本: 3.png

在 Docker 容器中使用 GPU 资源

测试下 GPU 是否可以在容器中使用:

1
2
# docker run --gpus all --rm centos:latest nvidia-smi
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

可以看到命令执行报错了,想在 Docker 中使用 NVIDIA GPU 还必须安装 nvidia-container-runtime 运行时。

使用 NVIDIA Container Toolkit 来安装 nvidia-container-runtime,下面以ubuntu为例(其他参考官网Installation)

1、Configure the production repository

1
2
3
4
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

2、Update the packages list from the repository

1
sudo apt-get update

3、Install the NVIDIA Container Toolkit packages

1
sudo apt-get install -y nvidia-container-toolkit

4、安装 NVIDIA Container Toolkit 之后,再使用下面的命令将 Docker 的运行时配置成 nvidia-container-runtime

1
nvidia-ctk runtime configure --runtime=docker

这个命令的作用是修改 /etc/docker/daemon.json 配置文件

1
2
3
4
5
6
7
8
9
# cat /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

5、重启docker

1
systemctl restart docker

6、查看docker内是否可以使用gpu

1
docker run --gpus all --rm centos:latest nvidia-smi

k8s调用GPU

gpu-operator

GPU Operator 是 NVIDIA 提供的一个 Kubernetes 操作器,旨在简化在 Kubernetes 集群中安装和管理 NVIDIA GPU 驱动程序、CUDA 和其他与 GPU 相关的软件组件。它自动化了许多与 GPU 管理相关的任务,例如:

  • 安装和管理 GPU 驱动:GPU Operator 能够自动在节点上安装和升级 NVIDIA GPU 驱动,并确保它们与集群中的其他组件兼容。

  • 设备插件:GPU Operator 包括 NVIDIA Device Plugin,它使得 Kubernetes 集群能够识别和调度 GPU 资源,以便容器能够访问 GPU 加速。

  • NVIDIA Toolkit:它包括了必要的工具(如 CUDA 和 NVIDIA Deep Learning SDK)来为运行 GPU 加速的容器提供支持。

  • GPU Operator 的自动化:包括 GPU 驱动、工具和设备插件的自动安装和配置,简化了管理过程。

1、安装

1
2
3
4
5
helm repo list

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update

helm install -n gpu-operator --create-namespace gpu-operator nvidia/gpu-operator --set driver.enabled=false

安装成功后,输出

1
2
3
4
5
6
NAME: gpu-operator
LAST DEPLOYED: Thu Dec 12 12:04:40 2024
NAMESPACE: gpu-operator
STATUS: deployed
REVISION: 1
TEST SUITE: None

查看deployment是否正常

1
k get deployment -n gpu-operator
1
2
3
4
NAME                                         READY   UP-TO-DATE   AVAILABLE   AGE
gpu-operator                                 1/1     1            1           3h45m
gpu-operator-node-feature-discovery-gc       1/1     1            1           3h45m
gpu-operator-node-feature-discovery-master   1/1     1            1           3h45m

2、测试GPU容器

GPU Operator 正确安装完成后,使用 CUDA 基础镜像,测试 K8s 是否能正确创建使用 GPU 资源的 Pod。

  • 创建资源清单文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Pod
metadata:
  name: cuda-ubuntu2204
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-ubuntu2204
    image: "nvcr.io/nvidia/cuda:12.4.0-base-ubuntu22.04"
    resources:
      limits:
        nvidia.com/gpu: 1
    command: ["nvidia-smi"]
  • 创建资源
1
kubectl apply -f cuda-ubuntu.yaml
  • 查看日志
1
kubectl logs pod/cuda-ubuntu2204
  • 清理测试资源
1
kubectl apply -f cuda-ubuntu.yaml

问题

1、 registry.k8s.io/nfd/node-feature-discovery:v0.16.6 镜像拉取不下来

找一个可以访问外网的机器,重现打tag,推送到harbor上,替换gpu-operator里面的镜像源为harbor地址

1
docker tag registry.k8s.io/nfd/node-feature-discovery:v0.16.6 192.168.50.7/library/node-feature-discovery:v0.16.6

2、 gpu-operator-node-feature-discovery-master无法启动

问题原因 如果k8s版本低于1.24,需要关闭健康检测

1
k edit deployment gpu-operator-node-feature-discovery-master -n gpu-operator

删除如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  livenessProbe:
    grpc:
      port: 8082
      service: ''
    initialDelaySeconds: 10
    timeoutSeconds: 1
    periodSeconds: 10
    successThreshold: 1
    failureThreshold: 3
  readinessProbe:
    grpc:
      port: 8082
      service: ''
    initialDelaySeconds: 5
    timeoutSeconds: 1
    periodSeconds: 10
    successThreshold: 1
    failureThreshold: 10
0%