嗶哩嗶哩大規(guī)模AI模型推理實(shí)踐
本期作者

一、背景
AI算法復(fù)雜度逐年上升,需要高效的方式支持AI模型的推理和部署。
隨著應(yīng)用規(guī)模的擴(kuò)大,算力資源消耗也在快速增長(zhǎng),對(duì)線上資源產(chǎn)生極大的壓力。
B站AI涉及計(jì)算機(jī)視覺(CV)、自然語言處理(NLP)、語音等多個(gè)場(chǎng)景,服務(wù)于內(nèi)容安全審核、內(nèi)容理解和創(chuàng)作的上百個(gè)應(yīng)用場(chǎng)景。
二、挑戰(zhàn)和目標(biāo)
挑戰(zhàn)
線上資源隨著流量線性增長(zhǎng),在降本增效的背景下,希望控制線上資源的增長(zhǎng)。
隨著大語言模型在工業(yè)界的推廣和落地,NLP場(chǎng)景部署了BERT,GPT,T5-Large模型,模型復(fù)雜度明顯提升。
幀級(jí)別的視頻處理。例如,在OCR(Optical character recognition) 場(chǎng)景下,24小時(shí)內(nèi)累計(jì)處理超過10億張720p圖片。這給模型推理和模型服務(wù)帶來了極大的壓力。

流量的增長(zhǎng)和算法復(fù)雜度的提升給線上服務(wù)的Response Time和QPS帶來了巨大的挑戰(zhàn)。
大量長(zhǎng)尾場(chǎng)景需要有統(tǒng)一的方式接入。
目標(biāo)
提高推理的吞吐,降低資源增長(zhǎng)速度。
改進(jìn)Response Time,提升服務(wù)的質(zhì)量。
擴(kuò)展新業(yè)務(wù),落地更多場(chǎng)景。
三、InferX推理框架 介紹
針對(duì)上述的問題,我們自研了推理框架,內(nèi)部研發(fā)代號(hào)InferX。架構(gòu)圖如下所示。
通用推理框架可以拆分為Interpreter, ?Graph Optimizer和Backend等組件。除了上述組件之外,InferX支持若干模型計(jì)算前鏈路優(yōu)化,例如稀疏化和量化。

近期InferX迭代主要包括了如下幾個(gè)方面。
支持ONNX鏈路,通過ONNX鏈路支持Tensorflow和paddle模型。提高模型的部署效率。
改進(jìn)InferX運(yùn)行時(shí),優(yōu)化資源獲取方式,減少了CPU占用
模型前鏈路優(yōu)化的能力:支持int8和sparsity
擴(kuò)展了圖像算子的能力。
四、InferX推理框架計(jì)算前鏈路
InferX計(jì)算前鏈路指模型在上線前進(jìn)行的若干離線處理,當(dāng)前主要包括量化和稀疏化。
模型量化:
相比于FP16, INT8 TensorCore的性能翻倍。
InferX實(shí)現(xiàn)了量化SDK,能夠較為方便地進(jìn)行模型量化。
PTQ量化已經(jīng)在OCR和版權(quán)場(chǎng)景落地。
上圖展示了InferX量化的流程。需要注意的是,InferX實(shí)現(xiàn)了TensorRT Lowering Graph Optimizer。如果跳過上述的Graph Optimizer,量化的模型將會(huì)沒有任何加速。
下圖顯示了量化在版權(quán)模型推理場(chǎng)景的收益。量化模型精度近乎無損,同時(shí)實(shí)現(xiàn)了2x的加速比。


?模型結(jié)構(gòu)化稀疏:
NVidia從Ampere架構(gòu)開始支持2:4稀疏方案,2:4 Sparsity能夠利用Sparsity TensorCore的性能。
訓(xùn)練后pruning,與算法協(xié)同完成sparsity模型的鏈路
支持稀疏化構(gòu)建
相比于dense的TensorCore,稀疏化TensorCore加速比為2x。但是由于稀疏化tensor-core只能作用于卷積,linear算子,因此,模型總體的加速比低于2x。例如,下圖中,長(zhǎng)尾kernel無法使用sparsity-tensorcore進(jìn)行優(yōu)化。

FP16 sparsity tensor-core在部分模型上有精度的問題,工程上可以通過混合精度計(jì)算解決。
五、使用InferX優(yōu)化重點(diǎn)場(chǎng)景?—— 以O(shè)CR為例
項(xiàng)目背景:
OCR是審核能力的重要組成部分。
OCR需要進(jìn)行逐幀的處理,需要消耗大量的計(jì)算資源。
需要注意的是,本章節(jié)討論了如何優(yōu)化一個(gè)重點(diǎn)場(chǎng)景,涉及到的技術(shù)不限于InferX。
模型適配:
由于OCR中存在第三方的算子,無法直接導(dǎo)出,針對(duì)這一缺陷,InferX支持了ONNX作為模型的交換格式,實(shí)現(xiàn)了ONNX Parser將ONNX模型轉(zhuǎn)換為圖中間表示。同時(shí)由于OCR中有第三方的算子可變形卷積(deformable convolution),需要在后端中添加算子的實(shí)現(xiàn)。后續(xù)deformable convolution這一技術(shù)在多個(gè)檢測(cè)場(chǎng)景中都得到了復(fù)用。

基于CUDA的可變形卷積的實(shí)現(xiàn)
通過優(yōu)化cuda算子提高性能
實(shí)現(xiàn)了NHWC 版本 deformable convolution,改進(jìn)了im2col 操作的訪存效率。
實(shí)現(xiàn)內(nèi)存對(duì)齊,將矩陣乘法的m/n/k補(bǔ)齊到8的倍數(shù),確保使用tensor-core進(jìn)行計(jì)算(需要注意的是,這是CUDA11之前的約束,CUDA11之后,TensorCore的使用已經(jīng)沒有了上述限制)。
下圖中展示NCHW和NHWC Layout在進(jìn)行im2col時(shí)的差別,相比于原始的NCHW內(nèi)存布局,NHWC是更加內(nèi)存和Cache友好的內(nèi)存布局,能夠進(jìn)行合并的內(nèi)存訪問(Memory Coalescing)。

基于結(jié)構(gòu)化稀疏的模型加速
InferX支持稀疏化模型的構(gòu)建并且支持顯式定義層精度,解決精度問題。
識(shí)別模型加速大約為25%。
基于CUDA的JPEG Decoder優(yōu)化
libjpeg的decode是CPU密集型任務(wù), 過高的CPU占用會(huì)影響服務(wù)的穩(wěn)定性并且由于libjpeg已經(jīng)非常成熟,很難優(yōu)化。
實(shí)現(xiàn)了inferx_cv 解碼庫(kù),封裝了nvjpeg,支持硬件解碼,CUDA解碼和CPU解碼。
使用CUDA進(jìn)行jpeg解碼, cuda以非常低的GPU利用率解碼jpeg,耗時(shí)僅為CPU的1/4。
視頻/直播OCR資源復(fù)用和同步化改造
舊的架構(gòu)中,視頻/直播OCR是不同的模型服務(wù)。
舊的架構(gòu)為異步執(zhí)行的GRPC,但是視頻/直播OCR的協(xié)議不同。
通過模型服務(wù)的同步改造,統(tǒng)一了協(xié)議,視頻和直播共享模型服務(wù),Response Time和服務(wù)的穩(wěn)定性都得到了提升。
模型服務(wù)增加優(yōu)先級(jí)的支持,直播請(qǐng)求有更高的優(yōu)先級(jí)。
通過利用視頻和直播服務(wù)的流量趨勢(shì)的差異,大幅提高了線上機(jī)器的GPU利用率。
基于上述優(yōu)化的OCR服務(wù),能夠以80%的GPU利用率穩(wěn)定運(yùn)行,并且保證服務(wù)具有較低的response Time。與未優(yōu)化前相比,總資源數(shù)節(jié)省了63%。
六、Triton模型服務(wù)介紹
相比于推理框架,模型服務(wù)的關(guān)注點(diǎn)是不同的,更加側(cè)重于提高吞吐和并行,提升整體資源利用率。

