Kubernetes 調(diào)度GPUs

2022-06-20 10:17 更新

調(diào)度 GPUs

特性狀態(tài): Kubernetes v1.10 [beta]

Kubernetes 支持對(duì)節(jié)點(diǎn)上的 AMD 和 NVIDIA GPU (圖形處理單元)進(jìn)行管理,目前處于實(shí)驗(yàn)狀態(tài)。

本頁(yè)介紹用戶如何在不同的 Kubernetes 版本中使用 GPU,以及當(dāng)前存在的一些限制。

使用設(shè)備插件

Kubernetes 實(shí)現(xiàn)了設(shè)備插件(Device Plugins) 以允許 Pod 訪問(wèn)類似 GPU 這類特殊的硬件功能特性。

作為集群管理員,你要在節(jié)點(diǎn)上安裝來(lái)自對(duì)應(yīng)硬件廠商的 GPU 驅(qū)動(dòng)程序,并運(yùn)行 來(lái)自 GPU 廠商的對(duì)應(yīng)的設(shè)備插件。

  • AMD
  • NVIDIA

當(dāng)以上條件滿足時(shí),Kubernetes 將暴露 ?amd.com/gpu? 或 ?nvidia.com/gpu? 為 可調(diào)度的資源。

你可以通過(guò)請(qǐng)求 ?<vendor>.com/gpu? 資源來(lái)使用 GPU 設(shè)備,就像你為 CPU 和內(nèi)存所做的那樣。 不過(guò),使用 GPU 時(shí),在如何指定資源需求這個(gè)方面還是有一些限制的:

  • GPUs 只能設(shè)置在 ?limits ?部分,這意味著:
    • 你可以指定 GPU 的 ?limits ?而不指定其 ?requests?,Kubernetes 將使用限制 值作為默認(rèn)的請(qǐng)求值;
    • 你可以同時(shí)指定 ?limits ?和 ?requests?,不過(guò)這兩個(gè)值必須相等。
    • 你不可以僅指定 ?requests ?而不指定 ?limits?。
  • 容器(以及 Pod)之間是不共享 GPU 的。GPU 也不可以過(guò)量分配(Overcommitting)。
  • 每個(gè)容器可以請(qǐng)求一個(gè)或者多個(gè) GPU,但是用小數(shù)值來(lái)請(qǐng)求部分 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 設(shè)備插件

官方的 AMD GPU 設(shè)備插件 有以下要求:

  • Kubernetes 節(jié)點(diǎn)必須預(yù)先安裝 AMD GPU 的 Linux 驅(qū)動(dòng)。

如果你的集群已經(jīng)啟動(dòng)并且滿足上述要求的話,可以這樣部署 AMD 設(shè)備插件:

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

你可以到 RadeonOpenCompute/k8s-device-plugin 項(xiàng)目報(bào)告有關(guān)此設(shè)備插件的問(wèn)題。

部署 NVIDIA GPU 設(shè)備插件 

對(duì)于 NVIDIA GPUs,目前存在兩種設(shè)備插件的實(shí)現(xiàn):

官方的 NVIDIA GPU 設(shè)備插件 

官方的 NVIDIA GPU 設(shè)備插件 有以下要求:

  • Kubernetes 的節(jié)點(diǎn)必須預(yù)先安裝了 NVIDIA 驅(qū)動(dòng)
  • Kubernetes 的節(jié)點(diǎn)必須預(yù)先安裝 nvidia-docker 2.0
  • Docker 的默認(rèn)運(yùn)行時(shí)必須設(shè)置為 nvidia-container-runtime,而不是 runc
  • NVIDIA 驅(qū)動(dòng)版本 ~= 384.81

如果你的集群已經(jīng)啟動(dòng)并且滿足上述要求的話,可以這樣部署 NVIDIA 設(shè)備插件:

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

請(qǐng)到 NVIDIA/k8s-device-plugin項(xiàng)目報(bào)告有關(guān)此設(shè)備插件的問(wèn)題。

GCE 中使用的 NVIDIA GPU 設(shè)備插件

GCE 使用的 NVIDIA GPU 設(shè)備插件 并不要求使用 nvidia-docker,并且對(duì)于任何實(shí)現(xiàn)了 Kubernetes CRI 的容器運(yùn)行時(shí),都應(yīng)該能夠使用。這一實(shí)現(xiàn)已經(jīng)在  Container-Optimized OS 上進(jìn)行了測(cè)試,并且在 1.9 版本之后會(huì)有對(duì)于 Ubuntu 的實(shí)驗(yàn)性代碼。

你可以使用下面的命令來(lái)安裝 NVIDIA 驅(qū)動(dòng)以及設(shè)備插件:

# 在 COntainer-Optimized OS 上安裝 NVIDIA 驅(qū)動(dòng):
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml

# 在 Ubuntu 上安裝 NVIDIA 驅(qū)動(dòng) (實(shí)驗(yàn)性質(zhì)):
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml

# 安裝設(shè)備插件:
kubectl create -f https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.12/cluster/addons/device-plugins/nvidia-gpu/daemonset.yaml

請(qǐng)到 GoogleCloudPlatform/container-engine-accelerators 報(bào)告有關(guān)此設(shè)備插件以及安裝方法的問(wèn)題。

關(guān)于如何在 GKE 上使用 NVIDIA GPUs,Google 也提供自己的指令。

集群內(nèi)存在不同類型的 GPU 

如果集群內(nèi)部的不同節(jié)點(diǎn)上有不同類型的 NVIDIA GPU,那么你可以使用 節(jié)點(diǎn)標(biāo)簽和節(jié)點(diǎn)選擇器 來(lái)將 pod 調(diào)度到合適的節(jié)點(diǎn)上。

例如:

# 為你的節(jié)點(diǎn)加上它們所擁有的加速器類型的標(biāo)簽
kubectl label nodes <node-with-k80> accelerator=nvidia-tesla-k80
kubectl label nodes <node-with-p100> accelerator=nvidia-tesla-p100

自動(dòng)節(jié)點(diǎn)標(biāo)簽

如果你在使用 AMD GPUs,你可以部署 Node Labeller, 它是一個(gè) 控制器, 會(huì)自動(dòng)給節(jié)點(diǎn)打上 GPU 屬性標(biāo)簽。目前支持的屬性:

  • 設(shè)備 ID (-device-id)
  • VRAM 大小 (-vram)
  • SIMD 數(shù)量(-simd-count)
  • 計(jì)算單位數(shù)量(-cu-count)
  • 固件和特性版本 (-firmware)
  • GPU 系列,兩個(gè)字母的首字母縮寫(xiě)(-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
    ......

使用了 Node Labeller 的時(shí)候,你可以在 Pod 的規(guī)約中指定 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 能夠被調(diào)度到你所指定類型的 GPU 的節(jié)點(diǎn)上去。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)