开源深度学习框架发展现状与趋势研究

2018-06-27 10:44
互联网天地 2018年4期
关键词:工具包张量开源

□ 文 庞 涛

一、概述

浅层学习起源上世纪20年代人工神经网络的反向传播算法(Back-Propagation)的发明,这时候的人工神经网络算法也被称为多层感知机MLP(Multiple Layer Perception),但由于多层网络训练困难,通常都是只有一层隐含层的浅层模型。Hinton在2006年提出了神经网络Deep Learning算法,它是传统神经网络(Neural Network)的发展,两者采用了相似的分层结构,但是深度学习采用了不同的训练机制,具备强大的表达能力。

深度学习是机器学习的第二次浪潮,除了学术界,国内外产业巨头也纷纷意识到通过开源技术建立产业生态是抢占产业制高点的重要手段,因此各种开源深度学习框架也层出不穷,按照开源面世的大致时间顺序排列,包括Theano(2012年以前)、Caffe(2013年底)、Torch(2014年)、DeepLearning4J(2014年)、TensorFlow(2015年)、Keras(2015年)、Neon(2015年)、Chainer(2015年)、CNTK(2016年初)、MXNet(2016年)、PaddlePaddle(2016年)、PyTorch(2017年初)、Caffe2(2017年)等,已有研究对部分框架进行研究,但是技术发展日新月异,有必要对相关技术持续跟踪。

本文关注深度学习开源框架的技术、应用、开源社区生态发展现状,在第2节选择部分主流框架从开发者、技术路线、应用场景、发展策略等多角度展开综合论述,在第3节从技术生态角度分析了开源框架的现状,并在第4节总结深度学习框架的发展趋势,最后给出全文小结。

二、开源框架

(一)Caffe和Caffe2

在Caffe出现之前,深度学习领域缺少一个完全公开所有代码、算法和各种细节的框架。Caffe是贾扬清在美国伯克利大学在读博士期间开发的深度学习框架,目前由伯克利大学主导,完全开源。

Caffe主要的代码由C++语言实现,并且提供了Python Layer来方便实现算法原型。Caffe给出了模型的定义、最优化设置以及预训练的权重,该框架只能够使用卷积网络,用户可以使用Caffe提供的各层类型来定义自己的模型。Caffe中定义了三种基本结构,包括:数据容器Blobs,用来存储、传递、处理数据;Layers,是Caffe模型运算的基本单元,内置了卷积、聚合、内积、阶跃、正则化、损失计算等基本算法;Nets,Nets是由一系列Layer及其连接组合形成的网状图。Caffe一开始主要是为图像领域的应用所设计,特别适合图像分类的应用场景,所以在其他更加一般的机器学习、语音识别等问题上,Caffe的框架并不一定是最优的。

图1 Caffe与Caffe2的主要区别

贾杨清博士入职Facebook之后,Facebook很快推出了Caffe2,这是一个跨平台的新型工业级深度学习框架,在移动端、服务器端、物联网设备、嵌入式系统都能部署Caffe2训练的模型。Caffe2最大的特点就是轻量、模块化和扩展性,与Java有类似的特点:一次编码,到处运行。Caffe2支持多GPU和多主机分布式计算,可使用英伟达基于GPU计算的深度学习SDK库(cuDNN、cuBLAS和NCCL)来实现高性能的训练和推理。Caffe2采用了计算图(Computation Graph)来表征神经网络或者包括集群通信和数据压缩在内的其它计算,其基本计算单位是用算子(Operator)取代了Caffe中的Layer作为Nets的基本构造单位,每个算子都包含了计算输出所必需的逻辑,在给定输入的数量、类型以及参数后,可计算得到输出结果。目前,Caffe2已经定义了超过500个算子。Caffe与Caffe2的主要区别如图1所示。

目前,Caffe和Caffe2的开源社区都很活跃,尽管Caffe2出现较晚,但是发展势头迅猛,在Caffe2与PyTorch合并之前,Caffe2项目的贡献者和代码提交次数已经直逼Caffe项目。出于减少维护成本、提高开发者效率等综合考虑,Facebook在2018年4月将Caffe2与PyTorch开源项目进行了整合,Caffe2的代码已经全部并入PyTorch。

