PyTorch是一个python包,提供两类高级功能:
- 具有强大的GPU加速度的张量计算(类似numpy)
- 基于tape-based的自动微分(autodiff)系统的深度神经网络
您可以重用自己喜欢的python包,例如numpy,scipy和Cython,以便在需要时扩展PyTorch。
从更细的粒度来说,PyTorch是一个由以下组件组成的库:
包 | 描述 |
---|---|
torch | 像NumPy这样的Tensor库,具有强大的GPU支持 |
torch.autograd | 基于tape的自动微分库,支持torch中所有可微分的Tensor操作 |
torch.nn | 与autograd深度集成的神经网络库,旨在实现最大的灵活性 |
torch.optim | 与torch.nn一起使用的优化包,使用标准优化方法,如SGD,RMSProp,LBFGS,Adam等。 |
torch.multiprocessing | python多处理,但具有神奇的内存共享跨进程传递torch Tensor。适用于数据加载和hogwild训练。 |
torch.utils | 为DataLoader,Trainer和其他实用程序功能提供便捷的辅助包 |
torch.legacy(.nn /.optim) | 由于向后兼容性原因而从torch移植过的遗留代码 |
通常使用PyTorch作为:
- 替代numpy使用GPU强大能力。
- 深度学习研究平台,提供最大的灵活性和速度
进一步阐述:
为GPU而生的Tensor库
如果你使用numpy,那么你使用了Tensors(a.k.a ndarray)。
PyTorch提供可以在CPU或GPU上运行的Tensors,并且可以大幅加速计算。
我们提供各种张量程序,以加速和满足您的科学计算需求,如切片,索引,数学运算,线性代数,约简。这些操作都非常快!
动态神经网络:基于磁带模式的Autograd
PyTorch有一种独特的构建神经网络的方法:使用和重放录音机。
大多数框架如TensorFlow
,Theano
,Caffe
和CNTK
有一个静态的世界观。人们必须建立一个神经网络,并一次又一次地重复使用相同的结构。改变网络的行为方式意味着必须从头开始。
使用PyTorch,我们使用一种名为Reverse-mode auto-differentiation的技术,它允许您以零滞后或开销任意改变网络的行为方式。我们的灵感来自几个关于这个主题的研究论文,以及当前和过去的工作,如autograd,autograd,Chainer等
虽然这种技术并不是PyTorch独有的,但它是迄今为止最快的实现之一。您可以获得最佳的速度和灵活性,以进行狂热的研究。
Pytorch跟Python的关系
PyTorch不是Python绑定到monolothic C++的框架。它被构建为深入集成到Python中。您可以像使用numpy /scipy /scikit-learn等自然地使用它。您可以使用自己喜欢的库编写新的神经网络层,使用Cython和Numba等软件包。我们的目标是在适当的时候不要重新发明轮子。
体验
PyTorch设计直观,线性思维,易于使用。当您执行一行代码时,它会被执行。没有所谓的全运行环境的异步视图。当您进入调试器或接收错误消息和堆栈跟踪时,理解它们是straight-forward。 stack-trace指向您的代码定义的确切位置。我们希望您不要因为堆栈跟踪错误或异步和不透明的执行引擎,而花费数小时调试代码。
快速和精益
PyTorch具有最小的框架开销。我们集成了英特尔MKL和NVIDIA(CuDNN,NCCL)等加速库,以最大限度地提高速度。其核心是CPU和GPU Tensor和神经网络后端(TH,THC,THNN,THCUNN)作为具有C99 API的独立库编写。
它们已经成熟并经过多年的测试。
因此,PyTorch非常快 – 无论你运行小型还是大型神经网络。
与Torch或其他一些替代方案相比,PyTorch中的内存使用效率非常高。我们为GPU编写了自定义内存分配器,以确保您的深度学习模型具有最大的内存效率。这使您能够训练比以前更大的深度学习模型。
扩展没有痛苦
编写新的神经网络模块,或与PyTorch的Tensor API连接,设计为straight-forward,并且具有最少的抽象。
您可以使用torch API在Python中编写新的神经网络层或者你最喜欢的基于numpy的库,比如SciPy
如果您想用C/C++编写图层,我们会提供基于CFFI的扩展API,这是有效的,并且具有最少的样板。
没有需要编写的包装代码。你可以在这里看到一个例子。