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

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


咨詢
建站咨詢
