当单机多卡也无法满足训练的速度需求的话,那就需要上分布式,搞多台机器一起训练了,也可以说是多机多卡吧。谈到分布式,必不可少的一个概念就是集群,先来看下TensorFlow官方对集群的定义:
翻译一下就是,Tensorflow 集群是一系列分布式执行计算图的tasks, 每一个 task 与一个server 相对应,一个server 包含 master service和 worker service。Master service负责创建 session,worker 负责执行图中的计算操作。一个集群也可以被切分成多个 jobs,每个 job 包含一系列相同功能的 tasks。
为了创建集群,需要在每个task上开启TensorFlow 的 server,每个 task 通常对应一台机器。然后在每个task上都需要做如下的事情:
创建一个 tf.train.ClusterSpec ,来描述集群中的所有tasks。这部分对于所有tasks都是一样的在每个task上创建一个 tf.train.Server ,在构造时候传入tf.train.ClusterSpec ,并且用 job_name 和 task_index 来标识当前task ,这样每个server在启动时就加入了集群的信息,可以和集群中的其他 server通信。需要注意的是,sever的创建需要在自己所在 host 上,一旦所有的 server 在各自的 host 上创建好了,整个集群就搭建好了。
上面介绍了,如何创建分布式的环境。下面来介绍下TensorFlow的分布式训练时所使用的架构。我们知道,一般机器学习的训练过程可以分为以下两步:
1)根据已有参数计算梯度
2)根据梯度来更新参数
对于超大规模的训练,数据量大,模型参数多,不仅计算梯度的过程要放到多个CPU或GPU上执行,参数的存储和更新也需要放到多个CPU或GPU上执行,这就需要多台机器来进行计算能力的扩展。在parameter server(参数服务器)架构中,集群中的节点被分为两类:parameterserver 和 worker。
其中 parameter server 负责存放模型的参数和更新梯度的操作,而worker负责计算参数的梯度。在每个迭代过程中,worke 节点从 parameter sever 节点中获得参数,再将计算的梯度回传给parameter server,parameter server 聚合从所有 worker 传回的梯度,然后开始更新参数。整个架构如下图所示,这里只简单介绍下,想要深入理解参数服务器架构,可以看下沐神的这两篇文章,Parameter Server for Distributed Machine Learning
和Scaling Distributed Machine Learning withParameter Server,这里只抛砖引玉。而且TensorFlow的分布式本身只是采用了 parameter server 的思想,与沐神的PS架构并不完全对等。
在tensorflow的分布式中,同样也将集群中的节点分为 ps 和 worker 两类:
ps节点就是参数服务器,简称 ps(parameterserver), 负责参数的存储和更新,ps 节点可以不止一个,也可以拿多台机器来充当ps节点。
worker节点,从 ps 节点上 pull 下最新参数,加载数据,执行计算图,获得梯度,然后将梯度 push 给 PS 节点。
关注小鲸融创,一起深度学习金融科技!