导语
在机器学习领域,我们经常使用 GPU 来加速计算工作负载。但现在的企业和开发者都更热衷于“上云”。有了云计算,使用云服务,用多少付多少,也就能降低运营成本了。
当你拥有数十个在不同时间段需要用到 GPU 的应用程序时,怎么以更低成本,怎么更灵活地在云服务器中调度资源,就会变成一件非常重要的事情。
作者介绍
Jina AI 云架构研发工程师陶然
问题
那么,如何优化云服务中 GPU 的使用成本呢?在使用虚拟机时,哪怕你不需要全天候的服务,你也必须持续为所有的设备付费。相比于虚拟机,容器拥有更高的资源使用效率,作为容器界的扛把子,kubernetes 提供了弹性的节点缩放方式。
因为我使用的是 Amazon EKS,所以本文选择了 Karpenter 作为节点缩放器。Karpenter 是一个为 Kubernetes 构建的开源自动扩缩容项目,你可以通过此 文档[1] 了解更多关于 Karpenter 的信息。
想要管理多个 GPU 节点,还需要用到 NVIDIA 的 k8s 插件[2]。这是一个 Daemonset(守护进程),提供了以下自动化的功能:
-
• 公开集群每个节点上的 GPU 数量
-
• 实时追踪 GPU 的运行状况
-
• 在 Kubernetes 集群中运行启用 GPU 的容器
除此之外,它还支持 时间切片[3],使得用户可以在 Pod (Kubernetes 的最小调度对象)之间共享 GPU,从而节省成本。
Karpenter 本身也为节点提供了自动缩放功能,也就是说,只有在需要算力时,才会创建 GPU 实例,并且可以根据实际需求修改应用实例的调度规则。除了降低成本之外,也能更灵活地把 GPU 资源调度到 kubernetes 集群中的应用程序。
架构
组件
这个架构非常简单易懂:应用程序选择了一个带有选择器(selector)的 karpenter 制备器(provisioner),接着,karpenter 制备器根据启动模板创建节点。
部署
接下来最重要的问题是如何去部署它,仍有一些细节需要考虑清楚:
-
• 如何将 NVID