Kubeflow实战系列: 利用TFJob运行分布式TensorFlow

介绍

本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob运行分布式模型训练。python

TensorFlow分布式训练和Kubernetes

TensorFlow做为如今最为流行的深度学习代码库,在数据科学家中间很是流行,特别是能够明显加速训练效率的分布式训练更是杀手级的特性。可是如何真正部署和运行大规模的分布式模型训练,却成了新的挑战。 实际分布式TensorFLow的使用者须要关心3件事情。git

  1. 寻找足够运行训练的资源,一般一个分布式训练须要若干数量的worker(运算服务器)和ps(参数服务器),而这些运算成员都须要使用计算资源。
  2. 安装和配置支撑程序运算的软件和应用
  3. 根据分布式TensorFlow的设计,须要配置ClusterSpec。这个json格式的ClusterSpec是用来描述整个分布式训练集群的架构,好比须要使用两个worker和ps,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擅长的,固化和可重复的操做保存到容器镜像。而自动化的构建ClusterSpecTFJob解决的问题,让用户经过简单的集中式配置,完成TensorFlow分布式集群拓扑的构建。github

应该说烦恼了数据科学家好久的分布式训练问题,经过Kubernetes+TFJob的方案能够获得比较好的解决。json

利用Kubernetes和TFJob部署分布式训练

  1. 修改TensorFlow分布式训练代码

以前在阿里云上小试TFJob一文中已经介绍了TFJob的定义,这里就再也不赘述了。能够知道TFJob里有的角色类型为MASTERWORKER 和 PSapi

举个现实的例子,假设从事分布式训练的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的规约修改分布式训练代码:学习

相关文章
相关标签/搜索