百度深度学习平台PaddlePaddle框架< titlesplit >PaddlePaddle是百度于2016年8月底开源的深度学习平台,并在短时间内迅速成为掀起全球发展的开源深度学习平台热情和数量增长最快的GithubPullRequests平台。PaddlePaddle的迭代速度非常快,也引起了社区的大量关注。最初开源时,PaddlePaddle的设计思路是基于Layer设计的。后来又推出了“v2”和“Fluid”的两个迭代:v2加入了算子的概念,将“破碎”的层变成更细粒度的算子,支持更复杂的网络拓扑“图”;Fluid类似于PyTorch,但它不依赖于Python的控制流(if-else、for等),而是提供了自己的解释器甚至编译器,因此不受Python执行速度的限制。今天先从PaddlePaddleFluid说起,然后讲讲在浏览器端训练的PaddlePaddleCloud,为了更容易使用集群,同时重点讲解集群训练的原理、配置和实验结果,这是PaddlePaddleEDL部分。***,讲解PaddlePaddleVisualDL,一个非常强大的训练日志解析和可视化工具。PaddlePaddleFluidPaddlePaddleFluid提供了类似高级语言的控制流结构(如while、if、if-else、for等),既可以利用编译优化技术保证计算性能,又可以提高用户开发效率。PaddlePaddleFluid的设计思想非常先进,不再遵循层结构和算子结构的模式。也就是说,不再有“模型”的概念,也不再有“图”(graphofoperators)或“sequenceoflayers”(层的序列)。而且只有“程序”的概念。同时,程序可以导出图形,图形可以从程序中导出为ONNX文件格式的模型。深度学习基础设施是发展最快的技术之一,四年内,已经发明了三代技术。从下表可以看出,深度学习技术架构设计的方向是逐渐摆脱模型。年层结构模型运行结构模型无模型2013Caffe,Theano,Torch,PaddlePaddle2015TensorFlow,MxNet,Caffe2,ONNX,n-graph2016PyTorch,TensorFlowEagerExecution,PaddlePaddleFluid基于Python语言的强大生态,PyTorch和Eager执行控制流全部在Python中,但瓶颈之一是Python的执行速度慢,难以提速。针对PyTorch和EagerExecution程序执行速度受限于Python执行速度的问题,Fluid有着比PyTorch和EagerExecution更激进的技术思路。在Fluid的设计中,执行会把写好的Python程序输出成protobuf消息,然后调用Fluid解释器(不是Python解释器)解释并执行protobuf消息。Fluid解释器大大加快了图形的执行速度。同时,在编译执行的方式上,编写一个transpiler将protobuf报文翻译成C++程序,然后使用nvcc、icc、gcc编译成二进制代码,可以直接在服务器和手机上运行。PaddlePaddleCloudPaddlePaddle有一个基于Web的IDE,支持用户在浏览器中使用JupyterNotebook编程开发AI应用,然后将程序发送到云端(Kubernetes集群)进行调试或运行,程序的输出会显示在实时浏览器。这样,用户无需在个人电脑、集群等多个编程环境之间切换,保持多个环境版本和配置的一致性,大大提高了工作效率。PaddlePaddleEDLPaddlePaddleEDL以GoogleKubeFlow为目标。PaddlePaddleEDL通过配合Kubernetes实现弹性作业调度。全球首个支持弹性作业调度的开源AI云解决方案。虽然现在很多深度学习应用可以用几台机器组成的小集群就可以解决,但是随着数据量的增加和AI应用场景的不断扩展,比如Web规模的应用(广告、搜索、推荐等),通过传感器采集拥有海量数据的无人车需要大规模的深度学习算力。这主要是为了解决深度学习面临的两大挑战。一是它需要大量的计算能力。研究实验室和公司通常构建由SLURM、MPI或SGE管理的GPU集群。这些集群要么运行提交的作业(假设它需要的资源少于空闲资源),要么将作业暂停一段不可预测的时间。但是这种方式有一个缺点:当有99个可用节点和一个需要100个提交作业的任务时,作业就得等待,无法运行。PaddlePaddleEDL灵活调度体现在一个训练作业空闲时使用较多资源,繁忙时使用较少,但资源变化不会导致作业失败;这是优于KubeFlow的特性之一。同时,EDL还可以灵活调度其他作业(如Nginx、MySQL等),从而大大提高集群的整体利用率。[2]这样一来,在公有云和私有云上推广部署时,很容易节省数倍的机器数量,为公司节省的计算成本可达数百万甚至上百万美元年。另一个挑战是,工业用户倾向于将深度学习作业视为完整数据管道的子阶段,例如日志收集器等。此类通用集群需要基于优先级的弹性调度。例如,深度学习任务很少在高网络开销期间运行,而深度学习任务在网络流量低时优先运行。这需要了解大局并协调不同工作中涉及的流程数量。PaddlePaddleEDL的测试实验面对以上两个挑战,PaddlePaddle作业可以轻松应对进程数量的变化。以下是FluidEDL的两个测试用例:Kubernetes集群只运行PaddlePaddle作业;运行PaddlePaddle和Nginx作业的集群。在第一个测试中,我们以10秒的间隔启动了20个PaddlePaddle作业。每个作业有60个训练器和10个参数服务进程,将持续几个小时。我们重复实验20次:10次关闭FluidEDL,10次打开FluidEDL。下图中,实线对应前10个实验,其余为虚线。在图表的上半部分,我们看到未完成工作的数量在没有EDL的情况下单调增加。但是,当EDL打开时,资源会平均分配给所有作业。FluidEDL会终止一些现有进程以为新的其他任务腾出空间,并且任务会在稍后开始运行。在这两种情况下,集群的利用率是一样的(参见图的下半部分)。在第二个测试中,每个实验运行400个NginxPod,优先级高于6个PaddlePaddle作业。最初,每个PaddlePaddle作业都有15个训练器和10个参数服务。我们每90秒杀死100个NginxPod,直到剩下100个,然后我们开始每90秒将Nginx作业的数量增加100。下图的上半部分显示了这个过程。图中中间是FluidEDL通过减少NginxPods自动启动部分PaddlePaddle进程,后期增加NginxPods杀死PaddlePaddle进程。因此,集群的利用率保持在90%左右,如图所示。关闭FluidEDL后,不会自动增加P??addlePaddle进程,利用率随NginxPod数量波动。PaddlePaddleEDL的设计与实现,上述深度学习服务与其他云服务共享计算资源的过程,动态调整和缩放各个任务的优先级,从而充分利用集群CPU/GPU的过程是如何实现的呢?EDL和HPAHorizo??ntalPodAutoscaling(HPA)是Kubernetes提供的一种弹性调度机制。它的设计出发点是通过将计算资源公平地分配给单个计算任务中的各个Pod,实现分布式系统资源对单个任务的优化利用。但是,我们的训练任务可能是多种多样的(语音、图像等),部署时间可能是第一位的,对资源的需求可能会有所不同。因此,我们希望这种灵活的调度机制能够控制每个训练任务所需的系统资源。有一个全局的了解,然后按需分配。但是HPA控制器还没有实现。同时,HPA的弹性调度是针对同类型计算任务(同构计算任务)下的Pod。然而,深度学习系统中的计算节点和参数服务器往往处于不同类型的Pod中。上述独特的需求导致在使用Kubernetes时需要特定的灵活调度方案,而不是直接使用HPA。所以更好的解决方案是PaddlePaddleEDL。PaddlePaddleEDL的具体设计与实现1.让Kubernetes支持自定义的弹性调度机制Kubernetes本身支持自定义的资源管理机制。用户可以通过提交自定义的资源声明文件和控制器文件,实现对某些Pod的灵活调度。以下图为例。这个training_job.yaml确保控制器将自动监督pservers并确保它们的数量在min-instance和max-instance之间。在Kubernetes集群上,可以使用kubectlcreate-ftraining_job.yaml命令获取此自定义资源。接下来,我们需要一个自定义训练作业控制器来调度此资源。自定义的trainingjobcontroller运行在一个Pod中,对集群资源有统一的理解。它通过KubernetesAPI监控和调度集群资源。下图是训练作业控制器配置文件的示例。在Kubernetes集群上,可以使用kubectlcreate-ftraining_job_controller.yaml命令启动这个自定义资源管理Pod。2.控制程序的实现对于上面提到的自定义资源,Kubernetes中目前有两种实现方式。一种是自定义资源定义(CRD),由Kubernetes1.7版本引入;另一个是第三方资源(TRP)。PaddlePaddle项目目前使用的是Kubernetes1.6版本,所以实现了TRP模式,未来会集成CRD模式。目前PaddlePaddle假设只有一个训练作业控制器在运行。目前的trainingjobcontroller按照如下逻辑管理资源:3.灵活调度算法PaddlePaddle根据自定义资源的配置文件(training_job.yaml)判断一个job是否需要灵活调度,判断标准是最小的培训师和pserver-instance=/max-instance。集群中的GPU调度控制器知道集群中所有GPU的数量和当前空闲GPU的数量,并尝试将所有空闲GPU分配给当前训练任务。PaddlePaddle为需要GPU的训练任务定义了一个“fulfillmentscore”,这个分数的范围是[0,1]。PaddlePaddle会优先将GPU资源分配给满意度最高的训练任务。如果存在分数相同的情况,则分别以GPU需求数、CPU需求数、内存需求数优先。如果某个训练任务的GPUmin-instance不满足(除非cur-instance=min-instance),那么PaddlePaddle会取出一个满足最大score的训练任务中的GPU资源交给它。如果训练任务cur-instance=min-instance满足degreescore***,整个集群将不再执行新的训练任务,新的任务需要等待。集群CPU调度CPU资源分配与GPU相同。控制器知道集群中有多少CPU、内存和负载;它还知道训练任务的CPU要求。同样,CPU资源是根据满意度分数按需分配的。PaddlePaddle容错机制这里讨论PaddlePaddle的容错机制。在分布式训练任务中,如果master进程或者所有参数服务进程挂掉,整个训练任务就会停止,一段时间后由Kubernetes重新启动。如果具体的训练过程没有死掉,则整个训练任务继续进行。PaddlePaddle使用etcd来记录训练过程的状态。etcd是一种高可靠的分布式键值存储。训练进程会定期将自己的状态写入etcd,这些信息会在必要时用于恢复训练进程。具体流程如下图所示:当master进程被Kubernetes启动时,会执行以下操作:从etcd中取一个唯一的master锁,避免存在多个master实例检查etcd中是否有任务队列.如果不存在,则新建一个任务队列;否则,获取这个任务队列中的信息,将自己的ip地址写入etcd中的/master/addrkey中,以便后面的训练过程可以和自己通信,并开一个端口来监控训练过程。需求,如果接收到来自训练进程的任务请求,则从任务队列中分配任务,并更新任务队列。如果master进程因任何原因挂掉,Kubernetes将重新启动它。从重启到获取etcd信息,获取训练进程的任务,这个过程一般需要几分钟。训练过程当训练过程被Kubernetes启动时,它执行以下操作:查看etcd包含参数服务前缀/ps/获取当前参数服务进程的数量,并等待数量达到配置文件中的要求从/master/ofetcd在addrkey中获取master进程的地址向master发起任务请求,根据任务启动训练程序。当训练进程挂掉后,Kubernetes会重启它,新的进程会重复上面的工作,直到新的训练工作开始。参数服务进程当参数服务进程被Kubernetes启动时,会执行以下操作:/1,...)找到一个小于所需进程数但还不存在的id,并在etcd中创建这个条目作为它自己的id。(如下图)当第三个参数服务器加入时:3.参数服务进程会从其对应的etcd路径中找到已有的训练结果参数并读入4.参数服务进程开始接收来自训练进程的请求。PaddlePaddle可视化——PaddlePaddleVisualDLPaddlePaddleVisualDL是PaddlePaddle自带的一个强大的可视化工具,也是一个Web应用套件。PaddlePaddleVisualDL目前支持4种可视化,分别是SCALARS、IMAGES、GRAPHS和HISTOGRAMS。这4个可视化的主要功能如下。●SCALARS:显示训练期间准确度、损失和权重/偏差的变化。●图像:显示训练过程中记录的图像。●GRAPHS:显示模型的数据流图,以及在各个设备上训练所消耗的内存和时间。●HISTOGRAMS:显示训练期间记录的数据的直方图。PaddlePaddleVisualDL通过运行本地服务器侦听端口8080。当浏览器发出请求时,分析训练过程中记录的数据,并在训练过程中绘制图像。此外,VisualDL与ONNX兼容。通过与pythonSDK的结合,VisualDL可以兼容大多数主流DNN平台,包括PaddlePaddle、pytorch、mxnet、Caffe2。Tensorboard目前仅支持Tensorflow、Pytorch、MXNet等,PaddlePaddleVisualDL的可视化界面如下图所示。使用VisualDLVisualDL的使用方法非常简单,只需要以下三个过程:VisualDL的特点VisualDL的特点主要有以下4点:支持Scalar虚线图展示,便于观察训练的整体趋势支持Imageto查看数据样本的质量和训练中间结果支持Histogram查看参数分布展示和变化趋势支持Graph查看深度神经网络模型结构总结随着PaddlePaddle新功能的不断增加,相信能带来很多帮助供用户在科学研究中使用。这里先从PaddlePaddleFluid说起,然后介绍PaddlePaddleCloud,它是在浏览器端训练的,目的是为了更容易使用集群。重点介绍了集群训练的原理、配置和实验结果,即PaddlePaddleEDL部分。***,讲解PaddlePaddleVisualDL,一个非常强大的训练日志解析和可视化工具。
