机器之心编辑部
11月5日,在Wave Summit+2019深度学习开拓者峰会上,飞桨全新发布和主要升级了最新的21项进展,在深度学习开拓者社区引起了巨大的反响。机器之心现场亲历了发布会的全部环节,并且在
《半年21项全新发布和升级,百度飞桨团队「码力」全开》

这篇文章中作了详细先容,再次引发国货当自强的评论。
很多未到场的开拓者以为遗憾,希望可以理解飞桨发布会背后的更多技能细节。机器之心策划了一个系列稿件,分别从核心框架、根本模型库、端到端开拓套件、工具组件和做事平台五个层面分别详细解读飞桨的核心技能与最新进展,敬请关注。
本日给大家带来的是飞桨系列解读文章之核心框架揭秘,本文对飞桨最主要的核心框架的进行解读,公布了大量宝贵的资料内容,很多飞桨核心框架的关键性内容属于首次深度解读。
飞桨全景图,本文紧张针对核心框架部分进行深度解读。 第一部分,首先看一下最新版本核心框架的主要升级:
本次核心框架主要升级1.1.开拓-易用性提升
用户体验和易用性专项提升,包含全面的文档优化、报错信息优化、配置项优化、接口优化、编译优化、多平台支持以及编程易用性提升等各方面。
1.2.演习-速率优化
演习框架进一步优化了速率,完善了显存优化机制,并支持在框架外部自定义C++/CUDA OP。新增了大量OP,并从多个维度优化了大量存量OP,包括兼容性、行为同等性、功能提升等方面。分布式演习新增LocalSGD、GEO-SGD等策略,大规模同步演习、异步演习速率连续提升,并支持K8S + Volcano任务提交。1.3.预测-支配能力强化
发布Paddle Lite 2.0,定位高性能、多平台、轻量化的端侧预测引擎,并可作为做事器端预测库的加速库。PaddleSlim强化了量化演习功能,增加了基于硬件的小模型搜索功能。从Release note中可以看到,本次的升级点还是比较多的。而且从字里行间也可以看得出,每一个几十字的点,背后实在是非常重的事情量。但是毕竟短缺细节,我们再来详细解读一下发布会PPT的重点内容。
飞桨核心框架升级重点图文解读2.1.核心框架易用性的全面提升
本次发布,核心框架在易用性方面全面提升。首先是算子的全面性,对付任何一个算法,基本算子库是根本,对付完善和全面性都有很高的哀求。飞桨通过这次新版本的发布,基本上可以担保支持全部AI主流领域的模型。 其次是API接口的升级,这里有两个层面:一是数据层,飞桨本次升级把IO的接口做了非常全面的梳理和进一步的呈现,易用性大幅提升。二是分布式演习的易用性。在单机上开拓好的算法,在演习时面对非常大规模数据时须要进行分布式演习,代码也须要调度,对付不理解分布式演习的开拓者困难很大。通过本次发布,只须要新增5行代码再加上对付实行语句的少量修正,就可以把单机版改成分布式并行演习。
末了,根据开拓者持续以来的反馈,飞桨不断的完善文档的内容,并且供应中英双语文档。本次发布,飞桨在中文的文档上进行了非常多的升级和完善,本着打造艺术品的标准来打磨API文档。可以为开拓者供应更清晰,有示例,乃至有时候会得到一些灵感的文档。 2.2.分布式演习的高性能
分布式演习的高性能,是飞桨的核心上风技能之一,这也与飞桨本身便是源于大数据的家当实践分不开的,在CPU和GPU方向分布式性能都有很好的性能上风。 通过GPU分布式演习下的Benchmark,可以看到在8x8 v100硬件条件下,比较其他主流实现可以得到20%-100%的速率提升。
通过多机分布式CPU演习Benchmark比较,基于飞桨自研的高性能异步演习算法Geo-SGD,可以看到分布式演习在Word2Vec和CTR任务中,飞桨吞吐量最大可达对标产品的6倍以上。
同时飞桨与英特尔也开展密切互助,在最新的英特尔至强可扩展处理器上,在担保精度基本不变的情形下,通过INT8的量化演习,性能的提升也能达到2到3.7倍,非常适宜实际业务利用。
2.3.打通端到真个支配全流程
除了开拓的易用性和演习的高性能,飞桨在打通端到端支配方面,也发布了一些最新进展。
从全体端到端支配涉及到的事情内容上看,须要做的事情还是非常多的,首先便是要适配不同的硬件。在最新的版本里面,飞桨新增了对付华为NPU的适配,以及对付边缘设备上FPGA的适配。后续还会进一步发布跟寒武纪和比特大陆适配,敬请期待。
从全体打通端到端支配的流程来看,在搭建模型和演习模型之后,会根据支配环境的特点,对模型做压缩处理,其目标包括压缩模型存储体积和提升推理速率。目前针对移动设备端环境常见的一个常用且比较成熟的压缩策略是INT8量化,该方法可以大幅压缩模型的体积,并提升预测效率。
飞桨在上一个版本已经支持了剪枝、量化、蒸馏等压缩方法。这次的升级重点是优化和增强自动化网络构造设计,我们直接把候选模型在详细硬件上的推理速率作为搜索的一个约束条件。基于这种策略,搜索到的模型可能更好的适配目标硬件,在担保精度的情形下得到更多的速率收益。在ImageNet1000类分类任务上,通过Light-NAS搜索到的模型,精度无损,在某款移动端硬件上的实际推理速率提升了20%。除了模型压缩策略增强之外,PaddleSlim通过打通检测库供应了更丰富的模型支持,同时担保了压缩产出的模型支持用PaddleLite直接支配。 理解完PaddleSlim的升级点之后,Paddle Lite 2.0版本也是正式发布。紧张特点:
一是非常高的易用性。在移动端开拓运用程序或者是在边缘设备上开拓运用程序涉及到非常多的设备环境的连调事情,Paddle Lite里面供应大量的示例代码,以及操作的指南,方便大家能够快速的去实现在不同的设备场景上进行支配。 二是非常广泛的硬件支持。Paddle Lite目前已经支持了8种主流的硬件,同时还支持华为的NPU和边缘设备的FPGA。而且Paddle Lite全体架构设计非常便于新硬件的扩展。新的硬件适配,只要去Paddle Lite里面新增这个硬件干系的Kernel就可以了,与框架代码是高度解耦的。可以非常便捷的适配新硬件。 三是性能上风。Paddle Lite一个非常显著的上风是在性能方面处在领先状态。性能的上风不仅仅是在FP32这种场景下,尤其是在现在移动端已经广泛遍及的INT8上,领先上风会更加明显。
比拟不同的推理框架利用MobileNetV1在ARM-v8上面推理延时,在FP32上大家可以看到,Paddle Lite 2.0已经具备全面领先的上风。而右侧INT8的条件下,性能上风更加显著。在真正的移动端下的推理场景,真正达到的性能的上风对付实际的运用是至关主要的,时延上的上风直接关系到终极开拓产品的用户体验。
飞桨核心框架技能完全公开解读飞桨深度学习框架核心技能,紧张包括前端措辞、组网编程范式、核心架构、算子库以及高效率打算核心五部分。3.1.核心架构
飞桨核心架构采取分层设计,如图3所示。前端运用层考虑灵巧性,采取Python实现,包括了组网 API、IO API、OptimizerAPI和实行 API等完备的开拓接口;框架底层充分考虑性能,采取C++来实现。框架内核部分,紧张包含实行器、存储管理和中间表达优化;内部表示方面,包含网络表示(ProgramDesc)、数据表示(Variable)和打算表示(Operator)几个层面。框架向下对接各种芯片架构,可以支持深度学习模型在不同异构设备上的高效运行。
3.2.关键技能(1)前端措辞
为了方便用户利用,选择Python作为模型开拓和实行调用的紧张前端措辞,并供应了丰富的编程接口API。Python作为一种阐明型编程措辞,代码修正不须要重新编译就可以直接运行,利用和调试非常方便,并且拥有丰富的第三方库和语法糖,拥有浩瀚的用户群体。同时为了担保框架的实行效率,飞桨底层实现采取C++。对付预测推理,为方便支配运用,则同时供应了C++和Java API。(2)组网编程范式飞桨中同时兼容命令式编程(动态图)与声明式编程(静态图)两种编程范式,飞桨以程序化“Program”的形式动态描述神经网络模型打算过程,并供应对顺序、分支和循环三种实行构造的支持,可以组合描述任意繁芜的模型,并可在内部自动转化为中间表示的描述措辞。“Program”的定义过程就像在写一段通用程序。利用声明式编程时,相称于将“Program”先编译再实行,可类比静态图模式。首先根据网络定义代码布局“Program”,然后将“Program”编译优化,末了通过实行器实行“Program”,具备高效性能;同时由于存在静态的网络构造信息,能够方便地完成模型的支配上线。而命令式编程,相称于将“Program”阐明实行,可视为动态图模式,更加符合用户的编程习气,代码编写和调试也更加方便。飞桨后面会增强静态图模式下的调试功能,方便开拓调试;同时提升动态图模式的运行效率,加强动态图自动转静态图的能力,快速完成支配上线;同时更加完善接口的设计和功能,整体提升框架易用性。
(3)显存管理
飞桨为用户供应技能领先、大略易用、兼顾显存回收与复用的显存优化策略,在很多模型上的表现优于其他开源框架。
显存分配机制:原生的CUDA系统调用(cudaMalloc)和开释(cudaFree)均是同步操作,非常耗时。为了加速显存分配,飞桨实现了显存预分配的策略,详细办法如图4所示。设置一个显存池chunk,定义其大小为chunk_size。若分配需求requested_size不超过chunk_size,则框架会预先分配chunk_size大小的显存池chunk,并从等分出requested_size大小的块返回。之后每次申请显存都会从chunk等分配。若requested_size大于chunk_size,则框架会调用cudaMalloc分配requested_size大小的显存。chunk_size一样平常依据初始可用显存大小按比例确定。同时飞桨也支持按实际显存占用大小的动态自增长的显存分配办法,可以更精准地掌握显存利用,以节省对显存占用量,方便多任务同时运行。
显存垃圾及时回收机制
显存垃圾及时回收机制GC(Garbage Collection)的事理是在网络运行阶段开释无用变量的显存空间,达到节省显存的目的。GC策略会积攒一定大小的显存垃圾后再统一开释。GC内部会根据变量占用的显存大小,对变量进行降序排列,且仅回收前面知足占用大小阈值以上的变量显存。GC策略默认生效于利用Executor或Parallel Executor做模型演习预测时。
Operator内部显存复用机制Operator内部显存复用机制(Inplace)的事理是Operator的输出复用Operator输入的显存空间。例如,数据整形(reshape)操作的输出和输入可复用同一片显存空间。Inplace策略可通过构建策略(BuildStrategy)设置生效于Parallel Executor的实行过程中。(4) 算子库
飞桨算子库目前供应了500余个算子,并在持续增加,能够有效支持自然措辞处理、打算机视觉、语音等各个方向模型的快速构建。同时供应了高质量的中英文文档,更方便国内外开拓者学习利用。文档中对每个算子都进行了详细描述,包括事理先容、打算公式、论文出处,详细的参数解释和完全的代码调用示例。 飞桨的算子库覆盖了深度学习干系的广泛的打算单元类型。比如供应了多种循环神经网络(Recurrent Neural Network,RNN),多种卷积神经网络(Convolutional Neural Networks, CNN)及干系操作,如深度可分离卷积(Depthwise Deparable Convolution)、空洞卷积(Dilated Convolution)、可变形卷积(Deformable Convolution)、池化兴趣区域池化及其各种扩展、分组归一化、多设备同步的批归一化,其余涵盖多种丢失函数和数值优化算法,可以很好地支持自然措辞处理的措辞模型、阅读理解、对话模型、视觉的分类、检测、分割、天生、光学字符识别(Optical Character Recognition,OCR)、OCR检测、姿态估计、度量学习、人脸识别、人脸检测等各种模型。飞桨的算子库除了在数量上进行扩充之外,还在功能性、易用性、便捷开拓上持续增强:例如针对图像天生任务,支持天生算法中的梯度惩罚功能,即支持算子的二次反向能力;而对付繁芜网络的搭建,将会供应更高等的模块化算子,使模型构建更加大略的同时也能得到更好的性能;对付创新型网络构造的需求,将会进一步简化算子的自定义实现办法,支持Python算子实现,对性能哀求高的算子供应更方便的、与框架解耦的C++实现办法,可使得开拓者快速实现自定义的算子,验证算法。(5)高效率打算核心
飞桨对核心打算的优化,紧张表示在以下两个层面。
Operator粒度层面飞桨供应了大量不同粒度的Operator(Op)实现。细粒度的Op能够供应更好的灵巧性,而粗粒度的Op则能供应更好的打算性能。飞桨供应了诸如softmax_with_cross_entropy等组合功能Op,也供应了像fusion_conv_inception、fused_elemwise_activation等领悟类Operator。个中大部分普通Op,用户可以直接通过Python API配置利用,而很多领悟的Op,实行器在打算图优化的时候将会自动进行子图匹配和更换。
核函数实现层面飞桨紧张通过两种办法来实现对不同硬件的支持:人工调优的核函数实现和集成供应商优化库。针对CPU平台,飞桨一方面供应了利用指令Intrinsic函数和借助于xbyak JIT汇编器实现的原生Operator,深入挖掘编译时和运行时性能;另一方面,飞桨通过引入OpenBLAS、Intel® MKL、Intel® MKL-DNN 和nGraph,对Intel CXL等新型芯片供应了性能担保。针对GPU平台,飞桨既为大部分Operator用CUDA C实现了经由人工精心优化的核函数,也集成了cuBLAS、cuDNN等供应商库的新接口、新特性。注:以上核心框架解读部分内容已经正式揭橥在中英文期刊《数据与打算发展前沿》(CN 10-1649/TP,ISSN 2096-742X) 本文对付飞桨核心框架的深度解读,也是飞桨全新发布完全解读的系列文章之(一),后续还会连续推出五篇系列文章,敬请期待。 想与更多的深度学习开拓者互换,请加入飞桨官方QQ群:796771754。如果您想详细理解更多飞桨PaddlePaddle的干系内容,请参阅以下文档。
官网地址:https://www.paddlepaddle.org.cn/核心框架:https://github.com/PaddlePaddle/Paddle分布式演习:https://github.com/PaddlePaddle/FleetPaddleLite:https://github.com/PaddlePaddle/Paddle-LitePaddleSlim:https://github.com/PaddlePaddle/models/tree/release/1.6/PaddleSlim