讓AI簡單且強大:深度學習引擎OneFlow技術實踐

本文內容節選自由msup主辦的第七屆TOP100summit,北京一流科技有限公司首席科學家袁進輝(老師木)分享的《讓AI簡單且強大:深度學習引擎OneFlow背後的技術實踐》實錄。git

北京一流科技有限公司將自動編排並行模式、靜態調度、流式執行等創新性技術相融合,構建成一套自動支持數據並行、模型並行及流水並行等多種模式的分佈式深度學習框架,下降了分佈式訓練門檻、極大的提升了硬件使用率。該框架已經成功幫助衆多頭部互聯網公司及人工智能企業提高了大模型訓練效率,節約了硬件運營和使用成本,達到了降本增效的效果。一流科技是一家爲企業客戶提供面向大規模大計算大模型等深度學習框架的人工智能領域科技創新公司。github

分享者袁進輝是北京一流科技有限公司創始人,任首席科學家。2008年7月在清華大學計算機系得到工學博士學位,得到清華大學優秀博士學位論文獎。2013年加入微軟亞洲研究院從事大規模機器學習平臺的研發工做。2014年發明了當時世界上最快的主題模型訓練算法和系統LightLDA,只用數十臺服務器便可完成之前數千臺服務器才能實現的大規模主題模型,該技術成功應用於微軟在線廣告系統,被當時主管研究的全球副總裁周以真稱爲「年度最好成果」。2015年至2016年末,專一於搭建基於異構集羣的深度學習平臺,項目榮獲微軟亞洲研究院院長特別獎 (top 1%)。2017年創立北京一流科技有限公司,致力於打造分佈式深度學習平臺的事實工業標準。面試

編者按:2018年11月30日-12月3日,第七屆全球軟件案例研究峯會在北京國家會議中心盛大開幕,現場解讀2018年「壹佰案例榜單」。本文爲北京一流科技有限公司首席科學家袁進輝(老師木)分享的《讓AI簡單且強大:深度學習引擎OneFlow背後的技術實踐》案例實錄。算法

提綱:編程

  • 研發OneFlow的動機
  • OneFlow技術突破
  • 總結

01研發OneFlow的動機服務器

軟件OneFlow簡介網絡

業界有人工智能浪潮的三駕馬車之說,即數據、算法、算力。具體到算力,業界更多關注的是硬件,譬如GPU,甚至是TPU之類的AI專用芯片。可是,人們發現,有了更快的加速器以後,制約大規模分佈式訓練算力的瓶頸是軟件。怎麼幫助數據科學家和研究員們更輕鬆的把各類算法在底層硬件上跑起來,並且充分釋放底層硬件的潛力,正是軟件框架須要解決的問題。目前,已有的開源深度學習框架對數據並行場景解決的比較好,但遇到模型愈來愈大的場景就沒有好辦法。用戶或者一籌莫展,或者只能付出極大成本基於開源框架作深度定製開發來知足需求。OneFlow團隊的目標是研發一個通用框架自動解決這些問題,讓那些沒有框架研發能力的團隊也可以享受分佈式GPU集羣帶來的效率,這是咱們歷時兩年多研發一套全新深度學習框架的初衷。架構

背後的動機:計算力是深度學習發展的最重要的推進力。框架

案例:2015 Microsoft Resnet機器學習

2016 Baidu Deep Speech 2

      2017 Google NMT

clipboard.png

2015年微軟研究院發明的ResNet須要的計算量是7乘以10的18次方次計算(ExaFlops)。固然,能夠推算一下用一顆24核的CPU來計算,大概須要多久能完成這些計算,也能夠推算用幾千個核心的GPU來算須要多長時間。多是須要幾個月或幾個星期的時間。除了計算量在增加,模型大小也在增加,ResNet 這種CNN模型一般是幾千萬參數,須要幾百兆字節的存儲空間,百度研發的Deep Speech模型到了三億參數的規模,而後Google的機器翻譯模型NMT,已經到了幾十億參數,整個模型在一塊GPU上已經放不下了。這種狀況,數據並行無濟於事,須要模型並行或流水並行來解決大模型的分佈式訓練問題。很不幸,目前尚未開源框架支持這些需求,一些大公司經過內部定製的系統來支持這種需求。

clipboard.png

今年上半年Facebook發佈了一個研究結果,收集35億張弱標註圖片,使用幾百塊GPU,通過接近一個月的時間,訓練了一個用於圖片分類的卷積神經網絡模型,它能作到什麼效果呢?能提升6個百分點的準確率。這是很是了不起的成績,算法基本上沒什麼變化,僅僅是經過採用更多的數據和計算就能把top-1的準確率提升了這麼多。要知道,對於一個商業價值很高的場景,提升0.5個百分點多是一個團隊一年的KPI。

