《電子技術應用》
您所在的位置:首頁 > 可編程邏輯 > 解決方案 > 想讀讀PyTorch底層代碼?這份內(nèi)核機制簡介送給你

想讀讀PyTorch底層代碼?這份內(nèi)核機制簡介送給你

2019-02-28
關鍵詞: PyTorch 代碼 JIT編譯器

學習 PyTorch 比較簡單,但你能學習 PyTorch 內(nèi)部機制嗎?最近,有 14 年 ML 經(jīng)驗的大神 Christian 介紹了 PyTorch 的內(nèi)核機制。雖然在實際使用中并不需要這些知識,但探索 PyTorch 內(nèi)核能大大提升我們對代碼的直覺與理解,挖底層實現(xiàn)的都是大神~


PyTorch 的構建者表明,Pytorch 的哲學是解決當務之急,也就是說即時構建和運行我們的計算圖。這恰好適合 Python 的編程理念,一邊定義就可以在 Jupyter Notebook 一邊運行,因此,PyTorch 的工作流程非常接近于 Python 的科學計算庫 NumPy。


Christian 表明 PyTorch 之所以這么方便,很多都是因為它的「基因」——內(nèi)部運行機制決定的。這一篇報告并不會介紹如何使用 PyTorch 基礎模塊,或如何用 PyTorch 訓練一個神經(jīng)網(wǎng)絡,Christian 關注的是如何以直觀的形式介紹 PyTorch 的內(nèi)核機制,即各個模塊到底是怎么工作的。


Christian 在 Reddit 表示這一次報告由于錄像問題并不能上傳演講視頻,因此暫時只能分享演講 PPT。不過 Christian 最近也會再做一次該主題的演講,所以我們可以期待下次能有介紹 PyTorch 的視頻。


演講 PPT 地址:https://speakerdeck.com/perone/pytorch-under-the-hood

百度云地址:https://pan.baidu.com/s/1aaE0I1geF7VwEnQRwmzBtA


如下所示為這次演講的主要議程,它主要從張量和 JIT 編譯器出發(fā)介紹底層運行機制:

微信圖片_20190228180845.jpg


在討論 PyTorch 的各組件機制前,我們需要了解整體工作流。PyTorch 使用一種稱之為 imperative / eager 的范式,即每一行代碼都要求構建一個圖以定義完整計算圖的一個部分。即使完整的計算圖還沒有完成構建,我們也可以獨立地執(zhí)行這些作為組件的小計算圖,這種動態(tài)計算圖被稱為「define-by-run」方法。


微信圖片_20190228180908.gif


其實初學者了解到整體流程就可以學著使用了,但底層機制有助于對代碼的理解和掌控。


張量


在概念上,張量就是向量和矩陣的推廣,PyTorch 中的張量就是元素為同一數(shù)據(jù)類型多維矩陣。雖然 PyTorch 的接口是 Python,但底層主要都是用 C++實現(xiàn)的,而在 Python 中,集成 C++代碼通常被稱為「擴展」。


因為張量主要承載數(shù)據(jù),并進行計算。PyTorch 的張量計算使用最底層和基本的張量運算庫 ATen,它的自動微分使用 Autograd,該自動微分工具同樣建立在 ATen 框架上。


Python 對象


為了定義 C/C++中一個新的 Python 對象類型,你需要定義如下 THPVariable 類似結構。其中第一個 PyObject_HEAD 宏旨在標準化 Python 對象,并擴展至另一個結構,該結構包含一個指向類型對象的指針,以及一個帶有引用計數(shù)(ref count)的字段。


微信圖片_20190228180926.jpg


Python API 中有兩個額外的宏,分別稱為 Py_INCREF() 和 Py_DECREF(),可用于增加和減少 Python 對象的引用計數(shù)。


在 PyThon 中,任何東西都是對象,例如變量、數(shù)據(jù)結構和函數(shù)等。

微信圖片_20190228180948.jpg


ZERO-COPYING 張量


由于 Numpy 數(shù)組的使用非常普遍,我們確實需要在 Numpy 和 PyTorch 張量之間做轉(zhuǎn)換。因此 PyTorch 給出了 from_numpy() 和 numpy() 兩個方法,從而在 NumPy 數(shù)組和 PyTorch 張量之間做轉(zhuǎn)換。

微信圖片_20190228181004.jpg


因為張量儲存的成本比較大,如果我們在上述轉(zhuǎn)換的過程中復制一遍數(shù)據(jù),那么內(nèi)存的占用會非常大。PyTorch 張量的一個優(yōu)勢是它會保留一個指向內(nèi)部 NumPy 數(shù)組的指針,而不是直接復制它。這意味著 PyTorch 將擁有這一數(shù)據(jù),并與 NumPy 數(shù)組對象共享同一內(nèi)存區(qū)域。


微信圖片_20190228181021.jpg


