0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PyTorch核心華人開發(fā)者透徹解讀PyTorch內部機制

DPVg_AI_era ? 來源:lq ? 2019-05-19 09:21 ? 次閱讀

本文以內部PyTorch核心開發(fā)者視角,非常詳細透徹的分析了PyTorch的內部結構,為開發(fā)者提供一張地圖,告訴您“支持自動區(qū)分的張量庫”的基本概念結構,并提供一些工具和技巧,以便找到適合代碼庫。對學習PyTorch、尤其是致力于參與PyTorch貢獻有非常大的意義。

PyTorch是一個開源的Python機器學習庫,基于Torch,已成為最受歡迎的機器學習框架之一。

相比Tensorflow,PyTorch的社區(qū)由更多專業(yè)機器學習開發(fā)人員、軟件架構師和公司內部程序員組成。

PyTorch也更多地用于數(shù)據分析和業(yè)務環(huán)境中的特殊模型中。

在PyTorch社區(qū)中,有更多的Python開發(fā)人員從事Web應用程序。此外,這種Python向框架的多功能性,使得研究人員能夠以幾乎無痛的方式測試想法,使得它成為最先進的尖端解決方案的首選框架。

對于準備、正在學習PyTorch的讀者來說,了解其內部機制能夠極大的提升學習效率、增進對PyTorch設計原理和目的的了解,從而能夠更好的在工作學習中使用該工具。如果你立志參與到PyTorch后續(xù)的改進中,那么更應該深入的了解其內部機制。

好消息是,F(xiàn)acebook Research Engineer、斯坦福博士生、PyTorch核心開發(fā)人員Edward Z. Yang為大家?guī)硪环軵yTorch內部機制的詳解slides,新智元在此強力推薦給廣大讀者。正文約3500字,閱讀可能需要10分鐘。

由于微信的限制無法展示高清圖像,我們特意為大家在文末找來了可下載的高清完整版,預祝大家學習愉快!

這份內部機制詳解是為誰準備的?

主要針對使用過PyTorch的人,尤其是希望成為PyTorch貢獻者、但卻被PyTorch的龐大復雜的C++代碼庫嚇到的人。

最終目的是能夠為大家提供一個通關寶典,讓大家了解“支持自動區(qū)分的Tensor庫”的基本概念結構,并提供一些工具和技巧,用來更容易的找到適合代碼庫。

讀者只需要對PyTorch有一個初步的了解,并且有過一定的動手經驗即可。門檻還是非常低的。

全部內容分為兩部分。首先介紹Tensor庫的概念。作者將從Tensor數(shù)據類型開始,更詳細地討論這種數(shù)據類型提供的內容,以便讓讀者更好地了解它是如何實際實現(xiàn)的。布局、設備和dtype的三位一體,探討如何考慮對Tensor類的擴展。

第二部分將討論PyTorch實戰(zhàn)。例如使用autograd來降低工作量,哪些代碼關鍵、為什么?以及各種用來編寫內核的超酷的工具。

理解Tensor庫的概念

Tensor

Tensor是PyTorch中的中心數(shù)據結構。我們可以將Tensor視為由一些數(shù)據組成,然后是一些描述Tensor大小的元數(shù)據,包含元素的類型(dtype),Tensor所依賴的設備(CPU內存?CUDA內存?)。以及Strides(步幅)。Strides實際上是PyTorch的一個顯著特征。

Tensor是一個數(shù)學概念。在計算機上最常見的表示是將Tensor中的每個元素連續(xù)地存儲在內存中,將每一行寫入內存,如上所示。

在上面的例子中,指定Tensor包含32位整數(shù),每個整數(shù)位于物理地址中,相互偏移四個字節(jié)。要記住Tensor的實際尺寸,還必須記錄哪些尺寸是多余的元數(shù)據。

假設我想在邏輯表示中訪問位置Tensor[0,1]處的元素。通過Stride我們應該這樣做:

找出Tensor的任何元素存在的位置,將每個索引乘以該維度的相應Stride,并將它們加在一起。

上圖中將第一維藍色和第二維紅色進行了顏色編碼,以便在Stride計算中跟蹤索引和步幅。

以上是Stride的一個例子。Stride表示實際上可以讓你代表Tensor的各種有趣的方法; 如果你想玩弄各種可能性,請查看Stride Visualizer。

可能存在共享相同存儲的多個Tensor,但請記住一點:有Tensor的地方,就有存儲。

存儲定義Tensor的dtype和物理大小,而每個Tensor記錄大小,步幅和偏移,定義物理內存的邏輯解釋。

Tensor擴展

有很多有趣的擴展,如XLA張量,量化張量,或MKL-DNN張量,作為張量庫,我們必須考慮是如何適應這些擴展。

當前的擴展模型在張量上提供了四個擴展點。首先,用三個參數(shù)用來確定張量是什么:

設備

張量的物理存儲器實際存儲在何處,例如在CPU上,NVIDIA GPU(cuda)上,或者可能在AMD GPU(hip)或TPU(xla)上的描述。設備的顯著特征是它有自己的分配器,不能與任何其他設備一起使用。

