「动手学习Tensorflow」- 深度学习框架纷争

「动手学习Tensorflow」- 深度学习框架纷争


大家好,我是人工智能工程师Alpha浪。

作为一名AI工程师,掌握一门深度学习框架是必备的生存技能之一。

深度学习发展至今,出现过很多深度学习框架,如theano,cntk,caffe,caffe2,torch,mxnet,keras,chainer,tensorflow, pytorch,PaddlePaddle 等。

框架之间竞争激烈,经过不断的纷争,有的框架成为主流,而有些框架使用的人越来越少,甚至退出了历史的舞台。


框架之间的纷争


Caffe和Theano 是比较早的深度学习框架。Caffe是贾扬清在加州大学伯克利分校攻读博士期间创建的项目,在2014年开源。

想当年,从事计算机视觉相关研究的小伙伴要复现一个深度学习相关的工作基本要从头到尾自己手撸,写代码和调试要耗费比较大的时间和精力。

Caffe的开源在当时受到了相关研究者的欢迎和热捧,尤其在图像等领域受到了广泛的应用。

Theano是大牛Benjio所在的蒙特利尔机器学习小组所创建的Python库,诞生于2008年,是很多人深度学习实操的启蒙框架。

然而,随着巨头google开源的tensorflow 和 Facebook 开源的Torch问世,这两个框架的使用人数越来越少。最终,Theano 官方在2017年宣布不再维护,而Caffe的升级版Caffe2则被整合到了Pytorch中。

Google 在2015年开源了Tensorflow,它的前身是Google内部从2011年开始使用的DisBelief。Facebook 则开源了Torch,torch是一门非常优秀的框架,但是需要使用不是十分流行的Lua进行深度学习开发。

印象中在2015年的时候,当时Stanford Nlp组提出了Tree structured Lstm, 并开源基于Torch的实现代码。

我当时想在它的代码上进行魔改,来实现自己的一些idea,但是由于对Lua不是很熟,魔改的过程异常艰难。

可能也是由于对Lua语言没那么熟悉原因,Facebook开源的Torch不是很能打,Tensorflow在Google的强推下变得越来越主流。

Facebook 在2016年9月份开源了Pytorch。PyTorch的前身是Torch,其底层和Torch框架一样,但是使用Python重新写了很多内容,不仅更加灵活,支持动态图,而且提供了Python接口。

和当时只支持静态图的tensorflow相比,支持动态图的pytorch 编写代码和调试起来更加方便,因此也受了越来越多的人的欢迎。

CNTK是由微软发布的一款机器学习框架,但是使用的人一直比较少,相关的博客也很少。

MXNET是由李沐,陈天奇等大神引领的开源社区开发的深度学习框架,目前已进驻apache开源项目,并受巨头Amazon热捧,但是mxnet一直不温不火。

个人感觉mxnet比较可惜,mxnet有一段时间是比较领先的,但是那个时候是由相关的开源社区维护和推广,力量比较有限。虽然后来加入了apache开源项目,并抱到了Amazon的大腿,但是失去了先机,现在从使用人数上应该排在第三的位置。

经过不断的衍化和升级,Tensorflow和Pytorch在众多深度学习框架中脱颖而出,形成了两强争霸的局面,是当下最火的深度学习框架,被广泛应用在工业界和学术界。


Tensorflow VS Pytorch


「动手学习Tensorflow」- 深度学习框架纷争

Tensorflow 在工业界有着更广泛的应用,Pytorch在学术界有着更广泛的应用。

TensorFlow强在在线部署,多语言支持和较好的线上系统稳定性,我觉得这个是TensorFlow在业界被广泛应用的最主要原因。

在业界,无论算法性能有多好,总归还是要上线的,不然都是白扯,不上线就算不到kpi中去。而方便部署到线上,支持多语言,并且有较好的系统稳定性以及有非常多线上应用实例是TensorFlow称霸业界的主要原因。

比较好一点的公司会在线上部署TensorFlow Serving,这样算法科学家们只需要提供相应的Tensorflow model即可将模型上线。

但是据我所知,在国内某电商巨头公司内部,只有某院才能够使用TensorFlow Serving, 其他业务部门(包括很多小公司)想将TensorFlow modle上到线上,一律通过TensorFlow api来加载模型,做线上serve。

这时候TensorFlow 支持多语言的特性就发挥了巨大的作用,它不仅支持c++, python,还支持如java等语言;很多公司目前的infrastructure 还没有针对AI做更新换代,也不提供相应的TensorFlow serving 能力,所以这些公司基本都用C++或者java来做TensorFlow 模型的线上serve。

再者,TensorFlow基于静态图的这种方式非常适合线上应用,一次build好graph,多次在这个图上面做inference,工程效率很高。

但是在线下,TensorFlow体验很差,用过的人都觉得体验很不好。

1. 在TensorFlow1.x时期,基于静态图的模式,无法在变量定义和使用的时候查看tensor的值,只有在session run的时候才能查看tensor的值,使得debug起来异常困难。

2. TensorFlow API混乱,使用体验比较差。

而Pytorch 在API和文档方面都做得更好,并且pytorch是基于动态图的模式,可以很方便的查看tensor的值,可以像debug Python程序一样debug pytorch模型。因此,pytorch在只关心算法性能而不用太关心部署的学术界,非常受欢迎。

虽然TensorFlow2.x默认是eager execution模式,可以像pytorch一样直接查看tensor的值,但是个人感觉出来的还是有点晚,短时间内可能不太会是主流的线下框架了。

一方面,已经习惯TensorFlow1.x的人还要重新学习tensorflow2.x,并且在TensorFlow1.x中静态图习惯的一些写法,在TensorFlow2.x可能不怎么支持,还要重新再踩很多坑,才能比较好的掌握;另一方面,习惯使用pytorch的那波人不太会去在学习TensorFlow2.x。

虽然Pytorch在新版本中也出了新的特性,更好的支持线上部署,但毕竟是才出来不久,没有经过线上的长时间检验,实际线上应用案例和分享也比较少。

而TensorFlow自15年release以来,已经在线上经历了五年多的考验,撑过了多次双十一高流量的检测,性能稳定。

Pytorch想更广泛应用在线上,短时间内也不太现实,替换成本还是很高,TensorFlow在这方面已经占尽了先机。

总的来说,Tensorflow在业界线上部署占尽了先机,而Pytorch在线下占尽了先机,短时间内谁都不能很快的取代谁。


框架之间的统一


「动手学习Tensorflow」- 深度学习框架纷争

Open Neural Network Exchange (ONNX,开放神经网络交换),是一个通用的深度学习模型标准。

起初是微软联合Facebook等多个相关公司为了抗衡Tensorflow而提出的,Pytorch,CNTK,MXNET等框架都支持导出和加载ONNX格式的模型。

模型格式的统一,可以给不同框架之间提供更好的交互性。例如,我们线下模型代码是用Pytorch实现的,但是线上是用MXNET部署的。

没有ONNX,我们可能要将代码重新用MXNET进行实现;有了ONNX,我们只需要将Pytorch模型实现导出到ONNX格式的模型,然后线上使用MXNET进行加载即可,非常方便。


「动手学习Tensorflow」- 深度学习框架纷争


而后,随着ONNX的发展,现在也支持Tensorflow和ONNX之间的相互转换,不过这个特征是在ONNX中实现的,Tensorfow官方暂不支持。


如今,ONNX支持上图中的框架,可以说常用的机器学习框架和深度学习框架都支持了。


「动手学习Tensorflow」- 深度学习框架纷争


对于ONNX,除了使用Pytorch,MXNET等框架提供的线上Inference方式,还可以使用进行优化过的Inference框架,如Nvidia的TensorRT,小米的MACE,腾讯的ncnn等。


Nvidia的TensorRT对计算图中的计算做了相应的优化,相比使用tensorflow部署线上模型,性能可以提高10+倍以上。


虽然ONNX可以将不同框架统一起来,虽然TensorRT可以将线上Inference速度提高很多,但是毕竟没出来多久,可以找到的例子和博客也比较少。


对于目前来讲,工业界线上部署的模型大部分还是Tensorflow。


动手学习Tensorflow


工业界线上部署的模型大部分还是Tensorflow模型,接下来的日子我们开始动手学习Tensorflow,精彩内容不容错过。



分享到:


相關文章: