用混合型的神经网络来统一完成原型化和生产系统开发
Apache MXNet及其在声明式与命令式编程之间的中间路线

在仅是学术圈里的计算机科学家和专门研究实验室的研究兴趣几十年后,深度学习已经广泛地出现在现实世界的产品里。这一转变带来了多个令人激动的深度学习框架的出现。这些框架或是专注于支持快速原型化,或是专注于能大规模地高效开发部署应用。对产品开发人员而言,如果是想对一个(深度学习的)想法先进行试验而后再增强它,并最终能开发部署上线,一个单一的且统一支持这两种过程的框架将会是有帮助的。

作为一个在2015年发布的开源的深度学习框架,Apache MXNet就是想要取得这样的目标。我最近和亚马逊的首席科学家Mu Li有了一次交谈。作为MXNet的最初作者之一,Li还是《Parameter Server》(参数服务器)论文的第一作者,而参数服务器是让MXNet拥有随着处理能力增加而线性扩展能力的核心。他带着我探索了MXNet框架的起源,以及他对“混合型”神经网络模式的看法。这种模式可以对一个项目从早期原型阶段到后期大规模部署阶段都支持。

MXNet是从计算机科学里面两个典型的相反的目标中产生的:易用性和高性能。在深度学习里,声明式的架构可以带来高性能:开发人员在高层次上指定一个神经网络的结构,而由框架去实现低层次的原生的任务来用最有效的方法构造网络。

这种方式的缺点是这些声明式的框架要求开发人员在最开始就要了解和指定神经网络的结构,即它的计算图。这就使得迭代会比较慢,给进行试验带来困难。对于一个特定的问题来找到最好的神经网络结构通常是(可讨论)深度学习工程师的主要任务。在某些情况下,比如长短期记忆网络(LSTM),神经网络的结构依赖于控制命令(那些循环和判断命令),而这些命令是在数据真正进入网络前无法进行评估的。因此开发人员就需要使用由框架提供的相同功能的语句,这就意味着摆弄很多低层代码的活了。

声明式的框架对于那些惯于使用试错方法的开发人员而言可能也是反直觉的。这也是对深度学习的兴趣暴增后出现的一个主要问题。因为很多深度学习的新手并没有受过系统化的符号型线性代数的培训,而是希望能通过主动的试验来进行自学。

不过深度学习社区已经通过引入一些命令式的框架(比如知名的PyTorchChainer)来响应这种需求。这些框架可以一行一行地执行代码来让开发人员使用复杂的控制命令去程序化和动态地改变神经网络结构。而这种模式的缺陷则是性能比较差。如果开发人员不能在运行网络前指定网络的整体结构,那么框架就没法针对指定的硬件加速器(比如GPU)来预编译网络以获得最佳性能。

Li说:“(命令式框架)的问题是很难对它做优化,因为你永远不知道下一条语句是什么。你没法知道内存里存放的结果是否会被再次使用,因此就很难获得好的性能。不过这种模式的本意就是给那些想把代码组装到一起来搞快速原型化的人用的”。现在的结果就是深度学习的实现有时候会在预研阶段使用命令式框架,而在开发生产阶段使用声明式框架。Li用Facebook作为一个例子。PyTorch和Caffe2(一个声明式的框架)在Facebook都被使用。它用前者来进行探索,而用后者做产品开发。

Li和MXNet的开发团队则采用了一个混合的方法。即用命令式编程来支持做试验和原型化,随后在进行大规模产品化时,无缝地把一些关键部分用声明式模块进行重构。“我们希望为用户提供一个单一的接口。你可以用命令式代码开始,当想部署时,你可以混合化它们。”,Li说。

在未来的几年,开发人员会有更多的机会来在所有设备上运行快速的神经网络。今日的研究人员依赖于装备GPU的电脑或是云服务来加速神经网络的训练。目前NVIDIA的GPU完全主导了深度学习的硬件领域,不仅仅是因为它的速度快,还因为CUDA(GPU的编程接口)和cuDNN(NVIDIA的深度学习库)被深度学习框架广泛地支持。这些框架通过编译神经网络的代码来使用cuDNN的提供的函数,从而让神经网络能在NVIDIA的GPU上高效地运行。

研究人员预见,在未来神经网络会在“边缘”设备(如手机和嵌入式系统)上进行推断和训练这两个动作。这可能会面对大量的设备,从高端的手机到低配的IoT(物联网)设备(还请别忘了那些老旧的设备,很多现在在用的设备会在未来的十年里依然被使用)。在这些设备上,神经网络没法依赖高端的GPU了。相反,他们可能要使用专门设计定制的现场可编程门阵列(FPGA)或是专用集成电路(ASIC),甚至是使用目前就存在的数字信号处理器(DSP)。

这意味着随着不同设备的大量出现,深度学习框架都需要去支持它们。框架的作者不可能为每种可用的加速器去写扩展;相反,他们需要关注于通用的编译器,让它能识别任何加速器硬件,并编译神经网络来高效地运行在它们上面。

在下个月或差不多的时间,MXNet会发布它的通用编译器,允许开发人员在任何加速器(从高端的GPU到便宜的DSP以及手机上的专用处理器)上开发运行神经网络。Li说这个编译器初始会对早期的用户进行开源。


本文是O’Reilly和Amazon的合作的部分产物。请查看我们的编辑独立声明

Jon Bruner

Jon Bruner负责O'Reilly在硬件、物联网、制造业和电子行业的出版物。他一直和Joi Ito一起作为O'Reilly Solid大会的内容主席。这个大会关注于软件和物理世界间的沟通与交互。 在加入O'Reilly之前他是《福布斯》杂志的数据编辑。在《福布斯》他结合写作和编程来报道很多主题,从哥伦比亚河上的大坝到美国国内移民。他在芝加哥大学学习数学和经济学,并定居在旧金山。在那里你可能偶尔会看到他表演管风琴。

Framework (source: Pixabay)