一代深度學習框架研究
于璠
華為技術有限公司
摘要:從人工智能的歷史出發,簡述深度學習發展歷程以及目前的挑戰,通過介紹新一代深度學習框架的特點,分析總體框架,闡述自動并行、自動微分、自動調優等技術優勢以及協同昇騰處理器的性能優勢,希望可以為深度學習技術研究人員提供參考。
關鍵詞:人工智能;機器學習 ; 深度學習 ; 計算框架 ; MindSpore
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)
@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協同華為昇騰芯片的實際訓練性能數據見表3、表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已開源,可在相關網站下載。
聯系我們:
Tel:010-81055448
010-81055490
010-81055534
E-mail:[email protected]
http://www.infocomm-journal.com/bdr
http://www.j-bigdataresearch.com.cn/
轉載、合作:010-81055537
大數據期刊
《大數據(Big Data Research,BDR)》雙月刊是由中華人民共和國工業和信息化部主管,人民郵電出版社主辦,中國計算機學會大數據專家委員會學術指導,北京信通傳媒有限責任公司出版的期刊,已成功入選中文科技核心期刊、中國計算機學會會刊、中國計算機學會推薦中文科技期刊,并被評為2018年國家哲學社會科學文獻中心學術期刊數據庫“綜合性人文社會科學”學科最受歡迎期刊。
關注《大數據》期刊微信公眾號,獲取更多內容






