pytorch框架

一文搞懂 PyTorch 内部机制 - 知乎原文链接:http://blog.ezyang.com/2019/05/pytorch-internals/ 原文出处:https://archwalker.github.io 原文地址:一文搞懂 PyTorch 内部机制译者序:这篇博文是一篇非常新的介绍PyTorch内部机制的文章,作者Edw…https://zhuanlan.zhihu.com/p/338256656PyTorch – Internal Architecture Tour | Terra Incognitahttps://blog.christianperone.com/2018/03/pytorch-internal-architecture-tour/PyTorch结构、架构分析_windrisess的博客-CSDN博客_pytorch架构pyTorch架构参考资料:主页 - PyTorch中文文档 (pytorch-cn.readthedocs.io)文章目录pyTorch架构torch是什么pytorch中的torchtorch.Tensortorch.Storagetorch.nn包含多种子类:容器(Containers):网络层:函数包:torch.nn.functional搭建好的网络:torch.autograd:torch.optim:torch.cuda:torch.utils:torch.utils.data.Datashttps://blog.csdn.net/qq_28726979/article/details/120690343一览 Pytorch框架 - 知乎首先声明下,这篇博客不是讲解 Pytorch 内部细节的文章,更多的是宏观上的讲解,希望读者可以站在 前人的肩膀上看清 Pytorch框架组成,同时希望读者可以走的更远 更多关于 Pytorch 的博文,有兴趣的小伙伴可以关注…https://zhuanlan.zhihu.com/p/334788042PyTorch JIT - 知乎如果搜索 PyTorch JIT,找到的将会是「TorchScript」的文档,那么什么是 JIT 呢?JIT 和 TorchScript 又有什么联系? 文章只会关注概念的部分,如果关注细节或实现部分,文章最后有一个完整的 Demo 可供参考。什么…https://zhuanlan.zhihu.com/p/370455320        pytorch框架的预览是在用numpy写深度学习框架的一个基础知识的累计上的,和pytorch这种框架对比的来看,然后再上升到mmcv这种对训练流程的封装上,最后到导向具体的算法上。但是对pytorch的内部解析很难的,我们主要还是关注它的代码结构多一些,torch的底层是c/c++写的,pytorch是torch的python接口。

pytorch框架_第1张图片

pytorch框架_第2张图片

pytorch框架_第3张图片

        上面是pytorch和torchvision的接口表示,pytorch的底层全部都是链接torch._C,但是torchvision是基于torch的,是python写的,torchvision和openmmlab做的mm系列,detectron系列差不多,是个在pytorch上做了一层封装的库,到这个程度的基本都是以算法模型为主了。在深度学习框架这块虽然可以基于numpy去写,numpy底层是用C/fortan,在矩阵计算上做了很多优化,很快,要有list转array的思维,但是numpy也不能完全支持众多的深度学习的算子以及高维的tensor。

1.torch

        torch定义了多维tensor结构以及基于tensor的多种操作,和numpy差不多,但是面向深度学习领域。

1.1 torch.Tensor

        16位整型 torch.ShortTensor,32位整型 torch.IntTensor,64位整型 torch.LongTensor,16位浮点型 torch.HalfTensor,32位浮点型 torch.FloatTensor,64位浮点型 torch.DoubleTensor,torch.Tensor 默认是torch.FloatTensor

        0.4版本之后,Tensor和Variable的合并,变量是可以构建计算图且能够进行自动求导的张量。

1.2 torch.Storage

        负责torch.Tensor底层的数据存储。假设一个k阶张量,它的维度是(n1,n2,...,nk),由于计算机的内存是连续的地址空间,所以在实际存储过程中存储的是1维的向量。

1.3 torch.nn

        nn是神经网络模块化的核心

1.3.1 torch.nn.init 

        定义了网络权重的初始化,使用了很多初始化方法,torch.nn.init.uniform_,torch.nn.init.normal,torch.nn.init.kaiming_uniform...

1.3.2 torch.nn.functional

        定义了pytorch中的函数模块,是def,不是class,主要包括损失函数(ctc_loss/nll_loss/poisson_nll_loss/kl_div/cross_entropy/binary_cross_entropy_with_logits/smooth_l1_loss/l1_loss/mse_loss/marhin_ranking_loss/hinge_emdedding_loss/multilabel_margin_loss/soft_margin_loss/multilabel_soft_margin_loss/cosine_embedding_loss/multi_margin_loss),激活函数(relu/glu/hardtanh/relu6/elu/selu/celu/leaky_relu/prelu/rrelu/gelu/hardshrink/tanhshrink/softsign/softmin/softmax/gumbel_softmax/log_softmax/tanh/sigmoid),池化(avg/max_pool1d/2d/3d,max_unpool1d/2d/3d,adaptive_avg_pool2d),卷积(conv1d/2d/3d),插值(upsample/interpolate/upsample_nearest/upsample_biliinear/grid_sample/affine_grid/pad),归一化(batch_norm/instance_norm/layer_norm/group_norm/local_response_norm)