(二)TensorFlow

TensorFlow由谷歌大脑研发团队开发,前身为谷歌第一代专有的机器学习系统DistBelief,之后不断简化和重构使其变成一个更快、更健壮的应用级别代码库,形成了TensorFlow。TensorFlow既是一个实现机器学习算法的接口,也是执行机器学习算法的通用框架。

在TensorFlow的实现中,机器学习算法被表达成图,计算过程就是张量(Tensor)沿着计算图传递闭包完成张量互相转化流动(Flow)的过程,其中张量定义了计算的规则而不保存计算的数据,是构建计算图不可或缺的重要组成部分。计算图中各个节点的输入输出计算过程为一组操作(Operation),节点会有零到多个输出,每个算子都会有属性,所有的属性都在建立计算图的时候被确定下来。

如图2所示,以C语言API为界,系统分为前端和后端两部分,前端支持Python、C++、Go、Java等多种开发语言,提供统一的编程模型构造计算图,通过会话(session)的形式,连接后端的程序运行环境(Runtime)启动计算图的执行过程;后端的核心以张量为处理对象,依赖网络通信和设备内存分配,实现了张量的各种操作和计算。

由于Google强有力的支持,TensorFlow开源之后大受欢迎,是开源社区最受欢迎的深度学习工具。TensorFlow具有良好的跨平台的特性,在其上实现的算法支持移植到Android手机、iPhone、PC服务器、大规模GPU集群等众多异构系统,为了进一步支持移动设备,减少模型体积、提升运算速度,还相继推出了TensorFlow Mobile和TensorFlow Lite,为安卓手机人工智能的生态进行布局。

(三)MXNet

MXNet主要是由卡内基梅隆大学(CMU)李沐博士牵头开发,博士期间,李沐等人在Github上创建了深盟(DMLC)的组织。MXNet是DMLC最初两个项目名称(Minerva和CXXNet)的组合。

在MXNet的架构中(图3),从上到下分别为各种主语言的嵌入,编程接口(矩阵运算,符号表达式,分布式通讯),两种编程模式的统一系统实现,以及多种硬件和操作系统的支持。整个系统全部模块化,有极小的编译依赖,适合快速开发。

图2 TensorFlow架构图

图3 MXNet的系统架构

MXNet使用Cpython将C++和Python语言绑定,MXNet支持命令式(类似Torch)和声明式(类似TensorFlow)两种编程模式API,并且MXNet将两种模式结合起来,在命令式编程上MXNet提供张量运算,而声明式编程中MXNet支持符号表达式,用户可以根据需要自由选择。同时,MXNet提供多语言的API接口,包括Python、R、Julia、C++、Scala、Matlab、Javascript等,并支持在Android或iOS系统上编译。在MXNet中,所有的任务,包括张量计算、symbol执行、数据通讯等都会交由引擎来执行。KV Store负责进行分布式的训练。

MXNet正式加入Apache以后,推出了MXNet 0.11版本,加入了动态图接口Gluon。Gluon学习了Keras,Chainer和PyTorch的优点,并加以改进,接口更简单,支持静、动态图混用,比PyTorch速度更快。

包括亚马逊、Apple、Samsung、微软等MXNet开源社区的成员已展开合作,将MXNet技术应用到自家产品,例如亚马逊、微软等公有云平台支持部署MXNet和Gluon深度学习框架,苹果发布了将使用MXNet构建的机器学习模型转换为苹果Core ML格式的工具等。

(四)Torch和PyTorch

Torch是由卷积神经网络之父Yann LeCun领导开发的框架,于2014年开源,曾是Facebook和Twitter主推的一款开源深度学习框架,Google和多个大学研究机构也在使用Torch。大名鼎鼎的Alpha Go便是基于Torch开发的,只不过在Google开源TensorFlow之后,Alpha Go迁移到了TensorFlow上。