布局

布局用來描述我們如何邏輯地解釋這個物理內存。最常見的布局是跨步張量,但稀疏張量具有不同的布局,涉及2個張量:一個用于索引、一個用于數(shù)據。

MKL-DNN張量可能具有更奇特的布局,例如阻擋布局,這不能僅使用步幅來表示。

dtype

描述了它實際存儲在張量的每個元素中的含義。這可以是浮點數(shù)或整數(shù),或者它可以是例如量化的整數(shù)。

順便說一下,如果你想為PyTorch張量添加一個擴展名,請聯(lián)系PyTorch官方。

實戰(zhàn)技巧

了解你手里的武器

PyTorch有很多文件夾,CONTRIBUTING文檔有非常詳細的描述。但實際上,你真正需要了解的只有四個:

torch/:包含導入和使用的實際Python模塊。Python代碼,很容易上手調試。

torch/csrc/:它實現(xiàn)了在Python和C++之間進行轉換的綁定代碼,以及一些非常重要的PyTorch功能,如autograd引擎和JIT編譯器。它還包含C++前臺代碼。

aten/:“A Tensor Library”的縮寫(由Zachary DeVito創(chuàng)造),是一個實現(xiàn)Tensors操作的C++庫。存放一些內核代碼存在的地方,盡量不要在那里花太多時間。

c10/:這是一個雙關語。C代表Caffe,10既是二級制的2,也是十進制的10(英文Ten,同時也是Tensor的前半部分)。包含PyTorch的核心抽象,包括Tensor和Storage數(shù)據結構的實際實現(xiàn)。

讓我們看看這種代碼分離在實踐中是如何分解的:

調用一個函數(shù)的時候,會經歷以下步驟:

將Python翻譯成C

處理變量調度

處理設備類型/布局調度

我們有實際的內核,它既可以是現(xiàn)代本機函數(shù),也可以是傳統(tǒng)的TH函數(shù)

值得一提的是,所有代碼都是自動生成的,所以不會出現(xiàn)在GitHub的repo里,必須自己構建PyTorch后才能看到。不過你也不必非常深刻地理解這段代碼在做什么,自動生成的嘛。

從武器庫中挑選寫內核的趁手兵刃

PyTorch為內核編寫者提供了許多有用的工具。在本節(jié)中,我們將介紹其中比較趁手的工具。

要利用PyTorch帶來的所有代碼生成,需要為運算符編寫schema。詳細介紹參見GitHub的README。

錯誤檢查可以通過低階API(TORCH_CHECK)和高階API實現(xiàn)。高階API可以基于TensorArg元數(shù)據提供用戶友好的錯誤消息。

要執(zhí)行dtype調度,應該使用AT_DISPATCH_ALL_TYPES宏,用來獲取張量的dtype,并用于可從宏調度的每個dtype的lambda。通常,這個lambda只調用一個模板化的輔助函數(shù)。

如何提高工作效率

別編輯header!

編輯header會導致很長的重構時間,盡量去編輯.cpp文件。

別直接用CI去測試

CI是一個直接可用的測試代碼的變動是否有效的非常棒的工具,但如果你真的一點不都改設置恐怕要浪費很長時間在測試過程中。

強烈建議設置ccache

它有可能讓你避免在編輯header時進行大量重新編譯。而當我們在不需要重新編譯文件時進行了重新編譯,它還有助于掩蓋構建系統(tǒng)中的錯誤。

用一臺高性能的工作站

如果你建立一個帶有CPU和RAM的強大服務器,你將獲得更愉快的體驗。特別是,不建議在筆記本電腦上進行CUDA構建。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7405

    瀏覽量

    163405
  • 機器學習
    +關注

    關注

    66

    文章

    8323

    瀏覽量

    132184
  • pytorch
    +關注

    關注

    2

    文章

    795

    瀏覽量

    13081

原文標題:揭秘PyTorch內核!核心開發(fā)者親自全景解讀(47頁PPT)

