深度學習框架太抽象?其實不外乎這五大核心組件

2020-12-08 雷鋒網

許多初學者覺得深度學習框架抽象,雖然調用了幾個函數/方法,計算了幾個數學難題,但始終不能理解這些框架的全貌。

為了更好地認識深度學習框架,也為了給一些想要自己親手搭建深度學習框架的朋友提供一些基礎性的指導,日前來自蘇黎世聯邦理工學院計算機科學系的碩士研究生Gokula Krishnan Santhanam在博客上撰文,概括了大部分深度學習框架都會包含的五大核心組件,為我們詳細剖析了深度學習框架一般性的內部組織結構。以下由雷鋒網編譯。

Gokula Krishnan Santhanam認為,大部分深度學習框架都包含以下五個核心組件:

1. 張量(Tensor)

2. 基於張量的各種操作

3. 計算圖(Computation Graph)

4. 自動微分(Automatic Differentiation)工具

5. BLAS、cuBLAS、cuDNN等拓展包

1. 張量(Tensor)

張量是所有深度學習框架中最核心的組件,因為後續的所有運算和優化算法都是基於張量進行的。幾何代數中定義的張量是基於向量和矩陣的推廣,通俗一點理解的話,我們可以將標量視為零階張量,矢量視為一階張量,那麼矩陣就是二階張量。

舉例來說,我們可以將任意一張RGB彩色圖片表示成一個三階張量(三個維度分別是圖片的高度、寬度和色彩數據)。如下圖所示是一張普通的水果圖片,按照RGB三原色表示,其可以拆分為三張紅色、綠色和藍色的灰度圖片,如果將這種表示方法用張量的形式寫出來,就是圖中最下方的那張表格。

圖中只顯示了前5行、320列的數據,每個方格代表一個像素點,其中的數據[1.0, 1.0, 1.0]即為顏色。假設用[1.0, 0, 0]表示紅色,[0, 1.0, 0]表示綠色,[0, 0, 1.0]表示藍色,那麼如圖所示,前面5行的數據則全是白色。

將這一定義進行擴展,我們也可以用四階張量表示一個包含多張圖片的數據集,其中的四個維度分別是:圖片在數據集中的編號,圖片高度、寬度,以及色彩數據。

將各種各樣的數據抽象成張量表示,然後再輸入神經網絡模型進行後續處理是一種非常必要且高效的策略。因為如果沒有這一步驟,我們就需要根據各種不同類型的數據組織形式定義各種不同類型的數據操作,這會浪費大量的開發者精力。更關鍵的是,當數據處理完成後,我們還可以方便地將張量再轉換回想要的格式。例如Python NumPy包中numpy.imread和numpy.imsave兩個方法,分別用來將圖片轉換成張量對象(即代碼中的Tensor對象),和將張量再轉換成圖片保存起來。

2. 基於張量的各種操作

有了張量對象之後,下面一步就是一系列針對這一對象的數學運算和處理過程。

其實,整個神經網絡都可以簡單視為為了達到某種目的,針對輸入張量進行的一系列操作過程。而所謂的「學習」就是不斷糾正神經網絡的實際輸出結果和預期結果之間誤差的過程。這裡的一系列操作包含的範圍很寬,可以是簡單的矩陣乘法,也可以是卷積、池化和LSTM等稍複雜的運算。而且各框架支持的張量操作通常也不盡相同,詳細情況可以查看其官方文檔(如下為NumPy、Theano和TensorFlow的說明文檔)。

NumPy:http://www.scipy-lectures.org/intro/numpy/operations.html

Theano:http://deeplearning.net/software/theano/library/tensor/basic.html

TensorFlow:https://www.tensorflow.org/api_docs/python/math_ops/

需要指出的是,大部分的張量操作都是基於類實現的(而且是抽象類),而並不是函數(這一點可能要歸功於大部分的深度學習框架都是用面向對象的程式語言實現的)。這種實現思路一方面允許開發者將各種類似的操作匯總在一起,方便組織管理。另一方面也保證了整個代碼的復用性、擴展性和對外接口的統一。總體上讓整個框架更靈活和易於擴展,為將來的發展預留了空間。

3. 計算圖(Computation Graph)

有了張量和基於張量的各種操作之後,下一步就是將各種操作整合起來,輸出我們需要的結果。

但不幸的是,隨著操作種類和數量的增多,有可能引發各種意想不到的問題,包括多個操作之間應該並行還是順次執行,如何協同各種不同的底層設備,以及如何避免各種類型的冗餘操作等等。這些問題有可能拉低整個深度學習網絡的運行效率或者引入不必要的Bug,而計算圖正是為解決這一問題產生的。

據雷鋒網了解,計算圖首次被引入人工智慧領域是在2009年的論文《Learning Deep Architectures for AI》。當時的圖片如下所示,作者用不同的佔位符(*,+,sin)構成操作結點,以字母x、a、b構成變量結點,再以有向線段將這些結點連接起來,組成一個表徵運算邏輯關係的清晰明了的「圖」型數據結構,這就是最初的計算圖。

後來隨著技術的不斷演進,加上腳本語言和低級語言各自不同的特點(概括地說,腳本語言建模方便但執行緩慢,低級語言則正好相反),因此業界逐漸形成了這樣的一種開發框架:前端用Python等腳本語言建模,後端用C++等低級語言執行(這裡低級是就應用層而言),以此綜合了兩者的優點。可以看到,這種開發框架大大降低了傳統框架做跨設備計算時的代碼耦合度,也避免了每次後端變動都需要修改前端的維護開銷。而這裡,在前端和後端之間起到關鍵耦合作用的就是計算圖。

將計算圖作為前後端之間的中間表示(Intermediate Representations)可以帶來良好的交互性,開發者可以將Tensor對象作為數據結構,函數/方法作為操作類型,將特定的操作類型應用於特定的數據結構,從而定義出類似MATLAB的強大建模語言。

需要注意的是,通常情況下開發者不會將用於中間表示得到的計算圖直接用於模型構造,因為這樣的計算圖通常包含了大量的冗餘求解目標,也沒有提取共享變量,因而通常都會經過依賴性剪枝、符號融合、內存共享等方法對計算圖進行優化。

目前,各個框架對於計算圖的實現機制和側重點各不相同。例如Theano和MXNet都是以隱式處理的方式在編譯中由表達式向計算圖過渡。而Caffe則比較直接,可以創建一個Graph對象,然後以類似Graph.Operator(xxx)的方式顯示調用。

因為計算圖的引入,開發者得以從宏觀上俯瞰整個神經網絡的內部結構,就好像編譯器可以從整個代碼的角度決定如何分配寄存器那樣,計算圖也可以從宏觀上決定代碼運行時的GPU內存分配,以及分布式環境中不同底層設備間的相互協作方式。除此之外,現在也有許多深度學習框架將計算圖應用於模型調試,可以實時輸出當前某一操作類型的文本描述。

4. 自動微分(Automatic Differentiation)工具

計算圖帶來的另一個好處是讓模型訓練階段的梯度計算變得模塊化且更為便捷,也就是自動微分法。

正如前面提到的,因為我們可以將神經網絡視為由許多非線性過程組成的一個複雜的函數體,而計算圖則以模塊化的方式完整表徵了這一函數體的內部邏輯關係,因此微分這一複雜函數體,即求取模型梯度的方法就變成了在計算圖中簡單地從輸入到輸出進行一次完整遍歷的過程。與自動微分對應,業內更傳統的做法是符號微分。

符號微分即常見的求導分析。針對一些非線性過程(如修正線性單元ReLU)或者大規模的問題,使用符號微分法的成本往往非常高昂,有時甚至不可行(即不可微)。因此,以上述迭代式的自動微分法求解模型梯度已經被廣泛採用。並且由於自動微分可以成功應對一些符號微分不適用的場景,目前許多計算圖程序包(例如Computation Graph Toolkit)都已經預先實現了自動微分。

另外,由於每個節點處的導數只能相對於其相鄰節點計算,因此實現了自動微分的模塊一般都可以直接加入任意的操作類中,當然也可以被上層的微分大模塊直接調用。

5. BLAS、cuBLAS、cuDNN等拓展包

