MindSpore:自动微分
MindSpore:自動微分
作為一款「全場景 AI 框架」,MindSpore 是人工智能解決方案的重要組成部分,與 TensorFlow、PyTorch、PaddlePaddle 等流行深度學習框架對標,旨在大幅度降低 AI 應用開發門檻,讓人工智能無處不在。
MindSpore 是一款支持端、邊、云獨立/協同的統一訓練和推理框架。希望通過這款完整的軟件堆棧,實現一次性算子開發、一致的開發和調試體驗,以此幫助開發者實現一次開發,應用在所有設備上平滑遷移的能力。
原生支持 AI 芯片,全場景一致的開發體驗——除了這些早已知曉的強大之處外,還著重展示了 MindSpore 的三大創新能力:新編程范式,執行模式和協作方式。
MindSpore 首個開源版本為 0.1.0-alpha 版,主要由自動微分、自動并行、數據處理等功能構成。MindSpore 具備開發算法即代碼、運行高效、部署態靈活的特點,其核心分為三層:從下往上分別是后端運行時、計算圖引擎及前端表示層。
MindSpore 開源社區:https://www.mindspore.cn/
MindSpore 代碼:https://gitee.com/mindspore
從整體上來說,MindSpore 搭建神經網絡會以「單元」為中心,其中單元是張量和運算操作的集合。從輸入張量開始,MindSpore 會提供各種算子以構造一個「單元」,最后模型封裝這個單元就可以用來訓練、推理了。
MindSpore 的整體結構,從后端的硬件支持到前端 API,中間會涉及多種優化與特性。例如不采用計算圖的自動微分、自動并行與優化計算過程等等。
MindSpore 最大的特點在于,其采用了業界最新的 Source-to-Source 自動微分,能利用編譯器及編程語言的底層技術,進一步優化以支持更好的微分表達。
自動微分:不止計算圖
自動微分是深度學習框架的靈魂,有了寫模型就只需要關注前向傳播,將所有復雜的求導、反傳過程都留給框架。一般而言,自動微分指一種自動求某個函數其導數的方法。在機器學習中,這些導數可以更新權重。在更廣泛的自然科學中,這些導數也能用于各種后續計算。
人類擅長以解析式推導微分,計算機擅長數值微分。
一般而言,自動微分都是需要建立計算圖的,有了計算圖才能追蹤各函數、變量的依賴情況,并進一步根據鏈式法則傳遞梯度。然而對于 MindSpore 來說,并不依賴于計算圖,而是通過一種名為「基于源碼轉換」的自動微分方法,支持 if、for 等復雜的控制流結構,以及靈活的函數式編程方式。
自動微分本質上是解析變量間的依賴關系,并利用全微分法則與鏈式求導法則將梯度傳遞給不同的變量。
將 Python 代碼解析為計算圖。
目前主流深度學習框架中主要有三種自動微分技術:
? 基于靜態計算圖的轉換:將網絡在編譯時轉換為靜態數據流圖,然后將鏈式法則應用于數據流圖,并實現自動微分。
? 基于動態計算圖的轉換:以操作符重載的方式記錄網絡在前向執行時操作軌跡,然后將鏈式法則應用于動態生成的數據流圖,并實現自動微分。
? 基于源碼轉換:該技術源以函數式編程框架為基礎,以即時編譯(JIT)的方式在中間表達(編譯過程中程序的表達形式)上做自動微分變換,支持復雜控制流場景、高階函數和閉包。
其中 TF 早期采用的是靜態計算圖,PyTorch 采用的是動態計算圖,靜態圖能利用靜態編譯技術對網絡性能進行優化,然而搭建網絡或 Debug 非常復雜。動態圖的使用非常便捷,但性能上難以做到極致的優化。
MindSpore 走的是另外一條路,即基于源碼轉換的自動微分。又支持對自動控制流的自動微分,所以與 PyTorch 一樣構建模型非常方便。同時 MindSpore 能對神經網絡做靜態編譯優化,因此性能也非常優秀。
基于源碼轉換的方法,是自動微分另一條康莊大道。
源碼轉換的簡要工作方式。
假設用 C 語言寫函數,那么根據自動微分工具,函數的源代碼會自動轉換為另一種源代碼,這種新生成的源代碼包含了用于計算梯度的語句,可以直接編譯。這樣的源碼到源碼轉換對于編譯器非常友好,編譯器在計算過程中也能進行優化。
MindSpore 自動微分的實現可以理解為對程序本身進行的符號微分,因為 MindSpore IR 是函數式的中間表達,與基礎代數中的復合函數有直觀的對應關系,只要已知基礎函數的求導公式,就能推導出由任意基礎函數組成的復合函數的求導公式。MindSpore IR 中每個原語操作可以對應為基礎代數中的基礎函數,這些基礎函數可以構建更復雜的流程控制。
自動并行訓練:一切計算都交給
如今的深度學習模型往往因為體量巨大而必須做并行化,MindSpore 能自動并行按照串行寫的代碼,自動實現分布式并行訓練,并且保持高性能。
一般而言,并行訓練可以分為模型并行與數據并行,數據并行比較好理解,每一個樣本可以獨立地完成前向傳播,最后再匯總傳播結果。相比之下,模型并行就比較復雜了,需要以「并行思維」這樣的邏輯手動編寫所有需要并行的部分。
MindSpore 自動并行的目標是構建一種融合了數據并行、模型并行和混合并行的訓練方式。會自動選擇一種代價最小的模型切分方式,實現自動分布式并行訓練。
目前 MindSpore 采用了切分算子細粒度的并行方式,即把圖中每個算子都切分到集群而完成并行運算。這期間切分方式可能非常復雜,但作為崇尚 Pythonic 的開發者,并不需要關心底層實現,只需要頂層 API 計算高效就行了。
除了自動微分與自動并行,MindSpore 還有很多優秀的特性與組件,完整的數據預處理模塊、高效的圖計算引擎都值得去探索。例如在數據預處理模塊中,MindSpore 需要考慮如何提升數據預處理的能力,從而使其跟得上昇騰芯片消耗數據的速度。
當然可視化工具、模型評估工具等常用模塊也都配齊了,除了常見的計算圖、標量曲線等可視化,MindSpore 還能實現新穎的「模型溯源」,會把學習率、損失值、模型大小等眾多超參配置都畫在一起,方便開發者調參。
MindSpore 代碼什么樣?
用 MindSpore 寫模型,代碼風格還是挺有特色的。MindSpore 主要概念就是張量、算子、單元和模型,提供的同樣也是 Python 編程范式,因為采用 Source-to-Source 自動微分,Python 常用的元組、列表等數據結構還能用,匿名函數 Lambda 也沒問題。
張量大家都了解了,MindSpore 中的算子可以是卷積,也可以是簡單的加法。與張量一起可以構成「單元」,單元是所有神經網絡單元的基本類。單元再封裝就成了模型了,MindSpore 可以直接調用模型來訓練與推理,也可以使用更底層的 API 構建復雜模型。
如下所示,可以發現寫 MindSpore 有兩個比較突出的亮點。首先當然是計算圖的調整,動態圖與靜態圖可以一行代碼切換。在正常情況下,MindSpore 使用的是 PyNative 動態圖,然而在需要靜態圖的時候,設置個 context 上下文管理器就可以了。
importnumpy asnp
importmindspore.context ascontext
importmindspore.nn asnn
frommindspore importTensor
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)
對于自動并行特性,寫的串行代碼,只需要多加一行就能完成自動并行,這背后的復雜并行邏輯完全不需要花費精力去理解。
如下所示,只要設置運行環境為圖模式,并允許使用分布式接口 HCCL(集合通信庫),那么在初始化后 MindSpore 就能自動優化寫的模型,以最好的并行策略加速整個訓練過程。
importos
frommindspore importcontext
frommindspore.communication.management importinit
if__name__ == “main”:
context.set_context(mode=context.GRAPH_MODE,
device_target= “Ascend”,
enable_hccl= True,
device_id=int(os.environ[ “DEVICE_ID”]))
init
…
表示,MindSpore 原生適應所有的 AI 應用場景,并能在按需協同的基礎上通過實現 AI 算法即代碼,顯著減少模型開發時間。以典型的 Transformer 為例,MindSpore 可降低核心代碼量 20%,開發門檻大大降低,效率整體提升 50% 以上。
隨著框架的開源,MindSpore 相關文檔和教程均已在官網上線,并歡迎開發者提供反饋意見。
至于未來的發展方向,表示在開源后大部分工作都將交由社區自主完成:MindSpore 社區會按照社區章程進行運作,未來新版本計劃會由各個特別興趣組 (Special Interest Group, 簡稱 SIG) 輸出,并交技術治理委員會 (Technical Steering Committee,簡稱 TSC) 決策并公示。
目前,MindSpore 技術治理委員會由來自依瞳科技、Conic AI、哈爾濱工業大學、、工商銀行、帝國理工、中科院計算所、北京大學、清華大學、中國科技大學、愛丁堡大學、University Paris-Saclay、Universit?t Münster、西安電子科技大學等 14 名不同機構的代表組成。
總結
以上是生活随笔為你收集整理的MindSpore:自动微分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow实现超参数调整
- 下一篇: TensorFlow Keras API