不知道你是否好奇GPU到底是个啥?

如果你好奇的话,可以看一下这个链接。有个小姐姐的文章说的比较好,简单的理解就是GPU是显卡的一部分

https://www.zhihu.com/question/28422454k8s gpu 插件对比 k8s显卡_ci

怎么查看我的机器上有没有GPU

这里我理解不太透彻,只能表示一下自己的理解:按理说只要有显卡就有GPU,但是不是所有的GPU都能拿来供我们的程序使用,应该也受计算框架的影响吧。

对于K8S来说,目前支持的GPU,是AMD和NVIDIA。

k8s gpu 插件对比 k8s显卡_GPU_02

k8s gpu 插件对比 k8s显卡_GPU_03


我的环境用的英伟达的,机器是阿里云的ECS,下面是在ECS的控制台上看到的

k8s gpu 插件对比 k8s显卡_ci_04


我们登录机器执行

# 
lspci

k8s gpu 插件对比 k8s显卡_kubernetes_05

# 查看使用情况
nvidia-smi

k8s gpu 插件对比 k8s显卡_docker_06

Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A; 
Temp:显卡内部的温度,单位是摄氏度;
Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能;
Pwr:能耗表示; 
Bus-Id:涉及GPU总线的相关信息; 
Disp.A:是Display Active的意思,表示GPU的显示是否初始化; 
Memory Usage:显存的使用率; 
Volatile GPU-Util:浮动的GPU利用率;
Compute M:计算模式; 
下边的Processes显示每块GPU上每个进程所使用的显存情况。
安装GPU驱动

对于ECS有的型号,第一次登录时可以自动安装驱动的,我的就是

k8s gpu 插件对比 k8s显卡_kubernetes_07


如果你的是物理机或者是不能自动安装,就需要去官网下载驱动,自行安装了,可以参考下面步骤

  • lspci 查看显卡的信息, 如果你看到是一些莫名其妙的东西,因为根据图中的信息,你根本不知道怎么下载
  • 进去http://pci-ids.ucw.cz/read/PC/10de/1eb8 这个网站, 把你上面的信息粘贴过来,进行翻译
  • 去NVIDIA的官网上进行下载 https://www.nvidia.com/download/index.aspx?lang=en-us#
  • 下载下来以后应该是一个执行文件
#上传到服务器
# chmod 755 <你的文件>
# ./NVIDIA-Linux-x86_64-440.64.00.run -no-x-check -no-nouveau-check -no-opengl-files
#一路ok就行了
安装nvidia-docker

如果是公网的话比较容易,直接按照官网的步骤执行就行了,注意docker的版本呀,一定要是19.03+,否则在更改daemon是会报错

https://github.com/NVIDIA/nvidia-docker

k8s gpu 插件对比 k8s显卡_docker_08

centos的话执行下面的命令

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
sudo yum install -y nvidia-container-toolkit
安装nvidia-container-runtime
  • 这个也直接yum就可以了
yum install -y nvidia-container-runtime
  • 修改docker的配置文件, /etc/docker/daemon.json ,如果这个文件没有的话自己创建
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}
  • 检查一下你的机器上是否有/usr/bin/nvidia-container-runtime这个文件

如果单独用docker启动容器的话,可以使用docker run --gpus all --rm nvidia/cuda:11.0-base nvidia-smi这种方式

支持GPU的 - 基础操作
  • 如果环境中只有部分机器是有GPU的,所以我们的省着用了,只能让特殊的应用(pod)才能跑到有GPU的节点上。 需要通过taint和label来完成
#  gpu-dev 是我环境中带有GPU节点名字
# taint 调度时用
kubectl taint nodes gpu-dev gpu=1:NoSchedule
kubectl taint nodes gpu-dev gpu=1:NoExecute
# 
kubectl label nodes gpu-dev accelerator=nvidia-1eb8
  • 如果所有的机器都有GPU,就可以忽略这一步了
支持GPU的 - k8s操作
  • 下载daemonset的文件
# 连接的地址最好获取最新的,这个连接的地址是在https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/#deploying-nvidia-gpu-device-plugin 中获取的
curl -O  https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
  • 修改nvidia-device-plugin.yml
tolerations:
# This toleration is deprecated. Kept here for backward compatibility
# See https://kubernetes.io/docs/tasks/administer-cluster/guaranteed-scheduling-critical-addon-pods/
- key: CriticalAddonsOnly
  operator: Exists
- key: nvidia.com/gpu
  operator: Exists
  effect: NoSchedule
- key: "gpu"
  operator: "Equal"
  value: "1"
  effect: "NoSchedule"
- key: "gpu"
  operator: "Equal"
  value: "1"
  effect: "NoExecute"
nodeSelector:
  accelerator: "nvidia-1eb8"
  • 修改网络插件的daemonset, 我的是flannel
#  kubectl edit ds kube-flannel-ds-amd64 -n kube-system
tolerations:
 - effect: NoSchedule
   operator: Exists
 - effect: NoSchedule
   key: gpu
   operator: Equal
   value: "1"
 - effect: NoExecute
   key: gpu
   operator: Equal
   value: "1"

wait a moment,see blow!!! 等待所有的flannel pod都启动起来

k8s gpu 插件对比 k8s显卡_docker_09

  • 启动NVIDIA的daemonset
kubectl create -f nvidia-device-plugin.yml

wait a moment ~~~~ 等待所有的pod启动起来

k8s gpu 插件对比 k8s显卡_docker_10

查看k8s的GPU资源
kubectl describe node gpu-dev

k8s gpu 插件对比 k8s显卡_GPU_11


如果不放心的话,启动一下下面这个POD,如果能启动起来,说明k8s能使用GPU资源,如果集群没有GPU资源的话,会一直pending

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-nginx
      image: "nginx"
      resources:
        limits:
          nvidia.com/gpu: 1
  tolerations:
    - key: "gpu"
      operator: "Equal"
      value: "1"
      effect: "NoSchedule"
    - key: "gpu"
      operator: "Equal"
      value: "1"
      effect: "NoExecute"
问题记录
  • 当你发现node上识别不到GPU时,并且通过 kubectl logs nvidia-device-plugin-daemonset-xxxx -n kube-system 时发现,could not load NVML library时, 请检查一下docker的demon.json 是否正确,可以和上文进行对比。

先写到这里了,有问题请留言,三克油