MXNet的動態圖介面Gluon

經過了3個月的開發,MXNet 0.11版本終於發布了,其中也發布了最為重要的一個更新,動態圖介面Gluon,李沐大神也在CVPR17上面介紹了Gluon介面,足以看出MXNet對這次新發布的Gluon介面的重視。

下面我就以一個PyTorch使用者的角度為大家介紹一個我對Gluon這個介面的看法。

為何要開發Gluon

很多人說MXNet將戰線拉得太大了,發布了兩年,api處於極速的更新狀態,非常不穩定。這一點我贊同,我認為一個成熟的框架必須要具有非常穩定的api,試想幾個月前寫的代碼現在想做一些修改,結果發現好多api不能用了,這無疑會讓人非常崩潰。而且我認為目前MXNet的api也存在一些問題,有很多可以改進的空間,但是我認為最為重要的問題是沒有規範的教程和文檔,同時官方沒有建立討論的社區,大家有問題就去github上提issue,這樣效率是非常底下的,這也給很多想使用MXNet的用戶造成了極大的困難。

既然說到了MXNet的這麼多可以改進的問題,當然dmlc他們自己肯定是意識到了,但是因為精力和時間的關係沒有很快去改進,反而他們將他們的重心放到了開發一個全新的動態圖介面Gluon上。對於這個工作量並不小的工程,我想他們肯定是經過了深思熟慮才做出的解決,下面我就談一談我個人的感受。

先放上一張沐神在CVPR17 tutorial上的一張圖片吧。

圖片上不僅從時間上,還從編程方式上將目前主流的框架做了一下區分,可以明顯看出2015年之前框架都是符號式編程,tensorflow繼承theano的特點出現,因為Google的背書,強力地吸引了很多人去使用,很快成為了最流行的框架。但是tensorflow真的很好用嗎?就我自己的使用情況而言,答案是否定的,一是因為tensorflow是由一群Google的工程師開發的,他們一方面希望工程能力很強,有希望tensorflow可以做科研,這樣必定顧此失彼;二是因為tensorflow是符號式編程方式,繼承了theano一大堆缺點,不僅寫法麻煩,而且bug難調;三是暫時只能用於靜態圖,現在很多深度學習的研究希望能夠使用動態圖。上面是我自己使用時感覺的問題,知乎上專門有一個問題來吐槽tensorflow,有興趣的讀者可以去看看。雖然說了這麼多tensorflow的不好,但是毫無疑問tensorflow仍然是深度學習框架的霸者地位。

我一直認為越新的東西就會越滿足用戶的需求,所以隨後Facebook新出的PyTorch的用戶體驗就感覺非常的好,一是因為其是命令式編程的方式,隨時能夠運行結果,跟我們寫python程序幾乎一模一樣,不用像tensorflow一樣要先定義graph,然後一個session去運行;二是因為bug非常好找,那裡出了問題就能夠直接定位;三是因為文檔非常清楚,乾淨整潔,同時源碼非常清晰,容易看懂和修改;四是因為其支持動態圖,非常靈活,能夠隨意取出其中的tensor進行操作和查看;五是因為其有非常非常清晰的教程和官方論壇,Soumith等主要開發者都會經常在論壇上面解答問題,而且一般遇到了問題去論壇上搜都能夠很容易搜到之前有人提過,所有能夠很方便地找到解答方法。

正是由於這些優點,使得PyTorch才剛剛發布半年的時間就被大量的人推崇和使用,最新的cs231n都推出了PyTorch版本的作業,可想而知PyTorch是多麼簡單易用。

說了這麼多tensorflow和PyTorch,這跟Gluon有什麼關係呢?我想MXNet正是看到了以PyTorch為首的命令式編程框架的潛力,對於新用戶特別友好,易於上手,所以他們決定模仿PyTorch開發一個動態圖介面Gluon。Gluon還邀請了CMU的兩位教授來聯手寫教程,也是一本書,我想也是因為他們發現PyTorch良好的教程對於吸引用戶實在是太有幫助了。但是目前還是沒有官方的社區和論壇,希望MXNet的開發者能夠看到這個問題,擁有一個官方的論壇能夠留住很多使用者。

其實PyTorch也是仿照Chainer開發的,其後端也是調用的torch的運算,定位比keras低,但是又比tensorflow高。所以Gluon也可以看作這樣一個介面,調用底層的MXNet,但是前端使用符號式編程的方式。

Gluon的定位

PyTorch定位於科研,在Facebook內部使用Caffe2作為產品的部署和應用,那麼Gluon是如何定位的呢?

官方稱Gluon不僅定位於科研,同時也可用於產品。這無疑比PyTorch更好,因為這樣不需要再重寫代碼,而且兩個框架之間轉化也容易丟掉一些細節,從而模型達不到之前的精度,能夠有一套統一的框架,不僅能做科研,同時能夠用於產品部署無疑是最好的解決方案。我相信以dmlc的實力肯定能做出了,畢竟MXNet的設計理念是非常領先的。

Gluon的優勢

大致看完Gluon的api,和PyTorch非常非常像,開發者也說了Gluon學習了Keras,Chainer和PyTorch的優點並加以改進,相似的api無疑是一個優勢。之前我是PyTorch使用者,這兩天我嘗試著將之前的PyTorch教程移植到Gluon下面,發現非常方便,幾乎大體的框架都不用改動,只需要該一些小的api就可以了,所以非常方便用戶遷移過來,這是我的PyTorch教程和移植的Gluon教程。

