- 设计深度学习系统
- (美)王迟 (美)司徒杰鹏
- 1329字
- 2025-03-13 16:30:27
1.2.5 在Kubernetes上构建组件
目前我们已经介绍了一系列作为服务实现的关键组件。对于这么多的服务,你可能希望在基础设施层使用一个复杂的系统来管理它们,比如Kubernetes。
Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源系统,这些应用程序在隔离的运行时环境中运行,例如Docker容器。我们已经看到一些构建在Kubernetes上的深度学习系统。有些人在学习如何使用Kubernetes时并不知道它可以用于运行深度学习服务,所以我们想先解释一下其背后的思想。如果你对Kubernetes很熟悉,可以选择跳过本小节。
注意 Kubernetes是一个复杂的平台,需要一本书的篇幅来讲解,因此我们只讨论它在深度学习系统中的优点。如果你想学习Kubernetes,我们强烈建议你阅读Marko Luksa撰写的Kubernetes in Action(Manning,2018)。
1.管理计算资源的挑战
在远程服务器上执行一个Docker容器似乎是一个简单的任务,但在30台不同的服务器上运行200个容器就是另一回事了。这有很多挑战,例如,监控所有远程服务器以确定在哪台服务器上运行容器,需要将容器迁移到健康的服务器上,当容器卡住时重新启动容器,跟踪每个容器的运行并在其完成时得到通知,等等。为了解决这些挑战,我们必须自己监控硬件、操作系统进程和网络。这不仅在技术上具有挑战性,而且也是一项庞大的工作。
2. Kubernetes的优势
Kubernetes是一个开源的容器编排平台,用于调度和自动化部署、管理和扩展容器化应用程序。一旦你设置了Kubernetes集群,你就可以管理服务器组的操作(部署、打补丁、更新)和资源了。以下是一个部署示例:你可以使用一条命令告诉Kubernetes运行一个具有16 GB内存和1个GPU的Docker镜像,Kubernetes将为你分配资源来运行这个Docker镜像。
这对软件开发人员来说大有裨益,因为并非每个人都有丰富的硬件和部署经验。有了Kubernetes,我们只需要声明集群的最终状态,Kubernetes就将执行相关作业来实现我们的目标。
除了容器部署的好处之外,以下是一些其他的Kubernetes关键功能,这些功能对于管理我们的训练容器而言非常重要:
● 自动伸缩功能:Kubernetes根据工作负载自动调整集群中节点的数量。这意味着如果有突然增加的用户请求,Kubernetes将自动添加容量,这被称为弹性计算管理。
● 自愈能力:Kubernetes在Pod失败或节点故障时会重新启动、替换或重新调度Pod。它还会终止不响应用户定义的健康检查的Pod。
● 资源利用和隔离:Kubernetes管理计算资源饱和度,它确保每台服务器都被充分利用。在内部,Kubernetes在Pod中启动应用程序容器。每个Pod都是一个具有计算资源保证的隔离环境,并且运行一个功能单元。在Kubernetes中,只要Pod的组合资源需求(CPU、内存、磁盘)不超过节点的限制,多个Pod就可以在一个节点(服务器)上运行,因此可以轻松地通过保证隔离来共享服务器上的不同功能单元。
● 命名空间:Kubernetes支持将一个物理集群划分为不同的虚拟集群,这些虚拟集群称为命名空间。你可以为每个命名空间定义资源配额,这样你就可以通过将资源分配到不同的命名空间来隔离不同团队的资源。
然而,这些优点也是以资源消耗为代价的。当你运行Kubernetes Pod时,Pod本身会占用一定数量的系统资源(CPU、内存)。这些资源会在运行Pod内的容器所需的资源之上被消耗。在许多情况下,Kubernetes的开销是合理的。例如,在Lally Singh和Ashwin Venkatesan于2021年2月发表的文章“How We Minimized the Overhead of Kubernetes in Our Job System”(http://mng.bz/DZBV)中,每个Pod的CPU开销约为10ms/s。
注意 建议查看附录B,了解现有的深度学习系统与本章中介绍的概念的关系。在该附录中,我们将1.2.1节中描述的参考架构与Amazon SageMaker、Google Vertex AI、Microsoft Azure Machine Learning和Kubeflow进行了比较。