我们的Kubernetes集群规模已经上升到7,500个节点,主要为诸如GPT-3、CLIP和DALL·E等大型训练模型提供可扩展的基础架构,而且还可用于小规模快速迭代研究,例如神经语言模型的标度律等。将单个Kubernetes集群扩展到如此规模很难完成,同时在这个过程中需要格外小心。但好处是借助这种简单的基础架构使得我们的机器学习研究团队无需更改其代码就可以快速扩容。
自上一篇有关扩展到2,500个节点的文章发表以来,我们一直在不断扩展基础架构以满足研究人员的需求,在此过程中我们还学到了很多经验。这篇文章对此作了总结,以便Kubernetes社区共同受益,最后介绍我们仍然要面对的问题以及解决办法探讨。
工作负载
在我们深入讨论之前,介绍一下我们的工作负载是很重要的。我们运行Kubernetes软硬件和您在公司的情况可能不太一样。我们的问题和相应的解决方案可能是,也可能不是,也请您视情况而应用!
大型机器学习作业跨越许多节点,并且只有当可以访问每个节点上的所有硬件资源时,才能最大化运行效率。如此一来,GPU就可以通过 NVLink直接进行交叉通信,或者GPU也可以通过GPUDirect直接与NIC通信。因此,对于我们的许多工作负载,一个节点上只放置一个Pod。任何NUMA、CPU或PCIE资源争用都不是调度的因素,因此装箱调度或碎片化不是一个常见的问题。我们现有的集群拥有完整的对分带宽,因此也无需考虑任何机架或网络拓扑。所有这些都表明,我们的Kubernetes拥有许多节点,但是调度的压力相对较低。
不过,kube-scheduler上经常会出现峰值压力。一个新的Job可能包含数百个一次性创建的Pod,但具有较低的使用率。