欢迎访问欧博亚洲(Allbet Game)!

首页科技正文

ug环球:深入浅出PyTorch(算子篇)

admin2020-06-2339

Tensor

自从张量(Tensor)盘算这个观点泛起后,神经网络的算法就可以看作是一系列的张量盘算。所谓的张量,它原本是个数学观点,示意种种向量或者数值之间的关系。PyTorch的张量(torch.Tensor)示意的是N维矩阵与一维数组的关系。

torch.Tensor的使用方式和numpy很相似(https://pytorch.org/...tensor-tutorial-py),两者唯一的区别在于torch.Tensor可以使用GPU来盘算,这就比用CPU的numpy要快许多。

张量盘算的种类有许多,好比加法、乘法、矩阵相乘、矩阵转置等,这些盘算被称为算子(Operator),它们是PyTorch的焦点组件。

算子的backend一样平常是C/C++的拓展程序,PyTorch的backend是称为"ATen"的C/C++库,ATen是"A Tensor"的缩写。

Operator

PyTorch所有的Operator都界说在Declarations.cwrap和native_functions.yaml这两个文件中,前者界说了从Torch那继续来的legacy operator(aten/src/TH),后者界说的是native operator,是PyTorch的operator。

相比于用C++开发的native code,legacy code是在PyTorch编译时由gen.py凭据Declarations.cwrap的内容动态天生的。因此,若是你想要trace这些code,需要先编译PyTorch。

legacy code的开发要比native code庞大得多。若是可以的话,建议你只管避开它们。

MatMul

本文会以矩阵相乘--torch.matmul()为例来剖析PyTorch算子的事情流程。

我在深入浅出全毗邻层(fully connected layer)中有讲在GPU层面是若何举行矩阵相乘的。Nvidia、AMD等公司提供了优化好的线性代数盘算库--cuBLAS/rocBLAS/openBLAS,PyTorch只需要挪用它们的API即可。

ug环球:深入浅出PyTorch(算子篇) 第1张

Figure 1是torch.matmul()在ATen中的function flow。可以看到,这个flow可不短,这主要是因为差别类型的tensor(2d or Nd, batched gemm or not,with or without bias,cuda or cpu)的操作也不尽相同。

at::matmul()主要卖力将Tensor转换成cuBLAS需要的花样。前面说过,Tensor可以是N维矩阵,若是tensor A是3d矩阵,tensor B是2d矩阵,就需要先将3d转成2d;若是它们都是>=3d的矩阵,就要思量batched matmul的情形;若是bias=True,后续就应该交给at::addmm()来处置;总之,matmul要思量的事情比想象中要多。

除此之外,差别的dtype、device和layout需要挪用差别的操作函数,这部分事情交由c10::dispatcher来完成。

Dispatcher

dispatcher主要用于动态挪用dtype、device以及layout等方式函数。用过numpy的都知道,np.array()的数据类型有:float32, float16,int8,int32,.... 若是你领会C++就会知道,这类程序最适适用模板(template)来实现。

很遗憾,由于ATen有一部分operator是用C语言写的(从Torch继续过来),不支持模板功效,因此,就需要dispatcher这样的动态调剂器。

类似地,PyTorch的tensor不仅可以运行在GPU上,还可以跑在CPU、mkldnn和xla等装备,Figure 1中的dispatcher4就凭据tensor的device挪用了mm的GPU实现。

layout是指tensor中元素的排布。一样平常来说,矩阵的排布都是紧凑型的,也就是strided layout。而那些有着大量0的希罕矩阵,响应地就是sparse layout。

ug环球:深入浅出PyTorch(算子篇) 第2张

Figure 2是strided layout的演示实例,这里创建了一个2行2列的矩阵a,它的数据现实存放在一维数组(a.storage)里,2行2列只是这个数组的视图。

stride充当了从数组到视图的桥梁,好比,要打印第2行第2列的元素时,可以通过公式:\(1 * stride(0) + 1 * stride(1)\)来盘算该元素在数组中的索引。

除了dtype、device、layout之外,dispatcher还可以用来挪用legacy operator。好比说addmm这个operator,它的GPU实现就是通过dispatcher来跳转到legacy::cuda::_th_addmm。

ug环球:深入浅出PyTorch(算子篇) 第3张

END

到此,就完成了对PyTorch算子的学习。若是你要学习其他算子,可以先从aten/src/ATen/native目录的相关函数入手,从native_functions.yaml中找到dispatch目的函数,详情可以参考Figure 1。

更多精彩文章,迎接扫码关注下方的民众号, 并接见我的简书博客:https://www.jianshu.com/u/c0fe8671254e

迎接转发至朋友圈,事情号转载请后台留言申请授权~

ug环球:深入浅出PyTorch(算子篇) 第4张

,

联博接口

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源:欧博亚洲(Allbet Game)!

本文链接:http://www.zbguandaobeng.com/post/1265.html

网友评论

最新评论

  • UG环球官网 09/24 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。姐妹们快看神仙

  • UG环球官网 09/24 说:

    欧博亚洲官网开户网址欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。姐妹们快看神仙

  • 环球UG官方网 09/23 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。就是很好,谁损也没用

  • 环球UG充值 09/23 说:

    欧博app下载欢迎进入欧博app下载网站:www.aLLbetgame.us,欧博app下载网站是欧博官方网站。欧博app下载网站开放欧博注册、欧博代理、欧博电脑客户端、欧博app下载等业务。哈哈,我是死忠粉

  • Usappledeveloperaccountsforsale 09/23 说:

    欧博亚洲客户端欢迎进入欧博亚洲客户端(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。一直在看哦

  • 欧博电脑版 09/22 说:

    联博统计接口www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。有看点,中意

  • AllbetGmaing官网 09/22 说:

    欧博开户欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。喜欢晚上看

  • UG环球电脑版下载 09/21 说:

    apple developer enterprise account for rentproviding apple enterprise developer accounts for rent, rent your own enterprise account for app signing. with high quality, stable performance and affordable price.累了的时候看这个