現在,通過上述所有模塊,我們已經可以搭建一個全功能的深度學習框架:將待處理數據轉換為張量,針對張量施加各種需要的操作,通過自動微分對模型展開訓練,然後得到輸出結果開始測試。這時還缺什麼呢?答案是運算效率。

由於此前的大部分實現都是基於高級語言的(如Java、Python、Lua等),而即使是執行最簡單的操作,高級語言也會比低級語言消耗更多的CPU周期,更何況是結構複雜的深度神經網絡,因此運算緩慢就成了高級語言的一個天然的缺陷。

目前針對這一問題有兩種解決方案。

第一種方法是模擬傳統的編譯器。就好像傳統編譯器會把高級語言編譯成特定平臺的彙編語言實現高效運行一樣,這種方法將高級語言轉換為C語言,然後在C語言基礎上編譯、執行。為了實現這種轉換,每一種張量操作的實現代碼都會預先加入C語言的轉換部分,然後由編譯器在編譯階段將這些由C語言實現的張量操作綜合在一起。目前pyCUDA和Cython等編譯器都已經實現了這一功能。

第二種方法就是前文提到的,利用腳本語言實現前端建模,用低級語言如C++實現後端運行,這意味著高級語言和低級語言之間的交互都發生在框架內部,因此每次的後端變動都不需要修改前端,也不需要完整編譯(只需要通過修改編譯參數進行部分編譯),因此整體速度也就更快。

除此之外,由於低級語言的最優化編程難度很高,而且大部分的基礎操作其實也都有公開的最優解決方案,因此另一個顯著的加速手段就是利用現成的擴展包。例如最初用Fortran實現的BLAS(基礎線性代數子程序),就是一個非常優秀的基本矩陣(張量)運算庫,此外還有英特爾的MKL(Math Kernel Library)等,開發者可以根據個人喜好靈活選擇。

值得一提的是,一般的BLAS庫只是針對普通的CPU場景進行了優化,但目前大部分的深度學習模型都已經開始採用並行GPU的運算模式,因此利用諸如NVIDIA推出的針對GPU優化的cuBLAS和cuDNN等更據針對性的庫可能是更好的選擇。

運算速度對於深度學習框架來說至關重要,例如同樣訓練一個神經網絡,不加速需要4天的時間,加速的話可能只要4小時。在快速發展的人工智慧領域,特別是對那些成立不久的人工智慧初創公司而言,這種差別可能就會決定誰是先驅者,而誰是追隨者。

總結

原文作者在文末指出:為了向開發者提供儘量簡單的接口,大部分深度學習框架通常都會將普通的概念抽象化,這可能是造成許多用戶感知不到上述五點核心組件的重要原因。

而這也正是作者寫本文的初衷:他希望開發者能夠通過了解不同框架之間的一些相似特性,更好地認識和使用一個深度學習框架。另一方面,對於那些不僅對學會使用深度學習框架感興趣,還打算親手搭建一個深度框架的朋友,作者認為了解各框架的內部組成和一些共性的特徵也是邁向成功的重要一步。他真誠地相信,一個優秀的工程師不僅應該「知其然」,更應該「知其所以然」。