Zero-Copying 的形式確實能省很多內(nèi)存,但是如上所示在位(in-place)和標準運算之間的區(qū)別會有點模糊。如果用 np_array = np_array +1.0,torch_array 的內(nèi)存不會改變,但是如果用 np_array += 1.0,torch_array 的內(nèi)存卻又會改變。


CPU/GPU 內(nèi)存分配


張量的實際原始數(shù)據(jù)并不是立即保存在張量結構中,而是保存在我們稱之為「存儲(Storage)」的地方,它是張量結構的一部分。一般張量存儲可以通過 Allocator 選擇是儲存在計算機內(nèi)存(CPU)還是顯存(GPU)。


微信圖片_20190228181037.jpg


THE BIG PICTURE


最后,PyTorch 主張量 THTensor 結構可以展示為下圖。THTensor 的主要結構為張量數(shù)據(jù),它保留了 size/strides/dimensions/offsets/等信息,同時還有存儲 THStorage。


微信圖片_20190228181057.jpg


JIT


因為 PyTorch 是即時運行模式,這表明它很容易 Debug 或檢查代碼等。在 PyTorch 1.0 中,其首次引進了 torch.jit,它是一組編譯工具,且主要目標是彌補研究與產(chǎn)品部署的差距。JIT 包含一種名為 Torch Script 的語言,這種語言是 Python 的子語言。使用 Torch Script 的代碼可以實現(xiàn)非常大的優(yōu)化,并且可以序列化以供在后續(xù)的 C++API 中使用。


如下所示為常見使用 Python 運行的 Eager 模式,也可以運行 Script 模式。Eager 模式適合塊做原型與實驗,而 Script 模式適合做優(yōu)化與部署。


微信圖片_20190228181117.jpg


那么為什么要用 TORCHSCRIPT 呢?Christian 給出了以下理由:


微信圖片_20190228181135.jpg


PyTorch JIT 主要過程


如下所示 JIT 主要會輸入代碼或 Python 的抽象句法樹(AST),其中 AST 會用樹結構表征 Python 源代碼的句法結構。解析可能是解析句法結構和計算圖,然后語法檢測接連著代碼優(yōu)化過程,最后只要編譯并執(zhí)行就可以了。


微信圖片_20190228181152.jpg


其中優(yōu)化可以用于模型計算圖,例如展開循環(huán)等。在如下所示的 Peephole 優(yōu)化中,編譯器僅在一個或多個基本塊中針對已生成的代碼,結合 CPU 指令的特點和一些轉(zhuǎn)換規(guī)則提升性能。Peephole 優(yōu)化也可以通過整體分析和指令轉(zhuǎn)換提升代碼性能。


如下所示矩陣的兩次裝置等于矩陣本身,這應該是需要優(yōu)化的。

微信圖片_20190228181211.jpg


執(zhí)行


和 Python 解釋器可以執(zhí)行代碼一樣,PyTorch 在 JIT 過程中也有一個解釋器執(zhí)行中間表征指令:


微信圖片_20190228181231.jpg


最后,Christian 還介紹了很多內(nèi)部運行機制,不過因為它們都很難,而且暫時沒有提供視頻講解,讀者大牛們可以看看具體 PPT 內(nèi)容。


