王敏捷 ACM'07
紐約大學博士,亞馬遜上海研究院應用科學家
內容概覽 介紹了深度學習框架發展的三個時期:工具包時代(2014年前)、數據流時期(2014-2018)、新時代(2019年後)。強調了深度學習框架的重要性與推動因素,介紹了3位ACM人李沐、陳天奇和他一起將各自的技術Parameter Server、CXXNet、Minerva融合併創造了新的深度學習框架MXNet。敏捷學長也指出了在深度學習新時代,隨著可微分編程、圖神經網絡等新領域的出現以及專用晶片的發展,深度學習框架會迎來更多機遇與挑戰。
深度學習的浪潮其實到現在僅僅發展了十幾年的時間。深度學習的火熱到底是什麼在驅動?
原因主要來自於三個方面:
(1)首先是規模很大的數據。俗話說巧婦難為無米之炊,大數據使得我們在訓練神經網絡的過程中有充分的資源可以利用;
(2)其次,算法也是非常非常重要的突破。比如說卷積神經網絡、residual network、注意力機制這些算法的興起,也是促成深度學習浪潮的重要因素。
(3)最後是算力。算力主要體現在兩個方面:軟體和硬體,其中軟體對應的就是今天要講的深度學習框架。
對於做人工智慧方面的研究或者工業界的人士,或多或少都用過深度學習框架。在過去的幾十年裡,有很多深度學習框架被提出,被使用,但最後銷聲匿跡。我們需要去了解一代又一代的深度學習框架被提出的原因,框架之間的關係及其演變的歷史,也就是今天的主題:深度學習框架這十年。
講深度學習框架之前,可以先了解一下什麼是Rube Goldberg’s Machine。這是一個在美國高中的科創文化中非常流行的概念。它的目的是設計一個複雜、可能有很多機關技巧的機器,但完成的卻是一個非常簡單的工作。比如去年Rube Goldberg’s Machine比賽的題目是設計一個能把一枚硬幣放到儲蓄罐裡的機器。另一個例子是self operating napkin,一個自動遞紙巾的機器。這個機器的工作非常簡單,但是流程卻非常複雜,比如客人把手放下,就要觸發各個機關,最後把紙巾遞到面前。
要理解一個複雜的system,最簡單的方式是看system的上遊和下遊,比如上述的機器,雖然流程很複雜,但觸發條件就是客人放下手,下遊就是把紙巾送嘴邊。
深度學習系統也是類似的思維。對於深度學習框架來說,系統上遊是各種神經網絡模型,系統的下遊是各類硬體,例如GPU、CPU等。理解了上下遊後,深度學習系統的邊界和目的就變得簡單而清晰了。深度學習框架就是使用最精簡的設計,靈活地支持各類神經網絡,並且不同硬體條件下,也能讓神經網絡高效執行。
Rube Goldberg’s Machine和深度學習框架兩者的區別在於:Rube Goldberg’s Machine將模型複雜化,而深度學習框架的目的是用最精簡的方完成任務。The simple is the better。從這個角度上,我們可以把十幾年間湧現的大量深度學習框架劃分為三個時代,分別是:工具包時代、數據流時代和新時代。
工具包時代是接觸神經網絡較早的時期,一般指2014年前,代表性的框架有Cuda-ConvNet2和Caffe。
這個時代的特點是計算機視覺領域的井噴。起源於07年的第一篇深度學習網絡論文在mnist數據集上得到了很好的效果,12年AlexNet誕生也鼓勵了深度學習的浪潮。在這個階段,卷積神經網絡是很多工具包關注的要點。Cuda-ConvNet2或Caffe定義模型的方式也因此是以寫configuration為主,和現在的框架有很大的區別。例如用Caffe寫AlexNet時,要定義 layer和它的name、type、input_param等參數。這樣設計的原因就是卷積神經網絡是深度學習系統上遊的主流,那個時代對這方面的研究也非常火熱。這些框架的interface是完全可以滿足需求的,因為當時的研究只是把不同的卷積層拼接,從而了解不同的神經網絡結構的效果。
工具包時代的系統設計非常簡單。
在用戶層,它僅僅是模型配置文件,在硬體層,系統通過手寫GPU和CPU的神經網絡算子來解決硬體問題,例如Cuda能明顯實現神經網絡加速。
隨著網絡和硬體的發展,個人作為單獨的團隊來編寫神經網絡算子變得困難,所以大廠商,包括英偉達、英特爾,會開發專門針對神經網絡的算子庫,比如說CuDNN和MKLDNN,這些算子在現在的神經網絡系統框架 中依然常用。
這就是工具包時代的Cuda-ConvNet2和Caffe成功的原因。
工具包時代的框架也存在一些缺點。
首先是模型配置文件非常不靈活,很難表達複雜的模型例如RNN,雖然對於計算機視覺的網絡處理比較方便,但是對於變長的數據,例如文本的支持並不理想。
其次,它並不是非常靈活的程式語言,隨著深度學習網絡可學習參數的增多,它難以利用多機和多GPU訓練,因為配置文件很難去表達如何在多機和多GPU的環境下訓練,同時算子庫也無法解決運行時的問題。
最後,隨著模型複雜化,工具包對新出現的算子的支持也非常有限。
在這個時代如何去解決框架的問題是值得思考的。
2014年在Denver,我、李沐和陳天奇三位ACM班的學生在OSDI開會。李沐實現的是 parameter server,他的專業領域在於多機分布式訓練。陳天奇的項目是CXXNet,包含了高效而豐富的算子庫。我的項目是Minerva,核心思想是使用數據流的引擎,令多GPU的訓練加速。我們共同的思想是如何設計更好的深度學習系統,同時我們的項目和專業領域正好互補。於是我們的MXNet應運而生。
接下來的一段時間(2014-2018年),就是數據流時期框架的爆發。主流的框架有MXNet、TensorFlow、PyTorch、Chainer、Caffe2。
隨著深度學習的領域的不斷發展,NLP也進入井噴階段,這是這些框架出現的一大誘因。同時隨著數據的增加,對並行的需求也隨之上升,因此在數據流時期,很多模型如ResNet在ImageNet上訓練只需要一小時,通過在大量機器上並行,甚至在分鐘、秒的量級上可以完成。這都得益於數據流的概念和數據流天然具有的並行性。
數據流時代的模型和工具包時代的區別就是在用戶層和硬體層中間加了一層中間表達:數據流圖。系統分為前端和後端,前端只關注用戶使用方面的問題,而後端負責系統優化。
第二個區別是,前端也放棄模型配置文件了,Python成為了整個深度學習框架的一個標杆,通過Python提供張量運算的接口。隨著Pytorch為典型的用戶友好的框架的出現,NN模型庫,包括動態自動求導成為了整個深度學習框架的標配。後端也逐漸把專用的算子替代成更豐富的張量算子庫,同時增加了參數伺服器,使得整個系統能夠在多機多GPU的環境下訓練。
數據流時代其實就是新時代的開端。雖然通用深度學習框架的設計趨向於穩定,但是新的概念,新的模型不斷湧現,讓系統的設計也有新的一些挑戰。
第一個概念是可微分編程。這是近兩年提出的一個廣大的思路概念。在編寫模型時,程序本身是可微分編程的,很多系統設計的工作在往這個方向邁進。第二點是新領域的出現,例如圖神經網絡,圖神經網絡可以處理原本難以解決的數據,比如知識圖譜,製藥中分子的生物圖,新領域出現,也對系統產生了新的挑戰。第三個概念是AI-chip,神經網絡專用晶片。這是深度學習發展的大趨勢,也是系統無可避免的問題。
在2019年後,系統的趨勢有了明顯的變化。
首先是前端垂直化。開發過程中,不再以通用系統為目標,而是基於通用系統開發面向垂直領域的工具,包括計算機視覺,自然語言處理,圖領域等領域,DGL、AutoGluon、Captum等垂直領域的工具包。
其次,新概念也在慢慢滲透到系統設計中。對於Python,很多人提出Python並不是很好的選擇,也有很多的工作來優化對應的語言的編譯。對於數據流圖,它並不是一種非常強大的程式語言。而實現可微分編程需要更強大的中間表達比如Relay、MLIR。對於張量算子庫,AI chip的出現讓張量算子編譯器應運而生,其代表作有TVM,TC等工作。
深度學習框架雖然非常年輕,但已經經歷了多輪的演變,而每一輪的演變都是由於算法和硬體的新趨勢帶來的新的挑戰。
2019年之後,新挑戰不斷湧現,對於有志於投身這個領域的同學是非常好的時機。我們ACM班人在深度學習框架演變中也起到了非常重要的推動作用,很多的學長學姐在各個領域有非常好的成就,在研究過程中,如果能和同學或者學長產生一些思維的火花,不要猶豫,可能你們要做的工作也能在歷史中留下印記。「乾貨學習,點贊三連↓