來源:medium,雷鋒網(公眾號:雷鋒網)編譯

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • TensorFlow和Caffe、MXNet、Keras等其他深度學習框架的對比
    在下周二(2月28日)雷鋒網硬創公開課欄目將會推出黃文堅老師的公開課《深度學習之經典卷積神經網絡的技術淺析》(點擊了解詳情),歡迎大家報名!Google 近日發布了 TensorFlow 1.0 候選版,這第一個穩定版將是深度學習框架發展中的裡程碑的一步。
  • 重磅| Torch7團隊開源PyTorch:Python優先的深度學習框架
    據官網介紹,PyTorch 是一個 Python 優先的深度學習框架,能夠在強大的 GPU 加速基礎上實現張量和動態神經網絡。PyTorch 介紹在粒度層面(granular level)上,PyTorch 庫包含了以下組件:使用 PyTorch 的原因通常有二:作為 numpy 的替代,以便使用強大的 GPU;將其作為一個能提供最大的靈活性和速度的深度學習研究平臺。
  • 深度學習框架比較,我該選擇哪一個?
    Theano 基於 Python,是一個擅長處理多維數組的庫,十分適合與其它深度學習庫結合起來進行數據探索。它設計的初衷是為了執行深度學習中大規模神經網絡算法的運算。其實,Theano 可以被更好地理解為一個數學表達式的編譯器:用符號式語言定義你想要的結果,該框架會對你的程序進行編譯,在 GPU 或 CPU 中高效運行。
  • Keras vs PyTorch:誰是第一深度學習框架?
    則正在學習這兩種框架。  一、簡介  Keras 和 PyTorch 是頗受數據科學家歡迎的深度學習開源框架。  Keras 是能夠在 TensorFlow、CNTK、Theano 或 MXNet 上運行的高級 API(或作為 TensorFlow 內的 tf.contrib)。
  • 使用Python從頭開始實現深度學習庫
    為此,可能需要將核心實現單元隱藏在幾個抽象層後面,這使得難以理解深度學習庫所基於的基本底層原理。因此,本文的目的是提供有關深度學習庫構建塊的見解。我們首先了解一些深度學習的背景知識,以了解功能要求,然後使用NumPy在python中使用一個簡單而完整的庫,該庫能夠端到端訓練神經網絡模型(非常簡單的類型)。在此過程中,我們將學習深度學習框架的各個組成部分。該庫不到100行代碼,因此應該很容易遵循。
  • 35 萬行代碼,曠視重磅開源天元深度學習框架 ,四大特性實現簡單開發
    發布會上,曠視研究院高級技術總監田忠博詳細介紹了這款剛剛正式對外開源的深度學習框架。  全球AI開發框架又添一員,曠視開源「天元」  曠視天元開源之時,正值深度學習框架百花齊放的時代。  自2007年Theano誕生以來,經過十餘年發展,深度學習技術與應用突飛猛進,深度學習框架也處在不斷迭代與進化的過程;另一方面,開源的概念在全球範圍內越來越深入人心,這使得人工智慧開發依賴的環境安裝、部署、測試,以及不斷迭代改進準確性和性能調優的工作變得更加簡單,在人工智慧領域,開源深度學習框架已經成為開發者離不開的平臺和工具。
  • 關於深度學習未來發展方向的六項預測
    即使您身為已經熟練掌握人工神經網絡基礎知識的數據科學家,大家也需要時間了解加速卷積、復發、生成以及其它與多層深度學習算法規範相關的複雜概念。而隨著深度學習創新態勢的升溫,這一技術開始面臨新的風險——對於普通開發者而言,其過度複雜的特性導致我們即使深入研究也很難加以了解。
  • 騰訊優圖開源深度學習推理框架TNN 助力AI開發降本增效
    6月10日,騰訊優圖實驗室宣布正式開源新一代移動端深度學習推理框架TNN,通過底層技術優化實現在多個不同平臺的輕量部署落地,性能優異、簡單易用。基於TNN,開發者能夠輕鬆將深度學習算法移植到手機端高效的執行,開發出人工智慧 APP,真正將 AI 帶到指尖。
  • TensorFlow與PyTorch之爭,哪個框架最適合深度學習
    那麼究竟哪種框架最適宜自己手邊的深度學習項目呢?本文作者從這兩種框架各自的功能效果、優缺點以及安裝、版本更新等諸多方面給出了自己的建議。如果你在讀這篇文章,那麼你可能已經開始了自己的深度學習之旅。如果你對這一領域還不是很熟悉,那麼簡單來說,深度學習使用了「人工神經網絡」,這是一種類似大腦的特殊架構,這個領域的發展目標是開發出能解決真實世界問題的類人計算機。
  • 曠視天元深度學習框架全球首發!3個實習生寫下一行代碼,27項全球AI...
    剛剛,中國AI領軍企業曠視舉辦了一場令業界震撼的線上發布會,向全球開發者開源其AI生產力平臺Brain++的核心組件——天元(MegEngine) 。天元也成為首個由中國AI公司研發的國產深度學習框架。
  • 清華自研深度學習框架「計圖」開源!多項任務性能超過PyTorch
    值得一提的是,這也是首個來自中國高校科研機構的開源深度學習框架,之前,業內來自「高校」的還有加拿大蒙特婁大學的Theano,UC伯克利的Caffe。與主流的深度學習框架TensorFlow、Pytorch不同,Jittor是一個完全基於動態編譯(Just-in-time)、使用元算子和統一計算圖的深度學習框架。
  • 深度學習框架哪家強?國產框架OneFlow做了一份測評報告
    機器之心報導機器之心編輯部近日,國產深度學習框架 OneFlow 發布了人工智慧方向深度學習領域的 DLPerf 測評報告。OneFlow 是一流科技自主研發、擁有完全自主智慧財產權的深度學習框架軟體,是國內首個由初創團隊研發並開源的 AI 框架,今年 7 月 31 日正式開源。OneFlow 獨創的自動數據模型混合併行、靜態調度、去中心化和全鏈路異步流式執行四大核心技術,使用軟體技術解決大數據、大模型、大計算所帶來的異構集群分布式橫向擴展挑戰,獲得了廣泛的業內關注。
  • 用PyTorch做深度學習實驗!Facebook新框架Ax和BoTorch雙雙開源
    在現代機器學習應用中,對實驗到生產的流程進行簡化是最難實現的任務之一。在已經市場化深度學習框架中,Facebook的PyTorch因其高度靈活性成為數據科學界的最愛,PyTorch能夠實現快速建模和實驗。但是,深度學習應用中的許多實驗面臨的挑戰已經超出了特定框架的能力範圍。
  • 教程| 斯坦福CS231n 2017最新課程:李飛飛詳解深度學習的框架實現...
    今天機器之心給大家分享的是其中的第八講——深度學習軟體(Deep Learning Software)。主要內容有:CPU 和 GPU 的對比;深度學習框架簡介;TensorFlow 和 PyTorch 的實例;以及各種深度學習框架的比較。
  • 專訪騰訊雲機器學習平臺技術負責人:揭秘騰訊深度學習平臺DI-X背後...
    據雷鋒網了解,DI-X將基於騰訊雲的大數據存儲與處理能力,為其用戶提供一站式的機器學習和深度學習服務。馬化騰曾表示:「人工智慧、物聯網,甚至未來的無人駕駛、機器人等等,它的後臺的核心一定有一顆在雲端的大腦。」而對於騰訊而言,馬化騰所提及的雲端大腦正是構建與其騰訊雲服務之上。
  • 陳天奇:深度學習編譯技術的現狀和未來
    作者:陳天奇傳統的深度學習框架採用人工優化算子,然後建立運行時圖解釋器來解決內存分配調度等問題。深度學習編譯器技術路線一般指在優化過程中採用了自動或者半自動的代碼生成用以替代人工優化。深度學習編譯器無疑是最近非常熱門的話題。本文主要探討深度學習編譯技術的現狀和未來。
  • Nature Neurosci: 神經科學的深度學習框架是什麼?
    那如果我們反過來思考,也許深度學習並沒有與神經科學背道而馳,而恰恰是觸及了當前神經科學還未開拓的領域呢?那麼我們是否可以,借鑑當前深度學習已有的規則和框架,來研究神經科學本身呢?今天分享一篇經典的文章。
  • 華為深度學習框架MindSpore正式開源:自動微分不止計算圖
    今年的華為開發者大會 HDC 2020 上,除了昇騰、鯤鵬等自研晶片硬體平臺之外,最令人期待的就是深度學習框架 MindSpore 的開源了。今天上午,華為 MindSpore 首席科學家陳雷在活動中宣布這款產品正式開源,我們終於可以在開放平臺上一睹它的真面目。
  • WAVE SUMMIT+2020深度學習開發者峰會報名啟動
    WAVE SUMMIT+2020深度學習開發者峰會盛大開啟!讓我們再次相約,嗨翻歲末~此次大會由深度學習技術及應用國家工程實驗室與百度聯合主辦,既有前沿技術解析與產業落地的乾貨,也有美酒和音樂的派對狂歡。同時,百度開源深度學習平臺飛槳也會在這次大會上帶來重磅更新,新老朋友們千萬不要錯過!
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。