Kubernetes和GPU节点集群实施实践

时间:2018-06-22 16:53:12

标签: tensorflow kubernetes google-kubernetes-engine

我试图更好地了解K8s gpu的做法,并实现一个小型K8s GPU集群,该集群应该像下面那样工作。

这将是一个很长的解释,但是我希望同时有很多问题有助于更好地了解Kubernetes中的GPU实践。

申请要求

  • 我想创建一个K8s自动缩放群集。
  • 根据基于tensorflow的深度学习程序,运行Pod的模型。
  • 豆荚正在等待pub子队列中的消息出现,它可以继续 收到消息后立即执行。
  • 现在,消息已在PUB / SUB队列中排队。
  • 消息可用时,pod会读取消息并执行深度学习程序。

集群要求

如果队列中没有消息,并且没有基于GPU的Pod正在执行程序(我的意思是不使用gpu),则gpu节点池应缩小为0。

设计1

创建一个gpu节点池。每个节点包含N个GPU,其中N> = 1。 将模型训练师吊舱分配给每个GPU。即Pod和GPU的1:1映射。 当我尝试将2个Pod分配给2个GPU机器时,每个Pod应该运行一个mnist程序。

我注意到的是

分配了1个Pod并执行了该程序,后来它进入崩溃循环。可能是我在做一些错误,因为我的docker镜像只想运行一次程序,因为我只是在同一节点的2 gpu上同时运行2个pod的可行性测试。下面是错误

 Message   Reason  First Seen  Last Seen   Count
Back-off restarting failed container    BackOff Jun 21, 2018, 3:18:15 PM    Jun 21, 2018, 4:16:42 PM    143
pulling image "nkumar15/mnist"  Pulling Jun 21, 2018, 3:11:33 PM    Jun 21, 2018, 3:24:52 PM    5
Successfully pulled image "nkumar15/mnist"  Pulled  Jun 21, 2018, 3:12:46 PM    Jun 21, 2018, 3:24:52 PM    5
Created container   Created Jun 21, 2018, 3:12:46 PM    Jun 21, 2018, 3:24:52 PM    5
Started container   Started Jun 21, 2018, 3:12:46 PM    Jun 21, 2018, 3:24:52 PM    5

另一个Pod根本没有分配给GPU。下面是来自Pod事件的消息

0/3个节点可用:3 nvidia.com/gpu不足。

设计2

gpu节点池中有多个GPU机器,每个节点只有1个GPU。
K8会将每个Pod分配给节点中的每个可用GPU,希望不会出现任何问题。我还没有尝试。

问题

  1. 从1.10版开始,是否有建议的实践在kubernetes中设计以上类型的系统?
  2. 从1.10版本开始,Design 1方法是否不可行?例如,我有2个GPU节点和24 GB GPU内存,是否有可能让K8分配 每个GPU 1个Pod,每个Pod执行各自的工作负载,每个内存限制12GB?
  3. 如何通过自动缩放器将gpu节点池缩小到0个大小?
  4. 在设计2中,说我的GPU内存用完了怎么办?目前在GCP 1 GPU节点中的内存不足16 GB。

对于这么长的问题再次道歉,但我希望这也会对其他人有所帮助。

更新

问题2 我创建了一个新集群来重现以前多次遇到的相同问题,我不确定这次发生了什么变化,但是成功为第二个pod分配了GPU。我认为,根据此结果,我可以确认在多GPU单节点中允许1gpu-1pod映射 但是从1.10版本开始,限制每个gpu进程的内存是不可行的。

1 个答案:

答案 0 :(得分:1)

1.10支持两种设计。我将设计2视为1的特殊情况。您不一定需要每个节点具有1个GPU。如问题(4)所述,如果您的Pod需要更多GPU和内存,则每个节点必须有多个GPU。除非有理由不这样做,否则我会选择1。

我认为最佳实践是创建一个没有GPU的新集群(一个集群具有默认节点池),然后创建一个GPU节点池并将其附加到集群。您的非GPU工作负载可以在默认池中运行,而GPU工作负载可以在GPU池中运行。为了支持缩小到0个GPU,创建GPU节点池时需要将--num-nodes--min-nodes设置为0。

文档:

创建没有GPU的集群:https://cloud.google.com/kubernetes-engine/docs/how-to/creating-a-cluster#creating_a_cluster

为现有集群创建GPU节点池:https://cloud.google.com/kubernetes-engine/docs/concepts/gpus#gpu_pool