深度学习是机器学习中一种基于对数据进行表征学习的方法,作为当下最热门的话题,谷歌、Facebook、微软等巨头纷纷围绕深度学习做了一系列研究,一直在支持开源深度学习框架的建设。
过去一年间,在这些巨头的加持下,深度学习框架格局发生了极大改变:新框架横空出世,旧的框架也逐渐退出历史舞台,而框架与框架之间的联系也更加紧密,生态更为开放。这一年,雷锋网 AI 科技评论也在时刻关注着这些发展和变化,下面这些话题,每一个都引起了开发者此起彼伏的讨论:
Facebook 开源 PyTorch,成为 TensorFlow 强敌
Theano 完成历史使命,功成身退
ONNX 开放平台横空出世,力图促进开放的开发生态
CNTK,Keras,MXNet 均迎来重大更新
微软携手亚马逊推出 Gluon 深度学习库,英特尔推出增强学习框架 Coach
针对移动终端,Caffe2 和 TensorFlow Lite 先后开源
接下来,雷锋网 AI 科技评论会盘点上述机器学习框架之间的重大发展和改变,以飨读者。
Facebook 开源 PyTorch,以风起云涌之势占领开发者社区
2017 年初,Facebook 在机器学习和科学计算工具 Torch 的基础上,针对 Python 语言发布了全新的机器学习工具包——PyTorch。PyTorch 实际上是 NumPy 的替代,它支持 GPU,有着更高级的功能,可以用来构建和训练深度神经网络。一经发布,它便受到广泛关注和讨论。经过将近一年的发展,目前 PyTorch 已经成为从业者最重要的研发工具之一。
年初发布 PyTorch 时,Facebook 曾表示,「它有望辅助、或在一定程度上替代现有的 Python 数学库(比如 NumPy)。」目前来看,PyTorch 的使用越来越广泛,这一预言成为现实。
在众多开发者眼中,PyTorch 是 TensorFlow 之外一个非常好的选择。
以下为 PyTorch 主要优势:
它处于机器学习第一大语言 Python 的生态圈之中,使得开发者能接入广大的 Python 库和软件。因此,Python 开发者能够用他们熟悉的风格写代码,而不需要针对外部 C 语言或 C++ 库的 wrapper,使用它的专门语言。
不需要从头重新构建整个网络,它为改进现有的神经网络提供了更快速的方法——采用动态计算图(dynamic computational graph)结构,而不是大多数开源框架,比如 TensorFlow、Caffe、CNTK、Theano 等采用的静态计算图。
PyTorch 中用于数据加载的 API 设计得很好。接口在数据集、采样器和数据加载器中有明确规定。数据加载器接收数据集和采样器,根据采样器的调度,在数据集上生成迭代器。加载并行数据就像把 num_workers 语句传递到数据加载器一样简单。
采用了定制的 GPU 内存分配器。这使得开发者的深度学习模型能够有「最大限度的内存效能」,训练比从前更大的深度神经网络。
GitHub 地址:https://github.com/pytorch/pytorch
TensorFlow 遇强敌,引入动态图机制等多个更新
TensorFlow 是 Google 于 2015 年底推出的深度学习框架。过去两年间,它在开发者社区享有盛誉,目前已成为最为常用的深度学习框架。它的功能全,社区好,因此使用率也一直稳定保持领先。而随着 PyTorch 等框架的横空出世,因为文档和接口混乱,使用繁琐等缺点,TensorFlow 广受诟病。
在 2017 年,开发团队不断为 TensorFlow 引入新的功能:年初发布 TensorFlow 1.0,实现对 Keras 的全面支持;年底引入 Eager Execution 动态图机制,让开发变得更加简单和直观。
以下为 TensorFlow 被大家广为称赞的优点:
TensorFlow 的 Saver 对象很容易使用,并为检查点(check-pointing)提供了更多选择。
在序列化中,TensorFlow 的主要优点是可以将整个图保存为协议缓冲区。这包括参数和运算。此外,该图可以通过其他支持的语言 (C++,Java) 加载。这对不支持 Python 的调度栈来说至关重要。理论上,在改变模型源代码之后,你想要运行旧模型时它也能有所帮助。
支持移动和嵌入式部署,虽然将 TensorFlow 部署到 Android 或 iOS 上需要大量的工作,但不必用 Java 或 C++重写模型的整个推理程序。
此外,TensorFlow Serving 支持高性能的服务器端部署,可以支持用户轻松地换用模型而不会降低服务性能。
另外,它在年底引入 Eager Execution——一种命令式、由运行定义的接口,一旦从 Python 被调用可立即执行操作,这使得 TensorFlow 的入门学习变得更简单,也使得研发工作变得更直观。
GitHub 地址:https://github.com/tensorflow/tensorflow
Theano 完成历史使命,功成身退
作为深度学习框架中祖师级的存在,由 Yoshua Bengio 主导的 Theano 在完成自己的历史使命之后,退出历史舞台。
据雷锋网 AI 科技评论了解,Theano 基于 Python,是个擅长处理多维数组的库(这方面类似于 NumPy),它的设计初衷是执行深度学习中大规模神经网络算法的运算。大家可以把它理解为一个数学表达式的编译器:用符号式语言定义你想要的结果,该框架会对你的程序进行编译,来高效运行于 GPU 或 CPU。
在过去的很长一段时间内,Theano 都是深度学习开发与研究的行业标准。比起深度学习库,它更像是一个研究平台,需要开发者从底层开始做许多工作,来创建自己需要的模型。Theano 早期的开发者有 Yoshua Bengio 和 Ian Goodfellow,由于出身学界,它最初是为学术研究而设计。
对于 Theano 的退出,有开发者这样评价,「它开启了基于符号运算的机器学习框架的先河,然后随着 TensorFlow 和 PyTorch 的崛起,完成自己的历史任务。」
Bengio 在告别邮件中表示:
支持深度学习研究的软件生态系统快速进化,且状态良好;开源软件成为规范,还有很多别的深度学习框架可选,满足着从探索全新想法到将其部署实现的全部需求;在激烈竞争中,行业参与者们支持着不同的软件堆栈。
多年以来,我们都以 Theano 的创新深感自豪,其创新也正被其他框架继承和优化。比如,把模型表达为数学表达式、重写计算图以获得更优性能和内存使用、GPU 上的透明执行、更高阶的自动微分,正在全部成为主流。
在这一背景下,我们认为继续维护 Theano 不再是推动全新研究与应用的最佳方式。即使来自学界、业界的贡献与支持在不断增加,但维持陈旧的代码库已经成为了创新的阻碍。
Theano 虽然已经停止更新了,但基本上所有的框架都参考过 Theano,它并不算彻底消失。
GitHub 地址:https://github.com/Theano/Theano
Facebook 联手微软推出 ONNX 标准,共筑开放 AI 生态
2017 年 9 月,Facebook 联手微软发布了一个全新的开源项目——ONNX(Open Neural Network Exchange),欲借此打造一个开放的深度学习开发工具生态系统,让不同的神经网络开发框架做到互通互用。目前,CNTK,PyTorch , Caffe2,MXNet 已宣布支持 ONNX。
为何要共同打造 ONNX 开放平台?
目前的开发现状如下:大体上,每个框架都会针对某个特定属性进行优化,比如训练速度、对网络架构的支持、能在移动设备上推理等等。在大多数情况下,研发阶段最需要的属性和产品阶段是不一样的。而在任意一个框架上训练的神经网络模型,无法直接在另一个框架上用。开发者需要耗费大量时间精力把模型从一个开发平台移植到另一个。这导致效率的降低以及进度延迟。
而借助 ONNX,开发者能实时跟踪某个神经网络是如何在框架上生成的,接着,使用这些信息创建一个符合 ONNX 标准的通用计算图。大家能更方便地在不同框架间切换,为不同任务选择最优工具。使用支持 ONNX 表示方式的框架,大幅简化了切换过程,让开发者的工具选择更灵活。
GitHub 地址:https://github.com/onnx/onnx
微软基于 CNTK,推出 CNTK 2
2016 年初,微软开源 CNTK 深度学习工具包。作为语音识别领域声名卓著的开发工具,CNTK 具有相当不错的可扩展性、速度和精确性。
2017 年 6 月,微软在 GitHub 上放出了 CNTK 的第一个候选(RC)版本,完成内测。在 Blog 中,微软表示,CNTK 是一个针对深度学习的系统,可以用来加速诸如语音、图像识别以及搜索相关性(search relevance)等领域相关研究,并可运行于 CPU 或英伟达 GPU。此外,CNTK 既可本地运行,也可在云端基于 Azure GPU 运行。
在 6 月更新的这一版本中,Layers 算法库得到了大幅升级。大量的通用「layers」已预定义,使编写包含标准层级的简单网络变得十分容易。新的 Cognitive Toolkit 评估算法库在易用性和性能上也得到大幅升级。
此后,在 2.0 的多个 Beta 和 RC 版本中,微软逐步更新了 CNTK 对 Python、C++、C#、Java 等的 API 支持,对 Keras 的后端支持等新功能。在 2.1 中,cuDNN 版本升级到 6.0,支持 Universal Windows Platform。在 2.2 中,微软又做了许多模型支持相关的改进。
在 2017 年底的 2.3 版本中,又有如下几个改进:提供了对 ONNX 标准的更好支持,分布式训练支持切换到 NCCL2,改进了 C# API 的支持,增加了网络优化 API,以及更快的稀疏 Adadelta。
GitHub 地址:https://github.com/Microsoft/CNTK
Keras 2 带来惊喜,与 TensorFlow 联系更加紧密
Keras 是一个崇尚极简、高度模块化的神经网络库,于 2015 年 3 月发布。
2017 年 3 月,keras 迎来全新版本——Keras 2。Keras 开发人员此前在博客中表示,他们更愿意人们将 Keras 视为一种通用的 API 规范,而不仅仅是一个代码库。当时,开发人员将此前的 Keras 实现归结为两个大类:
TensorFlow 的内部实现,即 TensorFlow 1.0 版本中发布的 tf.keras 模块——完全基于 TensorFlow 编写,并且与所有 TensorFlow 功能深度兼容;
通用实现,兼容多种运行后端,包括 Theano 和 TensorFlow 等(将来可能会支持更多其他的后端)。
3 月的版本中,最重要的一项内容就是增强了 Keras 与 TensorFlow 的逻辑一致性。另一项重要更新就是 API 的变化。他们重新设计了绝大部分 API,为将来的扩展和更新预留了充足的修改空间,并且新设计的 API 完全兼容于谷歌 TensorFlow 规范。
而在 2017 年 8 月,Keras 又做了如下几点更新:修复漏洞,性能提升,文件改善,为在 TensorFlow 的数据张量(比如 Datasets, TFRecords)上训练模型提供了更好的支持,提升 TensorBoard 用户体验,提升测试覆盖范围。此外,还迎来两个重大变化:一是让约束管理(constraint management)基于变量属性;二是把层和模型中已经不再使用的约束属性移除(不会影响任何用户)。
GitHub 地址:https://github.com/keras-team/keras
微软携手亚马逊推出 Gluon 深度学习库,全面支持符号式和命令式编程
2017 年 10 月,微软携手亚马逊推出全新 Gluon 深度学习库。它是一个支持符号式和命令式编程的 API,在创造深度学习模型的过程中能极大的简化进程,而不会使训练速度减慢。据悉,Gluon 能让开发者更简单的学习、规定和调试深度神经网络,也可以让接下来的迭代和保持更加简单,也支持开发作者快速构建和训练神经网络。目前 Gluon 已全面支持亚马逊 MXNet,接下来也将支持 CNTK,主要的亮点如下:
对于高级用户,Gluon 支持很多复杂技术,如动态图和灵活结构。
Gluon 包含完全的符号化的自动微分代码,这些代码已经被程序执行了,也包括控制流。Gluon 通过 hybridization 实现这一点:静态计算图先被计算出来,然后在随后的迭代中缓存和重用。计算图也可以被导出,例如给移动设备提供服务。
自带一个丰富的内嵌层库,通过重用库中预建的构件,可以大大简化规定复杂模型架构的任务。
Gluon 支持循环和不规则张量(ragged tensors)(能批处理变长度序列),对于 RNN 和 LSTM 模型具有空前的效率。
提供对稀疏和量化数据及操作的全面支持,可以用于计算和通信。稀疏性在 NLP 领域的深度神经网络中非常常见,而量化对于运行时性能评估至关重要。
虽然在单个 GPU 上进行调度很容易,但在多个 GPU 上操作要复杂得多。通过 MXNet 或 CNTK 后端,Gluon 在符号式和命令式模式下都提供自动分配。
GitHub 地址:https://github.com/gluon-api/gluon-api/
背靠亚马逊,MXNet 继续改进
MXNet 由华盛顿大学和卡内基梅隆大学的研究人员联合发起,2016 年底,它被 Amazon AWS 选为官方深度学习平台。
它的作者李沐曾表示,
MXNet 最早就是几个人抱着纯粹对技术和开发的热情做起来的兴趣项目,既没有指望靠它毕业,也没想着用它赚钱。
能够一步一步慢慢的扩大,我觉得最重要的是每个小伙伴对这个事情的投入,和抱着降低深度学习门槛的使命。也是让大家只需要关心「数据量和运算量」,而不是如何有效实现利用硬件;只需要「数学公式写好,根本就不想知道你支持哪些 layer,分别是干什么的」,不用管自动求导如何训练;只需要「把手上的数据交出去给云即可,然后花钱租算力」,而不是云上如何管理如何优化。
在 2017 年,开发人员一直在不断改进和优化该框架,目前 MXNet 已经迎来 1.0.0 版。
MXNet 于2017年8月加入了动态图接口 Gluon,于 2017 年 11 月加入 ONNX 开放体系。
MXNet 主要有如下 3 方面的优势:
效率:节省计算资源,资源利用效率高;
速度:可以随着机器和 GPU 的扩展呈线性增长,而且在单台机器上也有很高的效率;
简单易用:同时支持命令式编程(imperative programming)和声明式编程(declarative programming)
GitHub 地址:https://github.com/apache/incubator-mxnet
Intel 开源 Coach,用于训练和评估增强学习 Agent
2017 年 10 月,英特尔开源增强学习框架 Coach。该框架利用多核 CPU 处理能力,用于训练和评估增强学习 Agent。
Coach 包含许多 Agent 类型的实现,包括从单线程实现到多线程实现的无缝转换。Agent 以模块化方式实现,以允许重用不同的构建块来构建新的和更复杂的代理。此外,Coach 可以在单个任务的基础上编写新的 Agent,并切换到同步或异步的多任务实现,并进行最少的更改。
它的主要特点如下:
包含一些领先的增强学习算法的多线程实现,适用于各种游戏和机器人环境。它能够在台式计算机上高效地训练强化学习 Agent,而无需任何额外的硬件。
可与如 OpenAI Gym、Roboschool 和 ViZDoom 等顶级环境进行集成,同时还提供了可视化培训过程和了解 Agent 的基本机制的各种技术,所有的算法都是使用英特尔优化的 TensorFlow 来实现的,也可以通过 Intel 的 neon™框架来实现。
GitHub 地址:https://github.com/NervanaSystems/coach
针对移动终端,Facebook Caffe2 VS 谷歌 TensorFlow Lite
2017 年 4 月,Facebook 开源深度学习框架 Caffe2。根据官网介绍,它最大的特点就是轻量、模块化和扩展性好。Caffe2 可以方便地为手机等移动终端设备带来 AI 加持,让 AI 从云端走向终端。
据 Caffe2 官方博客表示:
长期以来,提起 AI 模型的训练和部署,人们通常都会联想到大数据中心或超级计算机。之所以会出现这种现象,是因为小型计算设备在大规模图像、视频、文本和语音处理上具有明显的短板,无论在速度还是可靠性上都远远不及大型数据中心。
因此在移动设备上部署 AI 模型,使其能够快速准确地处理相关分析任务,一直是一项有待解决的难题。要解决这个难题,让 AI 终端化,除了有赖于移动硬件平台的发展之外,在软件框架层面也需要一个灵活轻便的框架支持。
而 Caffe2 正是这样一个框架。它是在此前流行的开源框架 Caffe 基础上的重构和升级,一方面集成了诸多新出现的算法和模型,另一方面在保证运算性能和可扩展性的基础上重点加强了框架在轻量级硬件平台的部署能力。
GitHub 地址:https://github.com/caffe2/caffe2
2017 年 11 月,谷歌发布 TensorFlow Lite 预览版,与 Caffe2 类似,这款框架针对移动和嵌入式设备等。TensorFlow Lite 是一种全新的设计,具备如下三点特性:
轻量级(Lightweight):支持机器学习模型的推理在较小二进制数下进行,能快速初始化/启动。
跨平台(Cross-platform):可以在许多不同的平台上运行,现在支持 Android 和 iOS。
快速(Fast):针对移动设备进行了优化,包括大大减少了模型加载时间、支持硬件加速。
TensorFlow Lite 支持 Android 神经网络 API(Android Neural Networks API),当加速器(硬件设备)不可用时,TensorFlow Lite 会返回到 CPU 来执行,它目前支持很多针对移动端训练和优化好的模型,如 MobileNet,Inception v3,Smart Reply。
开发人员也表示,TensorFlow Lite 应该被看作是 TensorFlow Mobile 的升级,它的功能有很多,目前仍处于紧锣密鼓的开发阶段。
地址:http://tensorflow.org/mobile/tflite
(完)