众所周知,在机器学习框架领域,PyTorch、TensorFlow已分别成为目前学术界和工业界使用最广泛的两大实力玩家,而紧随其后的Keras、MXNet等框架也由于其自身的独特性受到开发者的喜爱。
本文主要是为部分初学者提供建议,框架并无“最好”与“最坏”之分,选择最终归结于您的技术背景、需求和期望。
TensorFlow:出身豪门的工业界霸主
TensorFlow于2015年11月面世,基于Apache License 2.0协议发布,由Google Brain团队研发。到目前为止也是github上热度最高、使用人数最多的深度学习框架,业界很多招聘要求中也提到了它。2019年3月推出TensorFlow2.0 版本,整体与1.0版本相比发生了较大的变化。
TensorFlow能有现在的地位,主因有二:一是“背靠大树好乘凉”,Google几乎在所有应用程序中都使用TensorFlow来实现机器学习。得益于Google在深度学习领域的影响力和强大的推广能力,TensorFlow一经推出关注度就居高不下;二是由于其本身设计宏大,不仅可以为深度学习提供强力支持,灵活的数值计算核心也能广泛应用于其他涉及大量数学运算的科学领域。
优势归因:
支持python、JavaScript、C ++、Java和Go,C#和Julia等多种编程语言;灵活的架构支持多GPU、分布式训练,跨平台运行能力强;自带TensorBoard组件,能可视化计算图,便于让用户实时监控观察训练过程;官方文档非常详尽,可查询资料众多;社区庞大,大量开发者活跃于此。踩坑预警:
从框架本身的语言设计来看,入门难度较大。加之部分自创的抽象概念,提高了学习门槛;系统设计过于复杂,代码总量逾100万行,学习者如果希望了解TF的底层运行机制,无疑漫长而艰辛;文档和教程虽多,但缺乏条理,新旧版本割裂,对初学者来说很难找到一个循序渐进的入口;接口迭代频繁,且版本间不兼容问题足以令人头秃。尤其在TF2发布后,不少TF1的用户发现很多开源代码无法在新版本上运行;在移动平台和嵌入式领域中TensorFlow过于“臃肿”,计算速度也不尽如人意(Google针对这一问题又开发了TensorFlow Lite)。小结:TensorFlow发展到如今,多少有点“始于宏大,囿于宏大”的意味。虽然吐槽者甚多,但也侧面说明了使用者众多。况且在工业界TensorFlow依然是深度学习框架中无可争议的标杆,加之谷歌的支持,投入时间学习算是一项相当不错的选择。
Keras:用户友好的极简主义拥趸
如果你已经掌握了Python并准备开启深度学习之旅,Keras可能会是最易上手的一个工具。严格来说,与其说Keras是一个深度学习框架,不如说它是一个由Python编写的开源神经网络库,一个构建于第三方框架之上的深度学习接口,一种高级API。Keras本是为支持快速实验而生,可以基于以TensorFlow为代表的多种深度学习框架快速建模,将你的想法迅速输出为实验结果,其设计充分体现了“用户友好”这一特性。
为了提供简洁一致的API,尽可能为用户减少重复造轮子的顾虑,Keras做了层层封装。这种高度封装一方面使用户的学习变得容易,但另一方面也缺乏灵活性,经常导致用户在获取底层数据信息时过于困难,改写现有的神经网络层也十分复杂。此外,由于不少Bug隐匿于封装中,这也使Keras运行速度相对缓慢。
优势归因:
用户友好,代码可读,句法明晰,高度模块化,便于上手;提供简洁的API,减少一般应用下用户的工作量;支持实现卷积神经网络和循环神经网络,或二者的结合;相同的代码可以在CPU或GPU上无缝切换运行;官方文档详尽易懂,用户社区庞大。踩坑预警:
高度集成,缺少灵活性,深入学习时容易遇到瓶颈;过度封装在一定程度上增加了调试难度;对DL的入门者来说,容易因Keras 的易用性而忽略底层原理。小结:在众多的深度学习框架中,Keras可以说将“极简主义”发挥到了极致。简洁的代码、简洁的API、简洁的模型构建和导出,这些都让深度学习看上去似乎不那么“高不可攀”了。不过对于初学者而言,Keras到底适不适合推荐则是见仁见智。支持者认为,Keras最大限度地减少了用户操作,并使模型非常容易理解,对菜鸟们绝对是很好的敲门砖;反对者认为,在使用Keras的大多数时间里,用户主要是在调用接口,很难真正理解到深度学习的内涵。其过度的封装容易让新手陷入似是而非的处境。
MXNet:低调规矩的轻量级选手
MXNet是一个轻量级的深度学习库,在2016年被AWS正式选择为其云计算的官方深度学习平台。2017年1月,MXNet项目进入Apache基金会,成为Apache的孵化器项目。MXNet以其超强的分布式支持,明显的内存、显存优化为人称道。同样的模型,MXNet往往占用更小的内存和显存,因此对资源不够的朋友来说是一个不错的选择。
作为一个轻巧的框架,MXNet的特点非常鲜明:语言接口非常丰富,包括C++、Python、R语言、Scala、Julia、Matlab和JavaScript;支持多端运行,可以运行在多CPU、多GPU、集群、服务器、台式机或者移动设备上;允许用户混合使用符号编程和命令式编程,最大限度确保深度学习框架的灵活性和执行效率。
优势归因:
支持多语言接口;同时支持符合式和命令式编程,集灵活与效率于一体;分布式环境下扩展性能出色,可有效扩展到多个GPU和多台机器;有AWS的平台支持,云端部署便捷。踩坑预警:
初期推广不给力,过于低调以致整体生态构建相对滞后,用户社区活跃度较低;教学文档不够系统,甚至于只能通过查看源码来真正理解MXNet接口的用法,学习成本较高。小结:MXNet自发行到现在一直比较低调和小众。创始人李沐曾提到MXNet发展早期是“舍推广保技术”。虽然性能上也算可圈可点,但终究没有迎来大放异彩的时刻。另外官方文档的“粗糙”也劝退了相当一部分用户,尤其对从零开始的新手来说,上手难度较高。
PyTorch:以动态图崛起的学术界宠儿
PyTorch是基于Torch并由Facebook强力支持的python端的开源深度学习库。它于2017年1月发布,是近年来最引人关注的深度学习框架之一。2018年Caffe2正式并入PyTorch后,PyTorch的发展势头更呈不可阻挡之势。因其上手简单、功能强大,可以非常快速地验证研究思路而广受研究人员的青睐。
有TensorFlow的“宏大蓝图”在前,PyTorch能如此快速崛起,主要原因在于:支持动态计算图,提供了很好的灵活性;易用性强,近乎傻瓜式操作非常亲民;有非常详尽清晰的官方教程,吸引了大量开发者和研究人员,社区迅速壮大。目前许多新发表的论文都采用PyTorch作为论文实现的工具。如果你是一名科研工作者,PyTorch或许会是你的首选。
优势归因:
简洁。PyTorch在设计上更直观,追求尽量少的封装,建模过程透明,代码易于理解;易用。应用十分灵活,接口沿用Torch,契合用户思维,尽可能地让用户实现“所思即所得”,不过多顾虑框架本身的束缚;社区。提供完整的文档和指南,用户可以通过全面的教程完成从入门到进阶,有疑问也可以在社区中获得各种及时交流的机会。踩坑预警:
生产环境部署仍存在大问题。PyTorch能在学界一枝独秀,主要是因为“研究”更注重快速实现、验证自己的想法,而不太注重部署的问题,一般“怎么快怎么来”。但在业界,部署的快速和稳定是必要的。否则做实验时节省下来的时间,都要在生产上线时加倍还回去。
小结:PyTorch的易用性是毋庸置疑的“王牌”。越来越多的人因为这一点开始学习PyTorch,不过其在工业界的部署问题也不容回避。显然,当你充分了解到这些利弊时,就应该明白这些深度学习框架都是工具,学的越多,可选择的余地越大。
国内深度学习框架自研之路
2020年上半年,华为Mindspore、旷视MegEngine、腾讯TNN、清华Jittor等数个国产AI框架渐次宣布开源,讨论的热度一直在持续。最近一流科技的OneFlow又首创性地引入Actor模型和SBP机制,以其独特设计引起关注。很多人也开始思考:在已有成熟的开源深度学习框架并拥有完整生态的情况下,中国企业和机构是否有必要再另造一套框架?自研深度学习框架的创新空间又有多大?
近几年,基础技术的“卡脖子”问题逐渐浮出水面。不久前美国政府发布的“芯片禁令”将华为逼到了非常被动的境地。前事不忘后事之师,中国要想发展好新一代的人工智能,通过自主研发来掌握AI底层技术无疑是未雨绸缪的重要举措。因此自研深度学习框架是非常必要的。不过局中人也都知道要超越那些已有的成熟的框架也是很难的,那么出路何在?
虽然很多人认为深度学习框架的融合是时之所趋势,TensorFlow2.0和PyTorch也的确是越来越像了,但实际上深度学习框架的市场是很大的,用户需求也是多样的,这就注定不可能由某个企业、某个产品垄断。就像TensorFlow也曾一家独大,但PyTorch横空出世后迅速形成两强对峙的局面,关键就在于两者设计初衷的差异。TensorFlow面向工业界,侧重推理,在部署上实现了工业级的稳定;PyTorch面向学术界,侧重训练,足够简单易用,能达成快速实现和验证。最终两者在各自面向的领域都确立了王者地位。
差异化可能将是深度学习框架自研之路上的制胜关键。单纯依靠模仿的框架肯定是没有出路的,如何与现存的成熟的深度学习框架区别开来进而打造自身亮点是众多开发团队所要考虑的。PaddlePaddle模型库丰富,MegEngine追求训练推理一体化,Mindspore深耕自动并行的训练能力,OneFlow专注分布式环境下的性能提升……相比“一枝独秀”,“百花齐放”无疑更有利于国内深度学习框架的长足发展。