允中 發自 凹非寺量子位 編輯 | 公眾號 QbitAI
百度飛槳於近期宣布,深度學習開源框架2.0搶先版本正式發布,進入2.0時代。其中一項重大升級,就是推出更加成熟完備的命令式編程模式,即通常說的動態圖模式。同時在該版本中將默認的開發模式定為動態圖模式,滿足用戶直接使用該模式完成計算機視覺、自然語言處理、語音、推薦等全場景的AI算法開發。可見飛槳團隊對採用動態圖模式開發的成熟度,以及未來主力推廣應用有著強大的自信和期待。
為什麼飛槳在開發模式升級上持續大量投入?
動態圖模式可以真正給廣大開發者帶來哪些實打實的好處?
本文將為你帶來深度解讀。
WHY動態圖?
深度學習框架在編程界面上,一般有兩種編程模式:命令式編程和聲明式編程,即動態圖和靜態圖。動態圖模式下程序可即時執行並輸出結果,編程體驗和調試便捷性更佳;靜態圖模式下需完成整體網絡結構的定義再執行,編程調試便捷性不夠,但能夠對全局編譯優化,更有利於性能的提升,並天然利於模型保存和部署。
飛槳同時支持這兩種編程模式,經過長期的深入技術探索和創新,已經實現同時兼顧兩種方式的優勢,達成了更有利於開發者的「動靜統一的理想國」:
模型開發時,採用動態圖模式,編程效率高調試方便;模型訓練部署時,支持動態圖一鍵式自動轉靜態圖,實現高性能訓練,並無縫銜接模型存儲和部署。
△ 圖1 飛槳動靜統一開發模式
在飛槳開源框架最新版本上,該模式已經達到很高的成熟完備度。開發者既可體驗到動態圖開發模式帶來的極大的便利性,用動態圖實現深度學習領域最前沿的模型算法;又可享受到經過極致優化的運行效率,並且可以很容易的將動態圖轉換為靜態圖來進行推理和部署。
接下來將一一為你揭曉真實體驗效果。
成熟完備的動態圖開發模式,帶來便捷體驗
成熟的動態圖模式,可以為開發者帶來極致體驗,更優雅地編程。總結一下,便利性主要體現在以下三方面:
調試程序的便利性。在動態圖開發模式下,用戶運行飛槳提供的API後,可即時返回運行結果,不需要先創建計算圖再運行,這樣便於用戶更加方便地組織代碼,交互式地調試程序。組建網絡的高效性。在動態圖開發模式下,用戶可以使用Python的條件判斷、循環等控制語句來執行模型算法的運算,不再需要使用靜態圖中的控制操作來執行運算,這樣便於用戶更加高效地組建網絡。構建模型的靈活性。在動態圖開發模式下,用戶可以根據控制流選擇不同的分支網絡,也可以更自然地構建權重共享的網絡,更自然地實現自定義損失函數和循環網絡、以及其他新穎的網絡結構,從而靈活地進行深度學習模型的創新。同時,在最新版本上,飛槳動態圖提供了對計算機視覺、自然語言處理、推薦系統、語音識別等領域主流算法模型的全面支持,同時也對前沿的學術研究提供了非常好的支持。已開放的動態圖模型數量達到了100+。這些模型都已開源在GitHub上,開發者可基於動態圖模型進行AI應用開發和前沿學術研究:https://github.com/PaddlePaddle/models/tree/develop/dygraph
更多飛槳動態圖應用實踐方法,歡迎訪問飛槳官網文檔。
△ 圖2.支持動態圖模式的算法模型(部分示例)
△ 圖3 支持動態圖模式的前沿學術論文中的模型(部分示例)
極致優化的動態圖運行效率,享受卓越性能
飛槳對動態圖運行效率的打磨,已持續數個版本,目前在主流的任務上,飛槳動態圖執行模式已經能夠達到與靜態圖媲美的水平,甚至達到業界領先水平。
△ 測試環境說明:CUDNN 7版本,CUDA 10.1版本,GPU V100單卡
在最新版本上,支持了自動混合精度和量化訓練功能,在大幅提升效率的同時,保證最終模型的效果和原來的一致。以自動混合精度為例,代碼實現如下:
混合精度訓練通過框架自動選擇訓練精度(AUTOMATIC CASTING)實現,過程如下圖所示。對於模型的每個執行操作,AutoCast模塊自動決定使用哪種精度的數據類型,例如:對於能夠使用fp16進行(比如conv,relu 等op),會優先使用fp16來進行運算,來提升執行效率;但是對於使用fp16會影響精度的op(比如exp,softmax運算等op),會自動轉換為fp32進行計算,保證收斂效果;對於單個op輸入的數據類型不一致的情況,會通過自動的轉換,使得能夠能夠支持運算。這些選擇都是框架會自動進行的,用戶僅需要調用上面示例的代碼即可。
△ 圖4 混合精度訓練AUTOMATIC CASTING流程
一行代碼實現動轉靜,無縫銜接高速推理部署
飛槳框架最新版本的動轉靜功能,Python語法覆蓋度處於業界領先水平,滿足用戶使用動態圖編程調試、自動轉靜態圖訓練部署的需求;並且轉換後性能幾乎無損,實現媲美靜態圖的效果。
一行代碼實現動轉靜。
動靜轉換的操作非常簡單,僅需添加一個裝飾器( @to_static ),框架就會自動將動態圖的程序,轉換為靜態圖的program,並使用該program訓練、保存為靜態圖模型以實現推理部署。
飛槳動轉靜功能除了簡單的一鍵式操作,還在進一步降低轉換出錯概率、提供便捷的轉換診斷工具方面做了大量工作,為用戶提供便捷的體驗。
廣覆蓋Python語法,降低轉換出錯概率:飛槳通過將Python寫的動態圖代碼轉寫為靜態圖代碼,並在底層自動使用靜態圖執行器運行。這種轉換方式使得用戶可以靈活使用Python語法及控制流來構建神經網絡模型,並且能夠利用靜態圖的圖優化策略進行加速。目前飛槳為用戶提供以下幾大類的語法支持,語法覆蓋度處於業界領先水平:
控制流相關關鍵詞,例如if-elif-else條件,while循環等;運算類型,例如and、or、not邏輯運算,類型轉化等;Python函數相關,例如print,len,lambda表達式等;報錯異常相關,例如assert等;Python基本容器,例如list,dict等。提供轉換Debug功能,便捷查看轉換信息:為了方便開發者查看轉換後的靜態圖代碼是否符合預期,飛槳提供了類似編譯器的易用功能來幫助用戶:
報錯信息對應到動態圖代碼行。設置斷點功能:通過 pdb.set_trace(),用戶可以進行斷點調試。中間狀態轉換查看:飛槳框架為用戶開放接口設定日誌級別,讓用戶可以列印中間狀態轉換的代碼。查看轉換後的靜態圖代碼:飛槳框架為用戶提供一個可以直接調用的StaticLayer class,可以讓用戶獲取轉換後的靜態圖代碼。動轉靜後性能媲美靜態圖。
性能方面,在保證用戶一鍵輕鬆實現動態圖轉靜態圖的同時,動態圖轉靜態圖之後的推理性能和靜態圖完全一致,兼顧動態圖易用性和靜態圖部署性能的需求。
聞說雙飛槳,翩然下廣津
以上即飛槳動態圖模式的最新創新進展,動態圖開發模式經過持續數個版本的打磨,無論是功能特性、易用性,還是性能水平,都達到了相當的成熟完備度,甚至達到業界領先水平。飛槳一直潛心於底層基礎技術的深耕,堅持為企業用戶和開發者提供最靈活易用的產業級深度學習框架,並以『用戶體驗的持續優化』和『產業實踐的打磨』作為迭代向前的兩個重要驅動輪。
未來飛槳的發展離不開廣大開發者的加持,期待更多的開發者加入飛槳,飛槳也將持續完善動態圖開發模式,開放更多動態圖實現的領先算法模型,優化運行效率,為開發者進行模型開發和開展前沿創新工作提供助力,踏著飛槳的戰船疾風向前。
— 完 —