作者:李楠管虎
人工智能是一个经久不衰的话题,在几十年的发展中经历了风风雨雨。然而,随着近年来AlphaGo、ImageNet等的新闻频出,人工智能再次被推上风口浪尖,大家都趋之若鹜。深度学习是驱动这一波人工智能的核心引擎。近年来,各种深度学习框架迅速流行起来,如TensorFlow、Keras、Torch、PyTorch、MXNet、Caffe等。在这些框架中,除了对GPU加速的支持,对分布式ring的支持也是它们受欢迎的关键因素之一。
接下来,本文将选取一个流行的深度学习框架,结合华云数据挖掘团队的产品开发实践,与大家分享一些分布式深度学习的经验。
流行的深度学习框架
深度学习框架层出不穷,包括TensorFlow、Caffe、Keras、CNTK、Torch、PyTorch、MXNet、DeepLearning4j等等。图1和图2分别显示了每个框架在研究人员中的使用统计和github上各种指标的统计。TensorFlow在科研使用和项目活跃度方面优于其他框架。除了Google的号召力和R&D水平,TensorFlow本身还有很多突出的表现,比如编程灵活、执行效率高、部署方便等等。目前为止,TensorFlow在github上保持着快速迭代更新,已经形成了活跃的社区。
在综合考虑了各种深度学习框架的功能和特点以及项目的具体需求后,在实际工作中,华云数据洞察-GPU选择TensorFlow作为深度学习的开发框架,扩展了分布式环境下训练过程和结果的可视化功能。
图1各框架在研究人员中的使用情况(图片引自keras官网)
图2显示了TensorFlow和各种深度学习框架对各种语言的支持。可见目前深度学习使用最多的是Python。
图2github上各种开源框架的数据统计(图片引自csdn的博文)
Python也深受Spark的喜爱。比如可以使用spark-submit直接提交Python版本的分布式map-reduce程序;人们会很自然地想到使用基于内存的map-reduce管理机制来处理分布式TensorFlow程序,从而处理单机无法完成的计算任务。
然而,基于GRPC(Google远程进程调用)的TensorFlow也可以灵活地支持分布式环境。
张量流和本地分布式方案
张量流简介
TensorFlow是一个静态数据流图,支持常见的神经网络结构,如卷积神经网络(CNN)和递归神经网络(RNN)。此外,TensorFlow还支持深度强化学习和其他计算密集型科学计算,如求解偏微分方程和物理模拟。
图3数据流图(图片引自TensorFlow官网)
图3示出了通过使用随机梯度下降方法训练模型的曲线图。TensorFlow是一个开源软件库,使用数据流图进行数值计算。图中的节点表示数学运算,图中的边表示多维数据数组,即张量,节点之间相互关联。TensorFlow可以在分布式环境下训练,实现集群、GPU集群或TPU集群的并行计算。
本地分布式方案
TensorFlow以“数据并行化”的方式支持模型的分布式训练,实际上是指在同一个“/job:worker”分组下,不同的任务可以使用不同的小批量数据来训练同一个模型,更新同一个参数。有几种方法可以实现分布式张量流支持:
(1)图内复制
1.通常所有的 *** 作都在一个图中定义;
2.与参数定义和更新相关的 *** 作被分配给参数服务器("/job:PS");
3.计算密集型 *** 作将被复制成多个副本,每个副本将被分配给不同的worker节点("/job:worker")。
图4复制同步训练示意图(图片来自TensorFlow官网)
(2)图间复制
1.你需要有多个客户端,每个客户端都有一个graph的定义;
2.通常,每个客户机与每个执行工作者类型任务的服务器处于相同的进程中;
3.和图内复制一样,参数的定义和更新都是分布到参数服务器上的("/job:ps")。
(3)异步训练
1.Graph的每个副本独立执行一个训练循环,它们之间没有协同作用;
2.PS服务器只要收到一个工作者服务器的梯度值,就会直接更新参数;
3.不稳定,训练曲线波动剧烈;
4.适用于图内和图间。
5.复制图片之间的异步训练示意图(图片引自TensorFlow官网)
(4)同步训练。
1.每个工作者服务器从ps服务器读取相同的参数,计算参数的梯度,然后将梯度传输到ps服务器,而不更新参数本身;
2.ps服务器收到所有工作服务器的梯度后更新参数;
3.PS服务器每次更新参数都需要等待所有工作服务器计算并传递参数梯度,所以执行速度取决于最慢的工作服务器。
图6独立于Hadoop/Spark集群的TensorFlow集群(图片引自雅虎Hadoop网站)
2016年,TensorFlow支持HDFS,但用户仍然需要部署专用的TensorFlow应用集群,如图6所示。
基于gRPC和RDMA(远程直接内存访问)的分布式TensorFlow的优势在于灵活性,对于有大量分布式编程基础的开发者来说尤其方便,但是这个特性也带来了很多麻烦:
(1)要求开发人员在worker上手动指定计算资源gpu:0或CPU:0;
(2)将需要相对谨慎计算资源分配给各个计算节点;
(3)分布式张量流计算资源共享调度麻烦。
华云数据洞察——GPU设计初心
一个昂贵的分布式GPU计算资源,团队共享,还是很麻烦,甚至很棘手,因为开发者事先知道可以调度多少计算资源;需要提前知道计算资源的存在,在竞争的情况下,在用户之间,团队之间,调度管理之间,都特别尴尬。可能正是因为这些看得见的缺点和使用中的痛点,才诞生了其他具有任务管理和调度功能的分布式深度学习平台。在这样的情况下,人们自然会想到使用成熟的spark任务调度模块(如Yarn或Mesos)和Spark管理RDD机制来管理分布式TensorFlow训练任务。
基于Spark的分布式张量流
雅虎团队基于Caffe和TensorFlow开发了两个方案,如图。根据现有的内部集群环境,经过深入的客户需求分析和研究,云大数据团队最终决定采用TensorFlowOnSpark作为内部分布式深度学习的部署方案。
图7基于Spark的深度学习扩展模块(图片引自雅虎Hadoop网站)
三维动态张量流分布式训练
在TensorFlow的原生分布式方案中,用户除了提交应用之外,还需要手动配置、维护和管理整个集群的运行。比如节点需要在提交申请前仔细配置;需要手动启动和关闭相应的集群节点;在inter-graph模式下,需要在不同的节点上多次提交应用程序,等等。总之,TensorFlow的原生分布式解决方案在运维成本和易用性上有很多改进空。
d性分布式数据集(RDDS)是Spark的核心数据对象,它为大数据集群提供了高度的抽象。RDD的抽象包括两个方面:
一种是数据并行化,即数据会被分成不同的部分,存储在不同的RDD中;TensorFlowOnSpark提供了张量模式和Spark模式两种模式的支持,其中Spark模式充分利用了RDD的数据并行化机制,Spark动态完成数据集的分割。
第二个是集群节点映射,这意味着RDD中的每个片段实际上都对应一个活动进程。TensorFlowOnSpark提供的分布式方案充分利用了RDD的这两个特点。图8是TensorFlowOnSpark的运行状态的示意图。在整个架构中,TensorFlowOnSpark使用nodeRDD管理TensorFlow集群的全生命周期,TensorFlow集群随着应用的提交和结束而动态创建和回收。
图8TensorFlowOnSpark运行状态图(图片引自雅虎hadoop网站)
分布式张量流训练过程的可视化
用分布式TensorFlow训练一个模型会降低训练精度吗?用RDD对训练数据进行分段,重新放到分布式环境中,训练过程和损耗下降过程会不会拉长?这一系列问题需要通过训练可视化工具tensorboard来完成和回答。
数据分析师也会通过tensorboard看到他们精心调制的损耗设计,试图监督训练中的收敛过程。但是细心的开发者会发现,即使是最新的1.6.0版本也不支持分布式环境下直接查看TensorFlow训练过程事件,因为事件机制编写的V2版训练过程文件无法被tensorboard实时加载。原因可能和新开发的NewCheckpointReader有关,它封装了C++程序,只关注本地化(单机本地化目录)解析,而忽略了HDFS文件夹的兼容性。
通过在分布式环境下同步本地文件夹和事件文件夹logdir,可以避免tensorboard无法加载HDFS上的事件文件夹的问题,仍然可以变相查看分布式TensorFlow的训练过程。
中国云数据洞察-GPU直接读取HDFS上的events文件夹,分析TensorFlow训练流程文件,如events、Model等。CKPT。数据A*,实时放置在分布式环境中,无需同步logdir文件夹。同时,为了脱离语言限制,华云数据的Insight-GPU还根据bazel的特点拆分了tensorboard可视化功能,方便不同语言的开发者调用和嵌入。
用户可以通过图9的方式将隐藏层权重分布图嵌入到分布式张量流训练过程中:
图9华云洞察-GPU
在分布式张量流训练过程中显示隐藏层权重
最直接地,如图10所示,它也可以直接嵌入到培训结果页面中:
图10华云数据的Insight-GPU展示了分布式TensorFlow的训练结果。
云数据分布式洞察-GPU运行部署环境
具有最新ant-design页面设计的insight-GPU可以很好地集成到各种云产品中,如公有云、私有云CloudUltra和华云开发的超融合产品。Insight-GPU嵌入k8s客户端,可以为用户设计更周到的管理功能(例如华云数据的Insight-GPU可以从一个pod追溯到顶层执行的分布式GPU任务),帮助用户更好地管理异构GPU集群,同时在各种云上布置管理容器。
参考
1.TensorFlow官网。https://www.tensorflow.org/
2.Keras官网。https://keras.io/
3.主流深度学习框架比较。http://blog.csdn.net/zuochao_2013/article/details/56024172
4,TensorFlowOnSparkgithub。https://github.com/yahoo/TensorFlowOnSpark
5、开源TensorFlowOnSpark:大数据集群上的分布式深度学习。http://YahooHadoop.Tumblr.com/post/157196317141/open-sourcing-tensorflowonspark-distributed-deep
6.星火官网http://spark.apache.org/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)