新聞中心
調(diào)度 GPUs
特性狀態(tài): Kubernetes v1.10 [beta]

Kubernetes 支持對節(jié)點(diǎn)上的 AMD 和 NVIDIA GPU (圖形處理單元)進(jìn)行管理,目前處于實(shí)驗狀態(tài)。
本頁介紹用戶如何在不同的 Kubernetes 版本中使用 GPU,以及當(dāng)前存在的一些限制。
使用設(shè)備插件
Kubernetes 實(shí)現(xiàn)了設(shè)備插件(Device Plugins) 以允許 Pod 訪問類似 GPU 這類特殊的硬件功能特性。
作為集群管理員,你要在節(jié)點(diǎn)上安裝來自對應(yīng)硬件廠商的 GPU 驅(qū)動程序,并運(yùn)行 來自 GPU 廠商的對應(yīng)的設(shè)備插件。
- AMD
- NVIDIA
當(dāng)以上條件滿足時,Kubernetes 將暴露 ?amd.com/gpu? 或 ?nvidia.com/gpu? 為 可調(diào)度的資源。
你可以通過請求 ?? 資源來使用 GPU 設(shè)備,就像你為 CPU 和內(nèi)存所做的那樣。 不過,使用 GPU 時,在如何指定資源需求這個方面還是有一些限制的:
- GPUs 只能設(shè)置在 ?
limits?部分,這意味著: - 你可以指定 GPU 的 ?
limits?而不指定其 ?requests?,Kubernetes 將使用限制 值作為默認(rèn)的請求值; - 你可以同時指定 ?
limits?和 ?requests?,不過這兩個值必須相等。 - 你不可以僅指定 ?
requests?而不指定 ?limits?。 - 容器(以及 Pod)之間是不共享 GPU 的。GPU 也不可以過量分配(Overcommitting)。
- 每個容器可以請求一個或者多個 GPU,但是用小數(shù)值來請求部分 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ū)動。
如果你的集群已經(jī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 項目報告有關(guān)此設(shè)備插件的問題。
部署 NVIDIA GPU 設(shè)備插件
對于 NVIDIA GPUs,目前存在兩種設(shè)備插件的實(shí)現(xiàn):
官方的 NVIDIA GPU 設(shè)備插件
官方的 NVIDIA GPU 設(shè)備插件 有以下要求:
- Kubernetes 的節(jié)點(diǎn)必須預(yù)先安裝了 NVIDIA 驅(qū)動
- Kubernetes 的節(jié)點(diǎn)必須預(yù)先安裝 nvidia-docker 2.0
- Docker 的默認(rèn)運(yùn)行時必須設(shè)置為 nvidia-container-runtime,而不是 runc
- NVIDIA 驅(qū)動版本 ~= 384.81
如果你的集群已經(jīng)啟動并且滿足上述要求的話,可以這樣部署 NVIDIA 設(shè)備插件:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
請到 NVIDIA/k8s-device-plugin項目報告有關(guān)此設(shè)備插件的問題。
GCE 中使用的 NVIDIA GPU 設(shè)備插件
GCE 使用的 NVIDIA GPU 設(shè)備插件 并不要求使用 nvidia-docker,并且對于任何實(shí)現(xiàn)了 Kubernetes CRI 的容器運(yùn)行時,都應(yīng)該能夠使用。這一實(shí)現(xiàn)已經(jīng)在 Container-Optimized OS 上進(jìn)行了測試,并且在 1.9 版本之后會有對于 Ubuntu 的實(shí)驗性代碼。
你可以使用下面的命令來安裝 NVIDIA 驅(qū)動以及設(shè)備插件:
# 在 COntainer-Optimized OS 上安裝 NVIDIA 驅(qū)動:
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml
# 在 Ubuntu 上安裝 NVIDIA 驅(qū)動 (實(shí)驗性質(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請到 GoogleCloudPlatform/container-engine-accelerators 報告有關(guān)此設(shè)備插件以及安裝方法的問題。
關(guān)于如何在 GKE 上使用 NVIDIA GPUs,Google 也提供自己的指令。
集群內(nèi)存在不同類型的 GPU
如果集群內(nèi)部的不同節(jié)點(diǎn)上有不同類型的 NVIDIA GPU,那么你可以使用 節(jié)點(diǎn)標(biāo)簽和節(jié)點(diǎn)選擇器 來將 pod 調(diào)度到合適的節(jié)點(diǎn)上。
例如:
# 為你的節(jié)點(diǎn)加上它們所擁有的加速器類型的標(biāo)簽
kubectl label nodes accelerator=nvidia-tesla-k80
kubectl label nodes accelerator=nvidia-tesla-p100 自動節(jié)點(diǎn)標(biāo)簽
如果你在使用 AMD GPUs,你可以部署 Node Labeller, 它是一個 控制器, 會自動給節(jié)點(diǎn)打上 GPU 屬性標(biāo)簽。目前支持的屬性:
- 設(shè)備 ID (-device-id)
- VRAM 大小 (-vram)
- SIMD 數(shù)量(-simd-count)
- 計算單位數(shù)量(-cu-count)
- 固件和特性版本 (-firmware)
- GPU 系列,兩個字母的首字母縮寫(-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:
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 的時候,你可以在 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)上去。
網(wǎng)頁題目:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes調(diào)度GPUs
分享網(wǎng)址:http://fisionsoft.com.cn/article/djhopji.html


咨詢
建站咨詢