clipboard.png

九月份Google發表了BigGAN模型,研究人員經過提升圖片的分辨率來訓練更大的GAN模型,CNN中間的activation和反向gradient會很是多,固然計算量也會大的很是多,基於TPU集羣來完成訓練。這個手段一樣得到了比之前的GAN模型好的多的效果。

clipboard.png

上個月,Google又發表了BERT模型,至關於一種大的多的transformer模型,在16個TPU上訓練了4天,而後基於這個語言模型做爲主幹網絡去解決各類常見的天然語言處理任務,發如今各任務上全面超越了之前的方法。很不幸,目前尚未出如今GPU集羣上從零開始訓練BERT-Large模型的辦法,若是想在本身的業務裏應用BERT,只能去下載Google預訓練好的模型,而後作少許微調來使用。這倒不是資源不足的問題,即便是已經搭建了大規模的GPU集羣的客戶也無能爲力,有錢也解決不了。

clipboard.png

深度學習通過這幾年的爆發式發展,特別引人注目的算法層面的創新愈來愈少了,今年比較吸引眼球的進步都來自於計算力,也就是人們常說的「大力出奇跡」的方式。怎麼才能讓更多的企業用戶能享受到算力提高的紅利,幫助算法科學家完成更多的KPI, 這是OneFlow很是關心的問題。常言道,工欲善其事必先利其器,框架在深度學習研究和落地的過程當中就扮演了「工具」的角色,好的工具能大大加速人工智能研發的效率,甚至可能成爲行業競爭的決勝法寶。從BigGAN和BERT等例子也能夠看出來,當一家公司掌握了其餘人不掌握的工具時,就能夠引領算法研究的潮流,反過來,當一家公司的基礎設施跟不上的時候,也就沒辦法作前沿探索,即便是作研究也只能跟在Google後面,所以稱深度學習框架是人工智能制高點的戰略武器一點不爲過。

基於純硬件的解決思路

clipboard.png

案例:Nvidia DGX-2

IBM Power9 Server

英偉達經過銷售GPU成爲這一波AI計算力紅利的最大受益者,英偉達除了把單個設備作的愈來愈快,也作了服務器架構方面的諸多創新,出品了一系列超級計算盒子,每一個盒子裏面能夠集成8個或者是16個計算力很是強的GPU(譬如DGX-1是P100,今年推出的DGX-2是V100),更特別的是,這些GPU之間使用了很是高速的互聯,可以實現GPU之間點對點150GB以上的傳輸帶寬,比常見的PCIe帶寬要高一個數量級。這種設計使得DGX服務器可以使得16塊GPU一塊兒工做時幾乎像一個單體芯片那樣輸出超強算力。

固然還有比DGX更特別的服務器,好比說IBM出的Power9 Server,它的獨特之處在於他的CPU使用了不一樣於Intel x86 CPU的架構,並且支持CPU和GPU之間NV Link互連,意味着CPU和GPU之間的數據傳輸也可以作到150GB以上的帶寬。目前世界排名第一的超級計算機Summit就使用了相似Power9 Server的架構。

基於這麼強的硬件就能解決計算力的問題嗎?

clipboard.png

IBM和Nvidia一塊兒搭建了世界上最強的超級計算機Summit,一共用了2萬多塊V100 GPU,還使用了最早進的互聯技術(NVLink, Infiniband),要說最強的硬件,除了TPU Cluster,應該沒有更好的了,這是否是就夠了呢?IBM首席科學家在今年的ASPLOS(計算機體系結構頂級會議)上作了一個特邀報告,主題是「只有很強的硬件,沒有很好的軟件仍是不能解決擴展問題」。如今國內擁有幾千塊GPU乃至上萬塊GPU的頭部公司不在少數,但基於開源框架能訓練BERT-Large模型嗎?不行,這也印證了軟件框架瓶頸的問題:購買了不少的硬件,但用不起來,或者說不能很好的用起來。

理念:縱向擴展與橫向擴展

縱向擴展

clipboard.png

