摘要:MindSpore是華為公司推出的新一代深度學習框架,是源於全產業的最佳實踐,最佳匹配昇騰處理器算力,支援終端、邊緣、雲全場景靈活部署,開創全新的AI程式設計正規化,降低AI開發門檻。
MindSpore是華為公司推出的新一代深度學習框架,是源於全產業的最佳實踐,最佳匹配昇騰處理器算力,支援終端、邊緣、雲全場景靈活部署,開創全新的AI程式設計正規化,降低AI開發門檻。2018年華為全聯接大會上提出了人工智慧面臨的十大挑戰,其中提到訓練時間少則數日多則數月,算力稀缺昂貴且消耗大,仍然面臨沒有“人工”就沒有“智慧”等問題。這是一項需要高階技能的、專家的工作,高技術門檻、高開發成本、長部署週期等問題阻礙了全產業AI開發者生態的發展。為了助力開發者與產業更加從容地應對這一系統級挑戰,新一代AI框架MindSpore具有程式設計簡單、端雲協同、除錯輕鬆、效能卓越、開源開放等特點,降低了AI開發門檻。
1、程式設計簡單MindSpore函式式可微分程式設計架構可以讓使用者聚焦模型演算法數學原生表達。資深的深度學習開發者都體會過手動求解的過程,不僅求導過程複雜,結果還很容易出錯。所以現有深度學習框架,都有自動微分的特性,幫助開發者利用自動微分技術實現自動求導,解決這個複雜、關鍵的過程。深度學習框架的自動微分技術根據實現原理的不同,分為以Google的TensorFlow為代表的圖方法,以Facebook的PyTorch為代表的運算子過載,以及以MindSpore為代表的原始碼轉換方法(Source to Source,S2S自動微分技術),如圖1.1所示。
圖方法實現簡單,並且圖的資料結構容易進行最佳化和並行。不過圖方法的可程式設計性一直飽受爭議,使用者需要理解圖的概念和介面,例如資料節點、通訊節點、計算節點、資料邊、依賴邊、引用邊等,存在一定的學習成本。並且,在圖方法中控制流、高階導的表示較為複雜。運算子過載方式比較符合使用者尤其是研究人員的程式設計習慣,很受學術界歡迎。不過這種方式需要使用宿主語言(Host Language)的直譯器,並且使用Tape模式去記錄執行過程,所以開銷比較大,同時這種動態方式也不利於反向效能最佳化。
S2S自動微分技術,兼顧了可程式設計性和效能。一方面能夠和程式語言保持一致的程式設計體驗;另一方面它是中間表示(Intermediate Representation,IR)粒度的可微分技術,可複用現代編譯器的最佳化能力,效能也更好。S2S自動微分技術使用了高效易除錯的可微程式設計架構。首先在介面層提供Python程式設計介面,包括控制流表達,利於使用者快速入門,如程式碼1.1所示。第一步用Python程式碼定義一個計算圖(函式)。第二步,利用MindSpore提供的反向介面進行自動微分,這一步的結果是一個反向的計算圖(函式)。第三步給定一些輸入,就能獲取第一步中的計算圖(函式)在給定處的導數。在這個例子中,自動微分的結果是圖中所有輸入的導數。MindSpore的反向介面同樣提供選項計算某一個或者一部分輸入的導數。
程式碼1.1 原生Python程式設計體驗
其次,IR(Intermediate Representation,中間表示)粒度的可微分技術能夠把使用者定義的網路原始碼透過解析驗證等過程轉換為MindSpore定義的IR,也就是MindSporeIR,在IR的基礎上應用IR更變器方法(IR Mutator Method),最終生成反向程式碼。在此過程中,也應用了運算元融合等技術進一步提升反向效能。如圖1.2所示,MindSpore對控制流的表達包括迴圈和條件。可以看到程式碼程式設計風格與原生Python保持一致,更重要的是,與Python對控制流的表達不同的是,MindSpore在生成控制流的反向時不會對迴圈進行展開,而透過在IR基礎上進行反向計算,避免了表示式膨脹,從而提升效能。
相比其他框架,用MindSpore可以降低核心程式碼量20%,降低開發門檻,效率整體提升50%以上。同時,能天然支援編譯最佳化,進一步提升程式碼執行效率,有效降低科研工程門檻。MindSpore自動微分程式碼如程式碼1.2所示。
除了圖層面的自動微分以外,MindSpore同時支援運算元層面的自動微分。在提供了深度學習主要網路的運算元的同時,MindSpore自帶的張量引擎(Tensor Engine)支援使用者使用Python DSL(Domain Specific Language)自定義運算元,並且提供運算元級的自動微分介面。透過使用Python DSL,使用者可以在Python中像寫數學式一樣自定義運算元,如同數學中用公式定義函式一樣,而張量引擎的運算元自動微分介面可以直接對DSL定義的運算元進行微分,正如數學中使用統一的微分符號表示求導一樣,這樣讓程式碼的書寫更加簡潔直觀,貼近使用者的書寫習慣,如程式碼1.3所示。這裡的前向運算元是使用者用DSL自定義的運算元,也是運算元級自動微分的求解目標。接下來利用張量引擎提供的反向介面去推匯出反向運算元。對於多輸入的運算元,反向運算元介面可以指定一個或者多個前向運算元的輸入,然後對這些輸入同時進行自動微分計算。另外與圖層面的自動微分不同,運算元級的自動微分額外接收反向圖中上一層運算元(對應在正向圖的下一層運算元)的微分結果作為輸入,然後使用鏈式法則計算出該層反向運算元的結果。數學中高階導數是透過對函式反覆使用微分運算元計算得到的,同樣,在MindSpore中,使用者可以對運算元反覆使用反向介面來計算運算元的高階導數。
程式碼1.3 MindSpore運算元級自動微分程式碼示例
運算元級的自動微分同樣使用了IR方法,因此許多IR層面的最佳化技術可以應用在運算元級的自動微分中。其中MindSpore的張量引擎根據深度學習的運算元特徵特別增加了IR層面的除零最佳化。未經最佳化的反向運算元中可能存在大量的零元素,極大地影響求和等計算的效率。張量引擎的自動微分透過迴圈軸合併、迴圈域排程變換消除反向運算元中的零元素,不僅能提高程式碼的執行效率,也使得程式碼簡化讓後續部署更加方便。此外MindSpore的張量引擎引入多項式(Polyhedral)模型,解決迴圈變形依賴問題,實現自動的運算元排程,並且自動記憶體最佳化,實現記憶體最優排布、運算元最佳效能。如此讓使用者從手寫排程調優的細節中解放出來,更專注於演算法本身。
MindSpore的運算元級自動微分介面不僅可以自動生成反向運算元,更提供了進一步手動最佳化導數公式的可能。MindSpore的運算元級自動微分功能把運算元分割成若干步簡單函式的複合運算後,先是利用已知基礎函式的導數和求導法則分佈求導,然後利用鏈式法則計算複合函式的導數,最後透過張量引擎內建的數學公式簡化器進行化簡。這可以滿足絕大部分使用者對自動微分的需要。但是對部分有更高效能或者程式碼部署要求的使用者,MindSpore提供介面讓使用者可以用自己最佳化過的導數公式代替某一步或者若干步自動生成的微分,如程式碼1.4所示。雖然上面的例子中MindSpore業已完成Sigmoid函式的求導,但部分使用者可能希望用手動推導的Sigmoid函式的導數dy=y(1-y)進行計算,這樣可以利用前向函式計算的結果。這裡把手動推導的導數公式放入函式custom_sigmoid_fdiff中,並在自動微分中過載這部分的求導。那麼自動微分在保持其他部分自動生成的情況下,使用custom_sigmoid_fdiff作為輸出對於x的導數進行運算。這樣MindSpore保持了自動微分和手動調優的反向運算元在風格上的統一,方便了圖層對運算元的呼叫。
程式碼1.4 MindSpore手動調優自動微分程式碼示例
總而言之,MindSpore在支援運算元級自動微分的同時,對反向運算元進行IR層面的最佳化,滿足運算元開發者自動生成反向運算元的需求。同時MindSpore兼顧了使用者對手動調優反向的需求,將自動和手動有機結合,簡化了開發流程,提升了程式碼的可讀性,增加了程式碼的執行效率。
2、端雲協同MindSpore依託華為“端—邊—雲”的業務場景,在隱私保護日漸重要的情況下,致力於支援全場景部署,並打通雲到端全流程。MindSpore針對全場景提供一致的開發和部署能力,以及按需協同能力,讓開發者能夠實現AI應用在雲、邊緣和手機上快速部署,全場景互聯互通,實現更好的資源利用和隱私保護,創造更加豐富的AI應用。學術界和工業界沒有對端雲協同做系統的概念定義,一般認為涉及雲和端互動的學習形態,即是端雲協同系統。模型壓縮、端側推理、端側訓練、遷移學習、聯邦學習等技術在端側的應用都可以劃分到端雲協同的範疇。這些涉及在雲側構建、預訓練或託管模型,在端側執行或訓練模型,以及雲和端之間模型或權重的傳輸。在端側推理場景中,對雲側模型進行模型壓縮並轉換為端側推理模型,使用端側推理框架載入模型並對本地資料進行推理。但云側預訓練模型使用的資料集和端側真實的資料存在差異,為了利用端側真實資料訓練模型,帶來精準的個性化體驗,端側訓練成為必然。由於端側裝置在算力、電量和資料量方面的限制,從頭訓練一個模型不切實際,因此遷移學習技術被用在了端側學習中,可以大幅度降低端側訓練的難度。為了充分利用端側資料和端側訓練能力,一些端雲聯合學習方法和框架被提出來,旨在聯合多個端側裝置共同訓練一個全域性模型,並實現端側隱私保護。Google率先於2016年提出了聯邦學習方法和框架。楊強等又提出了橫向聯邦學習、縱向聯邦學習、聯邦遷移學習以及聯邦強化學習等方法及對應的框架。端側推理、遷移學習和聯邦學習屬於端雲協同的不同階段,如圖1.3所示的MindSpore端雲協同框架融合了這三種形態並打通了雲到端全流程。
MindSpore端雲協同框架整合了MindSpore雲側框架、MindSpore端側框架,並打通了模型生成、模型壓縮、編譯最佳化和端側學習的全流程。MindSpore提供神經架構搜尋(Neural Architecture Search,NAS)能力用於自動化生成模型,構建模型庫。MindSpore模型壓縮模組用於對模型庫中的模型進行剪枝和量化。MindSpore提供了編譯最佳化能力用於轉換和最佳化模型,並透過神經處理單元(Neural-network Processing Unit,NPU)、圖形處理單元(GraphicsProcessing Unit,GPU)或ARM NEON(1)等加速運算元執行。MindSpore端雲協同框架具有如下多種特性。
(1)快速多處部署。實際場景中,模型需要快速適配不同機型硬體。透過神經架構搜尋技術構建多元化的模型庫,適配多種機型。針對特定應用場景,從模型庫中搜索滿足效能約束的模型,拿來即用,無須重複訓練。
(2)全棧效能最佳化。結合神經架構搜尋、模型壓縮(剪枝、蒸餾、量化)、編譯最佳化(運算元融合、常量摺疊、硬體加速)等手段最佳化模型精度、大小、時延,追求極致效能。
(3)靈活易用。支援多種策略,如模型生成、模型壓縮和編譯最佳化組合使用。打通雲到端全流程,集中管理全流程策略和配置,方便使用。
(4)多種學習形態。MindSpore端雲框架逐步支援多種學習形態,比如支援當前業界常用的端側推理形態,並逐步支援遷移學習、聯邦學習等需要端側訓練能力的高階學習形態,滿足開發者各種各樣的場景需求。
3、除錯輕鬆MindSpore實現看得見的AI開發、更輕鬆的除錯體驗、動靜結合的開發除錯模式。開發者可以只開發一套程式碼,透過變更一行程式碼,從容切換動態圖/靜態圖除錯方式。需要高頻除錯時,選擇動態圖模式,透過單運算元/子圖執行,方便靈活地進行開發除錯。需要高效執行時,可以切換為靜態圖模式,對整張圖進行編譯執行,透過高效的圖編譯最佳化,獲得高效能。MindSpore切換除錯模式程式碼如程式碼1.5所示。
程式碼1.5 MindSpore切換除錯模式程式碼
4、效能卓越MindSpore透過AI Native執行新模式,最大化發揮了“端—邊—雲”全場景異構算力。它還協同華為昇騰晶片On Device執行、高效AI資料格式處理、深度圖最佳化等多維度達到極致效能,幫助開發者縮短訓練時間,提升推理效能。此外,資料集、模型越來越大,單機的記憶體和算力無法滿足需求,需要模型並行;模型手動切分門檻高,開發效率低,除錯困難。MindSpore可以透過靈活的策略定義和代價模型,自動完成模型切分與調優,獲取最佳效率與最優效能。MindSpore自動並行程式碼如程式碼1.6所示。
程式碼1.6 MindSpore自動並行程式碼示例
5、開源開放MindSpore致力於AI開發生態的繁榮,開源開放可擴充套件架構,助力開發者靈活擴充套件第三方框架、第三方晶片支援能力,讓開發者實現各種定製化需求。MindSpore將在入口網站、開源社群提供更多學習資源、支援與服務。
(1) 參考連結:https://developer.arm.com/architectures/instruction-sets/simd-isas/neon。
(2) MindSpore端雲協同框架處於開發迭代中,其支援特性以官網公佈的為準。