新一代深度学习框架研究

新一代深度学习框架研究前端

于璠算法

华为技术有限公司,广东 深圳 518000express

摘要:从人工智能的历史出发,简述深度学习发展历程以及目前的挑战,经过介绍新一代深度学习框架的特色,分析整体框架,阐述自动并行、自动微分、自动调优等技术优点以及协同昇腾处理器的性能优点,但愿能够为深度学习技术研究人员提供参考。编程

关键词:人工智能;机器学习 ; 深度学习 ; 计算框架 ; MindSpore后端

论文引用格式:性能优化

于璠.新一代深度学习框架研究[J].大数据, 2020, 6(4):69-80.网络

YU F.Research on the next-generation deep learning framework[J].Big Data Research, 2020, 6(4):69-80.数据结构

1 引言
众所周知,人工智能(artificial intelligence,AI)做为影响普遍的颠覆性基础技术,将对将来各行业的发展产生深远影响。发展人工智能目前已上升到国家战略层面,但人工智能的发展并不是一路顺风。20世纪50年代,人工智能早期的发展极其缓慢,虽然在语音处理和问题求解等方面取得了不俗的表现,但仍存在很大的技术局限性;以后人工智能经历了两轮寒冬,直到20世纪90年代中期,遵循摩尔定律,计算机的运算能力呈指数级增加,各类机器学习算法得以快速验证、训练和应用,从而引起了人工智能的复兴。
1997年,IBM公司制造的深蓝(DeepBlue)计算机系统打败了当时的国际象棋世界冠军卡斯帕罗夫,引发了社会各界对人工智能的高度关注,重燃了人们对人工智能的信心。自此,人工智能的新一波浪潮逐步席卷全球。在本轮人工智能浪潮中,最具价值也最具影响力的一项研究当属深度学习理论。得益于大数据的不断积累和计算机的飞速发展,海量数据解决了神经网络训练的过拟合问题,而高性能的硬件设备使模型训练成为可能。近年来,随着深度学习研究的不断深刻,人们目击了谷歌AlphaGo成功击败人类世界围棋冠军以及包括无人车在内的各项智能技术的蓬勃发展,人们仿佛再一次看到了人工智能赶超人类的但愿。总而言之,人工智能正在逐步改变人类的平常生活模式,并凭借其惊人的效果和迅猛的发展势头,普遍融入各个行业的实际应用中。深度学习的研究和应用在近几十年获得了爆炸式的发展,而且已经在图像识别、语音识别、机器翻译以及游戏等方面取得了巨大的成功。
为了得到更好的性能,深度学习的网络结构日益复杂,网络深度和数据集也日益增大,这给深度学习的计算框架带来了巨大的挑战。但现有的AI计算框架很难兼顾性能和易用性,并且深度学习应用已经从云侧扩展到了边缘和端侧,这对AI计算框架提出了新的挑战,如在保护用户隐私的前提下,让开发者可以实现AI应用在云、边缘和端侧的快速部署,全场景互联互通。所以,全场景的AI计算框架应知足如下3个要求:
● 实时训练或推理;
● 每一个终端使用和训练其私有模型;
● 训练好的模型应能在多样化的硬件平台上运行。
为了更清晰地认识业界现有的计算框架,从易开发、高效执行和全场景3个角度对国外的TensorFlow、PyTorch、MXNet以及国内的PaddlePaddle进行了比较,见表1。
其中,易开发表现为API友好、调试难度低以及额外的自动化属性。高效执行包括计算效率、数据预处理效率和分布式训练效率。全场景指框架同时支持云、边缘以及端侧场景。能够看出,这些训练框架仍然不能知足以前提出的3个要求。所以,须要开发一个覆盖全部场景的深度学习框架,知足实时、专用、多样化的需求。本文详细阐述了笔者团队自研的新一代深度学习框架(MindScope)的架构、技术开发思路、性能优点。架构

新一代深度学习框架研究

2 MindSpore的整体框架
MindSpore是华为技术有限公司推出的新一代深度学习框架,其整体框架分为前端表示层(mind expression,ME)、计算图引擎(graph engine,GE)和后端运行时3层,如图1所示。框架

