在 Kubernetes 上調(diào)度 GPU 資源
Kubernetes 支持對(duì)節(jié)點(diǎn)上的 AMD 和 NVIDIA 的 GPU 進(jìn)行管理,目前處于實(shí)驗(yàn)狀態(tài)。
用戶如何在不同的 Kubernetes版本中使用GPU,以及當(dāng)前存在的一些限制。

1. 使用設(shè)備插件
Kubernetes 實(shí)現(xiàn)了 Device Plugins[1] 以允許 Pod 訪問類似 GPU 這類特殊的硬件功能特性。作為運(yùn)維管理人員,你要在節(jié)點(diǎn)上安裝來自對(duì)應(yīng)硬件廠商的 GPU 驅(qū)動(dòng)程序,并運(yùn)行來自 GPU 廠商的對(duì)應(yīng)的設(shè)備插件。
AMD - deploying-amd-gpu-device-plugin[2] NVIDIA - deploying-nvidia-gpu-device-plugin[3]
當(dāng)以上條件滿足時(shí),Kubernetes 將暴露 amd.com/gpu 或 nvidia.com/gpu 為可調(diào)度的資源,可以通過請求 資源來使用 GPU 設(shè)備。不過,使用 GPU 時(shí),在如何指定資源需求這個(gè)方面還是有一些限制的:
GPUs只能設(shè)置在limits部分,這意味著:不可以僅指定 requests而不指定limits可以同時(shí)指定 limits和requests,不過這兩個(gè)值必須相等可以指定 GPU的limits而不指定其requests,K8S將使用限制值作為默認(rèn)的請求值
容器( Pod)之間是不共享GPU的,GPU也不可以過量分配每個(gè)容器可以請求一個(gè)或者多個(gè) GPU,但是用小數(shù)值來請求部分GPU是不允許的
#?need?2?GPUs
apiVersion:?v1
kind:?Pod
metadata:
??name:?gpu-pod
spec:
??containers:
????-?name:?cuda-container
??????image:?nvcr.io/nvidia/cuda:9.0-devel
??????resources:
????????limits:
??????????nvidia.com/gpu:?2
????-?name:?digits-container
??????image:?nvcr.io/nvidia/digits:20.12-tensorflow-py3
??????resources:
????????limits:
??????????nvidia.com/gpu:?2
2. 部署 AMD GPU 設(shè)備插件
節(jié)點(diǎn)需要使用 AMD 的 GPU 資源的話,需要先安裝 k8s-device-plugin[4] 這個(gè)插件,并且需要 K8S 節(jié)點(diǎn)必須預(yù)先安裝 AMD GPU 的 Linux 驅(qū)動(dòng)。
#?安裝顯卡插件
$?kubectl?create?-f?https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/r1.10/k8s-ds-amdgpu-dp.yaml
3. 部署 NVIDIA GPU 設(shè)備插件
節(jié)點(diǎn)需要使用 NVIDIA 的 GPU 資源的話,需要先安裝 k8s-device-plugin 這個(gè)插件,并且需要事先滿足下面的條件:
Kubernetes的節(jié)點(diǎn)必須預(yù)先安裝了NVIDIA驅(qū)動(dòng)Kubernetes的節(jié)點(diǎn)必須預(yù)先安裝nvidia-docker2.0Docker的默認(rèn)運(yùn)行時(shí)必須設(shè)置為nvidia-container-runtime,而不是runcNVIDIA驅(qū)動(dòng)版本大于或者等于384.81版本
#?安裝nvidia-docker2.0工具
$?distribution=$(.?/etc/os-release;echo?$ID$VERSION_ID)
$?curl?-s?-L?https://nvidia.github.io/nvidia-docker/gpgkey?|?sudo?apt-key?add?-
$?curl?-s?-L?https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list?|?sudo?tee?/etc/apt/sources.list.d/nvidia-docker.list
$?sudo?apt-get?update?&&?sudo?apt-get?install?-y?nvidia-docker2
$?sudo?systemctl?restart?docker
#?安裝nvidia-container-runtime運(yùn)行時(shí)
$?cat?/etc/docker/daemon.json
{
????"default-runtime":?"nvidia",
????"runtimes":?{
????????"nvidia":?{
????????????"path":?"/usr/bin/nvidia-container-runtime",
????????????"runtimeArgs":?[]
????????}
????}
}
#?安裝顯卡插件
$?kubectl?create?-f?https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
也可以使用 helm 或 docker 安裝:
$?helm?repo?add?nvdp?https://nvidia.github.io/k8s-device-plugin
$?helm?repo?update
$?helm?install?--version=0.9.0?--generate-name?nvdp/nvidia-device-plugin
#?也可以使用docker安裝
$?docker?run?-it?\
????--security-opt=no-new-privileges?\
????--cap-drop=ALL?--network=none?\
????-v?/var/lib/kubelet/device-plugins:/var/lib/kubelet/device-plugins?\
????nvcr.io/nvidia/k8s-device-plugin:devel
4. 結(jié)論總結(jié)陳述
顯卡插件,就是在我們通過在配置文件里面指定如下字段之后,啟動(dòng) pod 的時(shí)候,系統(tǒng)給為我們的服務(wù)分配對(duì)應(yīng)需要數(shù)量的顯卡數(shù)量,讓我們的程序可以使用顯卡資源。
amd.com/gpunvidia.com/gpu
需要注意的是,第一次安裝顯卡驅(qū)動(dòng)的話,是不用重啟服務(wù)器的,后續(xù)更新驅(qū)動(dòng)版本的話,則是需要的。但是建議第一次安裝驅(qū)動(dòng)之后,最好還是重啟下,防止意外情況的出現(xiàn)和發(fā)生。
原文鏈接:https://www.escapelife.site/posts/b7a3f647.html
參考資料
Device Plugins: https://kubernetes.io/zh/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/
[2]AMD - deploying-amd-gpu-device-plugin: https://kubernetes.io/zh/docs/tasks/manage-gpus/scheduling-gpus/#deploying-amd-gpu-device-plugin
[3]NVIDIA - deploying-nvidia-gpu-device-plugin: https://kubernetes.io/zh/docs/tasks/manage-gpus/scheduling-gpus/#deploying-nvidia-gpu-device-plugin
[4]k8s-device-plugin: https://github.com/RadeonOpenCompute/k8s-device-plugin
