從零開始學習MXnet(四)計算圖和粗細粒度以及自動求導

  這篇其實跟使用MXnet的關係不大,但對於咱們理解深度學習的框架設計仍是頗有幫助的。算法

  首先仍是對promgramming models的一個簡單介紹,這個東西其實是在編譯裏面常常出現的東西,咱們在編譯咱們的程序的時候,能夠對變量構建出一個計算圖,而後能夠對這個圖進行相應的優化來提升速度或者節省內存。到了DL框架上,這些用處就更加劇要了,可是也不是全部的DL框架都有計算圖的,由於這其中存在一個research和engineering的權衡。計算圖的簡單理解就是下圖:框架

  

  

1、Symbolic vs. Imperative Programs 性能

  首先要說的就是符號式程序和命令式程序等區別了,相似於程序語言設計中的區別,可否在程序代碼執行的過程當中,可否方便直接的進行修改、分支選擇或者循環以及獲得中間的輸出結果等操做,是區分符號式和命令式的關鍵,固然這些只是我我的的直觀理解。。。。稍微正式點就是:Most symbolic-style programs contain, either explicitly or implicitly, a compile step. This converts the computation graph into a function that can be called. Computation occurs in the last step in the code. The major characteristic of symbolic programs is the clear separation between defining the computation graph and compiling.而後imperative就是你怎麼寫它怎麼跑,你何時寫好了讓他跑,他就何時開始跑。學習

  符號式的設計方法有不少好處,tenserflow和MXnet都是基於這種方法編寫的,首先由於它們均可以構建出計算圖,這樣以來就能夠對計算圖進行優化,經過dependency的分析等等,能夠大大的提升算法訓練的速度和減小內存的須要,甚至於TQ最新的那篇paper,經過手動置頂一些mirror來保存forward的時候的部分feature map而不是所有,最終resnet152訓練要求的48G顯存降到了6G,並且速度上並無掉太多(我我的實際使用的時候,多是由於miroor設置的很差,降了不少速度。。),可是符號式的缺點也很明顯,它給使用者的權限太少了,由於算法在訓練的時候,是在定義好的symbil的基礎上進行本身的優化,而後傳入data開始訓練,而後你想在裏面作一些奇葩的操做例如循環,if之類的,基本是不可能的。。優化

  因此在咱們作research的時候,專一點在於算法的性能而不是效率低時候,可能torch和chaniner這種 imperative-style program是個不錯的選擇,在torch框架上,你能夠很容易的作出一些mxnet很難進行的動做,可是由於我我的暫時也不是很熟悉它們,並且咱們的重點仍是mxnet,因此我也不強行講了。下面是一個簡單的例子,咱們在imperative program能夠容易的寫出來,可是在符號式的卻很難。google

    a = 2
    b = a + 1
    d = np.zeros(10)
    for i in range(d):
        d += np.zeros(10)

 

2、粗細力度,自動求導 spa

  框架的粗粒度、細粒度和自動求導的概念以前聽過不少次了,前二者之前是徹底不懂而且以爲很高端,後者是覺得是字面意思而後以爲太可怕。。。實際上粗細粒度是對框架提供的一個操做大小的描述,粗粒度操做如:FC,BN,細粒度操做如:elemenwise的sum、mul之類的。設計

  仍是拿Tenserflow和MXnet來講,前者提供了不少的底層小操做,因此它是一個細粒度的框架,這樣的好處是,使用者要想定義本身的操做的時候,就能夠經過組合tenserflow裏面的op來實現,大大的減少了難度,但這樣帶來的壞處就是,最終的計算圖會又大又複雜,很難去優化。這也是google背書的Tenserflow以前在性能上反而不是MXnet的緣由之一的吧。 MXnet咱們就很熟悉它的那些OP了,基本上都是一些粗粒度的操做,這樣咱們在定義本身的OP的時候,只能去默默的寫C++代碼,箇中滋味,就很少說了。。。粗粒度的操做帶來的好處固然就是性能的提高。rest

  自動求導這個概念,簡單的理解就是,框架給你提升的OP,你只要用他們作fwd,而後backward會自動定義好,由於這些OP的BP已經有人寫好了,而且整個BP的流程也能夠推到出來而後創建好。並非你在定義本身的操做的時候,代碼能自動幫你寫這個操做的BP。code

 

總結

    我發現作系統設計這些真的很interesting,要不是個人代碼水平太弱雞,真是分分鐘鍾想去搞系統啊。。

相關文章
相關標籤/搜索