NVIDIA Kubernetes设备插件带来临时GPU并发功能

NVIDIA设备插件框架支持时间切片GPU共享

v0.12版本开始,NVIDIA设备插件框架开始支持在Kubernetes上为容器的CUDA工作负载提供时间切片GPU共享功能。该功能旨在防止GPU单元的利用率不足,并通过利用时间复用的CUDA上下文来简化应用程序的扩展。在官方发布之前,一个插件分支已经实现了这种时间并发性。

CUDA上下文与并发机制

NVIDIA GPU会自动序列化由多个CUDA上下文提交的计算内核(即在设备上执行的函数)。虽然CUDA流API可以作为并发抽象使用,但流仅在单个进程内可用。因此,直接从多个进程(例如服务器应用程序的多个副本)执行并行作业通常会导致GPU资源消耗不足。

在GPU工作站中,CUDA API支持四种类型的并发来处理多进程GPU工作负载:CUDA多进程服务(MPS)、多实例GPU(MIG)、vGPU和时间切片。在Kubernetes上,NVIDIA GPU设备的超额订阅是不允许的,因为调度API将它们作为离散整数资源进行广告。这在HPC和ML架构中造成了扩展瓶颈,尤其是当多个CUDA上下文(即多个应用程序)无法最佳地共享现有GPU时。

Kubernetes上的GPU并发机制

随着Kubernetes成为扩展服务的实际平台,NVIDIA也开始通过设备插件将本地并发机制引入集群。对于Ampere及以后的GPU模型(如A100),多实例GPU并发已经被K8s设备插件支持。最新的功能是通过时间切片API实现的时间并发。另一方面,对于Volta及以后的GPU架构,MPS支持尚未由插件团队开发。

时间切片API的优势

尽管不同CUDA上下文的串行执行在时间上是并发的,因为它们可以同时管理,但时间切片API仍然有其优势。由于上下文调度在不同主机进程(CPU)中独立启动,上下文调度的计算成本并不低。此外,预先声明预期的CUDA执行数量可能允许更高级别的优化。

时间切片API在ML推理中的应用

时间切片API特别适用于ML推理应用程序,因为公司通常使用成本较低的低端GPU进行推理工作负载。MPS和MIG仅分别适用于Volta和Ampere架构的GPU,因此像NVIDIA T4这样的常见推理GPU无法在Kubernetes上使用MIG。时间切片API对于未来旨在优化加速器使用的库至关重要。

启用时间切片的配置

可以通过在清单YAML文件中添加额外配置来轻松启用时间并发。例如,以下设置将虚拟时间共享设备数量增加5倍(例如,对于4个GPU设备,Kubernetes上将提供20个设备用于共享):

version: v1
sharing:
  timeSlicing:
    resources:
    - name: nvidia.com/gpu
      replicas: 5

AMD的ROCm API

AMD为其ROCm API维护了一个单独的k8s设备插件仓库。例如,ROCm OpenCL API允许在GPU工作站中使用硬件队列进行内核的并发执行,但在Kubernetes上也存在类似的限制。未来,我们可能会看到在Kubernetes平台上对GPU共享机制进行标准化的尝试,无论供应商类型如何。

更多资源

有关并发机制的更多信息可以从官方文档中获取,时间切片API的详细概述可以从插件文档中找到。AWS还为Volta和Ampere架构提供了一个基于MPS的k8s vGPU实现,可以在官方仓库中查看。

阅读 31
0 条评论