近日,亞馬遜技術長 Werner Vogels 在一篇部落格上宣佈,亞馬遜選擇 MXNet 作為該公司最主要的深度學習框架;他還宣佈 AWS 將會為 MXNet 和該公司所支援的生態系統的開發提供軟體程式碼、文件和投資。這一訊息對深度學習領域和 MXNet 社群來說都無疑是重大利好的。看起來知乎上「為什麼強大的 MXNet 一直火不起來?」的問題現在終於可以終止了,相信在亞馬遜這樣的巨頭的支援下,MXNet 還將迎來更大的發展並被更多的實踐者應用。
MXNet 的前世今生
MXNet 起源於三個不同的開源專案,分別是由在美國的陳天奇,在加拿大的許冰和在香港的王乃巖牽頭的 cxxnet,上海張錚老師及其學生牽頭的 Minerva,以及在新加坡的 Min Lin 牽頭的 purine2 。
2014 年 NIPS 上,同為上海交大校友的陳天奇與李沐碰頭,討論到各個在做深度學習 Toolkits 的專案組,發現大家普遍在進行很多重複性的工作,例如檔案 loading 等。於是他們決定組建 DMLC(Distributied (Deep) Machine Learning Community),號召大家一起合作開發 MXNet,分別發揮各自的特長,避免 reinvent the wheel。
據張錚老師回憶,早期 MXNet 的核心成員在十人左右,卻曾同時分佈在多達六個時區。其中張錚老師指導的 Minerva 團隊主要負責後端引擎,陳天奇進行介面設計,李沐負責分散式。
在打造 MXNet 的過程中,團隊成員在設計上進行了十分細緻的思考和討論。MXNet 使用 Mixture 設計,融合了其他一些主流框架的優點,例如其像 Tensor Flow 一樣的 符號式程式設計(symbolic),和 Torch 一樣的 指令式程式設計(imperative);為了方便開發者使用,MXNet 支援多種語言介面,同時在底層預步了對 Caffe 和 Torch 等運算模組的相容等等;在記憶體使用方面,MXNet 大膽使用了不同於一般的系統記憶體優化的設計,並取得了很好的效果。
經過一年的努力,MXNet 現身 2015 年 NIPS 的機器學習系統 Workshop。點選「閱讀原文」檢視相關論文。
2016 年,越來越多的開源貢獻者參與到了開發及維護 MXNet 的工作中,對 MXNet 進行了大量的擴充套件、優化和修復工作。其中包括後期加入 DMLC,並逐漸成為核心成員,負責 rtc 和 torch 的解浚源(Eric),扛下 RNN 部分的 Chiyuan 和張宇,負責 R 介面的 Qiang Kou,Scala 介面的 Yizhi Liu,以及施新建等。截止到 2016 年 11 月中旬,MXNet 專案擁有超過兩百名貢獻者。
亞馬遜背書的開源深度學習框架
在昨天亞馬遜的表態之後,機器之心第一時間聯絡了 MXNet 專案的主要貢獻者之一解浚源(Eric),請他談論了一些對於這一訊息和 MXNet 發展情況的一些見解。
以下是機器之心對解浚源的專訪內容整理(部分回答引用自知乎):
1)亞馬遜選擇 MXNet 作為其最主要的深度學習框架,這對於你們雙方而言意味著什麼?這件事是從什麼時候開始計劃的?
該問題的答案引用自知乎:https://www.zhihu.com/question/52906838/answer/132582817
Eric:MXNet 發展到現在有一年多了,已經是一個相對成熟的專案。我對我們的技術很有信心。MXNet 的速度,節省記憶體,介面靈活性,和分散式效率都是可圈可點的。作為一個由愛好者發起,沒有投資的專案,MXNet 以前最大的短板是文件和宣傳。而 Amazon 作為大財主以後在這方面可以起到很好的作用。
實際上 Amazon 對 MXNet 的支援已經有一段時間了,在 Github 上提交了很多文件方面的改進。細心的同學可能已經發現最近網站變好看了,拼寫錯誤也少了很多(MXNet Documents),花錢請的前端和文案就是不一樣。總體來說 Amazon 對開源社群很友好,除了對文件和穩定性的要求嚴格了一些並沒有干涉我們的開發。Code Review 還是我們自己在做,是否接收程式碼也是社群決定的。
在 Amazon 之前已經有很多公司在默默的用 MXNet 了,只是沒有大肆宣傳。比如圖森、地平線、搞 Mathematica 的 Wolfram 都給 MXNet 貢獻了很多程式碼。
我對 MXNet 的前景很樂觀,歡迎大家試用,也歡迎貢獻程式碼,眾人拾柴火焰高嘛,不知道從哪裡下手的同學幫忙完善一下文件也是好的。有意全職做 MXNet 相關工作的可以聯絡我們,我們可以幫忙介紹美國 Amazon 以及北京、深圳各大機器學習 Startup 的工作:)
P.S. 這篇文章裡關於分散式效率的細節比較少,GPU 也是 K80,比較老。但是我以節操擔保線性加速的結果是靠譜的。我們自己在 Titan X 上用 resnet 也能跑出類似的效果。大家可以來試試。
2)在今後的發展中,你怎麼看待和 Caffe、CNTK、TensorFlow 以及 Torch 的競爭?
Eric: Caffe 有輝煌的歷史,但是隨著深度學習模型發展的越來越複雜,對靈活性要求越來越高,已經很難適應需求了。yangqing 吸取了 Caffe 的經驗教訓,已經開始在 Facebook 內部搞 Caffe2 了。Caffe 的使用者應該會在未來 1 到 2 年內遷移到其它平臺;
CNTK 目前熱度不高,但是微軟在持續投入,最近剛加入了 Python 前端,未來怎麼樣還不好說。
值得一提的是微軟的 Azure 團隊最近發了若干篇在 Windows 上用 MXNet 和 R 做深度學習的 blog。個人認為是因為 MXNet 對 Windows 和 R 都有完善的支援,用 Windows 的統計學家是微軟的重要客戶群。
剩下的平臺都有各自的特色,我認為未來會共存很長時間,很難實現一款平臺統一所有市場
Torch 比較像一個免費且原生支援 GPU 的 Matlab,在學術圈習慣 Matlab 或者不用 Python 的人群中很受歡迎。Torch 的封裝少,簡單直接,前期學習和開發時的思維難度都比較低。但是由於封裝少和 Lua 本身的限制,工程性不好、容易亂寫、程式碼可複用性差,導致 Torch 不適合做大專案的開發。
TensorFlow 希望做一個大而全的機器學習框架,而不只滿足於深度學習。我認為 TF 會沿著替代 sk-learn 的方向發展,會比較適合快速實現標準演算法。但是大而全的負面因素就是程式碼量大、抽象層數多、程式碼冗餘,對效能和可定製性都會帶來負面影響。可能並不適合需要深度定製、對效能敏感的企業和做前沿研究的 research。
MXNet 的方向是小而精、靈活高效。我們希望把核心深度學習的做到極致。MXNet 的程式碼量小,容易深度定製,同時支援 imperative(類似 Torch)和 declarative(類似 TF)兩種 API,所以更靈活。另外 MXNet 的單機和分散式效能都是很好的。缺點是相對於 Torch 學習難度會大一些,另外以前沒有資金支援,文件和宣傳做的比較差。但是有了 Amazon 的支援,相信在這些方面會有大幅改善。
3)可否為大家講解一下 MXNet 是如何達到拔群的 scaling efficiency 的?
Eric:MXNet 的並行化部分用了李沐的 pslite 進行通訊,基於 zeromq,效率很高。另外 MXNet 基於依賴引擎(Dependency Engine)排程,每一層的梯度計算完畢後馬上就可以開始傳輸,實現最優的 communication and computation overlapping。
4)可以介紹一些基於 MXNet 的有趣應用嗎?
Eric: MXNet 有 Fast/Faster RCNN 和 SSD 的實現樣例,另外還有一個用 DQN 玩 Flappy Bird 的例子,比較有趣:
Fast/Faster RCNN 案例:https://github.com/dmlc/mxnet/tree/master/example/rcnn
SSD案例:https://github.com/dmlc/mxnet/tree/master/example/ssd
DQN-Flappy Bird案例:https://github.com/li-haoran/DRL-FlappyBird
5)MXNet 開源社群現在發展狀況如何?說點什麼呼籲人們參與到 MXNet 的開發和應用中來?
Eric: MXNet 的社群很活躍,我們已經有超過 200 個 contributor,包括很多公司的員工,以及學生和愛好者。MXNet 需要提升的主要是文件和教程。另外陳天奇正在研究執行時編譯(RTC),不久後會釋出,可以帶來進一步的效能提升。近期我們會發布 0.9 版本,完成了後端到 nnvm 的遷移,以及很多新的 feature,比如一個用來除錯效能的 profiler。