挑戰(zhàn):
對(duì)于不同業(yè)務(wù)使用的不用類型的模型,提供統(tǒng)一的工程鏈路幫助模型快速上線。
部門自研的推理加速框架InferX能縮短推理時(shí)間,但同樣需要提高吞吐以增加GPU資源利用率。
很多業(yè)務(wù)使用了多個(gè)模型,模型間會(huì)有邏輯及依賴關(guān)系,需要對(duì)模型串聯(lián)/并聯(lián)提供編排能力。
針對(duì)上述問題,我們調(diào)研了常用的開源框架(Triton, TF-Serving等),最終選擇了基于Nvidia Triton Inference Server的模型推理服務(wù),它提供了以下功能:
支持多種深度學(xué)習(xí)框架,包括Pytorch,Tensorflow,ONNX,Python,DALI,TensorRT等框架生成的模型均可部署。并支持自定義的模型框架。
支持模型編排BLS。對(duì)于多模型串聯(lián)/并聯(lián)場(chǎng)景可以使用Python編寫模型編排代碼來完成(1)前處理,(2)分發(fā)tensor到各個(gè)模型推理并回收結(jié)果,(3)后處理的整個(gè)流程。
支持動(dòng)態(tài)batch。即向模型服務(wù)發(fā)送請(qǐng)求不需要提前組batch,Triton可以根據(jù)需要自動(dòng)完成組batch操作,并且可以配置batch的參數(shù),如prefered batch size,queue size,default timeout等。
提供HTTP/gRPC client,可以方便推理服務(wù)上游分發(fā)側(cè)接入。
支持Metrics,自動(dòng)采集服務(wù)實(shí)時(shí)QPS,錯(cuò)誤數(shù),耗時(shí),GPU利用率等參數(shù)。
七、Triton模型服務(wù)+InferX推理框架
我們將InferX推理框架集成進(jìn)Triton模型服務(wù),則構(gòu)成了AI模型推理的終極狀態(tài):低延時(shí)+高吞吐。

推理過程:
模型并發(fā)http/gRPC請(qǐng)求到達(dá)Triton后進(jìn)入模型隊(duì)列,根據(jù)請(qǐng)求到達(dá)時(shí)間動(dòng)態(tài)組成batch,其實(shí)現(xiàn)效率遠(yuǎn)高于手動(dòng)組batch,能使請(qǐng)求更加均衡。
batch請(qǐng)求通過模型編排腳本bls的方式,異步分發(fā)到各個(gè)子模型上,使用InferX推理框架的子模型通過推理加速,在最短的時(shí)間內(nèi)完成推理請(qǐng)求。
對(duì)于多模型并聯(lián)的場(chǎng)景,同樣的輸入tensor,多個(gè)模型實(shí)現(xiàn)完美的并行操作,并在內(nèi)部異步回收結(jié)果,對(duì)外整體仍是同步接口。
對(duì)于多模型串聯(lián)的場(chǎng)景,通過流水線復(fù)用覆蓋了多個(gè)請(qǐng)求的網(wǎng)絡(luò)傳輸及隊(duì)列等待時(shí)間,使得GPU能夠盡量少的處于idle狀態(tài)。
同步返回推理結(jié)果,并且統(tǒng)一上報(bào)監(jiān)控指標(biāo)。
性能收益:
AI目前已經(jīng)大量部署了Triton模型服務(wù),相比于手寫的python服務(wù)框架,平均單實(shí)例的吞吐都有3-8倍的提高,節(jié)省了50%的GPU卡數(shù),壓力測(cè)試下實(shí)現(xiàn)GPU利用率>90%。
結(jié)合InferX推理框架4-7倍的推理加速,基本上把顯卡的性能壓榨到極致,在不增加GPU采購(gòu)的情況下支持業(yè)務(wù)流量增長(zhǎng)。
八、總結(jié)
通過自研InferX推理框架+Triton模型服務(wù)部署,顯著提升了計(jì)算資源使用效率,降低資源成本,保證服務(wù)響應(yīng)時(shí)間和穩(wěn)定,同時(shí)降低了ai服務(wù)開發(fā)部署成本,更快捷地支持各類型業(yè)務(wù)落地。
