Kubernetes使用GPU

半兽人 发表于: 2019-07-23   最后更新时间: 2019-08-07  

Kubernetes提供对分布式节点上的AMD GPUNVIDIA GPU管理的实验性的支持。 在v1.6中已经添加了对NVIDIA GPU的支持,并且经历了多次向后不兼容的迭代。 通过设备插件将在v1.9中添加了对AMD GPU的支持。

本文将介绍如何在不同的Kubernetes版本中使用GPU以及当前的限制。

  • v1.8开始
  • 包含不同类型GPU的群集

v1.8开始

从1.8开始,使用GPU的推荐方法是使用驱动插件

要在1.10之前通过设备插件启用GPU支持,必须在整个系统中将DevicePlugins功能设置为true:--feature-gates="DevicePlugins=true"。从1.10开始则不再需要这样做了。

然后,必须在节点上安装相应供应商GPU驱动程序,并从GPU供应商(AMD,NVIDIA)运行相应的设备插件。

如果满足上述条件,Kubernetes将暴露nvidia.com/gpuamd.com/gpu作为可调度资源。

您可以通过请求<vendor>.com/gpu来从容器中使用这些GPU,就像请求cpu或内存一样。 但是,在使用GPU时如何指定资源要求存在一些限制:

  • GPU只应在limits部分中指定,这意味着:

    • 您可以在不指定requests的情况下指定GPU limits,因为默认情况下Kubernetes将使用limit作为请求值。
    • 您可以在limitsrequest中指定GPU,但这两个值必须相等。
    • 如果不指定limits,则无法指定GPUrequests
  • 容器(和pod)不共享GPU。 GPU没有过度使用。

  • 每个容器可以请求一个或多个GPU。 无法请求一小部分GPU。

例如:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1 # requesting 1 GPU

部署 AMD GPU 驱动插件

官方AMD GPU驱动插件有以下的需求:

  • Kubernetes节点必须预先安装AMD GPU Linux驱动程序。

要在群集运行时部署AMD设备插件,并满足上述要求:

# For Kubernetes v1.9
kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/r1.9/k8s-ds-amdgpu-dp.yaml

# For Kubernetes v1.10
kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/r1.10/k8s-ds-amdgpu-dp.yaml

如果使用有问题,可将问题报告给RadeonOpenCompute/k8s-device-plugin

部署NVIDIA GPU驱动插件

NVIDIA GPU目前有两种设备插件实现:

官方 NVIDIA GPU驱动插件设备插件具有以下要求:

  • Kubernetes节点必须预先安装NVIDIA驱动程序。

  • 必须预先安装Kubernetes节点nvidia-docker 2.0

  • 必须将nvidia-container-runtime配置为默认运行时而不是runc。

  • NVIDIA drivers ~= 361.93

要在群集运行并且满足上述要求后部署NVIDIA设备插件:

# For Kubernetes v1.8
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.8/nvidia-device-plugin.yml

# For Kubernetes v1.9
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.9/nvidia-device-plugin.yml

如果使用有问题,可将问题报告给NVIDIA/k8s-device-plugin

通过GCE的 NVIDIA GPU 驱动插件

GCE使用的NVIDIA GPU设备插件不需要使用nvidia-docker,并且可以使用任何容器运行时与Kubernetes容器运行时接口(CRI)兼容。 它在容器优化操作系统上进行了测试,并从1.9开始为Ubuntu提供实验代码。

在1.12群集上,您可以使用以下命令安装NVIDIA驱动程序和设备插件:

# Install NVIDIA drivers on Container-Optimized OS:
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml

# Install NVIDIA drivers on Ubuntu (experimental):
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml

# Install the device plugin:
kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.12/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml

如果在使用中遇到错误,可以提交到GoogleCloudPlatform/container-engine-accelerators.

在GKE上使用NVIDIA GPU的说明在这里

包含不同类型GPU的集群

如果集群中的不同节点具有不同类型的GPU,则可以使用节点标签和节点选择器将pod调度到适当的节点。

例如:

# Label your nodes with the accelerator type they have.
kubectl label nodes <node-with-k80> accelerator=nvidia-tesla-k80
kubectl label nodes <node-with-p100> accelerator=nvidia-tesla-p100

对于AMD GPU,您可以部署Node Labeller,它会自动使用GPU属性标记您的节点。 目前支持的属性:

  • Device ID (-device-id)
  • VRAM Size (-vram)
  • Number of SIMD (-simd-count)
  • Number of Compute Unit (-cu-count)
  • Firmware and Feature Versions (-firmware)
  • GPU Family, in two letters acronym (-family)
    • SI - Southern Islands
    • CI - Sea Islands
    • KV - Kaveri
    • VI - Volcanic Islands
    • CZ - Carrizo
    • AI - Arctic Islands
    • RV - Raven

示例结果:

kubectl describe node cluster-node-23

输出类似于:

    Name:               cluster-node-23
    Roles:              <none>
    Labels:             beta.amd.com/gpu.cu-count.64=1
                        beta.amd.com/gpu.device-id.6860=1
                        beta.amd.com/gpu.family.AI=1
                        beta.amd.com/gpu.simd-count.256=1
                        beta.amd.com/gpu.vram.16G=1
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/os=linux
                        kubernetes.io/hostname=cluster-node-23
    Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                        node.alpha.kubernetes.io/ttl: 0
    ......

在pod规范中指定GPU类型:

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "k8s.gcr.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    accelerator: nvidia-tesla-p100 # or nvidia-tesla-k80 etc.

这将保障将pod调度到指定的GPU类型的节点。



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: Taint和Toleration(污点和容忍)- Kubernetes
下一条: Kubernetes权限管理之RBAC