NNVM打造模块化深度学习系统(转)

2023-06-25,,

[摘录理由]:

  之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm);读者能够直接体会文中所述的意义,便于立刻展开研究。

MXNet专栏 :NNVM打造模块化深度学习系统

2016-10-01

作者:陈天奇    

 

本文是机器之心 MXNet 系列专栏的第一篇,作者是 MXNet 的打造者之一陈天奇。MXNet 专栏是机器之心之后将发表的系列文章,包括 MXNet 打造者的人物专访、技术博客等,敬请期待!

这是一个深度学习的大航海时代,不仅算法和应用日新月异,深度学习硬件发展势头也很迅猛。虽然目前主流硬件是 Nvidia GPU,但 Intel 也试图通过下一代 Xeon Phi 摇头赶上。而在用于汽车自动驾驶和智能硬件的低功耗深度学习硬件上,多家公司在同时发力。深度学习计算框架也是百花怒放,既有成名已久的 Torch 和 Caffe,也有一年前开源就名声大噪的 TensorFlow 和刚刚公开的 PaddlePaddle。我们 DMLC 小伙伴也在上面耕耘了好几年,从早期的 CXXNet, Minerva 和 Purine 到现在用户稳步增长的 MXNet,深刻的感受到了技术的变革。

我们也一直在琢磨,我们需要什么样的技术和系统来更好的服务未来几年深度学习的发展。为了弄清这个问题,我们先来大胆预测下未来深度学习需要什么样的编程和计算环境。

虽然大家都说深度学习能火归功于数据量大和计算能力的提升,但我们觉得它能够在众多领域上快速铺开,更主要得益于它的灵活性。反过来看传统机器学习,每个算法都是针对特定的应用,例如 SVM 主要是对分类,输入一个定长向量得到一个类别标量。大家的发挥余地基本是在特征的抽取上。而深度学习则可以是更多样的输入和输入,例如任意维度的张量,甚至大小都是可以变化。同时模型设计上也很灵活,更宽?更深?空间还是时间?更加精巧的内部连接?从这一点上,深度学习其实是一种语言,我们通过它来描述对问题的理解。

这个灵活性必然导致了深度学习框架前端用户接口的多样化。而且这个趋势肯定是越来越剧烈。因为随着进入这个领域的人越来越多,大家关注的应用各不相同,熟悉的编程语言又各不一样,所以很难会有一个统一的前端语言来满足这些要求。所以我们觉得深度学习的前端很有可能像编程语言那样,风潮涌动。

另一方面,深度学习应用需要大量的计算,目前没有,甚至未来几年内也不会有单一的硬件架构解决所有需求。所以必然是根据场景选择不同的硬件。例如 GPU 适合模型训练,CPU 由于大量存在也经常用作云端模型预测,但很多厂商也开始走 FPGA 路线。ARM 主要用在手机等低功耗的场景上,但很可能很快就会被定制的 FPGA/ASIC 取代。

不同硬件需要不同的优化。例如 GPU 计算单元多,需要算法并行度高,而 ARM 通常内存小而且结构复杂,需要重点优化。而定制化硬件则有更多的特殊打开方式。

所以在前端和后端都在快速发展的今天,要求每一个前端都对每个硬件做更好的支持明显是不能可持续发展的。所以我们要更好的解决方案。

幸运的是历史总是在重复。如果我们往回看,会发现我们曾面临一样的问题。当年编程语言层出不穷,CPU 架构也不断翻新,于是大名鼎鼎的 LLVM 横空出世,通过很好的模块化分离前后端,为新语言和新硬件提供和非常好的支持。

对于深度学习,我们需要类似的项目。学习 LLVM 的思想,我们将其取名 NNVM。他的工作原理如下所示:

示意图

前端把计算表达成一个中间形式,通常我们称之为计算图,NNVM 则统一的对图做必要的操作和优化,然后再生成后端硬件代码。简单地说, NNVM 是一个神经网络的比较高级的中间表示模块,它包含了图的表示以及执行无关的各种优化(例如内存分配,数据类型和形状的推导)。

设计这样一个模块最困难的地方并不是加入新的功能,而是可以在支持新的功能的情况下保持最小的接口,零依赖但是可以扩展未来可能可以想要的各种需求。我们总结了主流的深度学习框架 (TF, caffe2, MXNet) 的 operator 接口设计,设计了一个简洁但是扩展性极强的计算图结构和优化接口。利用这些模块,我们可以很容易地加入新的功能,或者删除我们不需要的功能来组合新的执行框架。

在第一阶段,我们通过把 MXNet 的符号执行模块转移到 NNVM,验证了接口的可靠性。未来我们会给 NNVM 加入更多的执行后端和优化。作为机器学习系统研究人员,我们也会基它来进行深度学习系统优化研究的探索。对于深度学习系统有兴趣的同学不妨一起来参与贡献代码。我们可以利用 NNVM 来很容易地为新的机器学习系统生成各种前端,并且复用通用的优化用以方便地实现各种后端。

目前 NNVM 发布在 https://github.com/dmlc/nnvm。我们相信可以模块化各个部件,从而可以相互组装成满足各种需求的深度学习平台,使得更好的适应未来算法,应用,前端编程环境,后端硬件的高速发展。这是一个 开始,相信未来会有更多更加灵活,模块化和通用的组件出现,使得大家轻松打造深度学习平台不再是一个不可能的事情。

不知道如何使用? 我们同时开放了一个两千行代码的样例项目,教你如何从头开始打造一个和 TensorFlow 一样 API 的深度学习系统 https://github.com/tqchen/tinyflow。

NNVM打造模块化深度学习系统(转)的相关教程结束。

《NNVM打造模块化深度学习系统(转).doc》

下载本文的Word格式文档,以方便收藏与打印。