近日,亚马逊首席技术官 Werner Vogels 在一篇博客上宣布,亚马逊选择 MXNet 作为该公司最主要的深度学习框架;他还宣布 AWS 将会为 MXNet 和该公司所支持的生态系统的开发提供软件代码、文档和投资。这一消息对深度学习领域和 MXNet 社区来说都无疑是重大利好的。看起来知乎上「为什么强大的 MXNet 一直火不起来?」的问题现在终于可以终止了,相信在亚马逊这样的巨头的支持下,MXNet 还将迎来更大的发展并被更多的实践者应用。
MXNet 的前世今生
MXNet 起源于三个不同的开源项目,分别是由在美国的陈天奇,在加拿大的许冰和在香港的王乃岩牵头的 cxxnet,上海张铮老师及其学生牵头的 Minerva,以及在新加坡的 Min Lin 牵头的 purine2 。
2014 年 NIPS 上,同为上海交大校友的陈天奇与李沐碰头,讨论到各个在做深度学习 Toolkits 的项目组,发现大家普遍在进行很多重复性的工作,例如文件 loading 等。于是他们决定组建 DMLC(Distributied (Deep) Machine Learning Community),号召大家一起合作开发 MXNet,分别发挥各自的特长,避免 reinvent the wheel。
据张铮老师回忆,早期 MXNet 的核心成员在十人左右,却曾同时分布在多达六个时区。其中张铮老师指导的 Minerva 团队主要负责后端引擎,陈天奇进行接口设计,李沐负责分布式。
在打造 MXNet 的过程中,团队成员在设计上进行了十分细致的思考和讨论。MXNet 使用 Mixture 设计,融合了其他一些主流框架的优点,例如其像 Tensor Flow 一样的 符号式编程(symbolic),和 Torch 一样的 命令式编程(imperative);为了方便开发者使用,MXNet 支持多种语言接口,同时在底层预步了对 Caffe 和 Torch 等运算模块的兼容等等;在内存使用方面,MXNet 大胆使用了不同于一般的系统内存优化的设计,并取得了很好的效果。
经过一年的努力,MXNet 现身 2015 年 NIPS 的机器学习系统 Workshop。点击「阅读原文」查看相关论文。
2016 年,越来越多的开源贡献者参与到了开发及维护 MXNet 的工作中,对 MXNet 进行了大量的扩展、优化和修复工作。其中包括后期加入 DMLC,并逐渐成为核心成员,负责 rtc 和 torch 的解浚源(Eric),扛下 RNN 部分的 Chiyuan 和张宇,负责 R 接口的 Qiang Kou,Scala 接口的 Yizhi Liu,以及施新建等。截止到 2016 年 11 月中旬,MXNet 项目拥有超过两百名贡献者。
亚马逊背书的开源深度学习框架
在昨天亚马逊的表态之后,机器之心第一时间联系了 MXNet 项目的主要贡献者之一解浚源(Eric),请他谈论了一些对于这一消息和 MXNet 发展情况的一些见解。
以下是机器之心对解浚源的专访内容整理(部分回答引用自知乎):
1)亚马逊选择 MXNet 作为其最主要的深度学习框架,这对于你们双方而言意味着什么?这件事是从什么时候开始计划的?
该问题的答案引用自知乎:https://www.zhihu.com/question/52906838/answer/132582817
Eric:MXNet 发展到现在有一年多了,已经是一个相对成熟的项目。我对我们的技术很有信心。MXNet 的速度,节省内存,接口灵活性,和分布式效率都是可圈可点的。作为一个由爱好者发起,没有投资的项目,MXNet 以前最大的短板是文档和宣传。而 Amazon 作为大财主以后在这方面可以起到很好的作用。
实际上 Amazon 对 MXNet 的支持已经有一段时间了,在 Github 上提交了很多文档方面的改进。细心的同学可能已经发现最近网站变好看了,拼写错误也少了很多(MXNet Documents),花钱请的前端和文案就是不一样。总体来说 Amazon 对开源社区很友好,除了对文档和稳定性的要求严格了一些并没有干涉我们的开发。Code Review 还是我们自己在做,是否接收代码也是社区决定的。
在 Amazon 之前已经有很多公司在默默的用 MXNet 了,只是没有大肆宣传。比如图森、地平线、搞 Mathematica 的 Wolfram 都给 MXNet 贡献了很多代码。
我对 MXNet 的前景很乐观,欢迎大家试用,也欢迎贡献代码,众人拾柴火焰高嘛,不知道从哪里下手的同学帮忙完善一下文档也是好的。有意全职做 MXNet 相关工作的可以联系我们,我们可以帮忙介绍美国 Amazon 以及北京、深圳各大机器学习 Startup 的工作:)
P.S. 这篇文章里关于分布式效率的细节比较少,GPU 也是 K80,比较老。但是我以节操担保线性加速的结果是靠谱的。我们自己在 Titan X 上用 resnet 也能跑出类似的效果。大家可以来试试。
2)在今后的发展中,你怎么看待和 Caffe、CNTK、TensorFlow 以及 Torch 的竞争?
Eric: Caffe 有辉煌的历史,但是随着深度学习模型发展的越来越复杂,对灵活性要求越来越高,已经很难适应需求了。yangqing 吸取了 Caffe 的经验教训,已经开始在 Facebook 内部搞 Caffe2 了。Caffe 的用户应该会在未来 1 到 2 年内迁移到其它平台;
CNTK 目前热度不高,但是微软在持续投入,最近刚加入了 Python 前端,未来怎么样还不好说。
值得一提的是微软的 Azure 团队最近发了若干篇在 Windows 上用 MXNet 和 R 做深度学习的 blog。个人认为是因为 MXNet 对 Windows 和 R 都有完善的支持,用 Windows 的统计学家是微软的重要客户群。
剩下的平台都有各自的特色,我认为未来会共存很长时间,很难实现一款平台统一所有市场
Torch 比较像一个免费且原生支持 GPU 的 Matlab,在学术圈习惯 Matlab 或者不用 Python 的人群中很受欢迎。Torch 的封装少,简单直接,前期学习和开发时的思维难度都比较低。但是由于封装少和 Lua 本身的限制,工程性不好、容易乱写、代码可复用性差,导致 Torch 不适合做大项目的开发。
TensorFlow 希望做一个大而全的机器学习框架,而不只满足于深度学习。我认为 TF 会沿着替代 sk-learn 的方向发展,会比较适合快速实现标准算法。但是大而全的负面因素就是代码量大、抽象层数多、代码冗余,对性能和可定制性都会带来负面影响。可能并不适合需要深度定制、对性能敏感的企业和做前沿研究的 research。
MXNet 的方向是小而精、灵活高效。我们希望把核心深度学习的做到极致。MXNet 的代码量小,容易深度定制,同时支持 imperative(类似 Torch)和 declarative(类似 TF)两种 API,所以更灵活。另外 MXNet 的单机和分布式性能都是很好的。缺点是相对于 Torch 学习难度会大一些,另外以前没有资金支持,文档和宣传做的比较差。但是有了 Amazon 的支持,相信在这些方面会有大幅改善。
3)可否为大家讲解一下 MXNet 是如何达到拔群的 scaling efficiency 的?
Eric:MXNet 的并行化部分用了李沐的 pslite 进行通信,基于 zeromq,效率很高。另外 MXNet 基于依赖引擎(Dependency Engine)调度,每一层的梯度计算完毕后马上就可以开始传输,实现最优的 communication and computation overlapping。
4)可以介绍一些基于 MXNet 的有趣应用吗?
Eric: MXNet 有 Fast/Faster RCNN 和 SSD 的实现样例,另外还有一个用 DQN 玩 Flappy Bird 的例子,比较有趣:
Fast/Faster RCNN 案例:https://github.com/dmlc/mxnet/tree/master/example/rcnn
SSD案例:https://github.com/dmlc/mxnet/tree/master/example/ssd
DQN-Flappy Bird案例:https://github.com/li-haoran/DRL-FlappyBird
5)MXNet 开源社区现在发展状况如何?说点什么呼吁人们参与到 MXNet 的开发和应用中来?
Eric: MXNet 的社区很活跃,我们已经有超过 200 个 contributor,包括很多公司的员工,以及学生和爱好者。MXNet 需要提升的主要是文档和教程。另外陈天奇正在研究运行时编译(RTC),不久后会发布,可以带来进一步的性能提升。近期我们会发布 0.9 版本,完成了后端到 nnvm 的迁移,以及很多新的 feature,比如一个用来调试性能的 profiler。