深度学习平台介绍
这里将详细介绍目前应用最广泛的7种深度学习平台(包括 Tensorflow、 Caffe、 Pytorch、MXNet、CNTK、 Paddlepaddle、Darknet)的基本原理、主要特性和优势,以及它们的应用场景,并且对它们未来的潜力及发展进行大致的评估,可以帮助初学者选择和掌握适合自己的发展的深度学习框架。
参考:《深度神经网络FPGA设计与实现》–西安电子科技大学-焦李成教授
Tensorflow是谷歌公司在 Disbelief(分布式深度学习平台)的基础上改进的第二代人工智能学习系统,而它的名字则来源于其运行原理。 Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算, Tensorflow是一个将数据流图( Data Flow Graphs)应用于数值计算的开源软件库。
Tensorflow是一个将复杂的数据结构传输至人工智能神经网络中,并对其进行分析和处理的系统。其中,节点( Nodes)在数据流图中表示数学操作,而数据流图中的线( (Edges))则表示在节点间相互联系的多维数据数组,即张量( Tensor)。它具有非常灵活的架构,能够帮助用户在多种平台上展开计算,也被广泛应用于语音识别或图像识别等多项机器学习和深度学习领域。
在硬件方面,TPU是谷歌为 Tensorflow定制的专用芯片。TPU被应用于谷歌的云计算平台,并作为机器学习产品开放研究和商业使用。 Tensorflow的神经网络 API Estimator有支持TPU下可运行的版本 Tpuestimator。 Tpuestimator可以在本地进行学习/调试并上传到谷歌云计算平台进行计算。使用云计算TPU设备,需要快速向TPU供给数据, 为此可使用 tf data. Dataset API( Application Programming Interface,应用编程接口)从谷歌云储分区中构建输入管道。小数据集可使用 tf data. Dataset. cache完全加载到内存中,大数据可转化为 Tfrecord格式并使用tf.data. Tfrecorddataset进行读取。除此之外, Tensorflow还有很多便于应用的其他优势:
(1) Tensorflow具有高度的灵活性。 Tensorflow并不是一个严格的“神经网络”数据库,任何用户都可以通过构建一个数据流图来表示驱动计算的内部循环:它能够为用户提供有用的工具,帮助用户组装被广泛应用于神经网络的“子图”,同时用户也可以Tensorflow的基础上编写自己的“上层库”。当然,如果用户发现找不到想要的底层数操作,可以自己编写C+代码来丰富底层的操作。
(2) Tensorflow具有真正的可移植性。 Tensorflow可以在CPU和GPU上运行,例如运行在台式机、服务器、手机上等: Tensorflow既可以帮助用户在没有特殊硬件的前提下,在自己的笔记本上运行机器学习的新想法,也可以帮助用户将自己的训练模型在多个CPU上规模化运算,而不用修改代码; Tensorflow可以帮助用户将训练好的模型作为产品的部分应用到手机App里,还可以帮助用户将自己的模型作为云端服务运行在自己的服务上,或者运行在 Docker容器里
(3) Tensorflow可以加强科研和产品之间的相关性。过去,需要通过大量的代码重写才能够将科研中的新想法应用于产品;而现在,科学家用 Tensorflow尝试新的算法,产品团队则用 Tensorflow来训练和测试新的计算模型,并直接提供给在线用户。使用 Tensorflow,既可以让应用型研究者将新想法迅速运用到产品中,也可以让学术型研究
更方便地分享代码,从而提高科研效率
(4) Tensorflow具有自动求微分的能力。它能够使得一些基于梯度的机器学习算法更加快速且准确。作为 Tensorflow用户,只需要定义需要预测的模型结构,将这个结构和目标函数结合在一起,并添加数据, Tensorflow将自动计算相关的微分导数。
(5) Tensorflow支持多语言。 Tensorflow有一个合理的C++使用界面,也有一个易用的 Python使用界面来构建和执行用户的图片和视频。可以直接编写 Python/C++程序,也可以在交互式的 Ipython界面中用 Tensorflow来尝试新想法。当然,这只是个起点。—这个平台将鼓励用户创造出自己最喜欢的语言界面,截至版本1.12.0, Tensorflow绑定完后成后并支持版本兼容运行的语言为C和 Python,其他绑定完成的语言为 Javascript、C+、JavaGo和 Swift,依然处于开发阶段的语言包括C、 Haskell、 Julia、Ruby、Rust和 Scala。
(6) Tensorflow可以最大化系统性能。如果用户拥有一个32个CPU内核、4个GPU显卡的工作站,则 Tensorflow可以帮助用户将工作站的计算潜能全部发挥出来。Tensorflow支持线程、队列、异步操作等,可以帮助用户将硬件的计算潜能全部发挥出来。用户可以自由地将 Tensorflow数据流图中的计算元素分配到不同的设备上, Tensorflow可以帮助用户管理好这些不同的副本。
(7) Tensorflow支持分布式执行。2017年10月31日,谷歌发布了 Tensorflow EagerExecution(贪婪执行),为 Tensorflow添加了命令式编程接口。在此之前的 Tensorflow有一个很大的缺点,就是只支持静态图模型。也就是说,之前的 Tensorflow在处理数据前必须预先定义好一个完整的模型,这要求数据非常完整,但是在实际工程操作中难免会有不完整的数据模型,这些模型处理起来会很麻烦。而现在, Tensorflow操作会立刻执行,不需要执行一个预先定义的数据流图,从而大大地提高了工作效率。
(8) Tensorflow可以进行迁移学习( Transfer Learning)。许多 Tensorflow模型都包含可训练、可优化示例,方便研发人员进行迁移学习。迁移学习就是在训练好的模型上继续训练其他内容,充分使用原来模型的权重,这样可以节省重复训练大型模型的时间,提高工作效率。因此,有新想法的用户可以不用花费时间重新训练一个无比庞大的神经网络,只需要在原来的神经网络上进行训练和测试即可
(9) Tensorflow生态系统包含许多工具和库。 Tensorboard是一个Web应用程序,它可以把复杂的神经网络训练过程可视化,也可以帮助理解、调试并优化程序。 TensorflowServing组件是一个为生产环境而设计的高性能的机器学习服务系统,它可以将 Tensorflow训练好的模型导出,并部署成可以对外提高预测服务的接口。 Jupyter Notebook是一款开放源代码的Web应用程序,用户可创建并共享代码和文档;它提供了一个环境,用户可以在其中记录、运行代码,并查看结果,可视化数据后再查看输出结果。 Facets是一款开源可视化工具,可以帮助用户理解并分析各类机器学习数据集。例如,用户可以查看训练和测试数据集,比较每个要素的特征,并按照具体特征对要素进行排序。
(10) Tensorflow支持CPU和GPU运行。在程序中,设备使用字符串进行表示,CPU表示为“CPU:0O”。第一个GPU表示为“ /device:GPU:O”,第二个GPU表示为“ /device:GPU:1”,
以此类推。如果 Tensorflow指令中兼有CPU和GPU实现,当该指令分配到设备时,则GPU设备的优先级高于CPU的。 Tensorflow会尽可能地使用GPU内存,最理想的情况是进程只分配可用内存的一个子集,或者仅根据进程需要增加内存使用量,为此,启用会话时可通过两个编译选项来执行GPU进程。
Caffe是一个深度学习框架,其优点是表达力强、速度快和模块化,由伯克利视觉学习中心( Berkeley Vision and Learning Center,BVLC)和社区贡献者开发,贾杨青等人在加州大学伯克利分校攻读博士期间创建了这个项目。 Caffe提供了一个用于训练、测试、微调和开发模型的完整工具包,而且它拥有可以应用于产品开发的完善的实例。同样的,它也是一个对于研究人员和其他开发者来说进入尖端机器学习的理想起点,它在短时间内就能应用于产业开发。
Caffe的核心模块有三个,分别是 Blobs、 Layers和Nets。 Blobs用来进行数据存储、数据交互和处理,Cafe通过 Blobs统一制定了数据内存的接口; Layers是神经网络的核心,它定义了许多层级结构,并将 Blobs视为输入输出;Nets是一系列 Layers的集合,并且这些层结构通过连接形成一个网图。
Caffe的特性和优点主要有:
(1) Caffe具有模块性。 Caffe本着尽可能模块化的原则,使新的数据格式、网络层和损失函数变得更加容易扩展。网络层和损失函数被预先定义好后,大量示例将帮助用户学会怎样组成一个神经网络系统并且应用于不同的问题。
(2) Caffe支持任意有向非循环图形式的网络构建。根据实例化, Caffe保留网络需要的内存,并且从主机或者GPU底层的位置抽取内存。它只需要调用一个函数就能快速完成CPU和GPU之间的转换,每一个单独的数据模块都会进行测试,没有相应的测试 Caffe就不允许新代码加入到新模型中,这样就可以快速改进和更新代码库
(3)Caffe提供了 Python和 Matlab相结合的目前研究代码的快速原型和接口,这两种语言都用在了构造网络和分类输入中。 Caffe还提供了应用于视觉工作的参考模型,包括里程碑式的 Alexnet、 Imagenet模型的变形和R-CNN探测模型。
(4) Caffe可以促进创新和应用。使用 Caffe可以在配置中定义模型和优化,不需要硬性编码。通过设置一个GPU机器训练标记在CPU和GPU之间转换,接着调配商品化集群系统或移动设备来完成模型的定义和优化
(5)Cafe代码具有可扩展性和活跃性。在Cafe项目开展的第一年,它就被用户开发超过1000次,由这些用户完成了许多重要的修改并反馈回来。也是这些贡献者,使得Cafe框架在代码和模型两方面都在追踪最先进的技术。
(6) Caffe具有非常快的运算速度。一个 NVIDIA K40 GPU Caffe每天可以处理超过64×10^6张图像。推理过程为每张图1ms,而学习过程为每张图4ms。我们相信,Cafe是现在可使用的最快的 Conynet应用,它也因此被广泛地应用于不同的机器学习领域。
Pytorch是 Torch的 Python版本,是由 Facebook开源的神经网络框架。 Pytorch提供一种类似 Numpy的抽象方法来表征张量(或多维数组),它可以利用GPU来加速训练。与Tensorflow的静态计算图不同, Pytorch的计算图是动态的,可以根据计算需要实时改变计算图,即使用户在深度学习方面的基础知识不够扎实, Pytorch也可以帮助用户快速入门。至少,用户可以将多层神经网络模型视为由权重连接的节点图,可以基于前向和反向传播,利用优化过程(如梯度计算)从不同数据中计算每层网络的权重。
Pytorch的基础主要包括以下三个方面:
(1)Numpy风格的 Tensor操作. Pytorch中 Tensor提供的AP参考了 Numpy的设计, 因此熟悉Numpy的用户基本上能够借鉴原来的经验,自行创建和操作 Tensor.,同时 Torch中的数组和 Numpy数组对象也可以无缝对接。 (2)变量自动求导。在序列计算过程形成的计算图中,所有变量都可以方便且快速地计算出自己对目标函数的梯度值。这样就可以方便地实现神经网络的后向传播。
(3)神经网络层、损失函数和优化函数等高层被封装。网络层的封装存在于 torch.nn模块中,损失函数由 torch. nn. functional模块提供,优化函数由 torch. optim模块提供
Pvtorch具有以下特性和优点:
(1) Pytorch可以混合前端,新的混合前端在急切模式和图形模式之间无缝转换,以提
供灵活性和速度
(2) Python语言优先。 Pytorch的深度集成允许用户在 Python中使用流行的库和包编写神经网络层。
(3) Pytorch拥有丰富的工具和函数库。丰富的工具和库生态系统扩展了 Pytorch,使得 Python支持计算机视觉、NLP( Neuro- Linguistic Programming,神经语言程序学)等领域的开发;C前端是 Pytorch的纯C++接口,它遵循已建立的 Python前端的设计和体系结构。
(4) Pytorch可以快速实现。在深度学习的训练过程中,用户会有很多奇思妙想,但这些新想法需要通过实验来验证。如果实现比较困难,而且在创新点的不确定性特别大时,用户会很容易放弃这个设想。而 Pytorch可以解放用户的思想,用 Tensor的思维思考代码,即一切操作均在 Tensor的基础上进行,一切 Tensor能做的, Pytorch都能做到。
(5) Pytorch具有简洁易懂的代码。如果用户不懂某个框架的源码,就不能完全掌握它的运行原理。在 Pytorch框架中,任何一个操作,不论多么高级复杂,都能轻松地找到与它对应的 Tensor操作。在大多数实际情况中, Pytorch都比 Tensorflow更高效,但这并不是说 Tensorflow速度慢,而是说要用 Tensorflow写出同等速度的代码会稍微困难一些,仅仅是加载数据这一方面就会非常复杂且耗时。
(6) Pytorch具有强大的社区。Pytorch论坛、文档一应俱全,而且它得到了 Facebook的 FAIR(Facebook的人工智能实验室)的强力支持。FAIR的几位工程师全力维护开发Pytorch, Github上基于 Pytorch框架的源码每天都有许多建议和讨论.
(7) Pytorch使用命令式热切式范式。也就是说,构建图形的每行代码都定义了该图的一个组件,即使在图形完全构建之前,我们也可以独立地对这些组件进行计算。这被称为运行时定义法( Define-by-Run)。
近几年, Pytorch正在被广泛应用于机器学习的各种领域。最近的几个应用包括:加州大学伯克利分校计算机科学家所构建的项目,它基于循环一致对抗网络进行非配对图到图的转换,该项目通过使用一组对齐的图像训练集来学习图像输入和输出映射;科学家正在利用 Pytorch架构实现AOD-Net(一种网络模型)图片去雾以及 Faster R-CNN(一种网络模型)和 Maske-CNN(一种网络模型)的神经网络模型构建。自2016年1月初发布以来,许多研究人员已将 Pytorch作为一种实现库,因为它易于构建新颖且复杂的计算图。作为一个新的并且正在建设中的框架,我们也期待着 Pytorch能够尽快被更多数据科学从业者熟知并采用。
MXNet 是亚马逊( Amazon)选择的深度学习库。它拥有类似于 Theano和 Tensorflow的数据流图,能够应用于多个GPU配置;有着更高级别的模型构建块,并且能够在任何硬件上运行(包括手机)。 MXNet 提供了对R、 Julia、C++、 Scala、 Matlab和 Javascript的接口,其中对 Python的支持只是其冰山一角。
推动深度学习创新的两个最大因素是数据和计算。随着数据集越来越多样和计算量越来越宏大,神经网络在大多数深度学习问题上逐渐占据了主导地位。虽然GPU和集群计算为加速神经网络训练提供了巨大的机会,但是更新传统深度学习代码以充分利用这些分布式资源仍具有挑战性。过去,我们熟悉的科学计算堆包括 Matlab、R, Numpy和 Scipy没有提供利用这些资源的直接方式。而现在,像 Manet这样的加速库提供了强大的工具来帮助开发人员利用GPU和云计算的全部功能。这些工具可以适用于任何数学计算,尤其适用于加速大规模深度神经网络的开发和部署。
Mxnet能够提供以下功能:
(1)设备放置。使用 Mxnet,可以轻松指定每个数据结构应存放的位置。
容内
(2)多GPU培训。 Mxnet可以通过可用GPU的数量轻松扩展计算。
(3)自动区分。 Mxnet可自动执行曾经陷入神经网络研究的衍生计算。
(4)优化的预定义图层。虽然用户可以在 Manet中编写自己的图层,但预定义的图层会针对速度进行优化,优于竞争库。
Mxnet具有高性能且简单易学的代码、高级API访问和低级控制,是深度学习框架中独一无二的选择; Mxnet是DMLC第一个结合了所有成员的努力的项目,也同时吸引了很多核心成员的加入。DMLC( Distributed Machine Learning Community,分布式机器学习社区)希望 Mxnet是一个方便、简单易学、可以快速训练新模型和新算法的系统。对于未来, Manet将会支持更多的硬件,将拥有更加完善的操作算子以及兼容更多种类的编程语言。
CNTK( (the Microsoft Cognitive Toolkit,微软认知工具集)是一个统一的深度学习工具包,它通过有向图将神经网络描述为一系列计算步骤。CNTK使用户能够通过深度学习实现集中性的、能够处理大规模数据的人工智能,它具有扩展性强、工作效率髙和准确性强等优点,并且可以实现多种编程语言与算法之间的相互兼容。
在有向图中,叶节点表示输入值或网络参数,而其他节点表示其输入上的矩阵运算。CNTK允许用户自由实现和组合流行的模型类型,如前馈DNN( Deep Neural Network,深度神经网络)、卷积神经网络( Convolutional neural network,CN)和循环网络( RNN/LSTM)。它通过跨多个GPU和服务器的自动区分和并行化实现随机梯度下降,即错误反向传播学习( Stochastic Gradient Descent,SGD)。自2015年4月以来,CNTK已获得开源许可。用户可以利用CNTK框架,通过交换开源代码,更快速、方便地互相分享新想法。
CNTK具有以下四个特性
(1)高度优化的内置组件。组件可以处理来自 Python、C+或 Brainscript的多维密集或稀疏数据,也可以处理FFN( eed Forward Neural network,前馈神经网络)、CNN、RNN/ILSTM,生成对抗网络等批量标准化的神经网络或者具有注意力的序列到序列等;组件能够进行强化学习、有监督学习和无监督学习,能够在 Python上从GPU添加新的用户定义的核心组件,并且进行自动超参数调整;同时,组件的内置读卡器针对海量数据集也进行了优化。
(2)能够对资源进行有效利用。CNTK通过一位SGD和 Block Momentum在多个GPU或者多个机器上实现准确的并行性、内存共享和其他内置方法,可以有效利用GPU的最大内存。
(3)能够帮助用户创建自己的网络。CNTK拥有完整的API,能够从 Python、C++和Brainscript定义网络、学习者、读者、培训和评估;它可以使用 Python、C+、C和 Brainscript评估模型与 Numpy互操作,高级和低级API均具有易用性和灵活性;它甚至可以根据数据自动进行形状推断和完全优化的符号RNN循环。
(4)能够使用 Azure(微软基于云计算的操作系统)进行培训和托管。CNTK在与 AzureGPU和 Azure网络一起使用时,计算机可以利用高速资源在 Azure上快速训练模型,并根据需要添加实时培训。
CNTK具有一下的三个优点:
(1)速度快和可扩展性强。CNTK能够比其他框架更快地训练和评估深度学习算法,能 CNTK具有以下三个优点:
够在各种环境中进行高效扩展,从CPU、GPU到多台设备并且保持准确性。os
(2)商业级质量。CNTK使用复杂的算法和生产阅读器构建,可以可靠地处理大量数据集。 Skype、 Cortana、Bing、Xbox和业界领先的数据科学家已经使用微软认知工具包开发商业级A
(3)兼容性。CNTK提供了最具表现力、最简单的架构,它使用用户最熟悉的语言和神经网络,如C++和 Python,使用户能够自定义任何内置的训练算法或者在此基础上实现自己设计的新算法.
CNTK目前主要被应用于基于神经网络的逻辑回归与MNST数字识别,也允许用户使用图级别的API来编写神经网络。由于它的高效性和可扩展性,CNTK被越来越多的用户所熟知和采用。
Paddlepaddle的前身是百度于2013年自主研发的深度学习平台。2016年9月1日百度世界大会上,百度首席科学家吴恩达首次宣布将百度深度学习平台对外开放,命名为Paddlepaddle。
Paddlepaddle具有以下优点:
(1)代码易于理解,官方提供丰富的学习资料及工具,并且帮助用户迅速成为深度学
习开发者。
(2)框架具备非常好的扩展性,并且提供了丰富全面的API,能够实现用户各种天马行空的创意。
(3)基于百度多年的AI技术积累以及大量的工程实践验证,框架安全稳定。
(4)架能够一键安装,针对CPU、GPU都做了众多优化,分布式性能强劲,并且具有很强的开放性。我们可以在 Linux系统下使用最新版的pip( Python包管理工具)快捷地安装和运行 Paddlepaddle
2016年, Paddlepaddle已实现CPU/GPU单机和分布式模式,同时支持海量数据训练数百台机器并行运算,可以轻松应对大规模的数据训练,这方面目前的开源框架中可能只有谷歌的 Tensorflow能与之相比。此外, Paddlepaddle具有易用、高效、灵活和可伸缩等特点,且具备更丰富、更有价值的GPU代码。它提供了神经机翻译系统( Neural MachineTranslation)、推荐、图像分类、情感分析、语义角色标注( Semantic Role Labelling)等5个任务,每个任务都可迅速上手,且大部分任务可直接套用。特别值得一提的是,与此前的对比测试结果显示,在训练数据和效果相同的情况下, Paddlepaddle比谷歌的 Tensorflow训速度可能会更快。
练速度更快。据了解,这主要是由于 Paddlepaddle的框架设计更具优势,并且未来有很大的潜力,速度可能会更快。
2016年以来, Paddlepaddle已经在百度几十项主要产品和服务之中发挥了巨大的作用,如外卖的预估出餐时间、预判网盘故障时间点、精准推荐用户所需信息、海量图像识别分类、字得识( Optical Character Recognition, OCR)毒和垃位圾信息检测、机器翻译和自动驾驶等领域。相信在不久的将来, Paddlepaddle会被越来越多的用户使用,并且被应用于其他的深度学习领域。
Darknet是一个使用C语言和CUDA( Computer Unified Device Architecture,计算统一设备架构编写的开源神经网络框架,它安装快速,并支持CPU和GPU计算。Darknet易于计 实交装,只有两个可选的依赖项;如果用户想要更多种类的支持图像类型,可以使用opencv;如果用户想要用GPU计算,可以使用CUDA。CPU上的 Darknet速度很快,但它在GPU上的速度更快,是CPU上的500倍
相比于 Tensorflow来说, Darknet并没有那么强大,但这也成了 Darknet的优势:Darknet完全由C语言实现,没有任何依赖项,可以使用 Opencv(开源的计算机视觉库)来实现对图片的可视化: Darknet持CPU与GPU(CUDA/ CUDNN,使用GPU当然更快更好,而 CUDNN是专门针对深度神经网络中的基础操作而设计的基于GPU的加速库)因为其较为轻型,没有像 Tensorflow那般强大的API,所以具有更大的灵活性,适合用来研究底层,以便用户能够更容易地从底层对其进行改进与扩展; Darknet的实现与Cafe的实现存在相似的地方,熟悉了 Darknet,对学习Cafe也有很大的帮助。
Darknet框架已经被广泛应用于深度学习领域:它被应用于基于YOLO(一种基于深度神经网络的对象识别和定位算法)网络的实时目标识别与检测系统;被应用于在 Imagenet数据集和 CIFAR-10数据集下的目标分类系统;还被应用于基于RNN网络的自然语言处理系统。 Darknet正在被越来越多的用户所熟知和使用。