攜程AI推理性能的自動化優(yōu)化實(shí)踐
一、背景
近年來,人工智能逐漸在安防,教育,醫(yī)療和旅游等工業(yè)和生活場景中落地開花。在攜程旅游業(yè)務(wù)上,AI技術(shù)同樣廣泛覆蓋了多個(gè)旅游產(chǎn)品和旅游服務(wù)領(lǐng)域,攜程度假AI研發(fā)根據(jù)旅游的特定場景和業(yè)務(wù)需求,將自然語言處理,機(jī)器翻譯,計(jì)算機(jī)視覺,搜索排序等主流AI技術(shù)成功應(yīng)用于旅游度假的多個(gè)業(yè)務(wù)線,例如自由行,跟團(tuán)游,簽證,玩樂和租車等。
從技術(shù)角度,為了適應(yīng)不同的業(yè)務(wù)場景需求,涉及到多種AI技術(shù),包括傳統(tǒng)機(jī)器學(xué)習(xí),卷積神經(jīng)網(wǎng)絡(luò),Transformer等深度學(xué)習(xí)模型結(jié)構(gòu),以及知識圖譜和圖神經(jīng)網(wǎng)絡(luò)等技術(shù)領(lǐng)域。同時(shí),為了充分挖掘AI技術(shù)的優(yōu)勢,模型設(shè)計(jì)復(fù)雜度日漸提升,包括模型深度,寬度以及結(jié)構(gòu)復(fù)雜度等各個(gè)維度,計(jì)算量的增大使得AI推理性能瓶頸日益凸顯,尤其是實(shí)時(shí)性的業(yè)務(wù)需求對推理速度要求更高。為了追求最佳推理性能,往往需要手動進(jìn)行逐個(gè)優(yōu)化,涉及的開發(fā),部署和溝通成本都很高。主要問題集中在:
- 模型結(jié)構(gòu)種類多,性能瓶頸差異較大,適用的優(yōu)化方法各有不同,手動優(yōu)化成本高;
- 優(yōu)化方法眾多,自上而下,涉及多種模型壓縮方式,系統(tǒng)級,運(yùn)行時(shí)優(yōu)化等,手動優(yōu)化門檻高;
- 逐個(gè)手動優(yōu)化,可推廣性差,技術(shù)覆蓋面有限;
- 硬件平臺的差異,需要針對性調(diào)優(yōu),導(dǎo)致優(yōu)化的人力成本和部署成本都很高;
- 新模型的發(fā)布和迭代,需要應(yīng)用優(yōu)化方法,涉及較高的溝通和接入成本,同時(shí)帶來了性能的不穩(wěn)定性;
- 模型壓縮技術(shù)對不同模型的優(yōu)化效果有所差異,可能需要進(jìn)行模型的再訓(xùn)練,訓(xùn)練和數(shù)據(jù)準(zhǔn)備流程較長,效率低下。
因此,為了降低優(yōu)化,部署和迭代成本,提高工作效率,并保證性能穩(wěn)定,我們嘗試搭建模型自動化優(yōu)化平臺,旨在為算法模型提供更全面易用,穩(wěn)定性更好,使用和維護(hù)成本更低的優(yōu)化解決方案。
二、優(yōu)化平臺的主要框架
從性能優(yōu)化方法論的角度,無論是自動優(yōu)化還是手動優(yōu)化,主要關(guān)注以下兩大方向:
- 降低算法復(fù)雜度:可通過調(diào)整或簡化模型結(jié)構(gòu),或者保持結(jié)構(gòu)不變,改進(jìn)算法實(shí)現(xiàn)效率;
- 充分發(fā)揮軟硬件性能:模型結(jié)構(gòu)和算法不變,優(yōu)化軟件執(zhí)行效率,使用硬件優(yōu)勢特征,最大化硬件執(zhí)行效率。
圍繞這兩大優(yōu)化方向以及人工智能的主流技術(shù)方向,優(yōu)化平臺的整體架構(gòu)層自下而上可以劃分為:
- 硬件平臺和操作系統(tǒng)層,包含x86架構(gòu)的CPU,GPU,ARM,F(xiàn)PGA等多種平臺,操作系統(tǒng)主要是Linux OS;
- 引擎框架層,主要是Tensorflow,Pytorch等人工智能主流框架;
- 推理優(yōu)化層,主要是由我們結(jié)合業(yè)務(wù)場景和實(shí)際需求進(jìn)行自主研發(fā)的優(yōu)化技術(shù),包含高性能算子庫,圖優(yōu)化和修改工具以及量化蒸餾等模型壓縮模塊;
- 算法模型:包含業(yè)界常用模型,例如以卷積為主要結(jié)構(gòu)的CV模型,Resnet,GoogleNet,YOLO等;以Transformer為主要結(jié)構(gòu)的NLP模型Bert,Albert等;
- 應(yīng)用場景:主要體現(xiàn)在旅游場景中的實(shí)際應(yīng)用,例如智能客服平臺,機(jī)器翻譯,搜索排序等應(yīng)用。
三、自動化優(yōu)化流程
優(yōu)化平臺的搭建能夠系統(tǒng)有效地將優(yōu)化技術(shù)整合起來,并快速應(yīng)用于實(shí)際需求,但是如果不實(shí)現(xiàn)自動化優(yōu)化,優(yōu)化效率比較低,部署和迭代成本,溝通和接入成本高。因此我們建立了自動化優(yōu)化流程,將所支持的優(yōu)化技術(shù)涵蓋在內(nèi),結(jié)合模型訓(xùn)練平臺,數(shù)據(jù)標(biāo)注平臺,從模型設(shè)計(jì),模型訓(xùn)練到模型推理優(yōu)化,模型部署全鏈路,實(shí)現(xiàn)零介入無感知的優(yōu)化效果,大大提升工作效率以及整體優(yōu)化效果的穩(wěn)定性。
圖2所示為數(shù)據(jù)平臺,模型訓(xùn)練平臺,模型優(yōu)化和部署的大概流程。具體有哪些優(yōu)化手段,如何進(jìn)行自動化實(shí)現(xiàn)的流程細(xì)節(jié)如圖3所示。
四、功能模塊
自動化優(yōu)化平臺的主要功能模塊分四部分:
- 高性能算子庫,包括算子重寫,算子合并等多個(gè)優(yōu)化,支持attention,softmax,Layer norm等多個(gè)常用算子;
- 計(jì)算圖優(yōu)化,主要進(jìn)行計(jì)算圖搜索,修改替換模型圖結(jié)構(gòu),合并生成新的模型文件進(jìn)行推理部署;同時(shí)包含常用的圖優(yōu)化和修改工具;
- 模型壓縮模塊,包括模型靜態(tài)和動態(tài)量化,模型剪枝和蒸餾等;
- 模型部署優(yōu)化,主要提供部署的優(yōu)化方案,包括部署設(shè)計(jì),運(yùn)行時(shí)環(huán)境配置等。
4.1 高性能算子庫
該模塊主要實(shí)現(xiàn)了常用的算子以及激活函數(shù),包含基礎(chǔ)算子,例如卷積,全連接層,batch norm,softmax等等以及合并后的經(jīng)典的模型結(jié)構(gòu),例如transformer encoder,decoder等,基于tensorflow實(shí)現(xiàn),采用c++實(shí)現(xiàn),支持CPU和GPU平臺的優(yōu)化。
具體的優(yōu)化方法涵蓋了:
- 算法改進(jìn),例如卷積算法的實(shí)現(xiàn),將im2col和winograd卷積相結(jié)合,針對不同卷積核大小自適應(yīng)使用最佳算法,實(shí)現(xiàn)最快的速度;
- 內(nèi)存重構(gòu),以BERT模型為例,最核心也是最耗時(shí)的計(jì)算模塊之一就是多頭自注意力機(jī)制multi-head self-attention,包含了大量的矩陣乘法計(jì)算,根據(jù)算法原理,包括query層,key層和value層的獲取,query和key點(diǎn)乘等等,更重要的是當(dāng)前的tensorflow算法實(shí)現(xiàn)包含了大量的行列變換操作(transpose),transpose帶來大量的內(nèi)存訪問開銷,這些問題可以通過內(nèi)存重構(gòu)來避免。
同時(shí)很多矩陣乘法實(shí)現(xiàn)可以通過批量矩陣乘法調(diào)用提升計(jì)算效率,從而帶來運(yùn)行速度的提升。如下圖5所示,self-attention機(jī)制原始實(shí)現(xiàn)流程包含了三次冗余的transpose操作,T(a)表示張量a的transpose形式。通過對內(nèi)存重構(gòu)可以避免這三次transpose操作。如圖6所示,優(yōu)化后的計(jì)算流程不包含transpose。
二者對比,可以明顯看出,優(yōu)化后減少了4次transpose操作,也就是減少了內(nèi)存訪問的開銷,同時(shí)對于矩陣乘法,調(diào)用批量矩陣乘法替代單個(gè)矩陣乘法操作,效率更高。
- Intrinsic指令集優(yōu)化,例如在CPU平臺使用合適的向量化指令A(yù)VX512以及專門針對AI的VNNI指令等;
- 算子融合,以transformer為例,每一層包含大量的零散算子,包括self-Attention,GELU激活函數(shù),歸一化Layer Normalization算子等多個(gè)零散算子,為了減少數(shù)據(jù)訪問開銷,將多個(gè)算子進(jìn)行融合,實(shí)現(xiàn)新的GPU kernel。通過算子合并,算子數(shù)量減少約90%,模型涉及內(nèi)存搬移的操作去除率100%,90%的時(shí)間集中在核心計(jì)算的kernel launcher。如圖7所示。
4.2 模型壓縮
模型壓縮是提升推理性能的另一個(gè)有效手段,主要是指在算法層面上的模型優(yōu)化,保證精度的前提下,通過合理的降低模型結(jié)構(gòu)或者參數(shù)量,從而實(shí)現(xiàn)減少整個(gè)模型計(jì)算量的目的。
模型壓縮的主要作用有:
- 簡化模型結(jié)構(gòu),降低計(jì)算復(fù)雜度,提升推理速度
- 減少模型參數(shù)和模型尺寸,降低對內(nèi)存的占用。
宏觀上來講,當(dāng)前的優(yōu)化平臺支持的模型壓縮方法有模型蒸餾,模型剪枝,低精度量化等。
4.2.1 模型蒸餾
模型蒸餾采用的是遷移學(xué)習(xí),通過預(yù)先訓(xùn)練好的復(fù)雜模型(Teacher model)的輸出作為監(jiān)督信號去訓(xùn)練另外一個(gè)簡單的學(xué)生網(wǎng)絡(luò)(Student Model),從而實(shí)現(xiàn)對模型的簡化,減少模型參數(shù)。模型蒸餾普遍性很強(qiáng),可有效提升小模型準(zhǔn)確率,但是調(diào)參相對困難,主要的核心的問題包括,如何選擇特征層如何設(shè)計(jì)損失函數(shù),學(xué)生模型的設(shè)計(jì)和數(shù)據(jù)集的選擇等等。圖8是我們壓縮框架中實(shí)現(xiàn)的對Transformer的decoder模型的蒸餾實(shí)現(xiàn)。
總損失函數(shù)構(gòu)成:
其中α和β分別表示相應(yīng)的損失值權(quán)重系數(shù),α∈(0,1],β∈R,Lsoft是 Teacher網(wǎng)絡(luò)的輸出與Student網(wǎng)絡(luò)模型輸出的損失值,Lhard - 訓(xùn)練數(shù)據(jù)語料真實(shí)標(biāo)簽與Student網(wǎng)絡(luò)模型輸出的損失值,LAT_FMT - Teacher和Student網(wǎng)絡(luò)模型的Decoder 的中間輸出內(nèi)容損失值,采用逐級分層蒸餾的方法,最終推理速度加速比達(dá)到2倍,精度損失BLEU值在可接受范圍內(nèi)(4%)。
4.2.2 低精度量化
低精度量化更多是從計(jì)算機(jī)硬件的設(shè)計(jì)角度,修改數(shù)據(jù)類型,降低數(shù)據(jù)精度,從而進(jìn)行加速,依賴于硬件實(shí)現(xiàn)。量化的方式也包含多種,訓(xùn)練后量化(PTQ post training quantization),訓(xùn)練時(shí)量化(QAT,quantization aware traning)等。
目前我們優(yōu)化平臺支持float16和int8,其中int8量化只支持PTQ方式,一般情況下,為了保證模型精度,采用int8量化需要對量化后的模型校準(zhǔn),校準(zhǔn)方式實(shí)現(xiàn)依賴于復(fù)雜的數(shù)學(xué)算法,目前較常用的是KL散度,對于CV模型,精度損失可接受。對于基于Transformer的NLP模型,精度損失較大,我們目前只支持GPU平臺的float16實(shí)現(xiàn)。相比于float32,存儲空間和帶寬減半,精度幾乎無損失,吞吐提升可達(dá)3倍。
4.2.3 模型剪枝
剪枝的主要思想是將權(quán)重矩陣中相對“不重要”的權(quán)值剔除,然后再對網(wǎng)絡(luò)進(jìn)行微調(diào);方法簡單,壓縮效果可控,但是在剪枝粒度和方法選擇需要認(rèn)為定義規(guī)則,而且非結(jié)構(gòu)化的剪枝效果需要依賴于硬件平臺實(shí)現(xiàn)。模型剪枝在計(jì)算機(jī)視覺領(lǐng)域廣泛使用,并取得了不錯(cuò)的效果。
圖9舉例實(shí)現(xiàn)了一種典型的結(jié)構(gòu)化剪枝的方法[4]。我們針對CV模型,在原始模型中加入batch_normal層,對batch_normal的參考論文2:ChannelPruning for Accelerating Very Deep Neural Networks論文中提出利用channel進(jìn)行剪枝,實(shí)驗(yàn)如下:在超分辨率的實(shí)驗(yàn)中,考慮在原始模型中加入batch_normal層,然后對batch_nomal的α值做正則化,最后利用該值作為依據(jù)進(jìn)行剪枝,對訓(xùn)練好的模型中的batch_normal層的參數(shù)α進(jìn)行分析,針對不同的卷積模型應(yīng)用同樣的方式,發(fā)現(xiàn)有些模型有近一半的參數(shù)在1e-5數(shù)量級,此外同一層中的分布方差極小,據(jù)此對模型進(jìn)行通道級別的剪枝并進(jìn)行fine tune訓(xùn)練,剪枝效果明顯,模型大小減少到原來的1/4,精度不變的前提下,加速比可達(dá)4倍。而對于yolov3模型,大部分參數(shù)差異不大(MAP降低2%),可剪掉的有限,所以為了保持精度,參數(shù)量減半,加速比1.5x左右。
4.3 接口設(shè)計(jì)
模型優(yōu)化平臺采用即插即用的模塊化設(shè)計(jì),可無縫對接模型訓(xùn)練平臺,模型發(fā)布平臺等。
- 訓(xùn)練平臺的調(diào)用和反饋:無縫對接訓(xùn)練平臺,python接口調(diào)用或者web服務(wù)接口;如果需要重新訓(xùn)練,向訓(xùn)練平臺申請接口;
- 優(yōu)化結(jié)果的接口提供:支持*.pb格式的模型輸出;
具體使用方式如圖10和圖11所示。
圖11給出了模型壓縮模塊的調(diào)用方式。
五、優(yōu)化成果
以實(shí)際應(yīng)用機(jī)器翻譯的Transformer模型為例,所測試平臺為CPU: Intel(R) Xeon(R) Silver 4210CPU @ 2.20GHz; GPU:Nvidia T4,以固定算例的平均響應(yīng)延遲為測試數(shù)據(jù),優(yōu)化后和優(yōu)化前的加速比如下圖12所示。
其中,原始性能基于tensorflow1.14為測試基準(zhǔn),在GPU平臺框架層優(yōu)化和編譯運(yùn)行時(shí)等多層優(yōu)化實(shí)現(xiàn),圖13是Transformer翻譯模型基于T4平臺使用模型壓縮和高性能算子庫優(yōu)化之后的對比結(jié)果,圖中給出的是token長度為64,不同batch大小時(shí)的延遲和吞吐提升比例,實(shí)際中token越大,float16的優(yōu)勢越明顯。
基于CPU硬件平臺,針對CV和NLP模型(例如yolov3,bert和albert等),也取得了不錯(cuò)的優(yōu)化效果,延遲加速比最高達(dá)到5倍以上。
六、未來展望
AI優(yōu)化的潛力和需求很大,因?yàn)锳I理論和模型的日益完善,應(yīng)用場景對模型精度等推理服務(wù)質(zhì)量的更高要求,必然使得模型結(jié)構(gòu)和計(jì)算復(fù)雜度越來越高,對推理服務(wù)的性能需求只會有增無減。從成本和效率多個(gè)角度考慮,自動優(yōu)化是必然趨勢,并且業(yè)界也都陸續(xù)開展了相關(guān)研究,取得了一些進(jìn)展。
依舊從兩方面來看,同樣是基于自動化優(yōu)化這個(gè)大方向,算子優(yōu)化等系統(tǒng)級優(yōu)化最終都會通過tvm等AI編譯器實(shí)現(xiàn),而模型壓縮則側(cè)重于使用AutoML的思想,基于當(dāng)前平臺和實(shí)際需求,通過結(jié)構(gòu)搜索找到符合要求的最簡化的網(wǎng)絡(luò)。當(dāng)然,當(dāng)前的蒸餾,剪枝等傳統(tǒng)壓縮方法也可以跟AutoML的思想相結(jié)合,同樣能夠高效地實(shí)現(xiàn)壓縮效果。
因此,我們的自動化優(yōu)化平臺也正是基于自動化優(yōu)化的思路,綜合考慮業(yè)務(wù)場景需求,參考業(yè)界更先進(jìn)的優(yōu)化技術(shù),為旅游場景的AI模型帶來更加高效的優(yōu)化方案,推動AI技術(shù)在旅游業(yè)務(wù)更好落地。