Kubernetes提供对分布式节点上的AMD GPU
和NVIDIA GPU
管理的实验性的支持。
在v1.6中已经添加了对NVIDIA GPU
的支持,并且经历了多次向后不兼容的迭代。 通过设备插件将在v1.9中添加了对AMD GPU
的支持。
本文将介绍如何在不同的Kubernetes版本中使用GPU以及当前的限制。
- v1.8开始
- 包含不同类型GPU的群集
v1.8开始
从1.8开始,使用GPU的推荐方法是使用驱动插件。
要在1.10
之前通过设备插件启用GPU支持,必须在整个系统中将DevicePlugins
功能设置为true:--feature-gates="DevicePlugins=true"
。从1.10开始则不再需要这样做了。
然后,必须在节点上安装相应供应商GPU驱动程序,并从GPU供应商(AMD,NVIDIA)运行相应的设备插件。
如果满足上述条件,Kubernetes将暴露 nvidia.com/gpu
或 amd.com/gpu
作为可调度资源。
您可以通过请求<vendor>.com/gpu
来从容器中使用这些GPU,就像请求cpu或内存一样。 但是,在使用GPU时如何指定资源要求存在一些限制:
GPU只能设置在limits部分中指定,这意味着:
- 您可以在不指定
requests
的情况下指定GPUlimits
,因为默认情况下Kubernetes将使用limit
作为请求值。 - 您可以在
limits
和request
中指定GPU,但这两个值必须相等。 - 你不可以仅指定
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节点必须预先安装AMD GPU Linux驱动程序。
要在群集运行时部署AMD设备插件,并满足上述要求:
# For Kubernetes v1.9
kubectl create -f https://raw.githubusercontent.com/RadeonOpenCompute/k8s-device-plugin/r1.9/k8s-ds-amdgpu-dp.yaml
# For Kubernetes v1.10
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 GPU目前有两种设备插件实现:
官方 NVIDIA GPU驱动插件设备插件具有以下要求:
Kubernetes节点必须预先安装NVIDIA驱动程序。
Kubernetes节点必须预先安装nvidia-docker 2.0
必须将nvidia-container-runtime配置为默认运行时而不是runc。
NVIDIA 驱动版本 ~= 384.81
要在群集运行并且满足上述要求后部署NVIDIA设备插件:
# For Kubernetes v1.8
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.8/nvidia-device-plugin.yml
# For Kubernetes v1.9
kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.9/nvidia-device-plugin.yml
# 最新
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,并且可以使用任何容器运行时与Kubernetes容器运行时接口(CRI)兼容。 它在容器优化操作系统上进行了测试,并从1.9开始为Ubuntu提供实验代码。
在1.12群集上,您可以使用以下命令安装NVIDIA驱动程序和设备插件:
# Install NVIDIA drivers on Container-Optimized OS:
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/daemonset.yaml
# Install NVIDIA drivers on Ubuntu (experimental):
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/ubuntu/daemonset.yaml
# Install the device plugin:
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 GPU的说明在这里
包含不同类型GPU的集群
如果集群中的不同节点具有不同类型的GPU,则可以使用节点标签和节点选择器将pod调度到适当的节点。
例如:
# Label your nodes with the accelerator type they have.
kubectl label nodes <node-with-k80> accelerator=nvidia-tesla-k80
kubectl label nodes <node-with-p100> accelerator=nvidia-tesla-p100
节点的自动标记
对于AMD GPU,您可以部署Node Labeller,它会自动使用GPU属性标记您的节点。 目前支持的属性:
- Device ID (-device-id)
- VRAM Size (-vram)
- Number of SIMD (-simd-count)
- Number of Compute Unit (-cu-count)
- Firmware and Feature Versions (-firmware)
- GPU Family, in two letters acronym (-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 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
......
在pod规范中指定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类型的节点。
楼主太强了