分布式Tensorflow由高性能的gRPC库底层技术支持,可以参照Martin Abadi、Ashish Agarwal、Paul Barham论文《Tensorflow:Large-Scale Machine Learning on Heterogeneous Distributed Systems》。
分布式集群
通常的部署方式有:单机多卡、多机多卡。
单机多卡是指,单台服务器有多块GPU。
当单机单GPU训练,数据会一个批次一个批次(batch)训练。
当单机多GPU训练,一次处理多个批次数据,而每个GPU处理一个批次数据。此时,变量参数保存在CPU,数据由CPU分发给多个GPU;GPU会计算每个批次从而更新梯度。CPU会收集完多个GPU的更新梯度,从而计算平均梯度,进而更新参数。因此,处理速度取决于最慢的GPU速度。
分布式,训练在多个工作节点(worker)。当数据量大,超过一台机器处理能力,需要采用分布式。
分布式可以采用单工作节点部署,或者是多工作节点部署。
单工作节点部署,每台服务器运行一个工作节点,服务器有多个GPU,该工作节点可以访问多块GPU。
此时,可以通过tf.device()
指定运行操作设备,优点是,单机多GPU间通信效率高;缺点是,需要通过代码指定设备。
多工作节点部署,每台服务器运行多个工作节点。通过设置CUDA_VISIBLE_DEVICES
环境变量,限制各个工作节点只可以看到一个GPU。通过tf.device()
指定特定GPU。优点是,代码简单,提高GPU使用率;缺点是,工作节点通信。
CUDA_VISIBLE_DEVICES='' python ./distributed_supervisor.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=ps --task_index=0
CUDA_VISIBLE_DEVICES='' python ./distributed_supervisor.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=ps --task_index=1
CUDA_VISIBLE_DEVICES='0' python ./distributed_supervisor.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=worker --task_index=0
CUDA_VISIBLE_DEVICES='1' python ./distributed_supervisor.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=worker --task_index=1
分布式Tensorflow集群由两种类型的服务器组成:
参数服务器(ps)
计算服务器(worker)
两种服务器通过高性能的gRPC库作通信,其中ps用于管理并保存神经网络参数取值;worker负责计算参数的梯度。
模型更新方式
在并行训练中,更新模型的方式有两种:同步更新和异步更新。
在同步更新模式下,所有服务器都会统一读取参数的取值,计算参数的梯度,最后统一更新。
在异步更新模式下,不同服务器会自行读取参数,计算梯度并更新参数,而不需要与其他服务器同步。
模型训练启动方式
而启动分布式深度学习模型训练任务,也有两种模型:
图内拷贝模式(In-graph Replication)
图间拷贝模式(Between-graph replication)
Tensorflow本身只是计算框架,在将其应用到生产环境时,还需要集群管理工具的资源调度、监控,以及对生命周期的管理等。
在Tensorflow的官方文档有介绍如何在kubernetes上部署和使用Tensorflow集群。
【参考】
1。k8s部署和使用tensorflow集群:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/dist_test?spm=a2c4e.11153959.blogcont68337.18.690c27bbIzCfmP\
2。SegamentFault:https://segmentfault.com/a/1190000011943200