从零开始的深度理解Pytorch源码(一):什么是Pytorch

Tricter是东南大学读研,研究方向为增强现实的一名研究生。之后会和老潘持续带来对Pytorch的源码分析以及深入理解。工欲善其事必先利其器,深入理解Pytorch源码还是很有必要的。老潘之前也有过相关的源码解读,稍有些乱,这次从头开始,一步一步来,由浅入深,一起探索Pytorch的内部奥秘吧!

图片

pytorc_Logo
Pytorch是很受欢迎一个框架,但大多数人都止步于使用Pytorch,却不想去探究Pytorch内部的具体实现。然而,这种探索的过程本身会很有趣。

这个系列,将会解析Pytorch的具体实现,来学习如何构建这样一个大型的项目。由于Pytorch也在不断更新,增加新的功能,这个系列将会从Pytorchv0.3.0版本开始解析。

什么是Pytorch
Pytorch是一个开源的机器学习库,从Torch发展过来,现在主要是由FAIR和开源社区进行维护。Pytorch主要提供了两个功能:

经过GPU加速的张量(Tensor)计算功能,类似Numpy。
搭建基于自动微分(Automatic Differentiation)求解来搭建深度神经网络。
Pytorch虽然是一个Python-First的框架,但它并不是完全使用Python实现的,明白这一点是理解Pytorch架构的第一步。但是等一下,我们先回想一下什么是Python。

Python是什么?
Python是一个编程语言,但它与C++等编译型编程语言不同,Python是解释型语言。简单来说,C++需要经过编译,链接等操作变成一个可执行程序,才能运行,但Python则不需要,Python需要的是一个解释器,解释器读取并执行Python源代码。

但是解释器又是什么?

现在最多人使用的解释器,是CPython[1],这也是Python默认的解释器,可以从Python的官网上直接下载。其实从CPython这个名字可以猜出来,CPython是用C实现的解释器,除此之外,还有使用Python自己实现的PyPy[2],以及使用.Net实现的IronPython[3]。

CPython使用C语言来实现,因此可以比较容易地接入其他使用C或者C++编写的拓展(Extension)。可能你也猜到了,Pytorch就是这样的拓展。

C = Extension(“torch._C”,
libraries=main_libraries,
sources=main_sources,
language=’c’,
extra_compile_args=main_compile_args + extra_compile_args,
include_dirs=[],
library_dirs=library_dirs,
extra_link_args=extra_link_args + main_link_args + make_relative_rpath_args(‘lib’))
从这段代码中可以看出来,Pytorch的主要实现,还是使用C++来完成的,并使用Python来对底层实现进行一些包装和拓展。

Pytorch由什么构成
Pytorch主要提供了两个大的功能:

类似Numpy的计算,适用于不同计算性能的设备。
自动微分引擎,可以帮助我们计算梯度。
Tensor
Tensor一般被称作张量,可以认为就是多维数组,Tensor进行的计算,包含加减乘除之类的基本运算。为了在不同的计算设备上进行计算,Pytorch利用了一些更为底层的库,这些库是继承自Torch[4]的,对于不同的计算设备,比如CPU、GPU,Pytorch会利用专门为这个计算设备编写优化的计算库来计算,这些库有:

TH: Torch
THD: Torch Distributed
THNN: Torch Neural Networks
THS: Torch Sparse
THC: Torch Cuda
THCS: Torch Cuda Sparse
THCUNN: Torch CUda Neural Networks
从名字上,就可以看出每一个库对应的计算设备。

Pytrorch建立在这些库之上,都这些不同计算设备进行抽象,并使用Tensor作为统一的接口,自动根据当前的计算设备来选择对应的库,在代码中,进行了动态转发,在之后的文章中将会深入这个话题。

自动微分引擎 (Auto Grad)
在进行优化的时候,梯度下降法是很常见的一种算法,在神经网络中,也采用梯度下降法及其变种来对网络的参数进行优化。

在利用梯度下降法进行优化的时候,必不可少的就是求出损失函数关于计算图(Computation Graph)中每一个节点的梯度,只有求得梯度之后,才能利用不同的算法来进行优化。

因此自动微分将会是Pytorch功能中最为关键的一环。

小结
本文介绍了Pytorch的基础信息,包括它的结构以及主要功能。

这也是解读Pytorch源码系列的第一篇文章,在之后的文章中会针对Pytorch的主要功能以及实现来进行解析。

相关的Pytorch源码解读文章:

一个Tensor的生命历程(Pytorch版)-上篇

一个Tensor的生命历程(Pytorch版)-下篇

参考资料
[1]CPython: https://github.com/python/cpython

[2]PyPy: https://www.pypy.org

[3]IronPython: https://ironpython.net

[4]Torch: https://github.com/torch

往期回顾
Mac mini m1使用简单体验(编程、游戏、深度学习)
各种姿势的debug(从python一路debug到C++)
实现TensorRT自定义插件(plugin)自由!
“软硬结合”的算法优化器,来看一哈Halide吧兄弟
主机回来以及,简单的环境配置(RTX3070+CUDA11.1+CUDNN+TensorRT)

关注“oldpan博客”,持续酝酿深度质量文
我是老潘,我们下期见~

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/202689.html

(0)
联系我们
联系我们
分享本页
返回顶部