我试图更好地了解K8s gpu的做法,并实现一个小型K8s GPU集群,该集群应该像下面那样工作。
这将是一个很长的解释,但是我希望同时有很多问题有助于更好地了解Kubernetes中的GPU实践。
如果队列中没有消息,并且没有基于GPU的Pod正在执行程序(我的意思是不使用gpu),则gpu节点池应缩小为0。
创建一个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不足。
gpu节点池中有多个GPU机器,每个节点只有1个GPU。
K8会将每个Pod分配给节点中的每个可用GPU,希望不会出现任何问题。我还没有尝试。
对于这么长的问题再次道歉,但我希望这也会对其他人有所帮助。
问题2 我创建了一个新集群来重现以前多次遇到的相同问题,我不确定这次发生了什么变化,但是成功为第二个pod分配了GPU。我认为,根据此结果,我可以确认在多GPU单节点中允许1gpu-1pod映射 但是从1.10版本开始,限制每个gpu进程的内存是不可行的。
答案 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