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