1.3.3 torch.nn.modules

        定义torch中网络层和容器(container),网络主要包括上面函数的类形式,forward中调用的还是functional中的函数,函数主要是封装在c++中的,rnn和transformer这种网络基础组件,以及所有网络的基类Module,继承自Module的Sequential,ModuleList等。

1.4 torch.autograd

        自动微分模块,torch.autograd.backwar在求损失函数之后进行反向传播,torch.autograd.grad用于一个标量对另一个张量求导。

1.5 torch.optim        

 定义一系列的优化器(Adadelta/Adagrad/Adam/AdamW/SparseAdam/Adamax/ASGD/SGD/Rprop/RMSprop/Optimizer/LBFGS),以及lr_scheduler,定义了很多lr的优化方法。

1.6 torch.cuda

        torch.cuda模块定义了与cuda运算相关的一系列函数,包括检查cuda是否可用,当前进程对应的gpu序号,清除gpu上的缓存,设置gpu上的计算流,同步gpu上执行的所有核函数。

1.7 torch.distributed 

        分布式计算模块,提供pytorch并行运行环境,主要支持后端有MPI,GLoo,NCCL等。pytorch的分布式工作原理主要是启动多个并行的进程,每个进程都拥有一个模型的备份,然后输入不同的训练数据到多个并行的进程,计算损失函数,每个进程独立的做反向传播,最后对所有进程权重张量的梯度做归约,用到后端的部分主要是数据的广播和数据的收集,其中前者是把数据从一个节点(进程)传播到另一个节点(进程)。pytorch的分布式计算模块不但提供了后端的一个包装,还提供了一些启动方式来启动多个进程。

1.8 torch.jit

         torch.jit是pytorch的即时编译器,把pytorch的动态图转换成可以优化和序列化的静态图。keras中的model.compile和tf中的graph都是jit的例子。pytorch的jit实现叫torchscript,jit是python和c++的桥梁,我们可以使用python训练模型,然后通过jit将模型转成语言无关的模块(onnx)。jit支持两种模式:Scripting:可以直接使用 TorchScript Language 来定义一个 PyTorch JIT Module,然后用 torch.jit.script 来将他转换成 TorchScript Module 并保存成文件。而 TorchScript Language 本身也是 Python 代码,所以可以直接写在 Python 文件中。使用 TorchScript Language 就如同使用 TensorFlow 一样,需要前定义好完整的图。对于 TensorFlow 我们知道不能直接使用 Python 中的 if 等语句来做条件控制,而是需要用 tf.cond,但对于 TorchScript 我们依然能够直接使用 if 和 for 等条件控制语句,所以即使是在静态图上,PyTorch 依然秉承了「易用」的特性。TorchScript Language 是静态类型的 Python 子集,静态类型也是用了 Python 3 的 typing 模块来实现,所以写 TorchScript Language 的体验也跟 Python 一模一样,只是某些 Python 特性无法使用(因为是子集),可以通过 TorchScript Language Reference 来查看和原生 Python 的异同。Tracing:使用 TorchScript Module 的更简单的办法是使用 Tracing,Tracing 可以直接将 PyTorch 模型(torch.nn.Module)转换成 TorchScript Module。「追踪」顾名思义,就是需要提供一个「输入」来让模型 forward 一遍,以通过该输入的流转路径,获得图的结构。这种方式对于 forward 逻辑简单的模型来说非常实用,但如果 forward 里面本身夹杂了很多流程控制语句,则可能会有问题,因为同一个输入不可能遍历到所有的逻辑分枝。

1.9 torch.multiprocessing

        定义了pytorch中的多进程api,可以启动不同的进程,每个进程运行不同的模型,并且能够在进程件共享张量,共享的张量可以在cpu上,也可以在gpu上,多进程api还提供了与python原生多进程api相同的一系列函数,包括lock&queue等。

1.10 torch.onnx

        定义了导出和加载onnx的函数。

2.torch.utils

       这里提供了一些python的辅助函数。

2.1 torch.utils.data

        引入了Dataset和DataLoader,Dataset包含了所有数据的数据集,通过索引能够得到某一条特定的数据,DataLoader通过对数据集的包装,得到一个迭代器,生成bs数据。

2.2 torch.utils.tensorboard

        这块通常用tensorboardx代替的比较多。

3.torchvision

        torchvision相当于在torch上做了个视觉版本的算法库,这个和mm系列的一些算法库都是比较类似的。一般在DataLoader时要用数据处理的transforms,这个函数是在torchvision中的,否则也不用导入torchvision。

你可能感兴趣的:(深度机器学习基础,pytorch,深度学习,python)