本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob
运行分布式模型训练。python
TensorFlow
做为如今最为流行的深度学习代码库,在数据科学家中间很是流行,特别是能够明显加速训练效率的分布式训练更是杀手级的特性。可是如何真正部署和运行大规模的分布式模型训练,却成了新的挑战。 实际分布式TensorFLow的使用者须要关心3件事情。git
ClusterSpec
应该长成下面的样子,而且分布式训练中每一个成员都须要利用这个ClusterSpec
初始化tf.train.ClusterSpec
对象,创建集群内部通讯cluster = tf.train.ClusterSpec({"worker": ["<VM_1>:2222", "<VM_2>:2222"], "ps": ["<IP_VM_1>:2223", "<IP_VM_2>:2223"]})
其中第一件事情是Kubernetes资源调度很是擅长的事情,不管CPU和GPU调度,都是直接可使用;而第二件事情是Docker擅长的,固化和可重复的操做保存到容器镜像。而自动化的构建ClusterSpec
是TFJob
解决的问题,让用户经过简单的集中式配置,完成TensorFlow分布式集群拓扑的构建。github
应该说烦恼了数据科学家好久的分布式训练问题,经过Kubernetes+TFJob的方案能够获得比较好的解决。json
以前在阿里云上小试TFJob一文中已经介绍了TFJob
的定义,这里就再也不赘述了。能够知道TFJob
里有的角色类型为MASTER
, WORKER
和 PS
。api
举个现实的例子,假设从事分布式训练的TFJob
叫作distributed-mnist
, 其中节点有1个MASTER
, 2个WORKERS
和2个PS
,ClusterSpec
对应的格式以下所示:服务器
{ "master":[ "distributed-mnist-master-0:2222" ], "ps":[ "distributed-mnist-ps-0:2222", "distributed-mnist-ps-1:2222" ], "worker":[ "distributed-mnist-worker-0:2222", "distributed-mnist-worker-1:2222" ] }
而tf_operator
的工做就是建立对应的5个Pod, 而且将环境变量TF_CONFIG
传入到每一个Pod中,TF_CONFIG
包含三部分的内容,当前集群ClusterSpec
, 该节点的角色类型,以及id。好比该Pod为worker0,它所收到的环境变量TF_CONFIG
为:架构
{ "cluster":{ "master":[ "distributed-mnist-master-0:2222" ], "ps":[ "distributed-mnist-ps-0:2222" ], "worker":[ "distributed-mnist-worker-0:2222", "distributed-mnist-worker-1:2222" ] }, "task":{ "type":"worker", "index":0 }, "environment":"cloud" }
在这里,tf_operator
负责将集群拓扑的发现和配置工做完成,免除了使用者的麻烦。对于使用者来讲,他只须要在这里代码中使用经过获取环境变量TF_CONFIG
中的上下文。分布式
这意味着,用户须要根据和TFJob
的规约修改分布式训练代码:学习