在Kubernetes集群中使用GPU,真正麻烦的地方往往不是让一个Pod执行CUDA程序,而是让大量GPU节点长期稳定地运行。节点需要安装匹配的NVIDIA驱动,容器运行时需要正确注入GPU设备,Kubernetes需要知道哪些GPU可以被Pod申请,MIG等GPU分区需要专门管理,监控系统还要能够看到显存、利用率、温度和设备健康状态。任何一个环节版本不匹配,都可能出现Pod已经Running却无法使用GPU的情况。
NVIDIA GPU Operator解决的核心问题,就是把原本需要管理员分别安装和维护的一组GPU软件组件纳入Kubernetes的声明式管理体系。NVIDIA官方目前列出的相关组件包括NVIDIA Driver、NVIDIA Container Toolkit、Kubernetes Device Plugin、GPU Feature Discovery、MIG Manager以及DCGM和DCGM Exporter等。换句话说,它更像一套GPU基础设施生命周期管理系统,而不是一个单纯的“GPU调度器”。
首先是驱动管理。传统做法通常是在每台GPU服务器上手工安装NVIDIA驱动,然后再根据CUDA、容器运行时和Kubernetes版本逐项检查兼容性。机器一多,这种方式很容易出现节点之间驱动版本不一致的问题。GPU Operator可以通过Driver Manager以及Driver Container等组件管理节点上的NVIDIA驱动;如果集群已经预装驱动,也可以关闭Operator的驱动部署。需要特别区分的是,GPU驱动并不是每启动一个容器就加载一套独立驱动。驱动属于GPU节点的软件栈,容器主要获得访问GPU所需要的设备和用户态运行环境。
这也解释了为什么CUDA Runtime和NVIDIA Driver不能混为一谈。一个AI容器镜像可以携带CUDA用户态库以及PyTorch、TensorFlow等框架,但真正控制GPU硬件的NVIDIA驱动仍然位于节点侧。容器化解决的是应用用户态环境的一致性,而不是把GPU硬件驱动完全封装进每一个镜像。实际部署时仍然需要检查CUDA与宿主机NVIDIA Driver之间的兼容关系。
第二个重要问题是容器运行时如何获得GPU。过去人们经常把这个过程简单理解为“NVIDIA Container Toolkit把GPU挂进Docker”,但现在的实现已经更加标准化。NVIDIA Container Toolkit负责让容器运行环境能够正确使用NVIDIA GPU,而GPU Operator负责把相关组件部署到Kubernetes节点。较新的GPU Operator默认使用Container Device Interface,也就是CDI,由支持CDI的containerd、CRI-O等容器运行时完成GPU设备注入。
因此,CRI-O或者containerd本身并不负责决定某个Pod应该使用哪块GPU。Kubernetes首先根据Pod的资源请求选择节点,例如Pod可以申请nvidia.com/gpu这样的扩展资源。随后节点侧的Device Plugin和kubelet参与设备分配,容器运行时再根据设备注入机制把相应GPU提供给容器。这个过程可以理解为:Scheduler负责选择节点,Device Plugin负责向Kubernetes声明GPU资源并参与设备分配,Container Toolkit和CDI负责把已经分配的GPU正确交给容器。
GPU Operator还解决了GPU硬件信息发现的问题。GPU服务器并不一定都是完全相同的设备,集群中可能同时存在不同型号、不同显存容量和不同计算能力的GPU。GPU Feature Discovery可以把硬件特征转换为Kubernetes能够使用的节点属性,从而让调度策略能够根据GPU型号等条件选择节点。对于大型AI集群来说,这一点非常重要,因为“有GPU”并不等于“这块GPU适合这个模型”。
GPU资源隔离则是另一个容易被混淆的概念。普通GPU分配、MIG和Time-Slicing解决的是不同问题。对于支持MIG的GPU,可以把一块物理GPU划分成多个相对独立的GPU实例,由MIG Manager负责根据配置管理这些实例。GPU Operator文档显示,MIG Manager会根据节点上的MIG配置进行重新配置,并在需要时停止相关GPU工作负载、重新配置GPU以及重新启动相关组件。
这与传统意义上的vGPU也不能混为一谈。vGPU属于GPU虚拟化技术体系,通常涉及虚拟机管理程序和虚拟GPU设备;MIG则是特定GPU支持的硬件级实例化机制。Time-Slicing又是另一种共享方式。因此,不能简单地说“GPU Operator把一块GPU切成多个逻辑GPU”,更不能把所有GPU共享方式都称为vGPU。
对于更加复杂的GPU资源选择,NVIDIA目前还提供DRA Driver for NVIDIA GPUs。DRA可以按照GPU型号、架构、显存、计算能力、UUID以及拓扑等属性进行设备选择,并通过ResourceClaim等机制表达资源需求。它是比传统Device Plugin资源模型更加灵活的一条路线,但其中部分高级资源共享功能仍然处于Alpha阶段,因此生产环境不能把所有DRA能力都当成已经完全成熟的通用功能。
GPU拓扑同样会影响AI工作负载。单GPU推理可能只关心GPU本身,而多GPU训练则需要进一步考虑PCIe、NVLink、NVSwitch、NUMA以及网络设备之间的关系。尤其是分布式训练中,GPU之间需要通过NCCL等通信软件进行大量数据交换,因此调度器选择了“数量足够”的GPU,并不意味着这些GPU组成的拓扑一定适合高性能训练。GPU Operator负责提供基础设施管理能力,但它并不会自动消除硬件拓扑造成的通信差异。
因此,把GPU Operator说成存在固定的“15%虚拟化性能损耗”并不准确。实际性能取决于GPU型号、是否使用vGPU或MIG、容器共享方式、PCIe或NVLink拓扑、网络、NUMA布局以及具体工作负载。Container Toolkit的GPU设备注入也不是一种持续存在的巨大计算开销。很多情况下,真正需要优化的是GPU利用率、数据输入、模型加载、批处理、GPU间通信以及存储和网络路径。
最后一个重要组成部分是监控。GPU Operator可以管理DCGM和DCGM Exporter,把GPU监控数据提供给Prometheus等监控系统。DCGM Exporter可以暴露GPU利用率、显存使用量、驱动版本等指标,也可以把GPU指标与Kubernetes Pod、Namespace等工作负载信息关联起来。
这使得GPU故障排查从“Pod启动失败”进一步进入硬件和资源层面。例如,一个训练Pod运行很慢,并不一定是Kubernetes调度错误,也可能是GPU利用率很低、显存不足、CPU供给不足、PCIe链路异常、数据加载速度不足,或者多GPU之间的通信拓扑不理想。监控系统应该把Pod、GPU、节点和网络等信息结合起来分析,而不是只看一个GPU utilization百分比。
从整个架构来看,GPU Operator真正解决的是GPU基础设施的生命周期管理问题。它把驱动、容器运行环境、Device Plugin、GPU特征发现、MIG管理以及GPU监控等组件组织起来,使GPU节点能够以更加标准化的方式加入Kubernetes集群。
理解这一点非常重要:GPU Operator不是把GPU变成一种普通CPU资源,也不是单独负责所有GPU调度和虚拟化工作的“超级插件”。它真正做的是把复杂的GPU软件栈纳入Kubernetes的声明式管理体系,让节点上的驱动、容器运行时、GPU资源发现、设备分配、GPU分区和监控能够协同工作。对于AI训练和推理集群来说,这种标准化管理本身,就是GPU基础设施能够长期运行的关键。
GPU Operator 解决了 Kubernetes 中哪些问题,GPU 驱动与容器运行环境如何管理
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP