常见深度学习框架及选用考虑
图三 常见深度学习框架
许多人准备开始进入深度学习世界时,最常问的问题就是到底要挑选哪一种框架来入门?有如(图三) 、(表格一)所示,从最大的开源社群Github上,就可找到二十种星星数超过一千的深度学习框架,包括TensorFlow、Keras、Caffe、PyTorch、CNTK、MXNet、DL4J、Theano、Torch7、Caffe2、Paddle、DSSTNE、tiny-dnn、Chainer、neon、ONNX、BigDL、DyNet、brainstorm、CoreML等,而排名第一名的TensorFlow更有近十万个星星。由此可知,深度学习非常受到大家重视,当选择深度框架时可以从好几个面向来考虑,以下将会分别介绍。
1. 程序语言
首先是开发时所使用的程序语言,如果要执行「训练」及「推论」效率好些,则可能要用C++。若要上手容易、支持性强,则要考虑Python,从(表格一)中可看出有3/4的框架都支援Python。
若习惯使用Java开发程序,那大概就只有TensorFlow、DL4J和MXNet可选了。目前有一些框架(如TensorFlow、Caffe等)底层是C++,应用层API是用Python,这类框架能取得不错的开发及执行效率。
若想改善底层效率时,还要考虑依不同硬件,学会OpenCL或Nvidia的CUDA/cuDNN等平行加速程序写法。
2. 执行平台
再来考虑的是可执行的操作系统及硬件(CPU、GPU)平台,目前大多数的框架都是在Linux CPU+GPU的环境下执行,部份有支持单机多CPU(多线程)或多GPU协同计算以加速运行时间,甚至像TensorFlow、CNTK、DL4J、MXNet等框架还有支持丛集(Cluster)运算。
许多云端服务商(Google、Amazon、Microsoft等)也是采取这类组合,方便布署开发好的应用程序。另外也有些非主流的框架(如:tiny-dnn)只支持CPU而不支持GPU,这类框架的好处就是移植性较强,但工作效率很差,较适合小型系统。
如果是用Windows的人,英特尔(Intel)及微软(Microsoft)也分别有提供BigDL及CNTK,若使用Mac系统则要考虑使用CoreML。不过最近Google的TensorFlow为了吃下所有的市场,已经可以支持Linux、Windows、Mac甚至是Android,因此成为开源排行榜第一名。
3. 模型支持
目前常见的深度学习模型包含监督型(如CNN)、时序型(如RNN/LSTM)、增强学习(如Q-Learning)、转移学习、对抗生成(GAN)等,但不是每个框架都能全部支持。
举例来说:老牌的Caffe适合做监督型学习,但对于时序型学习就不太合适,遇到对抗生成模型时就更使不上力。若不清楚那些框架可支持的模型类型,可参考(表格一)的对应网址,前往各官网了解使用上的限制。
4. 框架转换
如果遇到需要串接不同平台或框架时,则要考虑选用具有提供跨框架功能。目前有几大阵营,像Keras可支持TensorFlow、Theano、MXNet、DL4J、CNTK,而微软和脸书联盟推的ONNX可支持Caffe2、CNTK、PyTorch等,但Google的TensorFlow却不愿加入该联盟。
另外,虽然框架之间可以转换,但不代表转换后的执行效率会和直接使用某个框架一样好,此时只能依实际需求来取舍是否拿弹性换取效能。
5. 社群支援
最后要考虑选用的框架社群是否活跃,是否很久没有维护(升级),甚至被预告即将淘汰,像Theano虽然功能强大也有很多人在用,但目前确定已不再更新版本,因此建议不要再跳坑了。另外对于英文不好的朋友,选用框架的社群讨论区、文字教程、操作视频等是否有中文支持也是很重要的,以免遇到问题不知向谁求救。
表格一 深度学习框架比较表
总结
对于新手来说,目前用Python+Keras+TensorFlow是最多人的选择,网络上也可取得最多资源(包含中文),可支持的操作系统、硬件平台、模型以及数学函式库也是最丰富的。特色是弹性大,相对容易开发,也是最容易布署在云端的解决方案。
但这样的组合并非完全没有缺点,例如CNTK的执行效率相较于MXNet略差,而Python需占用较多内存,不利于布署在本地端(或嵌入式系统)进行边缘计算,因此如何选择合适的框架,有赖于大家多花点心思了。
作者:许哲豪