有著“年度 AI 風(fēng)向標(biāo)”之稱GTC 大會是英偉達(dá)每年最重要的發(fā)布平臺之一,廣納當(dāng)今計(jì)算領(lǐng)域最熱門話題的相關(guān)培訓(xùn)和見解,并為廣大開發(fā)者創(chuàng)造與頂級專家交流的機(jī)會。12月15日-19日,GTC中國大會首次以線上大會的形式與開發(fā)者相見,共組織265場技術(shù)演講,演講者分別來自百度、阿里、騰訊、字節(jié)跳動等眾多知名企業(yè),以及清華大學(xué)、中科院計(jì)算所等知名高校。百度飛槳也貢獻(xiàn)了四個主題演講,現(xiàn)在為您帶來飛槳推理引擎性能優(yōu)化的演講實(shí)錄。
課程鏈接:https://nvidia.gtcevent.cn/forum/watch?session_id=CNS20191
AI Studio鏈接:https://aistudio.baidu.com/aistudio/education/group/info/2099
在一小時的演講中,來自飛槳資深研發(fā)工程師商智洲老師介紹了飛槳原生推理引擎,以及該引擎中針對 GPU 推理所做的優(yōu)化工作。飛槳推理引擎是飛槳模型推理部署的重要基礎(chǔ),已在百度內(nèi)部各核心業(yè)務(wù)線和眾多 ToB 交付的AI服務(wù)中經(jīng)過充分驗(yàn)證。
商智洲介紹,飛槳在不同的推理場景下,都有相應(yīng)的推理部署方案:
1、飛槳框架的原生推理引擎Paddle Inference,側(cè)重低延遲、高吞吐,主要目標(biāo)是X86和英偉達(dá)的GPU上的模型推理;
2、模型服務(wù)化部署工具Paddle Serving,側(cè)重線上模型管理,彈性服務(wù),A/B測試;
3、面向Mobile&IoT的壓縮工具PaddleSlim 和推理庫Paddle Lite,側(cè)重高性能,低資源使用,部署體積小;
4、Paddle.js支持瀏覽器場景的推理部署。
飛槳框架的原生推理引擎Paddle Inference有如下特點(diǎn):
1、通用性:Paddle Inference復(fù)用了訓(xùn)練框架的前向代碼,可以完全支持飛槳訓(xùn)練出來的模型的推理。
2、多硬件支持:包括X86、英偉達(dá)的Tesla GPU和Jetson GPU。
3、深度優(yōu)化:支持顯存和內(nèi)存的優(yōu)化;支持OP的融合;X86和英偉達(dá)GPU架構(gòu)下的高性能計(jì)算kernel;通過子圖的方式集成TensorRT,支持混合精度推理。
4、接口簡單:十幾行代碼即可完成C++、Python的推理過程。另外有Go語言和R語言的API接口。
商智洲進(jìn)一步介紹了Paddle Inference的性能優(yōu)化方法:
1、顯存優(yōu)化
在模型推理時,顯存占用主要有模型參數(shù)、OP輸出tensor和OP內(nèi)臨時顯存占用三個方面。我們分別針對這三個方面進(jìn)行優(yōu)化,從而減小顯存的占用:
首先,我們支持了參數(shù)共享。推理過程需要的參數(shù)是只讀的,沒有修改需求,因此創(chuàng)建多個predictor做并行推理時,參數(shù)只用保留一份實(shí)際存儲,以降低顯存占用。
其次,我們對OP輸出Tensor進(jìn)行空間復(fù)用:
如圖所示,對OP輸出Tensor進(jìn)行生命周期分析,對生命周期無重合的Tensor進(jìn)行空間復(fù)用,可以降低臨時空間的使用。
同時,我們對臨時顯存,開辟顯存池,統(tǒng)一分配和管理。我們以一個例子來說明飛槳推理引擎使用的顯存分配策略原理。假設(shè)顯存共8GB,參數(shù)fraction_of_gpu_memory設(shè)置為0.2,初始化的時候會開辟第一個bucket,大小是8GB * 0.2 = 1.6GB。如果在bucket的剩余空間大小范圍之內(nèi)申請顯存,就會直接分配。釋放的時候,顯存也會直接釋放到bucket里面,然后左右相鄰的碎片連接到一起,并不會釋放回系統(tǒng)。
而當(dāng)申請的顯存大小超過bucket剩余空間大小的時候,會開辟一個新的bucket,其大小是用fraction_of_gpu_memory乘以顯卡上剩余的顯存,例如當(dāng)前我們的8GB已經(jīng)使用了1.6GB,下一個bucket大小為 6.4GB * 0.2 = 1.28GB。
值得注意的是,當(dāng)申請的顯存大小超過一個bucket的時候,會直接調(diào)用cudaMalloc()和cudaFree(),對推理的性能有比較嚴(yán)重的影響,因此相關(guān)參數(shù)一定要根據(jù)實(shí)際環(huán)境合理配置。
OP的融合
根據(jù)OP的具體計(jì)算邏輯,可以把相鄰的兩個和多個OP融合成一個大的融合OP。以這里的Conv和BatchNorm為例,通過把圖示的幾個公式代入到一起,就得到最下面化簡之后的形式。
通過融合,首先參數(shù)的數(shù)量可以減少,這樣的好處是可以減小顯存/內(nèi)存的使用,同樣也會減小顯存和內(nèi)存的訪問。參數(shù)數(shù)量的減小,同樣也意味著計(jì)算量的減小,通過降低冗余的計(jì)算量,可以顯著提升推理的性能。同時由于融合帶來的OP數(shù)量減少,可以減少CUDA Kernel Launch次數(shù),降低調(diào)度開銷。
2、CUDAKernel優(yōu)化
我們對CUDA的kernel也進(jìn)行了相關(guān)優(yōu)化,首先是訪存優(yōu)化:
連續(xù)線程訪問連續(xù)數(shù)據(jù),形成數(shù)據(jù)合并訪問;連續(xù)線程寫入連續(xù)數(shù)據(jù),避免數(shù)據(jù)分區(qū)沖突。
盡量使同一個warp內(nèi)連續(xù)線程訪問連續(xù)的數(shù)據(jù),以充分例行Global Memory讀寫的并行性。具體需要對齊的字節(jié)數(shù)跟設(shè)備的架構(gòu)相關(guān),比如算力6.0以上的設(shè)備上并行訪問以32字節(jié)對齊。
盡量使用Shared Memory, 避免Bank Conflict。
Shared Memory是性能最接近寄存器的存儲類型,由多個大小相等的Bank組成,不同的Bank之間可以并行訪問,訪問同一個Bank的線程要順序執(zhí)行。因此在使用Shared Memory時要盡量分散線程對數(shù)據(jù)的訪問,防止Bank訪問沖突。
其次是計(jì)算優(yōu)化,首先考慮從算法上優(yōu)化,使用更優(yōu)的實(shí)現(xiàn),減少計(jì)算量;根據(jù)CUDA架構(gòu),合理安排block和thread的數(shù)量分配,增加計(jì)算并行性和計(jì)算單元的空間利用率;多使用快速指令,例如在滿足精度要求的情況下,使用CUDA提供的低精度數(shù)學(xué)庫函數(shù)替換單精度浮點(diǎn)的版本等。
3、TensorRT集成
TensorRT是英偉達(dá)推出的一個高性能的深度學(xué)習(xí)推理SDK,包括一個推理優(yōu)化器和一個運(yùn)行時環(huán)境,可以顯著地提高在英偉達(dá)GPU上的推理性能。和Paddle Inference類似,TensorRT也會做一些層的融合,顯存的復(fù)用等優(yōu)化措施,還支持FP32、FP16、INT8的混合精度預(yù)測。TensorRT提供了C++和Python的組網(wǎng)API,這樣就可以嵌入到自己的工程中去使用,這也是飛槳的使用方式。Paddle Inference的執(zhí)行流程主要分為兩步,第一步是初始化,加載模型進(jìn)行各種的優(yōu)化操作,第二步就是預(yù)測。TensorRT也有類似的兩個步驟,一是推理優(yōu)化器,對應(yīng)網(wǎng)絡(luò)的構(gòu)建、優(yōu)化階段;二是運(yùn)行時環(huán)境。這兩個階段使得Paddle Inference和TensorRT可以很方便地集成到一起。
4、PaddleSlim量化
我們針對飛槳模型壓縮工具PaddleSlim也進(jìn)行了相關(guān)優(yōu)化,首先是訓(xùn)練側(cè),訓(xùn)練中統(tǒng)計(jì)OP的輸出 scale并存儲在屬性中,帶權(quán)重的OP插入fake quant OP、fake dequant OP并統(tǒng)計(jì)weight scale。
然后是推理側(cè),獲取TRT子圖中所有OP輸入、輸出的scale,以及有權(quán)重OP的weight scale,但由于TRT不支持fake quant和fake dequant OP,需要將其在計(jì)算圖中刪除。最后,在TRT engine中設(shè)置獲取到的scale。
最后商智洲介紹了Paddle Inference對ERNIE模型優(yōu)化的例子,首先采用OP融合,將標(biāo)準(zhǔn)ERNIE模型的OP數(shù)量降低到原來的20%,且核心的融合OP都提供了FP16精度的實(shí)現(xiàn),在英偉達(dá)T4上ERNIE模型運(yùn)行耗時從224ms降至41.90ms(batch=32, layers=12, head_num=12, size_per_head=64)。然后通過對ERNIE模型變長輸入的支持,進(jìn)一步提升了ERNIE模型的推理性能。在Tesla T4上ERNIE模型的推理性能從905 sentences/s提升到2237 sentences/s(飛槳框架2.0RC1, CUDA10.1,cuDNN 7.6,TensorRT 6.0,OSS 7.2.1;模型ernie-base-2.0;QNLI數(shù)據(jù)集,Batchsize 32)。
【關(guān)于飛槳】
飛槳(PaddlePaddle)以百度多年的深度學(xué)習(xí)技術(shù)研究和業(yè)務(wù)應(yīng)用為基礎(chǔ),是中國首個開源開放、技術(shù)領(lǐng)先、功能完備的產(chǎn)業(yè)級深度學(xué)習(xí)平臺,包括飛槳開源平臺和飛槳企業(yè)版。飛槳開源平臺包含核心框架、基礎(chǔ)模型庫、端到端開發(fā)套件與工具組件,持續(xù)開源核心能力,為產(chǎn)業(yè)、學(xué)術(shù)、科研創(chuàng)新提供基礎(chǔ)底座。飛槳企業(yè)版基于飛槳開源平臺,針對企業(yè)級需求增強(qiáng)了相應(yīng)特性,包含零門檻AI開發(fā)平臺EasyDL和全功能AI開發(fā)平臺BML。EasyDL主要面向中小企業(yè),提供零門檻、預(yù)置豐富網(wǎng)絡(luò)和模型、便捷高效的開發(fā)平臺;BML是為大型企業(yè)提供的功能全面、可靈活定制和被深度集成的開發(fā)平臺。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請進(jìn)一步核實(shí),并對任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實(shí)內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )