深入淺出PyTorch(算子篇)

Tensor

自從張量(Tensor)計算這個概念出現(xiàn)后棒假,神經(jīng)網(wǎng)絡(luò)的算法就可以看作是一系列的張量計算蜡饵。所謂的張量条辟,它原本是個數(shù)學(xué)概念黔夭,表示各種向量或者數(shù)值之間的關(guān)系。PyTorch的張量(torch.Tensor)表示的是N維矩陣與一維數(shù)組的關(guān)系羽嫡。

http://web.mit.edu/~ezyang/Public/pytorch-internals.pdf

torch.Tensor的使用方法和numpy很相似(https://pytorch.org/...tensor-tutorial-py)本姥,兩者唯一的區(qū)別在于torch.Tensor可以使用GPU來計算,這就比用CPU的numpy要快很多杭棵。

張量計算的種類有很多婚惫,比如加法、乘法、矩陣相乘先舷、矩陣轉(zhuǎn)置等艰管,這些計算被稱為算子(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++開發(fā)的native code,legacy code是在PyTorch編譯時由gen.py根據(jù)Declarations.cwrap的內(nèi)容動態(tài)生成的胆剧。因此絮姆,如果你想要trace這些code,需要先編譯PyTorch秩霍。

legacy code的開發(fā)要比native code復(fù)雜得多篙悯。如果可以的話,建議你盡量避開它們铃绒。

aten/src/ATen/Declarations.cwrap

MatMul

本文會以矩陣相乘--torch.matmul()為例來分析PyTorch算子的工作流程鸽照。

我在深入淺出全連接層(fully connected layer)中有講在GPU層面是如何進行矩陣相乘的。Nvidia颠悬、AMD等公司提供了優(yōu)化好的線性代數(shù)計算庫--cuBLAS/rocBLAS/openBLAS矮燎,PyTorch只需要調(diào)用它們的API即可。

Figure 1: function flow of torch.matmul()

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()主要負(fù)責(zé)將Tensor轉(zhuǎn)換成cuBLAS需要的格式既们。前面說過,Tensor可以是N維矩陣正什,如果tensor A是3d矩陣啥纸,tensor B是2d矩陣,就需要先將3d轉(zhuǎn)成2d婴氮;如果它們都是>=3d的矩陣斯棒,就要考慮batched matmul的情況馒索;如果bias=True,后續(xù)就應(yīng)該交給at::addmm()來處理名船;總之绰上,matmul要考慮的事情比想象中要多。

除此之外渠驼,不同的dtype蜈块、device和layout需要調(diào)用不同的操作函數(shù),這部分工作交由c10::dispatcher來完成迷扇。

Dispatcher

dispatcher主要用于動態(tài)調(diào)用dtype百揭、device以及l(fā)ayout等方法函數(shù)。用過numpy的都知道蜓席,np.array()的數(shù)據(jù)類型有:float32, float16器一,int8,int32厨内,.... 如果你了解C++就會知道祈秕,這類程序最適合用模板(template)來實現(xiàn)。

很遺憾雏胃,由于ATen有一部分operator是用C語言寫的(從Torch繼承過來)请毛,不支持模板功能,因此瞭亮,就需要dispatcher這樣的動態(tài)調(diào)度器方仿。

類似地,PyTorch的tensor不僅可以運行在GPU上统翩,還可以跑在CPU仙蚜、mkldnn和xla等設(shè)備,F(xiàn)igure 1中的dispatcher4就根據(jù)tensor的device調(diào)用了mm的GPU實現(xiàn)厂汗。

layout是指tensor中元素的排布委粉。一般來說,矩陣的排布都是緊湊型的面徽,也就是strided layout艳丛。而那些有著大量0的稀疏矩陣匣掸,相應(yīng)地就是sparse layout趟紊。

Figure 2: strided layout example

Figure 2是strided layout的演示實例,這里創(chuàng)建了一個2行2列的矩陣a碰酝,它的數(shù)據(jù)實際存放在一維數(shù)組(a.storage)里霎匈,2行2列只是這個數(shù)組的視圖。

stride充當(dāng)了從數(shù)組到視圖的橋梁送爸,比如铛嘱,要打印第2行第2列的元素時暖释,可以通過公式:1 * stride(0) + 1 * stride(1)來計算該元素在數(shù)組中的索引。

除了dtype墨吓、device球匕、layout之外,dispatcher還可以用來調(diào)用legacy operator帖烘。比如說addmm這個operator亮曹,它的GPU實現(xiàn)就是通過dispatcher來跳轉(zhuǎn)到legacy::cuda::_th_addmm。

aten/src/ATen/native/native_functions.yaml

END

到此秘症,就完成了對PyTorch算子的學(xué)習(xí)照卦。如果你要學(xué)習(xí)其他算子,可以先從aten/src/ATen/native目錄的相關(guān)函數(shù)入手乡摹,從native_functions.yaml中找到dispatch目標(biāo)函數(shù)役耕,詳情可以參考Figure 1。


歡迎關(guān)注和點贊聪廉,你的鼓勵將是我創(chuàng)作的動力

歡迎轉(zhuǎn)發(fā)至朋友圈瞬痘,公眾號轉(zhuǎn)載請后臺留言申請授權(quán)~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市板熊,隨后出現(xiàn)的幾起案子图云,更是在濱河造成了極大的恐慌,老刑警劉巖邻邮,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竣况,死亡現(xiàn)場離奇詭異,居然都是意外死亡筒严,警方通過查閱死者的電腦和手機丹泉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸭蛙,“玉大人摹恨,你說我怎么就攤上這事∪⑹樱” “怎么了晒哄?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肪获。 經(jīng)常有香客問我寝凌,道長,這世上最難降的妖魔是什么孝赫? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任较木,我火速辦了婚禮,結(jié)果婚禮上青柄,老公的妹妹穿的比我還像新娘伐债。我一直安慰自己预侯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布峰锁。 她就那樣靜靜地躺著萎馅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虹蒋。 梳的紋絲不亂的頭發(fā)上校坑,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音千诬,去河邊找鬼耍目。 笑死,一個胖子當(dāng)著我的面吹牛徐绑,可吹牛的內(nèi)容都是我干的邪驮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼傲茄,長吁一口氣:“原來是場噩夢啊……” “哼毅访!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盘榨,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤喻粹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后草巡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體守呜,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年山憨,在試婚紗的時候發(fā)現(xiàn)自己被綠了查乒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡郁竟,死狀恐怖玛迄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棚亩,我是刑警寧澤蓖议,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站讥蟆,受9級特大地震影響勒虾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攻询,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一从撼、第九天 我趴在偏房一處隱蔽的房頂上張望州弟。 院中可真熱鬧钧栖,春花似錦低零、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潭陪,卻和暖如春雄妥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背依溯。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工老厌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黎炉。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓枝秤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慷嗜。 傳聞我的和親對象是個殘疾皇子淀弹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容