本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權者。如涉及作品內(nèi)容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經(jīng)濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
在线播放中文字幕一区| 亚洲淫性视频| 国产日本欧美视频| 欧美午夜一区| 欧美日韩亚洲在线| 欧美日本不卡视频| 欧美日本高清一区| 欧美精品一区二区蜜臀亚洲| 欧美精品 国产精品| 欧美电影打屁股sp| 欧美精品在线观看一区二区| 欧美激情1区| 欧美精品国产一区| 欧美日韩精品高清| 国产精品yjizz| 国产精品日韩欧美一区二区三区 | 国内外成人免费视频| 国内视频一区| 在线观看亚洲视频| 亚洲精品少妇30p| 一区二区欧美国产| 亚洲一区精品电影| 先锋影音一区二区三区| 久久国产精品一区二区| 亚洲第一页在线| 亚洲精品美女免费| 亚洲手机视频| 亚洲欧美一级二级三级| 久久精品国产久精国产思思| 玖玖精品视频| 欧美精品在线免费播放| 国产精品久久激情| 国产亚洲精品aa午夜观看| 一区免费观看视频| 亚洲免费激情| 亚洲欧美视频| 亚洲国内精品| 亚洲一级特黄| 久久久久久综合网天天| 欧美激情久久久久久| 国产精品分类| 狠狠色狠狠色综合日日小说| 亚洲区欧美区| 午夜视频一区| 日韩视频中文字幕| 亚洲欧美日韩国产综合| 久久婷婷蜜乳一本欲蜜臀| 欧美精品日日鲁夜夜添| 国产精品亚洲综合一区在线观看 | 在线观看一区二区视频| 99精品欧美一区二区三区综合在线| 亚洲一区免费看| 亚洲国产天堂久久综合网| 一区二区日韩| 久久免费视频一区| 欧美日韩亚洲一区二区| 国产亚洲精品一区二555| 亚洲人午夜精品免费| 亚洲欧美中文日韩在线| 亚洲精品欧美在线| 欧美一区2区视频在线观看 | 欧美日韩一区二区精品| 国产亚洲免费的视频看| 亚洲毛片播放| 久久精品国语| 亚洲欧美一区二区在线观看| 免费精品99久久国产综合精品| 欧美午夜免费影院| 一区在线观看| 亚洲男人的天堂在线| 99re6这里只有精品视频在线观看| 久久精品91久久久久久再现| 欧美日韩国产一区| 激情伊人五月天久久综合| 一本色道久久99精品综合| 亚洲国产欧美一区二区三区同亚洲 | 亚洲破处大片| 久久av资源网站| 午夜欧美精品| 欧美日韩国产成人在线91| 怡红院精品视频| 香蕉久久夜色精品| 亚洲午夜精品| 欧美激情综合| 在线看国产日韩| 欧美一区二区免费观在线| 亚洲一级黄色片| 欧美—级在线免费片| 精品成人一区二区三区四区| 午夜伦理片一区| 亚洲一区视频| 欧美精品色网| 在线观看成人小视频| 性感少妇一区| 性色av香蕉一区二区| 欧美日韩一区在线观看视频| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美在线影院| 亚洲综合欧美日韩| 欧美理论电影在线播放| 亚洲国产精品va在看黑人| 亚洲高清网站| 久久久久久久综合狠狠综合| 国产日韩欧美制服另类| 亚洲欧美日韩国产一区| 亚洲一区二区三区乱码aⅴ| 欧美日韩国产亚洲一区| 亚洲精品欧美日韩| 99re热精品| 欧美巨乳波霸| 亚洲精品综合在线| 亚洲色无码播放| 欧美视频在线观看一区| 亚洲毛片视频| 亚洲视频在线观看三级| 欧美午夜精品久久久久久超碰| 99精品欧美| 亚洲小视频在线观看| 欧美三级电影网| 一本久久a久久精品亚洲| 亚洲午夜视频在线观看| 欧美午夜国产| 亚洲午夜一区二区三区| 香蕉久久国产| 国产亚洲欧美日韩日本| 久久国产精品久久久久久| 久久综合色播五月| 亚洲丰满少妇videoshd| 亚洲精品综合精品自拍| 欧美精品在线播放| 一区二区三区欧美亚洲| 亚洲女同精品视频| 国产免费成人| 久久精品成人一区二区三区| 裸体歌舞表演一区二区| 亚洲国产精品久久91精品| 一区二区日韩欧美| 国产精品美女主播在线观看纯欲| 亚洲一区精彩视频| 久久蜜臀精品av| 亚洲国产成人精品久久久国产成人一区 | 欧美日本亚洲视频| 在线视频欧美精品| 欧美在线观看网址综合| 极品少妇一区二区三区精品视频| 亚洲日本电影在线| 欧美日韩第一区日日骚| 亚洲午夜电影在线观看| 久久久国产一区二区三区| 在线观看视频一区二区| 在线视频欧美精品| 国产日韩一区欧美| 亚洲精品国产精品乱码不99| 欧美三级电影一区| 先锋a资源在线看亚洲| 欧美电影专区| 亚洲一区网站| 免费看的黄色欧美网站| 日韩一级精品视频在线观看| 欧美中文字幕久久| 精品成人一区二区三区四区| 99精品视频一区| 国产伦精品一区二区三区免费| 欧美一区=区| 欧美精品久久久久久久免费观看| 亚洲网友自拍| 久久综合电影一区| 亚洲精品美女久久7777777| 欧美亚洲一区二区三区| 伊人久久成人| 亚洲欧美日韩国产综合精品二区| 在线观看精品视频| 亚洲一区黄色| 亚洲成在人线av| 午夜精品亚洲| 亚洲国产精品久久| 欧美一区二区精品| 亚洲精品色婷婷福利天堂| 久久精品欧洲| 夜夜爽夜夜爽精品视频| 久久婷婷激情| 亚洲综合精品| 欧美理论电影网| 久久成人精品视频| 欧美色综合网| 亚洲黄色av一区| 国产伦理一区| 亚洲天堂成人在线观看| 精品999在线播放| 欧美亚洲一区| 一区二区三区|亚洲午夜| 欧美jizz19hd性欧美| 亚洲淫片在线视频| 欧美日韩精品久久久| 亚洲高清不卡av| 国产精自产拍久久久久久蜜| 亚洲深夜福利在线| 亚洲国内高清视频| 久久欧美肥婆一二区| 亚洲制服av|