縱向擴展是經過把單個設備或者是單個機器作的愈來愈強,或經過編譯器優化的手段讓做業在一個設備上或者是一個機器內部把硬件性能發揮到極致來知足如今日益增加的計算需求。硬件從多核架構CPU發展到衆核架構GPU,GPU從P100到V100, 爲了追求更高的效率,甚至研發FPGA或ASIC芯片來得到更高算力。當前最知名的AI芯片是Google的TPU,寒武紀,華爲,阿里,百度等本土公司也在研發AI芯片。AI芯片的主要問題是有物理限制(譬如製程,功耗,同步時鐘等等約束),人們不能生產出計算力任意大的芯片。也有人把這個現象稱爲硅基擴展瓶頸(Silicon Scaling)。除了提升單個芯片的吞吐率,英偉達的DGX也是縱向擴展的例子,DGX經過在一個機器內部高速互聯手段實現芯片之間點對點極高的傳輸帶寬,從而使得多芯片間協做起來更加高效。

橫向擴展

若是縱向擴展仍不能知足需求,人們繼續把多臺服務器經過高速以太網或Infiniband鏈接起來組成集羣來實現更高算力。若是能投入多少硬件資源,就獲得多少計算力,那計算力瓶頸就迎刃而解了。理想很豐滿,現實很骨感。一方面,芯片間互聯帶寬要比片內數據訪問帶寬低一到兩個數量級,在芯片間搬運數據成爲瓶頸,另外一方面,編寫在多芯片上高效運行的軟件很是挑戰,以深度學習爲例,神經網絡的結構不一樣,效率最高的並行方式(邏輯任務向物理計算單元的映射)也不一樣。在集羣上實現線性加速比縱向擴展更有想象空間,但實現難度更大。一個理想的橫向擴展方案,無論底層實際使用了多少鬆散耦合在一塊兒的芯片,在上層用戶眼裏就像在一個專門爲當前任務打造的巨大單體芯片同樣,編程簡單並且任務運行時能把底層每個獨立的芯片都利用充分。要實現這個目的,必須依靠軟件框架。

邏輯任務到物理拓撲之間的最優映射覆雜多變

clipboard.png

給定一個特定的神經網絡模型和一批計算資源,從任務到設備之間的映射有多種方式,但不一樣的映射方案運行效率不一樣。哪一種方案最優既取決於做業自己的特性,也取決於底層硬件的拓撲。神經網絡由不少局部計算(一般稱爲kernel)搭建組成,每個局部計算是採用數據並行,仍是模型並行取決於這個局部任務的計算傳輸比。如今業界討論比較多的卷積運算參數量很小,但中間結果量大,因此最划算的方法是對數據進行切分,不一樣的設備處理不一樣的數據,在設備之間偶爾進行參數同步,這種數據並行方法基本上是一個已經被解決的問題。還有一些運算,中間計算結果相對於參數量更少,就適合模型並行。還有一些網絡參數量很大或中間計算結果都很大,可能採用流水並行(也就是接力的形式)是最優的。模型並行和流水並行中通訊的數據路由要比數據並行複雜,同時,怎麼重疊計算和傳輸從而提升設備利用率也很是挑戰,現有開源框架對這些更復雜的並行模式的支持還比較初級。

通訊密集,延遲敏感

左圖展現了一個常見的大數據處理引擎的架構,集羣中的計算資源通常分紅用於中心調度的Master節點和用於處理數據的Worker節點。Master節點以有向無環圖(DAG)的方式管理整個做業的進度,同時監控全部Worker的資源使用情況,在合適的時機把一個子任務(Task)分配給某個Worker去作,某個Worker在完成一個子任務以後,會向Master節點彙報,等待Master分配新的任務。在傳統大數據處理中,Worker執行一個子任務的時間量級通常在幾十秒鐘或數分鐘。其它開銷,諸如發生在Master節點那裏的排隊開銷,Master和Worker之間對話的時間開銷,以及數據傳輸開銷都是數十毫秒,相對於Worker的工做時間能夠被忽略。可是深度學習訓練的負載與此不一樣,深度學習訓練更接近流式計算,一方面是由於隨機梯度降低算法採用的小批次訓練,計算粒度小,另外一方面是由於底層硬件吞吐率多是CPU的數十倍,計算太快。直接後果就是,數據處理時間愈來愈短,每一個子任務可能幾百毫秒就完成了,在這種狀況下,以前可忽略的那種幾十乃至幾百毫秒的開銷就很是顯著了,若是不能經過技術手段把這些開銷消除或掩蓋掉,整個系統的性能就很是低。

02OneFlow技術突破

基於靜態調度的流式計算引擎