在Torch中有命名空间为“nn”的神经网络工具包,Torch中的模块(Module)是构建神经网络的基石,而且模块本身也是神经网络,它可以和其他网络借助容器(Container)构建出更复杂的神经网络。最新的Torch7版本使用了多GPU及并行运算包。Torch后台以C语言写成,但前台交互界面采用了Lua语言和即时编译(LuaJIT),相对小众,导致了Torch推广的困难。

随着Python语言在机器学习领域的大热,Torch的开发团队开源了PyTorch,已发展的Torch7版本不再进行功能性的更新。

PyTorch的出现不仅是为了支持流行语言而对Torch进行简单的包装,PyTorch具有轻巧的框架,底层采用张量计算引擎,集成多种加速SDK,如面向深度神经网络的英特尔数学核心函数库(MKL-DNN)、英伟达的CuDNN和NCC来加速计算。在其核心,它的CPU和GPU Tensor与神经网络后端(TH、THC、THNN、THCUNN)使用C99 API被编写成了独立的库。

PyTorch由4个主要包装组成:

Torch:类似Numpy的通用数组库,可以在将张量类型转换为(torch.cuda.TensorFloat)并在GPU上进行计算。

torch.autograd:用于构建计算图形并自动获取渐变的包。

torch.nn:具有共同层和cost函数的神经网络库。

torch.optim:具有通用优化算法(如SGD,Adam等)的优化包。

PyTorch提供了高层的神经网络模块。对于常用的网络结构,如全连接、卷积、RNN等。同时,PyTorch还提供了常用的目标函数、optimizer及参数初始化方法。

在Facebook内部,PyTorch用于所有的研究项目,Caffe2用于所有的产品项目。目前,在开源项目端Caffe2已被并入PyTorch项目,足见PyTorch强大的生态魅力。

(五)微软认知学习工具包

微软认知学习工具包(Cognitive Toolkit,CNTK)是由微软研究院发布的一个产品级别的、开源深度学习库(框架),在语音识别领域的使用尤其广泛。

认知学习工具包使用向量运算符的符号图(symbolic graph)网络,支持如矩阵加、乘或卷积等向量操作。此外,认知学习工具包有丰富的细粒度的网络层构建,认知学习工具包设计是性能导向的,在CPU、单GPU、多GPU,以及GPU集群上都有不错的表现。它的另一个重要特性就是拓展性,认知学习工具包除了内置的大量运算核,允许用户定义他们自己的计算节点,支持高度的定制化。构建块(操作)的细粒度使用户不需要使用低层次的语言就能创建新的复杂的层类型。

Cognitive Toolkit 2.0版本支持在Windows和Ubuntu Linux环境下自动部署,但是不支持MacOS系统。2.0组件可以处理来自Python,C++或BrainScript的多维密集或稀疏数据。认知工具包包括各种各样的神经网络类型,FFN,CNN,RNN/LSTM,批次标准化等。它支持强化学习、生成对抗网络、监督和非监督学习、自动超参数调整,以及从Python添加新的用户定义的核心组件在GPU上运行的能力,能够在多个GPU和机器上并行运行。另外,还增加了对压缩模式的支持,在压缩模式下框架可以更容易地在低功耗的边缘设备进行部署,从而扩大机器学习的应用范围。

图4 PaddlePaddle分布式架构

在深度学习领域微软致力于模型的标准化互通,微软与亚马逊联手推出了Gluon API,CNTK也是最早支持ONNX(the Open Neural Network Exchange)格式的框架之一。目前,开源社区还在不断集成CNTK新的功能,CNTK2.0以上版本甚至支持Keras的前端,可使用Tensorboard作为其可视化调试工具。

(六)PaddlePaddle

PaddlePaddle是百度自主研发的深度学习平台,来自于百度深度学习研究院(IDL),是由徐伟博士带领十人左右小而美的团队开发的,不涉及业务的代码均已经在2016年开源。