文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Pytorch模型訓練實用PDF教程【中文】

    、模型權及損失函數(shù)的變化。本教程適用讀者:想熟悉 PyTorch 使用的朋友;想采用 PyTorch 進行模型訓練的朋友;正采用 PyTorch,但無有效機制去診斷模型的朋友;
    發(fā)表于 12-21 09:18

    PyTorch如何入門

    PyTorch 入門實戰(zhàn)(一)——Tensor
    發(fā)表于 06-01 09:58

    Facebook致力AI開源PyTorch 1.0 AI框架

    Facebook近日宣布,將于近期開源PyTorch 1.0 AI框架,據悉,該框架是PyTorch與Caffe 2的結合,可以讓開發(fā)者無需遷移就從研究轉為生產。
    的頭像 發(fā)表于 05-08 14:58 ?3363次閱讀

    Facebook致力AI 開源PyTorch1.0 AI框架

    導讀: Facebook近日宣布,將于近期開源PyTorch 1.0 AI框架,據悉,該框架是PyTorch與Caffe 2的結合,可以讓開發(fā)者無需遷移就從研究轉為生產。 Facebook近日宣布
    的頭像 發(fā)表于 06-18 10:30 ?3133次閱讀

    Facebook宣布發(fā)布深度學習框架 PyTorch 1.0開發(fā)者預覽版

    為了滿足這些需求,Google Cloud 也將為其眾多服務引入 PyTorch 支持。Facebook 在宣布這一消息的博客文章中稱,Google 與 Facebook 合作在為 PyTorch
    的頭像 發(fā)表于 10-08 14:36 ?3159次閱讀

    一文解構PyTorch:深入了解PyTorch內部機制

    PyTorch是一個較新的深度學習框架,主打動態(tài)網絡模型。相比其他同類框架,PyTorch提供一種較低級別的方法,對于更具備數(shù)學背景的用戶來講靈活性更強。
    的頭像 發(fā)表于 03-01 08:47 ?3929次閱讀
    一文解構<b class='flag-5'>PyTorch</b>:深入了解<b class='flag-5'>PyTorch</b><b class='flag-5'>內部</b><b class='flag-5'>機制</b>

    一篇非常新的介紹PyTorch內部機制的文章

    譯者序:這篇博文是一篇非常新的介紹PyTorch內部機制的文章,作者Edward Z Yang來自于Stanford大學,是PyTorch核心
    的頭像 發(fā)表于 12-26 10:17 ?2083次閱讀
    一篇非常新的介紹<b class='flag-5'>PyTorch</b><b class='flag-5'>內部</b><b class='flag-5'>機制</b>的文章

    PyTorch 的 Autograd 機制和使用

    PyTorch 作為一個深度學習平臺,在深度學習任務中比 NumPy 這個科學計算庫強在哪里呢?我覺得一是 PyTorch 提供了自動求導機制,二是對 GPU 的支持。由此可見,自動求導 (autograd) 是
    的頭像 發(fā)表于 08-15 09:37 ?1038次閱讀

    TensorFlow的衰落與PyTorch的崛起

    在采訪開發(fā)者、硬件專家、云提供商以及熟悉谷歌機器學習工作的人士時,他們的觀點也是相同的。TensorFlow 在爭奪開發(fā)者人心的競爭中落敗。其中有些人甚至使用了令人難以理解的確切說法:“PyTorch 正在享用 TensorFl
    的頭像 發(fā)表于 11-04 14:23 ?1645次閱讀

    PyTorch教程11.4之Bahdanau注意力機制

    電子發(fā)燒友網站提供《PyTorch教程11.4之Bahdanau注意力機制.pdf》資料免費下載
    發(fā)表于 06-05 15:11 ?0次下載
    <b class='flag-5'>PyTorch</b>教程11.4之Bahdanau注意力<b class='flag-5'>機制</b>

    沒有“中間商賺差價”, OpenVINO? 直接支持 PyTorch 模型對象

    隨著 OpenVINO 2023.0 版本的發(fā)布,OpenVINO 工具庫中預置了全新的 PyTorch 前端,為開發(fā)者們提供了一條全新的 PyTorch 模型支持路徑,帶來更友好的用戶
    的頭像 發(fā)表于 06-27 16:39 ?686次閱讀
    沒有“中間商賺差價”, OpenVINO? 直接支持 <b class='flag-5'>PyTorch</b> 模型對象

    15-PyTorch-Edge-在邊緣設備上部署AI模型的開發(fā)者之旅

    對于開發(fā)者而言,我們將整個ExecuTorch技術棧分為兩個階段。首先,我們從一個PyTorch模型開始,這在大多數(shù)情況下是一個torch.in.module。然后我們從中捕獲圖形,并將其lowering并序列化為額外的torch二進制文件。
    的頭像 發(fā)表于 01-12 10:29 ?642次閱讀
    15-<b class='flag-5'>PyTorch</b>-Edge-在邊緣設備上部署AI模型的<b class='flag-5'>開發(fā)者</b>之旅

    解讀PyTorch模型訓練過程

    PyTorch作為一個開源的機器學習庫,以其動態(tài)計算圖、易于使用的API和強大的靈活性,在深度學習領域得到了廣泛的應用。本文將深入解讀PyTorch模型訓練的全過程,包括數(shù)據準備、模型構建、訓練循環(huán)、評估與保存等關鍵步驟,并結合
    的頭像 發(fā)表于 07-03 16:07 ?738次閱讀

    PyTorch的介紹與使用案例

    學習領域的一個重要工具。PyTorch底層由C++實現(xiàn),提供了豐富的API接口,使得開發(fā)者能夠高效地構建和訓練神經網絡模型。PyTorch不僅支持動態(tài)計算圖,還提供了強大的自動微分系統(tǒng),極大地簡化了深度學習任務的
    的頭像 發(fā)表于 07-10 14:19 ?309次閱讀

    PyTorch深度學習開發(fā)環(huán)境搭建指南

    PyTorch作為一種流行的深度學習框架,其開發(fā)環(huán)境的搭建對于深度學習研究開發(fā)者來說至關重要。在Windows操作系統(tǒng)上搭建PyTorch
    的頭像 發(fā)表于 07-16 18:29 ?613次閱讀