爲了對任意做業和資源都達到相似巨大單體專用芯片的效果,OneFlow獨創了靜態調度(左圖)和流式執行(右圖)架構的深度學習框架。靜態調度是什麼思路呢?它來自於計算機體系結構。咱們熟知的CPU芯片中真正作算術運算的器件只佔很小比例的面積,大部分面積在作亂序執行,流水線和緩衝區的管理。學界和工業界好久之前就開始探索怎麼讓芯片的有效面積儘量多的作算術運算,靜態調度的思路應運而生,基本上是把流水管理,指令排布之類的工做從硬件轉移至編譯器。這樣硬件複雜度就能夠大幅下降,固然編譯器複雜度確定會提升不少。有一個叫VLIW(超長指令集架構)的指令集就採用了這種思路。OneFlow的靜態調度體如今兩方面,首先,編譯器自動解決從邏輯任務到硬件資源的映射,包括數據並行,模型並行,流水並行的設備分配以及數據路由方案,大大下降了分佈式編程的複雜度,用戶只須要關心任務的邏輯結構以及本次任務可以使用的硬件資源,而不用去編程實現數據在硬件資源中的流動機制;其次,靜態調度把全部能在正式運行以前獲得的調度策略,資源管理策略等問題都在編譯階段解決,運行時就不須要在線求解最優的調度方案,從而大大下降運行時開銷。

通過靜態編譯,每一個設備負責運行的子任務是預先可知的,每一個子任務的上下游依賴也預先可知,在運行任務時,就再也不須要中心調度器,只須要支持上下游任務之間局部的握手信號便可,即生產者向消費者發送的請求以及消費者向生產者發送的確認,整個系統以全鏈路異步的方式運行。這個思路也來自於芯片設計領域一種叫異步電路的技術。OneFlow另外一個區別於其它深度學習框架的特點是把數據搬運當作一等公民,在靜態分析階段就把磁盤IO,主存和設備之間數據搬運,節點間數據搬運看做和計算同等重要的任務,在代價分析和調度策略裏做爲一等公民進行顯式建模,從而獲得重疊傳輸和計算的最優方案。與此相對,已有開源框架把數據搬運當成二等公民處理,編譯期的注意力主要集中在計算的優化上。熟悉軟件定義網絡(SDN)技術的朋友能夠發現,OneFlow編譯器至關於網絡的控制平面,用於獲取數據計算和轉發策略,運行時至關於網絡的數據平面,執行體依照控制層面的策略去轉發和處理數據。

產品對比

clipboard.png

clipboard.png

clipboard.png

OneFlow歷經兩年的研發,2018年10月份才推出1.0版本,仍是一個很年輕的系統,目前正在客戶的生產環境裏面試用和迭代。實事求是的講,咱們在模型的豐富程度,易用性,多語言支持等方面還有比較大的提高空間,目前是落後於其它框架的。可是,OneFlow在企業級大規模應用上是稱得上遙遙領先的:(1)分佈式最容易使用,用戶在寫程序的時候是感覺不到多機和單機的區別的;(2)OneFlow支持數據並行,模型並行和流水並行,而其它框架只支持最容易支持的數據並行;(3)OneFlow在分佈式訓練時的擴展能力,加速比是最優秀的。這些特色也正是OneFlow做爲企業級深度學習框架,比已有開源深度學習框架優秀之處。

人有我優,用數據並行加速CNN訓練

clipboard.png

clipboard.png