PaddlePaddle采用PServer和Trainer的架构,如图4所示,在多机并行架构中数据分配到不同节点,图中灰色部分表示机器,方框里表示一个进程,PServer和Trainer是分布在两个进程里,中间是网络通讯连接,底层通信不依赖于任何其它网络框架。这种架构天生支持CPU/GPU的分布式模式,就算没有GPU也可以通过分布式CPUs进行大数据的深度学习。

PaddlePaddle支持的Layer类型丰富,FCN、CTC、BN、LSTM等悉数在列;同时也支持从一步一步的数学运算操作(OP)开始配深度学习网络(矩阵乘发,加法,激活等);对于成型的Layer(LSTM)使用C++重新优化。PaddlePaddle是企业解决现有问题的框架,不是纯粹的科研框架;企业需要性能,也需要灵活性。

百度是搞深度学习比较早的公司,Paddle系统在内部已经使用多年,为凤巢等数十个业务提供支持,技术成熟,PaddlePaddle开源社区也比较活跃。

(七)其他

Theano由蒙特利尔大学算法学习人工智能实验室(MILA)维护。支持快速开发高效的机器学习算法,在BSD协议下发布。Theano开创了将符号图用于神经网络编程的趋势。Theano的架构如同一个黑箱,整个代码库和接口使用Python,其中C/CUDA代码被打包成Python字符串,这使得开发人员很难调试和重构。Theano是很好的学术研究工具,在单个CPU上运行的效率比TensorFlow更有效。然而,在开发和支持大型分布式应用程序时,使用Theano可能会遇到挑战。

表1 各个开源框架在GitHub上2018年4月的数据统计

Deeplearning4J(DL4J)是用Java和Scala编写的Apache2.0协议下的开源、分布式神经网络库。DL4J最初由SkyMind公司的Adam Gibson开发,是唯一集成了Hadoop和Spark的商业级深度学习网络,支持YARN(Hadoop的分布式应用程序管理框架)和任意芯片数的GPU并行运行,通过Hadoop和Spark协调多个主机线程。DL4J使用Map-Reduce来训练网络,同时依赖其它库来执行大型矩阵操作。DL4J支持多种深度网络架构:RBM、DBN、CNN、RNN、RNTN和LTSM等。DL4J还支持矢量化库Canova。

Keras由Python编写,实现对TensorFlow、Theano的API封装,微软认知工具包也在2.0版本增加了Python API Keras功能,Keras 2 API更是作为TensorFlow框架的一部分直接向用户提供支持,因此,严格意义上Keras不算是深度学习框架,作为深度学习框架的前端更合适。

Chainer由日本的深度学习创业公司Preferred Networks开源,是一个基于Python的独立的深度学习框架。Chainer通过支持兼容Numpy的数组间运算的方式,提供了声明神经网络的命令式方法。Chainer使用“边运行边定义”的方法将“定义计算图”和“输入训练数据并计算损失函数”两个步骤合并,计算图不是在训练之前定义的,而是在训练过程中获得的。Chainer还包括一个名为CuPy的基于GPU的数值计算库。

其他还有众多开源的机器学习框架,如Neon、DyNet、BigDL等,限于篇幅,文章不再介绍。

(八)主流开源框架对比

表1为各个开源框架在GitHub上2018年4月的数据统计,可以看到TensorFlow是目前热度最高的深度学习开源框架。

图5 TensorFlow开源技术生态工具集

也有研究文献对部分框架进行了性能上的比对,所有的框架基于GPU都可以获得较大的性能提升,但是框架之间的性能差异并不显著。

三、技术生态

(一)TensorFlow生态工具

谷歌的生态圈和战略为TensorFlow提供了丰富的资源、完整的原型工具,以打造强大的技术生态,这样能让谷歌从底层到上层拥有绝对控制权,像安卓一样,用户只要在上层做应用开发,底层全交给谷歌完成。TensorFlow技术生态相关的工具如图5所示。

围绕TensorFlow的技术生态工具集从上至下可分为四大类:

第一类通过使用TensorFlow设计,构建和训练神经网络更容易,包括预建的或预训练的深度神经网络,用于跟踪训练进度的图形界面(TensorBoard)以及TensorFlow(Keras)的更高级别API。

