華為深度學習框架MindSpore正式開源:自動微分不止計算圖

機器之心報道

千呼萬喚始出來——3 月 28 日,華為的全棧全場景 AI 計算框架 MindSpore 終於正式開源了。

今年的華為開發者大會 HDC 2020 上,除了昇騰、鯤鵬等自研芯片硬件平臺之外,最令人期待的就是深度學習框架 MindSpore 的開源了。今天上午,華為 MindSpore 首席科學家陳雷在活動中宣佈這款產品正式開源,我們終於可以在開放平臺上一睹它的真面目。
作為一款「全場景 AI 框架」,MindSpore 是華為人工智能解決方案的重要組成部分,與 TensorFlow、PyTorch、PaddlePaddle 等流行深度學習框架對標,旨在大幅度降低 AI 應用開發門檻,讓人工智能無處不在。
MindSpore 是一款支持端、邊、雲獨立/協同的統一訓練和推理框架。華為希望通過這款完整的軟件堆棧,實現一次性算子開發、一致的開發和調試體驗,以此幫助開發者實現一次開發,應用在所有設備上平滑遷移的能力。
原生支持 AI 芯片,全場景一致的開發體驗——除了這些我們早已知曉的強大之處外,今天華為還著重展示了 MindSpore 的三大創新能力:新編程範式,執行模式和協作方式。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖


今天發佈的 MindSpore 首個開源版本為 0.1.0-alpha 版,主要由自動微分、自動並行、數據處理等功能構成。華為表示,MindSpore 具備開發算法即代碼、運行高效、部署態靈活的特點,其核心分為三層:從下往上分別是後端運行時、計算圖引擎及前端表示層。
MindSpore 開源社區:https://www.mindspore.cn/MindSpore 代碼:https://gitee.com/mindspore
從整體上來說,MindSpore 搭建神經網絡會以「單元」為中心,其中單元是張量和運算操作的集合。從輸入張量開始,MindSpore 會提供各種算子以構造一個「單元」,最後模型封裝這個單元就可以用來訓練、推理了。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖

MindSpore 的整體結構,從後端的硬件支持到前端 API,中間會涉及多種優化與特性。例如不採用計算圖的自動微分、自動並行與優化計算過程等等。
MindSpore 最大的特點在於,其採用了業界最新的 Source-to-Source 自動微分,它能利用編譯器及編程語言的底層技術,進一步優化以支持更好的微分表達。
自動微分:不止計算圖
自動微分是深度學習框架的靈魂,有了它我們寫模型就只需要關注前向傳播,將所有複雜的求導、反傳過程都留給框架。一般而言,自動微分指一種自動求某個函數其導數的方法。在機器學習中,這些導數可以更新權重。在更廣泛的自然科學中,這些導數也能用於各種後續計算。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖

人類擅長以解析式推導微分,計算機擅長數值微分。
一般而言,自動微分都是需要建立計算圖的,有了計算圖才能追蹤各函數、變量的依賴情況,並進一步根據鏈式法則傳遞梯度。然而對於 MindSpore 來說,它並不依賴於計算圖,而是通過一種名為「基於源碼轉換」的自動微分方法,它支持 if、for 等複雜的控制流結構,以及靈活的函數式編程方式。
自動微分本質上是解析變量間的依賴關係,並利用全微分法則與鏈式求導法則將梯度傳遞給不同的變量。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖

將 Python 代碼解析為計算圖。
目前主流深度學習框架中主要有三種自動微分技術:

  • 基於靜態計算圖的轉換:將網絡在編譯時轉換為靜態數據流圖,然後將鏈式法則應用於數據流圖,並實現自動微分。
  • 基於動態計算圖的轉換:以操作符重載的方式記錄網絡在前向執行時操作軌跡,然後將鏈式法則應用於動態生成的數據流圖,並實現自動微分。
  • 基於源碼轉換:該技術源以函數式編程框架為基礎,以即時編譯(JIT)的方式在中間表達(編譯過程中程序的表達形式)上做自動微分變換,支持複雜控制流場景、高階函數和閉包。


其中 TF 早期採用的是靜態計算圖,PyTorch 採用的是動態計算圖,靜態圖能利用靜態編譯技術對網絡性能進行優化,然而搭建網絡或 Debug 非常複雜。動態圖的使用非常便捷,但性能上難以做到極致的優化。
MindSpore 走的是另外一條路,即基於源碼轉換的自動微分。它又支持對自動控制流的自動微分,所以與 PyTorch 一樣構建模型非常方便。同時 MindSpore 能對神經網絡做靜態編譯優化,因此性能也非常優秀。


基於源碼轉換的方法,是自動微分另一條康莊大道。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖

源碼轉換的簡要工作方式。
假設我們用 C 語言寫函數,那麼根據自動微分工具,函數的源代碼會自動轉換為另一種源代碼,這種新生成的源代碼包含了用於計算梯度的語句,它們可以直接編譯。這樣的源碼到源碼轉換對於編譯器非常友好,編譯器在計算過程中也能進行優化。
MindSpore 自動微分的實現可以理解為對程序本身進行的符號微分,因為 MindSpore IR 是函數式的中間表達,它與基礎代數中的複合函數有直觀的對應關係,只要已知基礎函數的求導公式,就能推導出由任意基礎函數組成的複合函數的求導公式。MindSpore IR 中每個原語操作可以對應為基礎代數中的基礎函數,這些基礎函數可以構建更復雜的流程控制。


