kubernetes 1.15平台配置nvidia显卡集成GPU调度机制

自从1.10版本开始,Kubernetes只需通过统一的设备插件方式支持像Nvidia GPU,InfiniBand,FPGA等硬件加速设备,而社区的GPU方案将在1.10全面弃用,并在1.11版本彻底从主干代码移除。若您需要通过阿里云Kubernetes集群+GPU运行机器学习,图像处理等高运算密度等任务,无需安装nvidia driver和CUDA,就能实现一键部署和弹性扩缩容等功能。

前提条件

你需要一个k8s集群,单节点和多节点集群都可以,其中单节点要保证状态机器已安装了nvidia显卡,多节点只需要node节点装有nvidia显卡既可以参与本次的测试,本次我们使用kubernetes v1.15.2的版本进行 nvidia-plugin版本为1.0.0-beta。 注意: 只需在可调度的k8s节点的gpu机器安装nvidia-docker和相应的型号的gpu显卡驱动,安装完成后需切换下docker默认的运行时为“nvidia”即可;以下是具体的安装调试步骤:

背景信息

因公司业务需求,对于ai这块的业务组件需容器化后跑到kubernetes平台之上,并且可以满足容器可以调用宿主机的gpu设备,本次是生产级别的配置,可以放心部署至稳定的k8s集群之上即可。

1. 安装nvidia显卡驱动,

本次采用的是gtx1080ti的显卡,显卡驱动去官网下载最新版本即可,安装完成后通过nvidia-smi指令回显信息可判断显卡是否可以正常的驱动。

   [root@SH-IDC-PRD-AI-K8SN0001 OVPS]# nvidia-smi 
    Sat Sep 28 03:48:41 2019       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 430.50       Driver Version: 430.50       CUDA Version: 10.1     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce GTX 108...  Off  | 00000000:04:00.0 Off |                  N/A |
    | 23%   20C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   1  GeForce GTX 108...  Off  | 00000000:05:00.0 Off |                  N/A |
    | 23%   23C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   2  GeForce GTX 108...  Off  | 00000000:08:00.0 Off |                  N/A |
    | 23%   25C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   3  GeForce GTX 108...  Off  | 00000000:09:00.0 Off |                  N/A |
    | 23%   21C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   4  GeForce GTX 108...  Off  | 00000000:85:00.0 Off |                  N/A |
    | 23%   21C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   5  GeForce GTX 108...  Off  | 00000000:86:00.0 Off |                  N/A |
    | 23%   20C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   6  GeForce GTX 108...  Off  | 00000000:89:00.0 Off |                  N/A |
    | 24%   19C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
    |   7  GeForce GTX 108...  Off  | 00000000:8A:00.0 Off |                  N/A |
    | 23%   20C    P8     8W / 250W |      0MiB / 11178MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+

   ###以上信息显示的gpu显卡数量即表示显卡驱动安装完成。

2. 预先安装必备的repo仓库

· docker-ce: 阿里云镜像站下载对应操作系统平台的docker-ce.repo ,本次使用系统为:CENTOS7.7

· nvidia-docker:官方下载nvidia-docker2.repo仓库

3. 安装docker-ce ,docker-ce-cli核心软件

yum install docker-ce docker-cli

4. 安装 docker-nvidia2 插件

PS: 仓库地址 github nvidia找

yum install docker-nvidia2

5. 安装nvidia plugin 至k8s平台

kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta/nvidia-device-plugin.yml

6. 修改docker的运行时配置为”nvidia”

docker运行时的位置:/etc/docker/daemon.json

[root]#/etc/docker/daemon.json
  {
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

7. 检查显卡是否被暴露给k8s平台

可以是使用kubectl命令执行参数查看到您的显卡驱动是否已经被k8s平台识别了,其数字8是您显卡总的核心数。

[root@SH-IDC-PRD-K8S-ANSIBLE0001]kubectl describe node |grep nvidia.com/gpu
   nvidia.com/gpu:     8
   nvidia.com/gpu:     8
   nvidia.com/gpu      2          2
   nvidia.com/gpu:     8
   nvidia.com/gpu:     8
   nvidia.com/gpu      0          0
   nvidia.com/gpu:     8
   nvidia.com/gpu:     8
   nvidia.com/gpu      0          0

8.编写pod下gpu调度实例

以下例子是官方提供的,其中在测试的时候镜像:nvidia/cuda:9.0-devel 可能有点问题 ,你们可以测试的时候将容器cuda-container 用#注释掉即可。

[root@SH-IDC-PRD-K8S-ANSIBLE0001]cat nvidia-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: gpu-pod
spec:
  containers:
    - name: cuda-container
      image: nvidia/cuda:9.0-devel
      resources:
        limits:
          nvidia.com/gpu: 2 # requesting 2 GPUs
    - name: digits-container
      image: nvidia/digits:6.0
      resources:
        limits:
          nvidia.com/gpu: 2 # requesting 2 GPUs

9.应用测试pod yml并测试结果

### 应用测试nvidia-testyml文件
kubeclt apply -f nvidia-test.yaml
### 进入pod容器中
[root@SH-IDC-PRD-K8S-ANSIBLE0001]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
gpu-pod   1/1     Running   0          24h
[root@SH-IDC-PRD-K8S-ANSIBLE0001]kubectl exec -it gpu-pod /bin/bash
root@gpu-pod:/# cd
root@gpu-pod:~# ls
root@gpu-pod:~# nvidia-smi  #进入容器查看是否识别到宿主机的显卡gpu。
Sun Sep 29 02:16:49 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.50       Driver Version: 430.50       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:09:00.0 Off |                  N/A |
| 20%   22C    P8     8W / 250W |    151MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 108...  Off  | 00000000:85:00.0 Off |                  N/A |
| 26%   23C    P8     7W / 250W |     10MiB / 11178MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+
### 由此可以看到我们pod配置文件中限定的显卡数量是实现的。此容器只允许使用宿主机的任意2个显卡工作。

10.至此完成安装和调试

以上个人再生产的测试数据,仅供参考,生产中要多调研需求多测试,若觉得有问题的话,请欢迎多交流,联系我们。

分享 提问
comments powered by Disqus