新一代深度學習框架研究前端
於璠算法
華爲技術有限公司,廣東 深圳 518000express
摘要:從人工智能的歷史出發,簡述深度學習發展歷程以及目前的挑戰,經過介紹新一代深度學習框架的特色,分析整體框架,闡述自動並行、自動微分、自動調優等技術優點以及協同昇騰處理器的性能優點,但願能夠爲深度學習技術研究人員提供參考。編程
關鍵詞:人工智能;機器學習 ; 深度學習 ; 計算框架 ; MindSpore後端
論文引用格式:性能優化
於璠.新一代深度學習框架研究[J].大數據, 2020, 6(4):69-80.網絡
YU F.Research on the next-generation deep learning framework[J].Big Data Research, 2020, 6(4):69-80.數據結構
1 引言
衆所周知,人工智能(artificial intelligence,AI)做爲影響普遍的顛覆性基礎技術,將對將來各行業的發展產生深遠影響。發展人工智能目前已上升到國家戰略層面,但人工智能的發展並不是一路順風。20世紀50年代,人工智能早期的發展極其緩慢,雖然在語音處理和問題求解等方面取得了不俗的表現,但仍存在很大的技術侷限性;以後人工智能經歷了兩輪寒冬,直到20世紀90年代中期,遵循摩爾定律,計算機的運算能力呈指數級增加,各類機器學習算法得以快速驗證、訓練和應用,從而引起了人工智能的復興。
1997年,IBM公司製造的深藍(DeepBlue)計算機系統打敗了當時的國際象棋世界冠軍卡斯帕羅夫,引發了社會各界對人工智能的高度關注,重燃了人們對人工智能的信心。自此,人工智能的新一波浪潮逐步席捲全球。在本輪人工智能浪潮中,最具價值也最具影響力的一項研究當屬深度學習理論。得益於大數據的不斷積累和計算機的飛速發展,海量數據解決了神經網絡訓練的過擬合問題,而高性能的硬件設備使模型訓練成爲可能。近年來,隨着深度學習研究的不斷深刻,人們目擊了谷歌AlphaGo成功擊敗人類世界圍棋冠軍以及包括無人車在內的各項智能技術的蓬勃發展,人們彷彿再一次看到了人工智能趕超人類的但願。總而言之,人工智能正在逐步改變人類的平常生活模式,並憑藉其驚人的效果和迅猛的發展勢頭,普遍融入各個行業的實際應用中。深度學習的研究和應用在近幾十年獲得了爆炸式的發展,而且已經在圖像識別、語音識別、機器翻譯以及遊戲等方面取得了巨大的成功。
爲了得到更好的性能,深度學習的網絡結構日益複雜,網絡深度和數據集也日益增大,這給深度學習的計算框架帶來了巨大的挑戰。但現有的AI計算框架很難兼顧性能和易用性,並且深度學習應用已經從雲側擴展到了邊緣和端側,這對AI計算框架提出了新的挑戰,如在保護用戶隱私的前提下,讓開發者可以實現AI應用在雲、邊緣和端側的快速部署,全場景互聯互通。所以,全場景的AI計算框架應知足如下3個要求:
● 實時訓練或推理;
● 每一個終端使用和訓練其私有模型;
● 訓練好的模型應能在多樣化的硬件平臺上運行。
爲了更清晰地認識業界現有的計算框架,從易開發、高效執行和全場景3個角度對國外的TensorFlow、PyTorch、MXNet以及國內的PaddlePaddle進行了比較,見表1。
其中,易開發表現爲API友好、調試難度低以及額外的自動化屬性。高效執行包括計算效率、數據預處理效率和分佈式訓練效率。全場景指框架同時支持雲、邊緣以及端側場景。能夠看出,這些訓練框架仍然不能知足以前提出的3個要求。所以,須要開發一個覆蓋全部場景的深度學習框架,知足實時、專用、多樣化的需求。本文詳細闡述了筆者團隊自研的新一代深度學習框架(MindScope)的架構、技術開發思路、性能優點。架構
2 MindSpore的整體框架
MindSpore是華爲技術有限公司推出的新一代深度學習框架,其整體框架分爲前端表示層(mind expression,ME)、計算圖引擎(graph engine,GE)和後端運行時3層,如圖1所示。框架
圖1 MindSpore整體框架
2.1 前端表示層
前端表示層向用戶提供Python接口,並將用戶的Python代碼轉換爲數據流圖。該部分包含Python API、MindSpore中間表示(intermediate representation,IR)統一計算圖表達、計算圖高級別優化(graph high level optimization,GHLO)3個部分。
● Python API向用戶提供統一的模型訓練、推理、導出接口以及統一的數據處理、加強、格式轉換接口。
● MindSpore IR提供統一的計算圖表達,MindSpore基於此IR進行pass優化。
● GHLO包含與硬件無關的優化,如高級別優化(high level optimization,HLO) (如死代碼消除等)、自動並行和自動微分等功能。
2.2 計算圖引擎
計算圖引擎負責對與硬件相關的資源進行管理和優化,將平臺特有的信息傳遞給ME。該部分包含計算圖低級別優化(graph low level optimization,GLLO)、圖執行。
● GLLO包含與硬件相關的優化,即低級別優化(low level optimization,LLO)以及算子融合、緩衝(buffer)融合等與軟硬件結合相關的深度優化。
● 圖執行提供離線圖執行、分佈式訓練所需的通訊接口等功能。經過圖編譯將各個算子組織成統一的模型並下發到設備(device)側,在宿主(host)側只需一個觸發動做便可開啓device側的模型訓練,大大減小了host與device在模型訓練中的交互次數。而去中心化的梯度聚合歸約自動分段融合,根據不一樣模型自動生成不一樣的融合策略,以提高通訊效率,無中心點的設計能夠支持更大的集羣規模,下降了集羣的開銷。
2.3 後端運行時
後端運行時包含雲、邊、端上不一樣環境(CPU、GPU、華爲昇騰處理器、Android/iOS)中的高效運行環境。
3 MindSpore的技術開發思路
MindSpore有三大技術優點,分別是自動並行、自動微分、自動調優,這些優點大大提升了深度學習模型的訓練效率,同時也極大地方便了AI工程師進行編碼和調試。
3.1 自動並行
隨着數據集和模型愈來愈大,受限於單卡內存,數據並行遇到了瓶頸,須要混合並行。如今主流框架的作法是經過手動切分網絡模型的方式來進行模型並行,手動切分網絡模型難度很是大,對開發者的要求很是高,須要專家經驗。並且在切分網絡模型的同時,又要作數據並行,這極大地提升了開發的複雜度。最近有研究者提出了簡化混合並行的方法,但這些方法在切分策略、適用的網絡和速度上都存在侷限性。
針對上述問題,MindSpore提供了自動並行特性,用於實現自動的數據並行和模型並行的混合並行訓練。自動並行示意圖如圖2所示。
圖2 自動並行示意
關鍵技術開發的核心思路是在並行切分方面打破樣本和參數的邊界,按算子的輸入/輸出數據進行維度切分,將算子切分到多個節點執行,進而實現並行。在MindSpore前端編譯器中,經過算子切分、整圖切分、集羣拓撲感知調度、並行切分策略自動搜索等關鍵技術,實現計算的自動並行。
整圖切分是指遍歷整個計算圖,將每一個算子切分到多設備,相連算子間若是切分策略不一樣,則會自動插入一個張量(tensor)進行數據分佈重排列,用於銜接兩個算子間的計算。
因爲節點內卡間通訊的帶寬、時延比節點間通訊高,因此集羣拓撲感知調度是指將通訊量大的數據維度切分到節點內多卡上,將通訊量小或者對時延、帶寬不敏感的維度切分到節點間。
爲了進一步幫助用戶更加快速地進行並行網絡訓練,在前面的基礎上,引入了並行切分策略自動搜索的特性,主要圍繞昇騰910構建代價模型(cost model),進而計算出不一樣數據量、不一樣算子以及在不一樣切分策略下的計算通訊比,而後經過動態規劃等算法,自動搜索出在必定內存閾值下性能最優的切分策略。使用這個並行切分策略自動搜索算法,不須要用戶指定模型如何切分,MindSpore框架能夠實現自動的模型切分。用戶只須要一行代碼,就能對一個單機的模型作自動的混合並行訓練。
樣例代碼以下。
context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL,device_num=dev_num)
3.2 自動微分
資深的深度學習開發者都知道,手動微分求解的過程不只求導過程複雜,並且結果很容易出錯,所以現有的深度學習框架都具備自動微分的特性,能夠幫助開發者利用自動微分技術實現自動求導,解決這個複雜、關鍵的問題。
根據實現原理的不一樣,深度學習框架的自動微分分爲以谷歌的TensorFlow爲表明的圖方法、以臉書的PyTorch爲表明的運算符重載以及以MindSpore爲表明的源碼轉化(source to source,S2S)方法,自動微分技術路徑如圖3所示。
圖3 自動微分技術路徑
圖方法實現簡單,而且圖的數據結構容易進行優化和並行。不過圖方法的可編程性一直飽受爭議,用戶須要理解圖的概念和接口(如數據節點、通訊節點、計算節點、數據邊、依賴邊、引用邊等),存在必定的學習成本。而且,在圖方法中控制流、高階導數的表示較爲複雜。
運算符重載比較符合用戶尤爲是研究人員的編程習慣,很受學術界歡迎。不過這種方式須要使用宿主語言(host language)的解釋器,而且在使用過程當中須要先運行全部算子,並使用相似磁帶(tape)的模式記錄運行過程,所以開銷比較大,同時這種動態方式也不利於反向性能優化。
MindSpore採用的S2S自動微分技術兼顧了可編程性和性能,一方面它可以與編程語言保持一致的編程體驗,另外一方面它是IR粒度的可微分技術,可複用現代編譯器的優化能力,性能也更好。
S2S自動微分技術使用了高效易調試的可微編程架構。首先在接口層提供Python編程接口,包括控制流表達,有利於用戶快速入門。樣例代碼以下。
def cost(x,y):return x * (x + y)br/>@mindspore
def test_grad (x,y):
return grad_all(cost)(x,y)
def main():
test_grad (2,1)
第一步:用Python代碼定義一個計算圖(函數)。
第二步:利用MindSpore提供的反向接口進行自動微分,這一步的結果是一個反向的計算圖(函數)。
第三步:給定一些輸入,就能獲取第一步中的計算圖(函數)在給定輸入處的導數。
在此樣例中,自動微分的結果是圖中全部輸入的導數。MindSpore的反向接口一樣提供選項計算某一個或者一部分輸入的導數。
其次,IR粒度的可微分技術可以把用戶定義的網絡源代碼經過解析驗證等過程,轉化爲MindSpore定義的IR,也就是MindSpore IR。在IR的基礎上應用IR更變器方法(IR mutator method),最終生成反向代碼。在此過程當中也應用了算子融合等技術,進一步提高了反向性能。
MindSpore對控制流的表達如圖4所示,包括循環和條件。能夠看到代碼編程風格與原生Python保持一致,更重要的是MindSpore在生成控制流的反向時不會對循環進行展開,而是在IR基礎上進行反向計算,避免了表達式膨脹,從而提高了性能。
圖4 MindSpore對控制流的表達
相比其餘框架,MindSpore能夠下降20%的核心代碼量,下降了開發門檻,總體提高50%以上的效率。同時,MindSpore自然支持編譯優化,進一步提高了代碼運行效率,有效下降了科研工程門檻。
MindSpore圖層面的自動微分樣例代碼以下。
class Net(Cell):
def init(self):
self.w = Parameter(Tensor(np.ones([10])))
def forward(x,y):
return x + y
#定義網絡
net = Net()
x = Tensor(np.ones([10]))
y = Tensor(np.ones([10]))
#自動微分推導
gout = grad_all (net)(x,y)
除了圖層面的自動微分之外, MindSpore同時支持算子層面的自動微分。在提供深度學習主要網絡的算子的同時,MindSpore自帶的張量引擎(tensor engine)支持用戶使用Python特定領域語言(domain specific language,DSL)自定義算子,而且提供算子級的自動微分接口。經過使用Python DSL,用戶能夠在Python中自定義算子,如同數學中用公式定義函數同樣。而張量引擎的算子自動微分接口能夠直接對DSL定義的算子進行微分,正如數學中使用統一的微分符號表示求導同樣,這樣一來,代碼的書寫更加簡潔直觀,更貼近用戶的書寫習慣。樣例代碼以下。
def sigmoid(x)
#前向算子的 DSL 實現
from te.lang.cce import vrec,vadds,vexp,vmuls
res = vrec(vadds(vexp(vmuls(x,-1.0)),1.0))
return res
def sigmoid _ad(dout,x)
import te
#前向算子引用
out = sigmoid(x)
#前項算子自動微分後生成反向算子
dx]= te.differentiate(out,[x],dout)
return dx
這裏的前項算子是用戶用DSL自定義的算子,也是算子級自動微分的求解目標。接下來利用張量引擎提供的反向接口推導出反向算子。對於多輸入的算子來講,反向算子接口能夠指定一個或者多個前向算子的輸入,而後對這些輸入同時進行自動微分計算。另外,與圖層面的自動微分不一樣,算子級的自動微分額外接收反向圖中上一層算子(對應正向圖的下一層算子)的微分結果做爲輸入,而後使用鏈式法則計算出該層反向算子的結果。數學中高階導數是經過對函數反覆使用微分算子計算獲得的,一樣,在MindSpore中,用戶能夠經過對算子反覆使用反向接口來計算算子的高階導數。
MindSpore的算子級自動微分接口不只能夠自動生成反向算子,還提供了進一步手動優化導數公式的可能。MindSpore的算子級自動微分功能把算子分割成若干步簡單函數的複合運算後,先是利用已知基礎函數的導數和求導法則分步求導,而後利用鏈式法則計算複合函數的導數,最後使用張量引擎內置的數學公式簡化器進行化簡。這能夠知足絕大部分用戶對自動微分的須要。可是對於部分有更高性能要求或者代碼部署要求的用戶,MindSpore提供接口讓用戶可使用本身優化過的導數公式代替某一步或者若干步自動生成的導數公式。樣例代碼以下。
def sigmoid _ad_optimized(dout,x)
import te
#前向算子引用
out = sigmoid(x)
#手動調優
def custom_sigmoid_fdiff(out,inputs,grad):
return[out*(1.0–out)]
#利用後生成反向算子
dx]= te.differentiate(out,[x],dout,override={out:([x],custom_sigmoid_fdiff)})
return dx
這裏把手動推導的導數公式放入函數custom_sigmoid_fdiff(out,inputs,grad)中,並在自動微分中重載求導過程。那麼在保持其餘部分自動生成的狀況下,自動微分使用custom_sigmoid_fdiff(out,inputs,grad)做爲輸出(out)對x的導數進行運算。這樣MindSpore保持了自動微分反向算子和手動調優反向算子在風格上的統一,方便了圖層對算子的調用。
總而言之,MindSpore在支持算子級自動微分的同時,對反向算子進行IR層面的優化,知足了算子開發者自動生成反向算子的需求。同時,MindSpore兼顧了用戶對手動調優反向的需求,將自動和手動有機結合,簡化了開發流程,提升了代碼的可讀性和運行效率。
3.3 自動調優
如今AI開發的瓶頸之一是AI的黑盒化,特徵提取隨機化、調試過程不可視、推理結果無解釋,這些問題大大限制了AI技術的可信和普遍應用。
調試調優(mindinsight)的目標是打開AI的黑盒,經過可視化Debugger技術,幫助用戶輕鬆地進行模型調試;利用模型訓練過程可視化技術、模型溯源可視化技術、性能調優可視化技術,幫助用戶輕鬆地進行性能和精度調優。MindSpore可視化界面如圖5所示。
圖5 MindSpore可視化界面
調試調優提供了訓練看板,開發者在訓練看板中能夠總覽訓練過程當中的數據抽樣狀況、參數分佈變化狀況、損失(loss)變化狀況,掌握從訓練數據到模型參數再到loss變化的整個模型優化過程。訓練看板還集成了計算圖可視化和數據圖可視化功能。計算圖可視化功能有助於用戶理解模型結構,判斷模型結構是否符合預期。數據圖可視化功能有助於用戶掌握訓練數據的處理流程。
調試調優還提供了模型溯源和數據溯源可視化功能。在模型溯源頁面,開發者能夠方便地比較不一樣超參數、不一樣數據集等條件下的模型效果,選擇模型效果更優的超參數。在數據溯源頁面,開發者能夠同模型溯源聯動,精細分析不一樣的數據處理操做對模型效果的影響,選擇更合適的數據處理流程。
而使用動靜結合的開發調試模式時,開發者能夠只開發一套代碼,經過變動一行代碼,從容切換動態圖/靜態圖調試方式。須要高頻調試時,選擇動態圖模式,經過單算子/子圖,方便靈活地開發調試;須要高效運行時,能夠切換爲靜態圖模式,對整張圖進行編譯,經過高效的圖編譯優化得到高性能。樣例代碼以下。
net = Net()
x = Tensor(np.random.rand(1,1,4,1024).astype(np.float32))
out = net(x)
context.set_context(mode=context.GRAPH_MODE)
綜合整體框架和技術優點,能夠看出自動微分等特性對MindSpore目標的貢獻,見表2。
4 MindSpore的性能測試
4.1 性能卓越
MindSpore經過AI Native執行新模式,最大化地發揮了「端-邊-雲」全場景異構算力。它還協同華爲昇騰芯片,經過On-Device執行、深度圖優化、高性能數據處理流水線(pipeline)等多維度達到極致性能,幫助開發者縮短訓練時間,提高推理性能。MindSpore協同華爲昇騰芯片示意圖如圖6所示。
圖6 MindSpore協同華爲昇騰芯片示意
● On-Device執行:整圖下沉到device執行,減小host-device交互開銷。
● 深度圖優化:包括整圖的格式轉換消除、類型轉換消除、算子融合。
● 高性能數據處理pipeline:支持數據加強、全局混洗(shuffle)。
MindSpore協同華爲昇騰芯片的實際訓練性能數據見表三、表4,其中表3採用的是ResNet-50 v1.5網絡,其網絡類型爲卷積神經網絡,採用的數據集爲ImageNet2012,MindSpore版本爲0.2.0-alpha;表4中採用的是BERT Large網絡,其網絡類型爲Attention,採用的數據集爲zhwiki,MindSpore版本爲0.2.0-alpha。
4.2 端雲協同
MindSpore針對全場景提供一致的開發和部署能力以及按需協同能力,使開發者可以實現AI應用在雲、邊緣和手機上的快速部署,全場景互聯互通,實現更好的資源利用和隱私保護,創造更加豐富的AI應用。MindSpore端雲協同框架如圖7所示。
圖7 MindSpore端雲協同框架
MindSpore端雲協同框架整合了雲側框架和端側框架,並打通了自動模型生成、模型壓縮、編譯優化和端側學習的全流程。
● MindSpore提供了神經架構搜索(neural architecture search,NAS)能力,用於自動化生成模型,構建模型庫。
● MindSpore模型壓縮模塊用於對模型庫中的模型進行剪枝和量化。
● MindSpore提供了編譯優化能力,用於轉換和優化模型,並經過神經處理單元(neural-network processing unit,NPU)、圖形處理單元(graphics processing unit,GPU)等加速算子執行。
注:以上數據基於華爲雲AI開發平臺ModelArts測試得到,是訓練過程總體下沉至Ascend 910 AI處理器執行所得的平均性能。
注:以上數據基於華爲雲AI開發平臺ModelArts測試得到,其中網絡包含24個隱藏層,句長爲128個token,字典表包含21 128個token。
MindSpore端雲協同框架具備如下特性。
● 快速多處部署。在實際場景中,模型須要快速適配不一樣機型硬件。經過神經架構搜索技術構建多元化的模型庫,適配多種機型。針對特定應用場景,從模型庫中搜索知足性能約束的模型,拿來即用,無須從新訓練。
● 全棧性能優化。結合神經架構搜索、模型壓縮(剪枝、蒸餾、量化)、編譯優化(算子融合、常量摺疊、硬件加速)等手段優化模型精度、大小、時延,追求極致性能。
● 靈活而且易用。支持多種策略組合使用,如模型生成、模型壓縮和編譯優化能夠靈活組合;打通雲到端全流程,集中管理全流程策略和配置,方便使用。
● 多種學習形態。MindSpore端雲協同框架逐步支持多種學習形態,例如支持當前業界經常使用的端側推理形態,並逐步支持遷移學習、聯合學習等須要端側訓練能力的高級學習形態,知足開發者各類各樣的場景需求。
5 結束語
深度學習現已成爲人工智能發展重要的方向之一,已經深入地改變了諸多應用領域,其中廣爲人知的領域包括自動語音識別、圖像識別、天然語言理解以及不少其餘交叉領域(如醫療、生物、金融等),並將在愈來愈多的領域取得成功。本文經過研究人工智能發展歷史認識到深度學習的價值和影響力,介紹了新一代深度學習框架MindSpore的框架、技術開發思路和性能優點,但願能夠爲深度學習技術研究人員提供參考。
致謝
感謝整個華爲MindSpore團隊的貢獻。MindSpore已開源,可在相關網站下載。
做者簡介
於璠(1980-),男,博士,華爲技術有限公司AI計算框架的創新和生態架構師,曾主導華爲雲計算資源調度、SDN大規模路由等架構和算法的設計,發表專利30餘篇 。