在 Kubernetes 叢集中啟動 GPU 節點
阿新 • • 發佈:2021-09-15
參考文章:
本文目的是執行在叢集中的POD使用節點上的GPU資源。Kubernetes 實現了裝置外掛(Device Plugins) 以允許 Pod 訪問類似 GPU 這類特殊的硬體功能特性。我們需要在 GPU 節點上安裝來自對應硬體廠商的 GPU 驅動程式,並執行來自 GPU 廠商的對應的裝置外掛。
實驗環境
./+o+- ubuntu@netlab-529-GPU1 yyyyy- -yyyyyy+ OS: Ubuntu 18.04 bionic ://+//////-yyyyyyo Kernel: x86_64 Linux 5.4.0-81-generic .++ .:/++++++/-.+sss/` Uptime: 1d 18h 16m .:++o: /++++++++/:--:/- Packages: 1655 o:+o+:++.`..```.-/oo+++++/ Shell: bash 4.4.20 .:+o:+o/. `+sssoo+/ Resolution: 1536x864 .++/+:+oo+o:` /sssooo. DE: GNOME /+++//+:`oo+o /::--:. WM: Not Found \+/+o+++`o++o ++////. GTK Theme: Adwaita [GTK2/3] .++.o+++oo+:` /dddhhh. Icon Theme: Adwaita .+.o+oo:. `oddhhhh+ Font: Cantarell 11 \+.++o+o``-````.:ohdhhhhh+ CPU: 11th Gen Intel Core i7-11700KF @ 16x 4.9GHz [27.8°C] `:o+++ `ohhhhhhhhyo++os: GPU: NVIDIA GeForce RTX 3080 Ti .o:`.syhhhhhhh/.oo++o` RAM: 2143MiB / 47934MiB /osyyyyyyo++ooo+++/ ````` +oo+++o\: `oo++. +-----------------------------------------------------------------------------+ | NVIDIA-SMI 470.57.02 Driver Version: 470.57.02 CUDA Version: 11.4 | |-------------------------------+----------------------+----------------------+
安裝裝置外掛
目前 kubernetes 叢集支援 Nvidia 和 AMD 兩個廠商的顯示卡。本文環境使用的是 Nvidia 顯示卡,所以在此介紹安裝 Nvidia 裝置外掛。
安裝 Nvidia 裝置外掛的前提條件
官方的 NVIDIA GPU 裝置外掛 有以下要求:
- Kubernetes 的節點必須預先安裝了 NVIDIA 驅動
- Kubernetes 的節點必須預先安裝 nvidia-docker 2.0
- Docker 的預設執行時必須設定為 nvidia-container-runtime,而不是 runc
- NVIDIA 驅動版本 ~= 384.81
Docker 的預設執行時設定示例, 確保在docker配置檔案中(
/etc/docker/daemon.json
)中存在以下片段:{ "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } }
如果叢集已經啟動並且滿足上述要求,則可以部署 NVIDIA 裝置外掛,部署命令如下:
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/1.0.0-beta4/nvidia-device-plugin.yml
安裝完成後的變化
安裝裝置外掛後,Kubernetes 將暴露 nvidia.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
注意
目前k8s只支援卡級別的排程,並且顯示卡資源是獨佔,無法在多個容器之間分享,這一點在使用過程中需要特別注意。