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

想讀讀PyTorch底層代碼?這份內核機制簡介送給你

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

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


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


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


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


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

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


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

微信圖片_20190228180845.jpg


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


微信圖片_20190228180908.gif


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


張量


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


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


Python 對象


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


微信圖片_20190228180926.jpg


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


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

微信圖片_20190228180948.jpg


ZERO-COPYING 張量


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

微信圖片_20190228181004.jpg


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


微信圖片_20190228181021.jpg


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


CPU/GPU 內存分配


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


微信圖片_20190228181037.jpg


THE BIG PICTURE


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


微信圖片_20190228181057.jpg


JIT


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


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


微信圖片_20190228181117.jpg


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


微信圖片_20190228181135.jpg


PyTorch JIT 主要過程


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


微信圖片_20190228181152.jpg


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


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

微信圖片_20190228181211.jpg


執行


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


微信圖片_20190228181231.jpg


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


本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
亚洲欧美日韩综合国产aⅴ| 亚洲视频免费| 一本到高清视频免费精品| 亚洲大片在线观看| 一区国产精品| 精品动漫av| 伊人伊人伊人久久| 好看的日韩av电影| 好吊色欧美一区二区三区四区| 国产区精品视频| 国产女优一区| 国产日韩欧美在线一区| 国产精品视频xxx| 国产精品女主播在线观看| 国产精品久久久久9999| 国产精品久久网| 国产精品网站在线播放| 国产美女精品视频免费观看| 国产精品美女诱惑| 国产日韩欧美中文在线播放| 国内久久视频| 在线观看欧美黄色| 亚洲精品123区| 日韩一区二区精品在线观看| 中文精品一区二区三区| 亚洲欧美国产制服动漫| 欧美一区二区在线播放| 亚洲国产第一| 亚洲乱码久久| 亚洲尤物在线| 欧美一区二区三区四区在线观看地址 | 在线观看视频免费一区二区三区| 狠狠色狠狠色综合人人| 18成人免费观看视频| 亚洲伦理网站| 亚洲欧美日韩高清| 亚洲观看高清完整版在线观看| 亚洲欧洲精品成人久久奇米网| 99热在这里有精品免费| 亚洲欧美激情视频| 久久久99精品免费观看不卡| 欧美电影免费观看高清| 欧美日韩在线观看一区二区三区| 国产麻豆综合| 在线观看欧美日本| 一本色道久久综合亚洲精品不卡| 香蕉久久夜色精品国产| 91久久香蕉国产日韩欧美9色| av成人免费在线| 午夜宅男欧美| 久久综合中文| 欧美三级电影精品| 国产日韩久久| 亚洲福利专区| 亚洲午夜久久久久久久久电影院 | 欧美午夜电影网| 国产视频精品xxxx| 亚洲成人在线免费| 亚洲视频一二| 亚洲第一天堂av| 亚洲一区二区三| 巨胸喷奶水www久久久免费动漫| 欧美日韩久久不卡| 国内一区二区在线视频观看| 99国产精品自拍| 欧美一区二区久久久| 亚洲美女黄网| 久久久久久网址| 欧美三级电影网| 伊人婷婷欧美激情| 亚洲影院一区| av不卡在线观看| 久久―日本道色综合久久| 欧美日韩国产成人精品| 激情综合色综合久久| 一区二区三区国产盗摄| 亚洲精品乱码久久久久久蜜桃91| 性色av香蕉一区二区| 欧美激情中文字幕一区二区| 国产一区二区三区视频在线观看 | 亚洲激情黄色| 久久国产精品99精品国产| 亚洲免费视频在线观看| 欧美ed2k| 黄色小说综合网站| 亚洲一二三四久久| 在线一区免费观看| 男女激情久久| 国产日韩专区在线| 中日韩高清电影网| 一本色道久久综合亚洲精品不卡 | 亚洲国产欧美一区二区三区丁香婷| 亚洲欧美视频在线观看视频| 国产精品99久久99久久久二8 | 亚洲国产成人午夜在线一区| 欧美与欧洲交xxxx免费观看 | 在线不卡中文字幕播放| 亚洲欧美日韩国产| 亚洲一区二区三区在线看| 欧美多人爱爱视频网站| 狠狠综合久久av一区二区小说 | 久久免费国产| 国产欧美一区二区精品婷婷| 一本一道久久综合狠狠老精东影业| 亚洲三级电影全部在线观看高清| 久久婷婷激情| 国产综合激情| 欧美一区二区三区的| 欧美一区二区三区的| 国产精品无码永久免费888| 一区二区免费在线观看| 一区二区精品| 欧美日韩中文在线| 99精品99| 亚洲一区综合| 国产精品二区二区三区| 在线一区视频| 亚洲欧美精品suv| 国产精品福利久久久| 亚洲一区二区三区四区视频 | 久久久久久久999| 国产精品一区在线观看你懂的| 亚洲综合三区| 欧美专区日韩专区| 国产在线观看91精品一区| 欧美在线啊v一区| 久久综合图片| 亚洲国产高清自拍| 日韩视频在线观看国产| 欧美日韩在线一区| 亚洲自拍另类| 久久久久久久久久看片| 黑丝一区二区| 91久久在线| 欧美国产乱视频| 日韩亚洲一区二区| 亚洲欧美中文日韩在线| 国产色婷婷国产综合在线理论片a| 欧美在线免费观看亚洲| 欧美r片在线| 亚洲精品国产日韩| 亚洲一区欧美激情| 国产精品亚洲аv天堂网| 欧美一级网站| 能在线观看的日韩av| 亚洲免费观看| 性色av香蕉一区二区| 好吊日精品视频| 日韩视频在线免费| 国产精品久久久久国产a级| 亚洲欧美日韩国产一区二区三区| 久久精品三级| 亚洲狠狠丁香婷婷综合久久久| 亚洲一二区在线| 国产亚洲精品aa| 亚洲精品免费在线观看| 国产精品久久久久国产a级| 久久福利毛片| 欧美经典一区二区三区| 亚洲专区免费| 欧美电影在线| 亚洲一区高清| 免费不卡欧美自拍视频| 在线视频精品一区| 久久亚洲春色中文字幕| 99成人在线| 久久久精彩视频| 亚洲精品乱码久久久久久久久 | 一本久久综合| 久久久99久久精品女同性| 最近中文字幕日韩精品| 欧美在线观看网址综合| 亚洲国产高清一区二区三区| 先锋a资源在线看亚洲| 亚洲高清一二三区| 欧美一区二区日韩一区二区| 亚洲国产精品一区二区久| 亚洲欧美在线一区二区| 亚洲国产精品123| 欧美中文字幕在线播放| 亚洲精品在线一区二区| 久久免费黄色| 亚洲在线免费视频| 欧美激情bt| 久久精品天堂| 国产精品爽爽ⅴa在线观看| 亚洲精选久久| 国内精品亚洲| 午夜精品一区二区三区在线视| 在线播放亚洲| 久久国产精品电影| 洋洋av久久久久久久一区| 免费久久精品视频| 欧美亚洲一区二区在线观看| 欧美日韩精品伦理作品在线免费观看 | 亚洲自拍高清| 日韩一级在线观看| 欧美xart系列高清| 欧美一区影院| 国产精品尤物|