PyTorch版本:1.10.0
Tensor
Tensor是Pytorch項(xiàng)目較為重要的一部分,其中的主要功能如存儲(chǔ)赔桌,運(yùn)算由C++和CUDA實(shí)現(xiàn)吐葵,本文主要從前端開(kāi)始探索學(xué)習(xí)Tensor的代碼結(jié)構(gòu)册踩。
結(jié)構(gòu)探索
PyTorch前端位于torch目錄下,從_tensor.py可以找到Tensor的python定義度苔,可以看到其繼承自torch._C._Tensorbase
而Tensorbase的定義可以從torch/_C目錄下的__init__.pyi.in文件中找到
可以看到這里傳入了metaclass的參數(shù)匆篓,同時(shí)注釋表明_TensorBase 和 _TensorMeta的定義存在于python_variable.cpp中
學(xué)習(xí)一下metaclass相關(guān)知識(shí)。參考來(lái)源于 https://blog.csdn.net/jiguanglong/article/details/93204314
Python除了部分特殊符號(hào)之外都是對(duì)象寇窑,類同樣是對(duì)象鸦概,為了便于理解,可以認(rèn)為它們相比普通對(duì)象甩骏,多了可以被實(shí)例化的特點(diǎn)窗市。
所有的對(duì)象應(yīng)該擁有基本屬性__class__(屬于什么類),而所有的類在此基礎(chǔ)上應(yīng)該擁有另一個(gè)基本屬性__bases__(父類)横漏。如果進(jìn)行實(shí)驗(yàn)可以發(fā)現(xiàn):
一直通過(guò)__class__追溯上去谨设,type是最終的頂點(diǎn)(type的__class__指向自己)熟掂;
一直通過(guò)__bases__追溯上去缎浇,object是最終的頂點(diǎn)(object的__bases__為空)。
因此可以稱type為元類(一般類的類)赴肚,當(dāng)我們進(jìn)行類定義的時(shí)候素跺,實(shí)際上運(yùn)行的是class = type(classname, superclasses, attributedict) (也就是type的__call__方法)
而如果傳遞了metaclass參數(shù),此時(shí)類創(chuàng)建的動(dòng)作就不再由type執(zhí)行誉券,而是執(zhí)行參數(shù)對(duì)象的__call__方法指厌。
有什么用:通過(guò)這種改變?cè)惖姆椒ǎ覀兛梢栽陬悇?chuàng)建的過(guò)程中增加自定義的工作踊跟,該特性極大地提高了編程的自由度踩验。
進(jìn)一步,在torch/csrc/autograd/python_variable.cpp 中可以找到上面Base與Meta類的定義來(lái)源
1509與1518行分別對(duì)這兩個(gè)類的定義和文件中的C++對(duì)象進(jìn)行了綁定(module在這里是pytorch前端的_C)商玫,進(jìn)而找到
因此表面上的結(jié)構(gòu)可以表示成如下