新一代深度学习框架研究
图1 MindSpore整体框架
2.1 前端表示层
前端表示层向用户提供Python接口,并将用户的Python代码转换为数据流图。该部分包含Python API、MindSpore中间表示(intermediate representation,IR)统一计算图表达、计算图高级别优化(graph high level optimization,GHLO)3个部分。
● Python API向用户提供统一的模型训练、推理、导出接口以及统一的数据处理、加强、格式转换接口。
● MindSpore IR提供统一的计算图表达,MindSpore基于此IR进行pass优化。
● GHLO包含与硬件无关的优化,如高级别优化(high level optimization,HLO) (如死代码消除等)、自动并行和自动微分等功能。
2.2 计算图引擎
计算图引擎负责对与硬件相关的资源进行管理和优化,将平台特有的信息传递给ME。该部分包含计算图低级别优化(graph low level optimization,GLLO)、图执行。
● GLLO包含与硬件相关的优化,即低级别优化(low level optimization,LLO)以及算子融合、缓冲(buffer)融合等与软硬件结合相关的深度优化。
● 图执行提供离线图执行、分布式训练所需的通讯接口等功能。经过图编译将各个算子组织成统一的模型并下发到设备(device)侧,在宿主(host)侧只需一个触发动做便可开启device侧的模型训练,大大减小了host与device在模型训练中的交互次数。而去中心化的梯度聚合归约自动分段融合,根据不一样模型自动生成不一样的融合策略,以提高通讯效率,无中心点的设计能够支持更大的集群规模,下降了集群的开销。
2.3 后端运行时
后端运行时包含云、边、端上不一样环境(CPU、GPU、华为昇腾处理器、Android/iOS)中的高效运行环境。
3 MindSpore的技术开发思路
MindSpore有三大技术优点,分别是自动并行、自动微分、自动调优,这些优点大大提升了深度学习模型的训练效率,同时也极大地方便了AI工程师进行编码和调试。
3.1 自动并行
随着数据集和模型愈来愈大,受限于单卡内存,数据并行遇到了瓶颈,须要混合并行。如今主流框架的作法是经过手动切分网络模型的方式来进行模型并行,手动切分网络模型难度很是大,对开发者的要求很是高,须要专家经验。并且在切分网络模型的同时,又要作数据并行,这极大地提升了开发的复杂度。最近有研究者提出了简化混合并行的方法,但这些方法在切分策略、适用的网络和速度上都存在局限性。
针对上述问题,MindSpore提供了自动并行特性,用于实现自动的数据并行和模型并行的混合并行训练。自动并行示意图如图2所示。

新一代深度学习框架研究
图2 自动并行示意

关键技术开发的核心思路是在并行切分方面打破样本和参数的边界,按算子的输入/输出数据进行维度切分,将算子切分到多个节点执行,进而实现并行。在MindSpore前端编译器中,经过算子切分、整图切分、集群拓扑感知调度、并行切分策略自动搜索等关键技术,实现计算的自动并行。
整图切分是指遍历整个计算图,将每一个算子切分到多设备,相连算子间若是切分策略不一样,则会自动插入一个张量(tensor)进行数据分布重排列,用于衔接两个算子间的计算。
因为节点内卡间通讯的带宽、时延比节点间通讯高,因此集群拓扑感知调度是指将通讯量大的数据维度切分到节点内多卡上,将通讯量小或者对时延、带宽不敏感的维度切分到节点间。
为了进一步帮助用户更加快速地进行并行网络训练,在前面的基础上,引入了并行切分策略自动搜索的特性,主要围绕昇腾910构建代价模型(cost model),进而计算出不一样数据量、不一样算子以及在不一样切分策略下的计算通讯比,而后经过动态规划等算法,自动搜索出在必定内存阈值下性能最优的切分策略。使用这个并行切分策略自动搜索算法,不须要用户指定模型如何切分,MindSpore框架能够实现自动的模型切分。用户只须要一行代码,就能对一个单机的模型作自动的混合并行训练。
样例代码以下。
context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL,device_num=dev_num)
3.2 自动微分
资深的深度学习开发者都知道,手动微分求解的过程不只求导过程复杂,并且结果很容易出错,所以现有的深度学习框架都具备自动微分的特性,能够帮助开发者利用自动微分技术实现自动求导,解决这个复杂、关键的问题。
根据实现原理的不一样,深度学习框架的自动微分分为以谷歌的TensorFlow为表明的图方法、以脸书的PyTorch为表明的运算符重载以及以MindSpore为表明的源码转化(source to source,S2S)方法,自动微分技术路径如图3所示。

