1.3 为什么用PyTorch
通过将模型应用到例证,深度学习允许我们执行很多复杂任务,如机器翻译、玩战略游戏以及在杂乱无章的场景中识别物体等。为了在实践中做到这一点,我们需要灵活且高效的工具,以便能够适用于这些复杂任务,能够在合理的时间内对大量数据进行训练。我们需要已被训练过的模型在输入变量变化的情况下正确执行。接下来看看我们决定使用PyTorch的一些原因。
PyTorch很容易被推广,因为它很简单。许多研究人员和实践者发现它易于学习、使用、扩展和调试。它是Python化的,虽然和任何复杂领域一样,它有注意事项和最佳实践示例,但对于以前使用过Python的开发人员来说,使用该库和使用其他Python库一样。
更具体地说,在PyTorch中编写深度学习机是很自然的事情。PyTorch为我们提供了一种数据类型,即张量,通常用来存储数字、向量、矩阵和数组。此外,PyTorch还提供了操作它们的函数,我们可以使用这些函数来增量编程。如果我们愿意,还可以进行交互式编程,就像平常使用Python一样。如果你知道NumPy,那么你对交互式编程应是非常熟悉的。
PyTorch具备2个特性,使得它与深度学习关联紧密。首先,它使用GPU加速计算,通常比在CPU上执行相同的计算速度快50倍。其次,PyTorch提供了支持通用数学表达式数值优化的工具,该工具用于训练深度学习模型。请注意,这2个特性适用于一般的科学计算,而不只适用于深度学习。事实上,我们完全可以将PyTorch描述为一个在Python中为科学计算提供优化支持的高性能库。
PyTorch设计的驱动因素之一是表现力,它允许开发人员实现复杂的模型,而不会被PyTorch库强加过高的复杂性(PyTorch不是一个框架)。PyTorch可以说是最无缝地将深度学习领域的思想转化为Python代码的软件之一。因此,PyTorch在研究中得到广泛的采用,国际会议上的高引用次数就证明了这一点[3]。
PyTorch从研发到成为产品的过程是一件值得关注的事情。虽然PyTorch最初专注于研究工作流,但它已经配备了高性能的C++运行环境,用于部署模型进行推理而不依赖Python,并且还可用于设计和训练C++模型。它还提供了与其他语言的绑定,以及用于部署到移动设备的接口。这些特性允许我们利用PyTorch的灵活性,还允许我们的程序在难以获得完整的Python运行环境或可能需要极大的开销的情况下运行。
当然,易用性和高性能是很容易做到的,我们希望当你深入阅读本书的时候,会认同这句话。
深度学习竞争格局
虽然所有的类比都有瑕疵,但2017年1月PyTorch 0.1的发布标志着深度学习库、包装器和数据交换格式从“寒武纪”爆炸式增长过渡到一个整合和统一的时代。
注意
当前深度学习发展迅速,以至于当你读到本书的印刷版时,它可能已经过时了。如果你不了解这里提到的一些库也很正常。
PyTorch第1个测试版本发布时情况如下。
- Theano和TensorFlow是最早的低级别库,它们使用一个模型,该模型让用户自定义一个计算图,然后执行它。
- Lasagne和Keras是Theano的高级包装器,同时Keras还对TensorFlow和CNTK进行了包装。
- Caffe、Chainer、DyNet、Torch(以Lua为基础的PyTorch前身)、MXNet、CNTK、DL4J等库在深度学习生态系统中占据了不同的位置。
在接下来大约2年的时间里,情况发生了巨大的变化。除了一些特定领域的库,随着其他深度学习库使用量的减少,PyTorch和TensorFlow社区的地位得到了巩固。变化情况可以总结为以下几点。
- Theano是最早的深度学习框架之一,目前它已经停止开发。
- TensorFlow:
- 完全对Keras进行封装,将其提升为一流的API;
- 提供了一种立即执行的“急切模式(eager mode)”,这种模式有点儿类似于PyTorch处理计算的方式;
- TensorFlow 2.0默认采用急切模式。
- JAX是谷歌的一个库,它是独立于TensorFlow开发的,作为一个与GPU、Autograd和JIT编译器具有对等功能的NumPy库,它已经开始获得关注。
- PyTorch:
- Caffe2完全并入PyTorch,作为其后端模块;
- 替换了从基于Lua的Torch项目重用的大多数低级别代码;
- 增加对开放式神经网络交换(Open Neural Network Exchange,ONNX)的支持,这是一种与外部框架无关的模型描述和交换格式;
- 增加一种称为“TorchScript”的延迟执行的“图模型”运行环境;
- 发布了1.0版本;
- 取代CNTK和Chainer成为各自企业赞助商选择的框架。
TensorFlow拥有强大的生产线、广泛的行业社区以及巨大的市场份额。由于使用方便,PyTorch在研究和教学领域取得了巨大进展,并且随着研究人员和毕业的学生进入该行业,PyTorch的势头越来越好。它还在生产解决方案方面积累了经验。有趣的是,随着TorchScript和急切模式的出现,PyTorch和TensorFlow的特征集开始趋同,尽管在这些特征的呈现和整体体验上仍然存在很大的差异。