第二类包含可以预判行为并易于管理的工具。

第三类是用于连接到其他流行的开源项目,如Hadoop、Spark、Docker和Kubernetes等,以及与之交互的组件。

最后一类是减少训练深度神经网络的时间和成本的技术和硬件设施。在深度学习技术生态圈中,英伟达公司为众多机器学习框架提供了GPU硬件加速,但是Google研发的TPU(张量处理单元)已经让谷歌不依赖于GPU,愈发显示谷歌在人工智能领域的领先地位。

(二)其他联盟

鉴于深度学习框架技术的重要性,其他各大厂商也纷纷自立门户,于是出现了Facebook的Caffe2和PyTorch、亚马逊的MXNet、微软的认知工具包等,但是无论哪一家,相比TensorFlow在生态工具的完整性、易用性、跨平台等方面总有欠缺,而且众多的框架训练出来的模型不能通用,事实上造成了深度学习框架的“碎片化”。

为了避免谷歌TensorFlow的一家独大,解决深度学习框架模型兼容性,Facebook、微软等企业牵头推出了开放神经网络交换格式(ONNX),可使模型在不同框架之间进行转移,以方便各个深度学习框架之间模型的迁移,目前ONNX已经得到AMD、ARM、华为、IBM、英特尔、高通等厂商支持。

苹果公司专注于移动终端上的深度学习,推出了移动设备上的机器学习编程框架Core ML,Core ML只支持在设备上使用模型推断,而不是训练新模型。苹果自研转换器工具支持Caffe、Keras、MXNet、LIBSVM、scikit-learn和XCBoost等模型的转换。

四、发展趋势

国内外产业巨头已经纷纷意识到在人工智能领域通过开源技术建立产业生态,是抢占产业制高点的重要手段,开源深度学习技术框架是产业链中重要的一环。通过深度学习平台的开源化,可以扩展技术应用领域,深度影响人工智能全产业链。

开源深度学习框架的快速发展既有工业界的推动,也有学术界的贡献,工业界追求“how”,学术界重在“why”。从多个主流框架发展历程来看,学术界培养出来的高端人才是推动深度学习框架技术的发展的核心力量。

当前,开源深度学习框架百家争鸣,TensorFlow虽然热度较高,但也没有强大到一统天下的地步,未来开源深度学习框架分庭抗争的形势将长期存在,对于各个框架训练出来的模型进行标准化互通将是业界努力的方向。

各类云服务平台已经开始引入AI服务能力,面对众多的框架技术选择,云平台一般采用支持多种框架技术的方式,为各类型终端提供跨平台的云端模型训练和推断服务。

TensorFlow、MXNet、Caffe2等均支持ARM架构,未来,随着物联网和5G通信技术的发展,云和终端的无缝融合、深度学习嵌入到移动设备、学习框架向终端侧延伸、边缘计算参与训练和推断等都将是可能的技术发展方向。

五、结束语

本文介绍了主流开源框架技术的发展现状和趋势。当前,TensorFlow作为主流深度学习框架热度最高的技术,是国内安卓生态圈内用户必需跟进的深度学习框架,同时,为避免被一家厂商的技术垄断,也有必要同时关注其他框架的技术进展,对于安卓生态圈以外的用户,MXNet、PyTorch也是不错的选择,具体还需要根据用户自身的生产或科研需求进行选择。业界通过联盟的方式正在致力于解决开源深度学习框架的“碎片化”问题,需要密切跟踪ONNX、Gluon这类跨框架的开源技术及组织,为企业自身AI技术选型提供参考。■

猜你喜欢
工具包张量开源
校园武术“学、练、赛”一体化实践探索
浅谈张量的通俗解释
关于一致超图直积的循环指数
非负张量谱半径上下界的估计不等式
传播开源精神 共迎美好未来
支持张量机算法优化研究综述
五毛钱能买多少头牛
2019开源杰出贡献奖
谷歌云与Digital Asset合作推出区块链工具包
运用MATLAB软件求解高中数学中的线性和非线性规划问题