作为谷歌AlphaGo背后的强大推动力,于2015年底开源的TensorFlow一经推出便受到极大关注。目前在所有机器学习框架中,如果它宣称使用普及率第二,没人敢说自己是第一。
虽说有谷歌的背书,社区好,资源多,但同学们在使用TensorFlow的过程中,常常会一不小心跳进坑里,严重影响体验。
近日一位同学就在知乎上提了一个问题【TensorFlow有哪些令人难以接受的地方?】,表达了TensorFlow在使用过程中的不便,顺便问了大家有没有什么更优雅的方法绕过那些坑。短短一个月的时间,该问题的浏览量已经达到10万+,关注者也达上千人。
作为问题的提出者,这位同学也试着抛砖引玉作了回答,他表示提出这个问题的初衷是希望引发大家对TF少一些盲目的推崇,多些理性的思考和进一步的讨论。而在全部42个回答中,雷锋网AI科技评论也总结了一些有意思的现象。
TensorFlow的“吐槽大会”
结合知乎上网友的回答,以及业内相关人士对TensorFlow的评价,AI科技评论整理了TensorFlow目前被“吐槽”频率比较高的一些问题。
文档和接口混乱
因为它的API发展太快,经常更新,所以有一些常用的函数方法会不断挪位置,例如rnn就从之前的nn接口移到contrib接口,写代码时需要常常翻阅文档。底层接口写起来繁琐,高层接口不灵活,且封装混乱。
默认占用所有GPU的所有内存
在实验过程中,并不是所有人都有多块GPU可用。tf在GPU不可用时会自动改在CPU上跑,这样一方面会导致速度变慢,另一方面,在共用显卡的情况下,你根本就不知道是在CPU上跑。虽说tf会打印设备信息,但是tf启动的时候输出的信息太杂了,没法每次都仔细看一遍。
使用繁琐
明明有其他更通用的模块能用,可事无巨细都要去使用tf的模块。例如虽然有默认的python库argparse可以用,但在很多tf示例代码中使用tf.app.flags。
做流程控制非常难以理解
语句中存在条件分支,例如当a>0时执行一步,a<0时执行另一步,如果有多层的这种条件嵌套会很难操作。
调试困难
TensorFlow作为静态图框架,api经常变,打印中间结果必须要借助Session运行才能生效,或者学习额外的tfdbg工具。而如果是用PyTorch这样的动态框架的话,就不需要多学一个额外的工具,只需要用正常的Python调试工具如ipdb就可以了。
综合看来,在使用TF的过程中,确实存在很多不够人性化的地方。不过,每个工具都不是完美的,虽说TF缺陷很多,但是对框架使用情况的统计数据最能说明问题,正所谓“TF虐我千万遍,我待TF如初恋”嘛。
TF普及率遥遥领先
下表为各个开源框架在GitHub上的数据统计(数据统计于 2017 年 9月 6 日),可以看到 TensorFlow 在 star 数量、fork 数量、contributor 数量这三个数据上都完胜其他对手。
此外,特斯拉AI负责人Andrej Karpathy2017年初通过分析过去五年arxiv上的论文数据,对比了各种深度学习框架的使用情况,看图说话:
下图是从2012年1月到2017年3月各框架的使用随时间的发展趋势。
下图对比了2017年3月在arxiv上提交的论文中提到深度学习框架的情况。
结合上面两张图,可以看到,自15年底谷歌开源TensorFlow以来,它的用户数增长稳定,而且一直处于高速的增长中,到17年3月,已经处于不可撼动的地位。(pytorch于2017年1月才开源,此处不做对比)
AI科技评论也总结了TensorFlow的几点优势。
背靠谷歌这座大山,目前TensorFlow的文档最全,资源最多,很多模型都有tf的源码实现。而且用户基数庞大,一旦出问题很容易找到解决方案。
TensorFlow有功能强大的可视化组件TensorBoard,能可视化网络结构和训练过程,对于观察复杂的网络结构和监控长时间、大规模的训练很有帮助。
虽然TensorFlow是静态图操作,会给调试带来困难,但会大大方便部署。除了caffe,目前还没有其他架构能支持静态图操作,但是caffe编程要比TF复杂。
而有意思的是,caffe作者贾扬清也在知乎上为TensorFlow正名。
他提到,TF是目前唯一一个在核心设计层面上支持dynamic control flow的框架,也是极少几个经历大规模多应用部署考验的框架之一。TensorFlow能直面实际应用中的限制条件,部署到真正核心的产品里面,它支持大规模推荐系统和移动端产品的部署,而这点对于很多框架来说没法实现。
“TF的确难,但是它给你提供了真正可以产品化的可能性。很多问题只看见一棵树的时候简单,看见森林的时候,解决方法就不一样了。”
细数完优点和缺点,问题来了。对于哪些实在忍受不了TensorFlow缺点的人,在考虑是否应该换个框架了。而对于那些还没入坑的同学,到底该用哪种框架?
当前主流框架大对比
主流框架的对比一直是个长期被讨论的话题,相关的帖子和文章也层出不穷。而在今年三月的斯坦福大学cs231n中,李飞飞、Justin Johnson和 Serena Yeung 也对当前几种主流框架进行了对比,并给出了建议。
TensorFlow虽然不完美,但是利于部署,有稳定的社群。此外它还拥有很多库,比如Keras和Sonnet等。
PyTorch很适合用于研究,但是它很新,因此你可能有很多坑要填。
除了TensorFlow,caffe、caffe2也可以用于产品部署。
手机端可以考虑TensorFlow或caffe2。
此外,北大的吴秉哲同学在知乎上也给出了很好的解答,他之前用Pytorch,Tensorflow,Mxnet这三个模型都做过项目,认为应该根据自己的需求选择模型。
在需要快速验证一下自己某些想法的时候,我一般会用Pytorch快速实现,而且Pytorch的底层计算的代码是C写的,并且和Torch共用一套底层计算代码,想要阅读原码并做定制化修改比较容易上手。
在做一些数据量比较大的long term的训练的时候,我会用tensorflow,比如它提供的tensorboard的训练监督,还有自带的profiling和debug功能比较方便,还有个原因就是它可以很方便的把模型deploy到手机上,现在caffe2出来了,或许可以是一个比较好的替代。
另外选择框架的时候还得参考一下你所做的项目,比如做person re id大多数的工作都是基于caffe修改的,这个时候需要考虑迁移这些工作到其他框架下时不时会遇到坑。
如果做物体定位,Mxnet已经提供了一些操作的高效实现。
他还强调,“现在框架迭代得也越来越快,mxnet在近期推出gluon的接口,API仿照Pytorch设计。不久之后Tensorflow也会有相应的接口推出。”
总结
很多同学在实验过程中,总是对框架过多考虑。这个框架的速度怎么样?好用程度程度怎么样?为什么文档这么乱?为什么用起来这么不顺手?随之而来就是一系列的吐槽。而他们往往忽略了最关键的东西,框架只是个手段,重要的是你想解决的是什么问题,以及你解决问题的思路。
此处借用贾扬清一句话,“框架就是个框架,最终要能出活。”