1|前言
深度学习编程框架提供了用于深度学习设计、训练,验证等功能的基本模块使用架提供的高级API,用户可以简单方便地实现各种深度学习以及机器算法目前,市面上有很多流行的开源框架,每个框架都有自己的用户群和优缺点。几乎所有的框架都支持CPU和GPU设备,使用了常见的基于设备的加速库,如BLAS, cuBLAS、NCCL等。选取 TensorFlow、 PyTorch、Cafe、 MXNet、paddlepaddle这五个相对有代表性的框架进行全面的对比。
首先我们统计了各框架在社区的活跃程度,如图1所示,从开源社区 Github上统计了各框架的星标(Star)数、仓库复制Fork)数、讨论帖(Issue)数和代码提交请求(Pull Request)数。这四个指标大致反映了一个框架的受欢迎程度和活跃程度其中, TensorFlow在三项中都具有明显的优势。 PyTorch的代码提交请求数排第一,说明它也是一个非常活跃的有着众多用户的框架。
表1中列出了这些框架的其他比较项,包括主要维护团体、框架支持的前端语言支持的操作系统平台、支持的操作系统平台、编程模式以及现阶段辅助工具生态等。下面我们从这些角度分别计论各个框架的情况。
1 | TensorFlow
TensorFlow是一个规模较大的框架,在开源之前就已经在 Google内部得到了广泛的应用。开源后很快成为社区最受欢迎的框架之一。
TensorFlow功能强大,覆盖面广,支持众多常见的前端语言,覆盖云端到终端几乎所有的平台,同时也有众多的辅助工具来支持多平台多设备使用。例如,可视化计算图工具 Tensor Board既可以让用户查看计算图结构,也能让用户追踪训练过程,如Loss收敛情况等; TFLite则可以将训练好的模型导出为终端设备使用的轻量模型,方便手机或嵌入式设备使用;Profiler则是性能剖析工具,可以帮助使用者分析和优化模型性能。
TensorFlow社区力量强大,文档完善,对初学者较为友好从图1中我们就能看到, Tensor Flow的使用者非常多,这些用户在 Gthub、 Stackoverflo 、CSON、 Merium等社区网站留下了大量的教程和使用经验,初学者很容易就能查到之前遇到的问题此外, TensorFlow自身也提供了丰富的教程和开源模型(tensorflow/models),帮助大家更好地学习和使用。
当然, TensorFlow也有很多广为使用者病的缺点,如API较为混乱、声明式编程不方便调试等。因此,在最新版的 TensorFlow 2.0中对于众多API做了系统性梳理掉了一些余重复的API,更重要的是, TensorFlow在2.0版本中默认采用适合快速开发和调试的命令式编程(即Eager模式),不需启动会话(Session)即可逐条执行程序员编写的命令,得到结果。 Eager模式还高度集成了更高层 Keras API,使用起来更加方便。当然命令式编程无法对于整个计算图做全局优化,执行速度较低,因此,在大规模部署的生产环境下,建议采用基于 Session的声明式编程,通过提供 两种编程模式,TensorFlow 2.0既能满足学术研究人员即写即用、方便调试、快速验证想法的灵活性需求,又能继续提供工业界大型项目所需的高效性和高可靠性
2 | PyTorch
PyTorch目前主要由 Facebook维护。相对于TensorFlow, PyTorch显得小而灵活。
PyTorch前端支持 Python和C++,尤其是对 Python用户非常友好。 PyTorch支持的自动求导和 TensorFlow不同,后者在添加新算子时需要自己实现求导函数,但 PyTorch不用。此外, PyTorch的模块化编程方法对复用网络架构特别适用,可以极大提高开发效率, PyTorch一直支持动态图命令式的编程模式,虽然牺牲了静态图优化的运行效率优势,但更加好用(比如在复杂循环网络)和方便调试(比如直接使用 Python的调试工具pdb),因此广受欢迎 PyTorch的辅助工具也非常多,除了自身提供的可视化工具 Torch Vision之外也支持模型在 Tensor Board上的可视化,同时也提供了丰富的模型库。随着使用人数的增加,社区内容也日趋完善。基于上述优点,在小规模的使用场景和学术界, PyTorch使用数量迅猛增长,有赶超TensorFlow的趋势。
此外我们也看到,目前 Py Torch无法全面支持各种平台,这意味着训练好的模型不能很方便地转移到其他平台或设备上使用,因此对生产环境来说, PyTorch目前还不是首选。
3| MXNet
MXNet是一款针对效率和灵活性而设计的深度学习框架。它和 TensorFlow一样支持声明式编程,也支持命令式编程(MXNet Gluon),用户可以混用声明式编程和命令式编程以最大化开发效率。 MXNet支持的语言很丰富,如R、 Julia和Go等 MXNet的总体框架类似 TensorFlow,但是后端代码比 TensorFlow轻量得多 MXNet基于动态依赖调度器,并且能够高效支持多设备和多机器。
4| Caffe
Calfe是出现最早的框架之一,最开始由加州大学伯克利分校所开发,后由开区维护
相对于 TensorFlow的计算图以算子为单位, Caffe的计算以层(layer)为粒度,对应神经网络中的层, Caffe为每一层给出了前向实现和反向实现,并采用 prototxt格式表示网络结构的层次堆叠,相对于 TensorBoard里呈现的分散算子,如果 TensorFlow在实现网络时没有很好地组织命名空间,则很难看出网络结构和功能, 而Caffe的 prototxt就非直观和简单 。Caffe的这些特性,使得使用者能很快掌握深度学习基础算法的内部本质和实现方法,并由此开发出自己的 Caffe变种,完成自定义功能。
然而,正是由于它使用层的粒度来描述网络,缺少灵活性、扩展性和复用性,同时,由于 Caffe早期是为卷积神经网络设计的,在功能上有很多局限性,对RNN类的网络支持很有限,同时也不支持多设备和多机器的使用场景,虽然早期的 Caffe版本已经不再维护更新了,但 Caffe依旧能够为深度学习的初学者提供一个了解深度学习计算本质(而不仅是停留在使用各种高层API上)的工具和平台。
5 | PaddlePaddle
飞桨PaddlePaddle是百度自主研发的开源深度学习框架。飞桨PaddlePaddle是集深度学习核心框架、工具组件和服务平台于一体的技术领先、功能完备的开源深度学习平台,拥有活跃的开发者社区。
作为领先的核心框架,飞桨PaddlePaddle具备简单、易用、高效、安全的特点,能满足模型开发、训练、部署的全流程需求。
飞桨PaddlePaddle拥有丰富的工具组件。飞桨PaddlePaddle开放了PaddleHub、PARL、AutoDL Design、VisualDL等一系列深度学习工具组件。
飞桨PaddlePaddle具备专业的服务平台——AI Studio和EasyDL,可以满足不同层次的深度学习开发的需求。
PaddlePaddle源于业界顶尖实践,拥有强大的超大规模并行深度学习处理能力,它具备4大工业级特点。
- 提供高性价比的多机GPU参数服务器训练方法。
- 全面支持大规模异构计算集群。
- 同时支持稠密参数和稀疏参数场景的超大规模深度学习并行训练。
- 支持千亿规模参数、数百个节点的高效并行训练。
PaddlePaddle在速度上追求极致的体验,推出了全流程、全类型的高性能部署和集成方案,在计算性能与易用性上具备3大特性。
- 支持千亿规模参数、数百个节点的高效并行训练。
- 提供性能全面领先的底层加速库和推理引擎—Paddle Mobile和Paddle Serving。
- 通过两行Python代码就可调用的自动化模型压缩库PaddleSlim。
图3 展示了飞桨PaddlePaddle的生态结构。
|写在最后
对主流的编程框架,包括 TensorFlow PyTorch、 Caffe、mxet、PaddlePaddle等,从多个角度进行了对比。