新一代深度学习框架研究
图3 自动微分技术路径

图方法实现简单,而且图的数据结构容易进行优化和并行。不过图方法的可编程性一直饱受争议,用户须要理解图的概念和接口(如数据节点、通讯节点、计算节点、数据边、依赖边、引用边等),存在必定的学习成本。而且,在图方法中控制流、高阶导数的表示较为复杂。
运算符重载比较符合用户尤为是研究人员的编程习惯,很受学术界欢迎。不过这种方式须要使用宿主语言(host language)的解释器,而且在使用过程当中须要先运行全部算子,并使用相似磁带(tape)的模式记录运行过程,所以开销比较大,同时这种动态方式也不利于反向性能优化。
MindSpore采用的S2S自动微分技术兼顾了可编程性和性能,一方面它可以与编程语言保持一致的编程体验,另外一方面它是IR粒度的可微分技术,可复用现代编译器的优化能力,性能也更好。
S2S自动微分技术使用了高效易调试的可微编程架构。首先在接口层提供Python编程接口,包括控制流表达,有利于用户快速入门。样例代码以下。
def cost(x,y):return x * (x + y)br/>@mindspore
def test_grad (x,y):
return grad_all(cost)(x,y)
def main():
test_grad (2,1)
第一步:用Python代码定义一个计算图(函数)。
第二步:利用MindSpore提供的反向接口进行自动微分,这一步的结果是一个反向的计算图(函数)。
第三步:给定一些输入,就能获取第一步中的计算图(函数)在给定输入处的导数。
在此样例中,自动微分的结果是图中全部输入的导数。MindSpore的反向接口一样提供选项计算某一个或者一部分输入的导数。
其次,IR粒度的可微分技术可以把用户定义的网络源代码经过解析验证等过程,转化为MindSpore定义的IR,也就是MindSpore IR。在IR的基础上应用IR更变器方法(IR mutator method),最终生成反向代码。在此过程当中也应用了算子融合等技术,进一步提高了反向性能。
MindSpore对控制流的表达如图4所示,包括循环和条件。能够看到代码编程风格与原生Python保持一致,更重要的是MindSpore在生成控制流的反向时不会对循环进行展开,而是在IR基础上进行反向计算,避免了表达式膨胀,从而提高了性能。

新一代深度学习框架研究
图4 MindSpore对控制流的表达

相比其余框架,MindSpore能够下降20%的核心代码量,下降了开发门槛,总体提高50%以上的效率。同时,MindSpore自然支持编译优化,进一步提高了代码运行效率,有效下降了科研工程门槛。
MindSpore图层面的自动微分样例代码以下。
class Net(Cell):
def init(self):
self.w = Parameter(Tensor(np.ones([10])))
def forward(x,y):
return x + y
#定义网络
net = Net()
x = Tensor(np.ones([10]))
y = Tensor(np.ones([10]))
#自动微分推导
gout = grad_all (net)(x,y)
除了图层面的自动微分之外, MindSpore同时支持算子层面的自动微分。在提供深度学习主要网络的算子的同时,MindSpore自带的张量引擎(tensor engine)支持用户使用Python特定领域语言(domain specific language,DSL)自定义算子,而且提供算子级的自动微分接口。经过使用Python DSL,用户能够在Python中自定义算子,如同数学中用公式定义函数同样。而张量引擎的算子自动微分接口能够直接对DSL定义的算子进行微分,正如数学中使用统一的微分符号表示求导同样,这样一来,代码的书写更加简洁直观,更贴近用户的书写习惯。样例代码以下。

def sigmoid(x)
#前向算子的 DSL 实现
from te.lang.cce import vrec,vadds,vexp,vmuls
res = vrec(vadds(vexp(vmuls(x,-1.0)),1.0))
return res
def sigmoid _ad(dout,x)
import te
#前向算子引用
out = sigmoid(x)
#前项算子自动微分后生成反向算子
dx]= te.differentiate(out,[x],dout)
return dx
这里的前项算子是用户用DSL自定义的算子,也是算子级自动微分的求解目标。接下来利用张量引擎提供的反向接口推导出反向算子。对于多输入的算子来讲,反向算子接口能够指定一个或者多个前向算子的输入,而后对这些输入同时进行自动微分计算。另外,与图层面的自动微分不一样,算子级的自动微分额外接收反向图中上一层算子(对应正向图的下一层算子)的微分结果做为输入,而后使用链式法则计算出该层反向算子的结果。数学中高阶导数是经过对函数反复使用微分算子计算获得的,一样,在MindSpore中,用户能够经过对算子反复使用反向接口来计算算子的高阶导数。
MindSpore的算子级自动微分接口不只能够自动生成反向算子,还提供了进一步手动优化导数公式的可能。MindSpore的算子级自动微分功能把算子分割成若干步简单函数的复合运算后,先是利用已知基础函数的导数和求导法则分步求导,而后利用链式法则计算复合函数的导数,最后使用张量引擎内置的数学公式简化器进行化简。这能够知足绝大部分用户对自动微分的须要。可是对于部分有更高性能要求或者代码部署要求的用户,MindSpore提供接口让用户可使用本身优化过的导数公式代替某一步或者若干步自动生成的导数公式。样例代码以下。
def sigmoid _ad_optimized(dout,x)
import te
#前向算子引用
out = sigmoid(x)
#手动调优
def custom_sigmoid_fdiff(out,inputs,grad):
return[out*(1.0–out)]
#利用后生成反向算子
dx]= te.differentiate(out,[x],dout,override={out:([x],custom_sigmoid_fdiff)})
return dx
这里把手动推导的导数公式放入函数custom_sigmoid_fdiff(out,inputs,grad)中,并在自动微分中重载求导过程。那么在保持其余部分自动生成的状况下,自动微分使用custom_sigmoid_fdiff(out,inputs,grad)做为输出(out)对x的导数进行运算。这样MindSpore保持了自动微分反向算子和手动调优反向算子在风格上的统一,方便了图层对算子的调用。
总而言之,MindSpore在支持算子级自动微分的同时,对反向算子进行IR层面的优化,知足了算子开发者自动生成反向算子的需求。同时,MindSpore兼顾了用户对手动调优反向的需求,将自动和手动有机结合,简化了开发流程,提升了代码的可读性和运行效率。
3.3 自动调优
如今AI开发的瓶颈之一是AI的黑盒化,特征提取随机化、调试过程不可视、推理结果无解释,这些问题大大限制了AI技术的可信和普遍应用。
调试调优(mindinsight)的目标是打开AI的黑盒,经过可视化Debugger技术,帮助用户轻松地进行模型调试;利用模型训练过程可视化技术、模型溯源可视化技术、性能调优可视化技术,帮助用户轻松地进行性能和精度调优。MindSpore可视化界面如图5所示。

新一代深度学习框架研究

图5 MindSpore可视化界面

调试调优提供了训练看板,开发者在训练看板中能够总览训练过程当中的数据抽样状况、参数分布变化状况、损失(loss)变化状况,掌握从训练数据到模型参数再到loss变化的整个模型优化过程。训练看板还集成了计算图可视化和数据图可视化功能。计算图可视化功能有助于用户理解模型结构,判断模型结构是否符合预期。数据图可视化功能有助于用户掌握训练数据的处理流程。
调试调优还提供了模型溯源和数据溯源可视化功能。在模型溯源页面,开发者能够方便地比较不一样超参数、不一样数据集等条件下的模型效果,选择模型效果更优的超参数。在数据溯源页面,开发者能够同模型溯源联动,精细分析不一样的数据处理操做对模型效果的影响,选择更合适的数据处理流程。
而使用动静结合的开发调试模式时,开发者能够只开发一套代码,经过变动一行代码,从容切换动态图/静态图调试方式。须要高频调试时,选择动态图模式,经过单算子/子图,方便灵活地开发调试;须要高效运行时,能够切换为静态图模式,对整张图进行编译,经过高效的图编译优化得到高性能。样例代码以下。

定义网络

net = Net()
x = Tensor(np.random.rand(1,1,4,1024).astype(np.float32))

默认使用动态图模式

out = net(x)

切换静态图模式

context.set_context(mode=context.GRAPH_MODE)
综合整体框架和技术优点,能够看出自动微分等特性对MindSpore目标的贡献,见表2。

新一代深度学习框架研究

4 MindSpore的性能测试
4.1 性能卓越
MindSpore经过AI Native执行新模式,最大化地发挥了“端-边-云”全场景异构算力。它还协同华为昇腾芯片,经过On-Device执行、深度图优化、高性能数据处理流水线(pipeline)等多维度达到极致性能,帮助开发者缩短训练时间,提高推理性能。MindSpore协同华为昇腾芯片示意图如图6所示。

新一代深度学习框架研究
图6 MindSpore协同华为昇腾芯片示意

● On-Device执行:整图下沉到device执行,减小host-device交互开销。
● 深度图优化:包括整图的格式转换消除、类型转换消除、算子融合。
● 高性能数据处理pipeline:支持数据加强、全局混洗(shuffle)。
MindSpore协同华为昇腾芯片的实际训练性能数据见表三、表4,其中表3采用的是ResNet-50 v1.5网络,其网络类型为卷积神经网络,采用的数据集为ImageNet2012,MindSpore版本为0.2.0-alpha;表4中采用的是BERT Large网络,其网络类型为Attention,采用的数据集为zhwiki,MindSpore版本为0.2.0-alpha。

新一代深度学习框架研究

新一代深度学习框架研究
4.2 端云协同
MindSpore针对全场景提供一致的开发和部署能力以及按需协同能力,使开发者可以实现AI应用在云、边缘和手机上的快速部署,全场景互联互通,实现更好的资源利用和隐私保护,创造更加丰富的AI应用。MindSpore端云协同框架如图7所示。

新一代深度学习框架研究
图7 MindSpore端云协同框架

MindSpore端云协同框架整合了云侧框架和端侧框架,并打通了自动模型生成、模型压缩、编译优化和端侧学习的全流程。
● MindSpore提供了神经架构搜索(neural architecture search,NAS)能力,用于自动化生成模型,构建模型库。
● MindSpore模型压缩模块用于对模型库中的模型进行剪枝和量化。
● MindSpore提供了编译优化能力,用于转换和优化模型,并经过神经处理单元(neural-network processing unit,NPU)、图形处理单元(graphics processing unit,GPU)等加速算子执行。
注:以上数据基于华为云AI开发平台ModelArts测试得到,是训练过程总体下沉至Ascend 910 AI处理器执行所得的平均性能。
注:以上数据基于华为云AI开发平台ModelArts测试得到,其中网络包含24个隐藏层,句长为128个token,字典表包含21 128个token。
MindSpore端云协同框架具备如下特性。
● 快速多处部署。在实际场景中,模型须要快速适配不一样机型硬件。经过神经架构搜索技术构建多元化的模型库,适配多种机型。针对特定应用场景,从模型库中搜索知足性能约束的模型,拿来即用,无须从新训练。
● 全栈性能优化。结合神经架构搜索、模型压缩(剪枝、蒸馏、量化)、编译优化(算子融合、常量折叠、硬件加速)等手段优化模型精度、大小、时延,追求极致性能。
● 灵活而且易用。支持多种策略组合使用,如模型生成、模型压缩和编译优化能够灵活组合;打通云到端全流程,集中管理全流程策略和配置,方便使用。
● 多种学习形态。MindSpore端云协同框架逐步支持多种学习形态,例如支持当前业界经常使用的端侧推理形态,并逐步支持迁移学习、联合学习等须要端侧训练能力的高级学习形态,知足开发者各类各样的场景需求。
5 结束语
深度学习现已成为人工智能发展重要的方向之一,已经深入地改变了诸多应用领域,其中广为人知的领域包括自动语音识别、图像识别、天然语言理解以及不少其余交叉领域(如医疗、生物、金融等),并将在愈来愈多的领域取得成功。本文经过研究人工智能发展历史认识到深度学习的价值和影响力,介绍了新一代深度学习框架MindSpore的框架、技术开发思路和性能优点,但愿能够为深度学习技术研究人员提供参考。
致谢
感谢整个华为MindSpore团队的贡献。MindSpore已开源,可在相关网站下载。

做者简介

于璠(1980-),男,博士,华为技术有限公司AI计算框架的创新和生态架构师,曾主导华为云计算资源调度、SDN大规模路由等架构和算法的设计,发表专利30余篇 。

相关文章
相关标签/搜索