卷積神經網絡(CNN)做爲最容易解決的一個問題,是你們最喜歡拿來作基準測試的應用。在過去一年,不少公司用數據並行方法,已經能夠用數千塊GPU作到幾分鐘就在ImageNet數據集上訓練好ResNet模型。若是發現TensorFlow的參數服務器不給力,上層使用Horovod,底層使用Nvidia NCCL已經能夠作到很漂亮的結果。須要注意的是,之前社區有一個認識是TensorFlow並行作的很差,速度比其它框架慢,實際上今天已經不是這樣了,TensorFlow團隊的benchmark項目(https://github.com/tensorflow...)針對CNN作了不少優化,作數據並行已是開源框架裏最優秀之一了。咱們使用徹底同樣的算法和硬件(V100 GPU, 100Gbps RDMA網絡),和TensorFlow benchmark對比會發現,不管是基於單機多卡,仍是多機多卡都是比TensorFlow快。上圖左邊是OneFlow,右邊是TensorFlow,除了AlexNet遇到硬件瓶頸,OneFlow都能作到線性加速,TensorFlow在單機多卡和多機多卡上與OneFlow仍是有必定的差距。

clipboard.png

阿姆達爾定律

上面的評測結果中,在32卡時,OneFlow還是線性加速,當卡數增長到必定程度,譬如幾百或者是上千時早晚會遇到天花板。並行效率不一樣的系統,只是遇到天花板時間遲早的問題,這是阿姆達爾定律所揭示的規律。好比說上圖綠色曲線表示一個並行度(parallel portion)爲95%的任務,何時遇到天花板呢?能夠計算出來,加速到20倍的時候就到了天花板了,後面投入再多的資源進去它也不可能再加速了。假設系統的並行度不隨卡數變化,在卡數少時,大部分系統仍是比較接近線性的,各個系統之間差異很小,但當卡數增多時,系統早晚會遇到天花板,即便增長再多的GPU也不會進一步提高吞吐率。這代表,在卡數比較少時實現線性加速比不必定能在卡不少時還能實現線性加速,但在卡數較少時就實現不了線性加速,在卡數更多時確定距離線性加速更遠。因而可知,把系統的運行時開銷優化到極致,對於大規模集羣訓練效率是相當重要的。

人無我有,分佈式訓練BERT-Large模型

clipboard.png

BERT-Large是谷歌最近推出的一個學習語言模型的大型神經網絡,基本上在常見的天然語言處理任務上都顯著超越了之前的方法。BERT-large有24層,整個模型大概1.3G,每一層中間結果都蠻大的,若是不作內存優化,對於32GB顯存的V100,一次也就處理八九個句子。雖然BERT是個大殺器,但客戶想基於本身語料從新訓練一個BERT-Large模型,卻不可能。谷歌在TPU Cluster上用16個TPU訓練BERT-Large須要4天時間。沒有TPU的用戶,只能使用GPU,最主要的是,如今尚未開源的分佈式解決方案,谷歌放出來TensorFlow代碼只支持單GPU卡,若是用戶作一些定製去支持分佈式,很遺憾,加速比也很不理想。如左上角圖所示,即便是在有NVLink互聯的單機八卡服務器上,TensorFlow也只能實現四五倍的加速,按這種加速比去推算一下,即便是使用幾十塊V100也是須要一個月以上的時間。在Google BERT論文發表後不久,咱們團隊就基於OneFlow實現了和TensorFlow準確率同樣的BERT,在單機八卡服務器上數據並行接近線性加速,在8機64卡的配置下,也能跑到50倍以上的加速比。這還不是線性加速比,咱們正在作一些優化工做,不久之後對於BERT-Large在多機多卡也能實現線性加速比。OneFlow如今的實如今單精度條件下只須要8天就能訓練出來BERT-Large模型,若是加上半精度支持,時間會再縮短一半,只須要三四天。須要指出的是,Google BERT的詞典只有4萬個單詞,當詞表達到幾十萬或上百萬級別時,embedding層就沒法用數據並行計算了,必須作模型並行,然後續的層次能夠繼續使用數據並行,也就是混合並行,OneFlow能夠很方便的支持起來。最近,咱們已經開始爲幾家頭部互聯網公司提供BERT訓練服務,在客戶本身的數據集上訓練BERT-Large模型。

clipboard.png

以訓練安防領域的大規模人臉識別模型爲例,當人臉類別達到百萬級時,最後的全鏈接層必須使用模型並行,要解決這個問題,用戶就不得不深度hack 已有開源框架,此時會面臨易用性和高效性的難題。詞嵌入和廣告/推薦系統領域也存在許多大模型的問題,模型容量可達幾十GB甚至幾百GB乃至TB,也只有少數頭部企業不計研發成本才能作一些定製開發來支持這些需求。OneFlow 能夠很方便高效的支持這些需求,大大節省用戶成本,幫助用戶完成之前搞不定的事情。

05總結

一路走來,咱們深切體會了do right things, do things right 如此重要。在諸多方向裏,咱們通過反覆論證,認爲這個領域最關鍵也最難的問題是橫向擴展,從公司成立之初,就立下解決這個業界公認難題的目標。不一樣於其它框架的技術路線,OneFlow以軟硬協同設計爲指導思想,從芯片設計領域借鑑了大量有益的思路,在純軟件層面解決了橫向擴展難題。咱們深信如今OneFlow的技術路線是解決深度學習橫向擴展難題的必由之路,在咱們走通這條路徑以後,很高興看到技術社區其它團隊已經開始沿着這個方向進發。創新和創造是OneFlow決勝的法寶,僅僅follow已有框架走過的路是不可能實現超越的,惟有創新纔有機會。最後,咱們深感真正有價值的事都是長跑,除了技術因素,情懷和堅持也必不可少,seeing is believing, believing is seeing。

以上內容來自袁進輝(老師木)老師的分享。

相關文章
相關標籤/搜索