Kubernetes 十分合适各种类型的容器化作业负载,从服务到作业再到有状况应用程序。但是 AI 和需要 GPU 的机器学习作业负载呢?是的,Kubernetes 也支撑这些,但有许多细微差别。
译自Optimizing AI and Machine Learning Workloads in Kubernetes,作者 Eugene Burd 。
本文将介绍 Kubernetes 怎么支撑 GPU,包含调度、过度订阅和时刻同享以及安全性/阻隔。此外,咱们将评论三大公共云供给商怎么支撑这些功用,以及怎么确保您的 GPU 节点仅由 GPU 作业负载运用。
设备插件
让咱们首先看一下 Kubernetes 支撑 GPU 的机制。Kubernetes 自身不知道任何关于 GPU 的信息。相反,它供给了一个扩展机制,称为设备插件。设备插件框架答应第三方广告节点上可用的其他功用,如 GPU、InfiniBand 适配器等。
设备插件,通常以守护进程集完成,向节点的 kubelet 注册自己,并向 kubelet 广告节点上可调度的资源。Kubelet 将此信息传递给 API 服务器,然后由 Kubernetes 调度程序运用,以调度恳求每个容器的资源的作业负载到节点上。
从作业负载恳求 GPU
已然咱们了解了 Kubernetes 怎么知道 GPU,那么让咱们来评论容器怎么恳求一个 GPU。作业负载能够以类似恳求 CPU 或内存的方式恳求 GPU,但有些不同。与 Kubernetes 自身支撑的 CPU 不同,GPU(和设备插件一般)仅支撑约束(您能够供给恳求,但假如这样做,您也有必要供给约束,并且两个值有必要相等)。约束还有必要是整数(不答应运用小数约束)。
让咱们看一个示例 pod。在本例中,pod 正在恳求 1 个 Nvidia gpu。调度程序将测验找到一个具有可用 Nvidia gpu 且没有分配的节点,并继续在该节点上放置 pod。
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
containers:
- name: my-gpu-container
image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
command: ["/bin/bash", "-c", "--"]
args: ["while true; do sleep 600; done;"]
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
memory: 1000Mi
nvidia.com/gpu: 1
过度订阅和时刻同享
CPU 时刻同享由 CNI 运用 linuxcgroups本地处理。它受您的恳求和约束的影响 – 请参阅有关怎么设置 CPU 恳求和约束的文章(以及为什么要避免约束)。
GPU 时刻同享关于 Nvidia GPU 经过两种机制支撑:
- 多实例 GPU(Nvidia A100、H100)支撑多个核算和内存单元。在这种情况下,您能够配置要公开的分区数量。此配置驱动设备插件显现每个物理 GPU 的多个“虚拟 GPU”。这由AWS、Azure和GCP支撑。
- 关于单实例 GPU,Nvidia 的 GPU 调度程序经过对 GPU 上的作业负载进行时刻分片来支撑时刻同享。这只有AWS和GCP支撑。
尽管这种办法意味着能够过度订阅 GPU,但您有必要小心,因为您的作业负载或许会被饿死,与 CPU 不同,没有彻底公正的调度程序(CFS),也没有 cgroup 优先级,因此时刻只能由作业负载相等区分。
安全性/阻隔
与 CPU 不同,当时 GPU 内没有进程或内存阻隔。这意味着调度到 GPU 上的一切作业负载同享其内存,因此您只应在相互信任的作业负载之间同享 GPU。
创立 GPU 节点
已然咱们现已知道怎么恳求 GPU,您或许想知道怎么创立具有 GPU 的节点以及怎么装置设备插件。这根据您运用的 kubernetes 供给商而有所不同,咱们将在下面介绍 3 大供给商。
AWS
AWS 支撑运用任何 EC2 GPU 实例类型创立节点组。您能够从两个选项中进行选择:
- 运转预装了 Nvidia 驱动程序的 EKS 加快的 Amazon Linux AMI 。在这种情况下,您需要自行单独装置Nvidia 设备插件。
- 在节点组上运转 Nvidia 的GPU Operator。在这种情况下,晋级是手动的。
Azure
Azure 支撑运用三种选项创立节点池:
- 创立 GPU 节点池,其间主动包含 GPU 驱动程序,但需要您自己装置 Nvidia 设备插件。
- 运用AKS GPU 镜像预览,其间包含 GPU 驱动程序和 Nvidia 设备插件。在这种情况下,晋级是手动的。
- 在节点组上运转Nvidia 的 GPU Operator,它为您处理一切事项。
GCP
GKE 支撑运用两种选项创立节点池。
- 让 google 办理 GPU 驱动程序装置以及设备插件。运用此选项还答应 GKE 主动晋级节点。
- 自己办理 GPU 驱动程序和设备插件
保护 GPU 节点免受非 GPU 作业负载的影响
最终,已然您现已创立了 GPU 节点,您会期望这些节点免受集群上运转的任何非 GPU 作业负载的影响。您能够经过污点和忍受来完成这一点。在创立节点池和组时,您会想要应用污点。 假如集群具有非 GPU 节点池,GKE 会主动为您履行此操作。其他供给商不会,所以您需要确保这样做。
关于 pod,您会期望为污点供给忍受,以便它们能够调度到 GPU 节点上。下面的示例为名为“nvidia.com/gpu”的污点创立了一个忍受,这答应此 pod 在 nvidia GPU 节点上运转。
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
containers:
- name: my-gpu-container
image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
command: ["/bin/bash", "-c", "--"]
args: ["while true; do sleep 600; done;"]
resources:
requests:
cpu: 100m
memory: 500Mi
limits:
memory: 1000Mi
nvidia.com/gpu: 1
tolerations:
- key: "nvidia.com/gpu"
operator: "Exists"
effect: "NoSchedule"
随着 AI 和机器学习作业负载的不断增长,期望您考虑在 Kubernetes 上运转它们,而不是更贵重的云供给商专有选项。
您是否现已测验在 Kubernetes 上运转 GPU 作业负载?哪些方面效果好?遇到哪些问题?
本文在如此众生(yylives.cc/)首发,欢迎大家访问。