2.2 PyTorch框架历史和特性更迭
为了方便理解后续章节中对PyTorch的详细阐述,这里首先介绍一下PyTorch的发展历史和一些特性的变化过程。截至本书写作的时候,PyTorch的最新版本为1.3.0,所以本书叙述的历史为PyTorch 1.3.0之前的特性更迭,本书后面的代码将主要基于PyTorch 1.3.0。
PyTorch是由Facebook公司开发的深度学习框架,其起源应该是Torch这个深度学习框架。Torch深度学习框架最初的开发可以追溯到2002年。相比使用Python语言作为深度学习框架前端的PyTorch,Torch使用了Lua语言作为深度学习框架的前端。由于机器学习的主流语言是Python,相比之下,Lua语言比较小众。Facebook在2016年发表了PyTorch最初的版本0.1.1(alpha-1版本),作为Torch向Python迁移的一个项目。在最初的版本中,PyTorch和Torch共享的是底层的C语言API库,现在还可以在PyTorch源代码里看到TH、THC、THNN、THCUNN这些目录,即来源于Torch的代码。同时,在前端代码的组织上,PyTorch也借鉴了Torch的一些概念(比如张量和模块等)。
在最初的版本中,PyTorch支持的深度学习计算操作很少,而且在并行计算和异构计算(CPU/GPU混合)方面的支持不是很完善。在后续版本中,PyTorch逐渐引入了多进程计算的功能,而且逐渐集成了CuDNN的GPU深度学习计算库,引入了越来越多的张量运算操作和深度学习模块。在PyTorch 0.2.0中已经实现了高阶导数、分布式计算、张量广播等功能。同时,在重要的并行计算的支持方面,也得到了很大的完善。到了PyTorch 0.3.0,PyTorch支持更多的损失函数和优化器,同时在框架的计算性能的表现上有了长足的进步。另外,PyTorch开始支持导出神经网络为开放神经网络交换格式(Open Neural Network Exchange Format,ONNX),这个格式用于存储神经网络的连接方式和权重,也用于和其他深度学习框架(如Caffe2和MXNet等)交换构建神经网络的权重。
PyTorch 0.4是在PyTorch 1.0之前的最后一个大版本,在PyTorch 0.4.0中,相对前一个版本而言,对分布式计算的支持更加完善,方便了用户的使用。同时,ONNX也增加了对循环神经网络(Recurrent Neural Network,RNN)的支持。另外,在这个版本中,也增加了对Windows操作系统的支持,实现了张量(Tensor)和变量(Variable)的合并,而在之前的版本中,这两个概念是相互独立的,变量是可以构建计算图且能够进行自动求导的张量。在PyTorch 0.4.0中,通过指定张量支持导数的选项,就不再需要用到变量。因此,这两个概念合并为张量。
到了PyTorch 1.0,深度学习框架本身又有了几个重大的变化。首先是分布式训练方式的更改,PyTorch在分布式计算方面开始对不同的后端有了完善的支持,包括MPI和NCCL等。在即时编译器(Just-In-Time Compiler,JIT)方面,PyTorch 1.0新增了许多功能,使得之前的深度学习模型追踪(trace)的功能有了很大提高。通过使用改进的JIT,可以把PyTorch的动态计算图编译成静态计算图,方便模型的部署。为了减少Python前端在运行深度学习模型的时间损耗,PyTorch也加强了对C++前端的支持,这样一个Python训练和保存的模型就能通过C++前端运行,有效地提高了模型的运行效率。
PyTorch Hub的开发也是1.0版本的亮点之一,通过PyTorch Hub,用户可以获得一系列预训练的深度学习模型,主要包括计算机视觉、自然语言处理、生成式模型和音频模型等,这些预训练模型的出现能有效地加快用户开发新型的深度学习模型,方便用户构建基线模型和复现深度学习模型的效果。到了PyTorch 1.1,PyTorch开始支持TensorBoard对于张量的可视化,并且加强了JIT的功能。PyTorch 1.2增强了TorchScript的功能,同时增加了Transformer模块,也增加了对视频、文本和音频的训练数据载入的支持。到了PyTorch 1.3,增加了移动端的处理,而且增加了对模型的量化功能(Quantization)的支持。
综上所述,PyTorch从2016年发布以来,迭代非常迅速,经历了从0.1.0到1.3.0一共8个大版本的更新,同时在大版本之间各有一个小版本的更新。在保持快速更新的同时,PyTorch保持了API的稳定性,而且作为一个飞速迭代的深度学习框架,PyTorch在构建和运行深度学习模型方面也非常稳定,并没有因为迭代速度太快而导致代码运行不稳定。得益于迭代速度,PyTorch现阶段支持非常多的神经网络类型和张量的运算类型。可以预见,PyTorch在未来能够兼顾更新速度和代码质量,支持更多的神经网络类型,并拥有更高的计算效率。