自動並行訓練:一切計算都交給它
如今的深度學習模型往往因為體量巨大而必須做並行化,MindSpore 能自動並行按照串行寫的代碼,自動實現分佈式並行訓練,並且保持高性能。
一般而言,並行訓練可以分為模型並行與數據並行,數據並行比較好理解,每一個樣本可以獨立地完成前向傳播,最後再彙總傳播結果。相比之下,模型並行就比較複雜了,需要我們以「並行思維」這樣的邏輯手動編寫所有需要並行的部分。
MindSpore 自動並行的目標是構建一種融合了數據並行、模型並行和混合並行的訓練方式。它會自動選擇一種代價最小的模型切分方式,實現自動分佈式並行訓練。
目前 MindSpore 採用了切分算子細粒度的並行方式,即把圖中每個算子都切分到集群而完成並行運算。這期間切分方式可能非常複雜,但作為崇尚 Pythonic 的開發者,並不需要關心底層實現,只需要頂層 API 計算高效就行了。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖


除了自動微分與自動並行,MindSpore 還有很多優秀的特性與組件,完整的數據預處理模塊、高效的圖計算引擎都值得我們去探索。例如在數據預處理模塊中,MindSpore 需要考慮如何提升數據預處理的能力,從而使其跟得上昇騰芯片消耗數據的速度。
當然可視化工具、模型評估工具等常用模塊也都配齊了,除了常見的計算圖、標量曲線等可視化,MindSpore 還能實現新穎的「模型溯源」,它會把學習率、損失值、模型大小等眾多超參配置都畫在一起,方便開發者調參。
MindSpore 代碼什麼樣?
用 MindSpore 寫模型,代碼風格還是挺有特色的。之前介紹過,MindSpore 主要概念就是張量、算子、單元和模型,它提供的同樣也是 Python 編程範式,因為採用 Source-to-Source 自動微分,Python 常用的元組、列表等數據結構還能用,匿名函數 Lambda 也沒問題。
張量大家都瞭解了,MindSpore 中的算子可以是卷積,也可以是簡單的加法。它們與張量一起可以構成「單元」,單元是所有神經網絡單元的基本類。單元再封裝就成了模型了,MindSpore 可以直接調用模型來訓練與推理,也可以使用更底層的 API 構建複雜模型。
如下所示,我們可以發現寫 MindSpore 有兩個比較突出的亮點。首先當然是計算圖的調整,動態圖與靜態圖可以一行代碼切換。在正常情況下,MindSpore 使用的是 PyNative 動態圖,然而在需要靜態圖的時候,設置個 context 上下文管理器就可以了。

<code>import numpy as np
import mindspore.context as context
import mindspore.nn as nn
from mindspore import Tensor
# Initialize the network
net = Net()
x = Tensor(np.random.rand(1, 1, 4, 1024).astype(np.float32))
# Predict the network in PyNative mode, by default
out = net(x)
# Change to Graph mode to predict the network
context.set_context(mode=context.GRAPH_MODE)
out = net(x)
/<code>


對於自動並行特性,我們寫的串行代碼,只需要多加一行就能完成自動並行,這背後的複雜並行邏輯完全不需要花費精力去理解。
如下所示,只要設置運行環境為圖模式,並允許使用分佈式接口 HCCL(華為集合通信庫),那麼在初始化後 MindSpore 就能自動優化我們寫的模型,以最好的並行策略加速整個訓練過程。

<code>import os
from mindspore import context
from mindspore.communication.management import init
if __name__ == "__main__":
 context.set_context(mode=context.GRAPH_MODE, 
 device_target="Ascend", 
 enable_hccl=True, 
 device_id=int(os.environ["DEVICE_ID"]))
 init()
 ... 
/<code>


華為表示,MindSpore 原生適應所有的 AI 應用場景,並能在按需協同的基礎上通過實現 AI 算法即代碼,顯著減少模型開發時間。以典型的 Transformer 為例,MindSpore 可降低核心代碼量 20%,開發門檻大大降低,效率整體提升 50% 以上。

華為深度學習框架MindSpore正式開源:自動微分不止計算圖

隨著框架的開源,MindSpore 相關文檔和教程均已在官網上線,並歡迎開發者提供反饋意見。 至於未來的發展方向,華為表示在開源後大部分工作都將交由社區自主完成:MindSpore 社區會按照社區章程進行運作,未來新版本計劃會由各個特別興趣組 (Special Interest Group, 簡稱 SIG) 輸出,並交技術治理委員會 (Technical Steering Committee,簡稱 TSC) 決策並公示。
目前,MindSpore 技術治理委員會由來自依瞳科技、Conic AI、哈爾濱工業大學、華為、工商銀行、帝國理工、中科院計算所、北京大學、清華大學、中國科技大學、愛丁堡大學、University Paris-Saclay、Universität Münster、西安電子科技大學等 14 名不同機構的代表組成。


為吸引開發者,華為還將啟動一系列的開發者體驗活動。
隨著深度學習框架等工具的全面開源,「最強 AI 處理芯片」昇騰的落地,華為的 AI 佈局已經逐漸清晰起來,MindSpore 將為各行業帶來哪些新變化,讓我們拭目以待。


分享到:


相關文章: