合作机构:阿里云 / 腾讯云 / 亚马逊云 / DreamHost / NameSilo / INWX / GODADDY / 百度统计
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 调度程序使用,以调度请求每个容器的资源的工作负载到节点上。
图片
既然我们了解了 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
TOP