第二個優勢是MXNet的優勢,就是速度快,省顯存,並行效率高,分散式簡單等等。這些優勢並不是Gluon帶來的,而是MXNet一直以來的優勢。

第三個優勢就是靜態圖和動態圖的轉換,PyTorch只有動態圖的模式,有的時候我們的網路結構其實是一個靜態圖,但是通過PyTorch每次都會重新構建動態圖,而Gluon提供了一個靜態圖和動態圖之間切換的方式。Gluon中的模塊gluon.nn.Sequential和gluon.Block分別與PyTorch中的torch.nn.Sequential和torch.nn.Module對應,他們都是動態圖的構建,而Gluon中還提供了gluon.nn.hybridSequential和gluon.HybridBlock,這兩個模塊就可以在動態圖和靜態圖之間轉換,使用者可以先用imperatvie的方式寫網路,debug,最後跑通網路之後,如果網路是一個靜態圖結構,就可以用net.hybridize()的方式將其轉換成靜態圖,眾所周知靜態圖的運算會比動態圖快,所以這是Gluon比PyTorch更好的地方,具體可以看看這個教程。

第四個優勢就是前面提到過的,科研和工業界可以都用同一個框架開發,避免的代碼的重寫,減少勞動效率,避免出現問題。

Gluon與PyTorch的對比

Gluon和PyTorch非常相似,比如PyTorch中的`torch.Tensor()`可以對應Gluon中的mx.nd.array(),PyTorch中tensor.cuda()可以對應Gluon中ndarray.as_in_context(mx.gpu())等等,大家在使用中就會慢慢發現很多相似的地方,我就不一一列舉了。除了這些相似之處,還有一些不同的地方具體說一下。

首先,Gluon和PyTorch在網路定義的部分有一個不同點,PyTorch定義網路的時候必須要明確的網路輸入和輸出的維度,所以我們需要自己去算,或者讓網路向前傳播一次print出維度。而Gluon並不需要這樣做,其能夠根據網路定義自動去判斷維度,避免了我們自己運算的麻煩,可以說是變得更加方便了。

由此帶來了另外一點的不同,就是lazy loading。定義好網路之後其實裡面的權重並沒有真實存在,這和PyTorch不同,PyTorch定義好網路之後就能夠將每一層的權重print出來,而Gluon定義好網路之後是沒有辦法print出來的。但是想像PyTorch一樣print出具體的權重數值也可以做到,就是定義一個輸入,然後feed進網路做一次前向傳播,這樣網路中的參數就真實存在了,可以print出裡面的具體數值了。這就是lazy loading,在使用的時候才會去真正地賦值,而不是定義的時候就賦值,究其原因,還是因為Gluon希望在定義的時候能夠盡量方便,不需要人為去推斷輸入的維度,這帶來的問題就是需要網路前向傳播一次才能夠真正賦予網路中的參數。這和PyTorch對比到底哪個更好了,這就見仁見智了。

最後一點不同之處就是PyTorch在網路定義的時候就會默認初始化,而且初始化的api並沒有暴露出來,如果你想要自己重新初始化就需要手動提取出裡面的tensor進行賦值。而Gluon有點像tensorflow,需要在定義網路之後進行一次參數的初始化,net.collect_params().initialize(ctx=mx.gpu()),而且PyTorch中可以使用model.cuda()將網路放到GPU上,而Gluon需要在初始化中指明ctx=mx.gpu()或者ctx=mx.cpu()。同時Gluon還可以在網路定義的時候就定義當前層的初始化方式,比如gluon.nn.Dense(weight_initializer=mx.init.Normal()),我感覺這比PyTorch方便一些。

Gluon的不足

最後說一說Gluon的不足吧,畢竟Gluon是剛剛上線的產品,所以難免存在一些bug,api偏少,線上部署不成熟,同時ndarray存在一些奇怪的問題,比如a = mx.nd.array([2, 3, 4]),我想取最後一位,a[-1]就會報錯,但是我用a[2]就沒有問題,雖然說影響不是很大,但是感覺用著有點煩。另外ndarray的操作也沒有PyTorch中tensor多,比如squeeze這個操作我就沒有在ndarray中找到類似,也許是我沒有發現,知道的同學可以告訴我一下。

總結

說了這麼多,最後總結一下,Gluon的出現是現在深度學習框架發展的趨勢,目前剛剛上線,雖然不成熟,但是提供了一套從科研到工業的簡單的、統一的框架。對於使用PyTorch的用戶比較友好,遷移成本比較低,同時還能夠保證性能,如果是使用tensorflow等框架的用戶,也強烈建議感受一下imperative框架的魅力。

最後,希望dmlc的開發者們能夠好好去更新和維護Gluon,如果真的能夠將科研和工業界統一起來,那麼一定會有很多人來使用Gluon的。

已經有官方論壇了,論壇

歡迎查看我的知乎專欄,深度煉丹

歡迎訪問我的博客


推薦閱讀:

國內哪些公司在用caffe、torch、TensorFlow、paddle等框架,哪些在用自研框架?
為什麼強大的 MXNet 一直火不起來?

TAG:mxnet | 深度学习DeepLearning |