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 中优化 AI 和机器学习作业负载

从作业负载恳求 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 经过两种机制支撑:

  1. 多实例 GPU(Nvidia A100、H100)支撑多个核算和内存单元。在这种情况下,您能够配置要公开的分区数量。此配置驱动设备插件显现每个物理 GPU 的多个“虚拟 GPU”。这由AWSAzureGCP支撑。
  2. 关于单实例 GPU,Nvidia 的 GPU 调度程序经过对 GPU 上的作业负载进行时刻分片来支撑时刻同享。这只有AWSGCP支撑。

尽管这种办法意味着能够过度订阅 GPU,但您有必要小心,因为您的作业负载或许会被饿死,与 CPU 不同,没有彻底公正的调度程序(CFS),也没有 cgroup 优先级,因此时刻只能由作业负载相等区分。

安全性/阻隔

与 CPU 不同,当时 GPU 内没有进程或内存阻隔。这意味着调度到 GPU 上的一切作业负载同享其内存,因此您只应在相互信任的作业负载之间同享 GPU。

创立 GPU 节点

已然咱们现已知道怎么恳求 GPU,您或许想知道怎么创立具有 GPU 的节点以及怎么装置设备插件。这根据您运用的 kubernetes 供给商而有所不同,咱们将在下面介绍 3 大供给商。

AWS

AWS 支撑运用任何 EC2 GPU 实例类型创立节点组。您能够从两个选项中进行选择:

  1. 运转预装了 Nvidia 驱动程序的 EKS 加快的 Amazon Linux AMI 。在这种情况下,您需要自行单独装置Nvidia 设备插件。
  2. 在节点组上运转 Nvidia 的GPU Operator。在这种情况下,晋级是手动的。

Azure

Azure 支撑运用三种选项创立节点池:

  1. 创立 GPU 节点池,其间主动包含 GPU 驱动程序,但需要您自己装置 Nvidia 设备插件。
  2. 运用AKS GPU 镜像预览,其间包含 GPU 驱动程序和 Nvidia 设备插件。在这种情况下,晋级是手动的。
  3. 在节点组上运转Nvidia 的 GPU Operator,它为您处理一切事项。

GCP

GKE 支撑运用两种选项创立节点池。

  1. 让 google 办理 GPU 驱动程序装置以及设备插件。运用此选项还答应 GKE 主动晋级节点。
  2. 自己办理 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/)首发,欢迎大家访问。