MinPy:劍氣雙修的武功秘籍
機器之心發布
作者:王敏捷
MinPy基於MXNet引擎,提供NumPy的介面,以達到最靈活的編程能力和最高效的計算性能。
現在的深度學習系統就像五嶽劍派,各大門派,互有所長,互有所短。不過從編程角度看,不外乎有「氣宗」與「劍宗」之分。
深度學習的「劍」「氣」之爭
氣宗講究內家功夫,講究「以氣御劍」。外在形式並不重要,重要的是內在性能。在性能為王的如今,這也是很多門派所採納的理念。遠如五嶽鼻祖之一的 Theano,近如目前的五嶽盟主 Tensorflow,都採用符號式編程 (Symbolic Programming) 的模型。其核心思想是讓用戶通過編寫符號來描述演算法,演算法描述完畢後再進行執行。由於深度學習演算法往往是需要反覆迭代的,系統可以靜態地對演算法進行優化,從而獲得更好的執行性能。正所謂,「真氣所至,草木皆是利劍」。只要系統提供的符號足夠表達演算法,用戶就可以獲得不錯的性能。其問題也正在此。其一,符號式編程並不能涵蓋所有的演算法邏輯,特別是應對控制型邏輯(control dependency)顯得笨拙。其二,由於需要掌握一門新的符號語言,對於新手的上手難度比較高。其三,由於有演算法描述和執行兩個階段,如果演算法邏輯和實際執行的值相關,符號式編程將比較難以處理。
相對來說,命令式編程(Imperative Programming)則更像劍宗。劍宗注重招式的靈活與變化。遠如當年劍宗第一高手 NumPy,近如貴為五嶽之一的 Torch 都是採用命令式編程的介面。他和符號式編程最大的不同在於,命令式編程並沒有描述演算法和執行兩個階段,因此用戶可以在執行完一個語句後,直接使用該語句的結果。這對於深度學習演算法的調試和可視化等都是非常重要的特性。命令式編程的缺點在於,由於演算法是一邊執行一邊描述的,因此對演算法的優化是一個挑戰。
究竟是「以劍御氣」還是「以氣御劍」?其實兩者應該相輔相成。如果你空有一身內力卻無一丁點劍招,就會像是剛得到逍遙子畢生內力的虛竹,想到巧妙複雜的深度學習模型只能幹瞪眼卻無法實現。如果你空有華麗招式而不精進內力,別人以拙破巧,你優美的模型只會被別人用簡單粗暴的高性能,大模型和大數據給擊倒。正因如此,五嶽新貴 MXNet 同時支持符號式和命令式編程介面。用戶可以選擇在性能優先的部分使用符號式編程,而在其餘部分使用靈活性更高的命令式編程。不過這種分而治之的方式給用戶帶來了額外的選擇負擔,並沒有將兩者融匯貫通。因此,我們進一步基於 MXNet,開發了 MinPy,希望將這兩者取長補短——使用命令式編程的介面,獲得符號式編程的性能。
MinPy 的劍宗招式
在編程介面上,MinPy 繼承了劍宗第一高手 NumPy 老先生的精髓。正所謂「無招勝有招」。沒有特殊語法的語法才是好語法。於是在使用 MinPy 時,你只需要簡單改寫一句 import 語句:
importminpy.numpyasnp
就能夠開始使用 MinPy 了。由於是完全的命令式編程的介面,編程的靈活性被大大提高。我們來看以下兩個例子。
例 1: 調試和列印變數值
在 Tensorflow 中,如果需要列印某個變數,需要在列印語句前加上 control_dependencies。因為如果沒有這條語句,Print 這個運算並不會出現在所需要求的 x 變數的依賴路徑上,因此不會被執行。而在 MinPy 中,我們保持了和 NumPy 一樣的風格,因此可以直接使用 Python 原生的 print 語句。
例 2: 數據依賴的分支語句
數據依賴的分支語句是符號編程的另一個難點。比如在 Tensorflow 中,每個 branch 是一個 lambda,而並非直接運算。其原因在於符號編程將演算法描述和實際執行分為兩個部分,在沒有算出來 x 和 y 的值之前,是無法知道究竟會取哪個分支的。因此,用戶需要將分支的描述寫成 lambda,以便在能在運行時再展開。這些語法雖然細微,但是仍然會對初學者帶來負擔。相對的,在 MinPy 中,由於採用命令式編程的介面,所以一切原生的 if 語句都可以使用。除了以上這些編程方面的區別外,MinPy 還提供了以下功能。
招式一:動態自動求導
符號編程的一個巨大優勢是能夠自動求導。這原本是命令式編程的弱項,原因在上面的例子中也有所體現。由於命令式編程需要應對各類分支和循環結構,這讓自動求導變得比較複雜。MinPy 採納了一位西域奇人 Autograd 的招法來解決這一問題。方法也非常簡單:首先,用戶將需要求導的代碼定義在一個函數中,這樣通過分析函數參數和返回值我們就能知道自動求導的輸入和輸出;其次,MinPy 一邊執行一邊記錄下執行的路徑,在自動求導時只需要反向這一路徑即可。通過這一方法,MinPy 可以支持對於各類分支和循環結構的自動求導:
招式二:完整 NumPy 支持
MinPy 的目標是希望只修改 import 語句,就能將 NumPy 程序變成 MinPy 程序,從而能夠使用 GPU 進行加速。無奈 NumPy 老先生的招式博大精深,介面繁多,MinPy 作為後輩不能在短時間內支持所有的介面。因此,MinPy 採用了一套折中的策略。當用戶使用 np.func 的時候,MinPy 會檢測所調用的 func 是否已經有 GPU 支持。如果有,則直接調用,否則會使用 NumPy 原有的實現。同時,MinPy 會負責一切 CPU 和 GPU 之間的內存拷貝,完全做到用戶透明。
招式三:與符號式編程的銜接
儘管命令式編程能靈活地應對各種複雜的演算法邏輯,出於性能的考慮,我們仍然希望對某些運算(特別是卷積運算)能夠使用已有的符號執行的方式去描述。在 MinPy 中,我們也同樣支持 MXNet 的符號編程。其思想是讓用戶將符號「包裝」成一個函數進行調用。
在上面這個例子中,我們將一個 Convolution 的符號包裝成了一個函數。之後該函數可以像普通函數一樣被反覆調用。其中有一點需要注意的是,由於符號編程需要在執行前確定所有輸入矩陣的大小,因此在上面例子中的 x 的大小不能任意改變。
MinPy 的氣宗修為
如之前所說,光有招式沒有內功修為是沒有辦法成為令狐沖的,最多也就是個成不憂。命令式編程的挑戰就在於如何優化演算法使得性能能和符號式編程程序相較。以下我們比較了 MinPy 和使用 MXNet 符號編程的性能區別。
在上面的例子中,我們測試了訓練50層MLP網路的性能。我們分別比較了MXNet符號編程,與MinPy命令式編程的運行時間。結果可以看到當網路計算量比較大時,MinPy的命令式編程和符號編程的性能幾乎相同。當計算量比較小時,命令式編程有明顯性能差距。但如果在MinPy中使用符號編程則性能又和MXNet幾乎相同。類似的,我們測試了訓練RNN網路的性能。我們比較了MXNet的符號編程以及MinPy的命令式編程的性能區別。我們可以看到,在計算量比較大的情況下,命令式編程和符號式編程的性能比較接近。在小網路中,MinPy有一個固定的性能開銷。我們認為這一性能開銷主要來源於用於求導的動態路徑記錄,以及過細的計算粒度等問題。這些都是命令式編程所帶來的性能挑戰,也是MinPy今後的努力方向。
面向武林新人的武功寶典
對於想要加入五嶽劍派的新人們,MinPy 也是一個非常適合的上手工具。原因之一是因為 MinPy 和 NumPy 完全兼容,幾乎沒有額外修改的語法。另一個原因是我們團隊還提供了完整的 MinPy 版本的 CS231n 課程代碼。CS231n 是斯坦福大學著名教授 Fei-Fei Li 和她的愛徒 Andrej Karpathy、Justin Johnson 講授的一門深度學習入門課程。該課程完整覆蓋各類深度學習基本知識,包括卷積神經網路和遞歸神經網路。該課程的作業並不僅僅是對這些知識點的簡單堆砌,更是包含了很多最新的實際應用。由於 MinPy 和 NumPy 天生的界面相似性,我們團隊改進了 CS231n,使得學生能夠更好地體驗如何在實際中訓練和使用深度神經網路,也讓學生能夠體會到 MinPy 在實際研究環境下的便利性。基於 MinPy 的 CS231n 課件已經在上海科技大學和交通大學深度學習教程中被試用。
總結
團隊從早期的 Minerva 項目開始,加入 MXNet 團隊,陸續貢獻了執行引擎、IO、Caffe 兼容 Op 等核心代碼。MinPy 是我們回歸用戶界面,對純命令式編程下的一次嘗試。我們希望將最靈活的介面呈現給用戶,而將最複雜的系統優化交給我們。MinPy 擁有和 NumPy 完全一致的介面,支持任意分支與循環的自動求導,以及良好的性能。MinPy 將進一步優化其性能,並即將成為 MXNet 項目的一部分。
鏈接
Github 地址:https://github.com/dmlc/minpy
MinPy 文檔地址:http://minpy.readthedocs.io/en/latest/
鳴謝
MXNet 開發社區
上海科技大學馬毅教授、博士後周旭;上海交通大學俞凱教授、張偉楠老師
上海紐約大學博士生 Sean Welleck,本科生蓋宇,李牧非
MinPy 劍客名單
*:MinPy 工作在 NYU Shanghai intern 期間完成。
本文為機器之心發布,轉載請聯繫本公眾號獲得授權。
------------------------------------------------
※哈佛大學提出「片上多區域大腦」:建模大腦不同區域之間的連接
※百度宣布原微軟高管陸奇加盟,任總裁兼COO
※小度戰平人類最強大腦後,我們和吳恩達聊了聊
※有了這款工具,任何人都可以開發量子計算軟體了
※專訪微軟小冰負責人李笛:智能助手是創造需求,而非僅提高效率
TAG:機器之心 |
※CESA獨門Midterm秘籍
※技術為先!三星Galaxy S系列成功秘籍
※今天翻什麼:Desi Perkins的旅行護膚秘籍
※StyleTV时装周播报|CHANEL、Hermès告诉你巴黎女人的时髦秘籍
※太空戰士 Final Fantasy :【秘籍】FFT 發獃練功法
※第一個CRUD的製作方法(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)
※中國第一IFBB Pro吳龍的虐胸秘籍,快來get√
※印第安泉中學 Indian Springs School申請秘籍
※日本女孩素顏肌膚完美修鍊秘籍#東京女孩TokyoGirls
※揭秘 新晉辣媽Angelababy孕後健康瘦身秘籍
※Hotchkiss School霍奇科斯學校申請秘籍
※肯特學校Kent School申請秘籍
※心機girl的撩男秘籍
※G?潮 看看「最會穿的華人」Eugene Tong 的穿搭秘籍!
※揭秘Angelababy瘦身秘籍 原來這就是女神的秘密!
※《cs:source》兩個小秘籍
※G?潮? 看看「最會穿的華人」Eugene Tong 的穿搭秘籍!
※想提高男友衣品?看最會穿的華人Eugene Tong穿搭秘籍
※國慶新「肌」大戰!嫩白baby的美麗秘籍!