導讀
introduction
經過近幾年的技術演進,語義模型在百度搜尋場景中被廣泛地應用,消耗了大量的GPU資源,模型壓縮技術也随之得到大量研究和實踐。通過兼顧推理性能、業務效果和疊代效率的優化目标,我們成功地将INT8量化技術大面積地應用到了搜尋場景中,極大地提高了資源效能。此外,目前大模型正在被研究和應用,算力資源已經成為瓶頸,如何以更低的成本進行落地是一個非常熱點的問題。基于對模型壓縮技術的實踐和積累,我們能夠更好地助力大模型的探索和應用。
全文6287字,預計閱讀時間16分鐘。
GEEK TALK
01
搜尋語義模型現狀
ERNIE: Enhanced Representation through Knowledge Integration是百度在2019年4月的時候,基于BERT模型做的進一步優化,在中文的NLP任務上得到了state-of-the-art的結果。
近年來,ERNIE 1.0/2.0/3.0等語義模型在搜尋各個重點業務場景下得到了廣泛應用,包括相關性、排序等多個子方向,消耗了大量GPU資源。每個業務方向一般由多個模型組成鍊路來完成最終計算,整體搜尋業務所涉及的模型數量多、疊代快。目前,線上全流量模型超過幾百個,月級疊代近百次。語義模型的大量應用對搜尋産生了巨大影響,相關業務名額對模型精度的變化非常敏感。總的來說,在模型壓縮技術的工程實踐中,推理性能、業務名額和疊代效率三者的優化目标應當統一考慮:
1、推理性能:采用INT8量化,ERNIE模型的性能加速平均達25%以上。其主要影響因素包含輸入資料量大小(batch size、sequence length等)、隐藏節點數、非标準網絡結構與算子融合優化。
2、業務名額:以某相關性場景下的ERNIE模型為例,模型輸出在數值上的diff率不超過1%,在離線測試集上的評價名額達到幾乎無損。
3、疊代效率:離線量化達小時級,流水線式快速産出量化模型,不阻塞模型全生命周期的相關環節(如模型多版本疊代、小流量實驗、全量化推全等)。
GEEK TALK
02
模型量化簡述
簡而言之,模型量化就是将高精度存儲(運算)轉換為低精度存儲(運算)的一種模型壓縮技術。優勢如下:
- 更少的存儲開銷與帶寬需求:如每層權重量化後,32位比特壓縮到8比特甚至更低比特,模型占用空間變小;記憶體通路帶寬的壓力自然也會變小。
- 更快的計算速度:機關時間内執行整型計算指令比浮點計算指令更多;另,英偉達安培架構晶片還有專用INT8 Tensor core。
如果我們從不同的技術角度來看待它,那麼:
- 從映射函數是否是線性,分為線性和非線性。非線性量化計算較為複雜,一般主要研究線性量化,其公式如下:
- Q = clip(round(R/S) + Z),其中R: high precision float number,Q:quantized integer number,s:scale,z:zero point。
- 從零點對應位置區分,線性量化又分為對稱和非對稱。
△圖1:對稱與非對稱量化
以矩陣乘為例,計算公式如下:
= =
= ( − ) ( − ) = − − +
在實際應用中,兩者精度差異不大,對稱量化在推理上更容易實作、計算更快。
- 從量化粒度上,分為逐層量化、逐組量化和逐通道量化。第一種在推理上最易實作,性能更好,一般應用在輸入矩陣。第二和第三種在推理上難實作,但業務精度好,一般應用在權重矩陣。
- 從浮點矩陣中統計最大值是否截斷上,分為飽和量化和非飽和量化。一般權重采用非飽和量化;輸入/輸出矩陣資料分布不均勻,采用飽和量化。
- 從是否參與訓練上,分為訓練後量化(Post-Traning Quantization,PTQ)和量化感覺訓練(Quantization Aware Training, QAT)。從實踐上看,前者成本效益最高,在精度損失可接受範圍内能夠快速産出量化後模型,并獲得不錯的性能加速;後者需要結合訓練來看,往往是在PTQ造成精度損失過大時采取的進一步手段。
△圖2:PTQ與QAT流程
- 從是否在推理中動态生成尺度因子,分為線上(動态)量化和離線(靜态)量化。線上量化需要在推理過程中根據實際激活計算量化參數,會影響推理速度。
GEEK TALK
03
訓練後量化
結合實際的應用場景,我們率先對訓練後INT8量化技術進行了細緻研究和大規模實踐。本文中涉及到的硬體測試環境為GPU A10,CUDA 11.2,TensorRT8,工具鍊包括PaddlePaddle、PaddleInference、PaddleSlim等。
3.1 量化損失的精細化分析
低精度表示空間遠遠小于高精度表示空間,無論采用何種校準方法和校準資料,量化一定會帶來不同程度上的數值誤差。為了盡可能的減小誤差、不影響模型業務名額,那麼誤差的來源和解決方案應當被全面細緻地探究與分析。比如,哪些算子适合量化,每個算子量化後帶來的端到端誤差如何衡量,能否将誤差較大的部分算子不作量化等問題。
3.1.1 量化算子的選擇
通常情況下,應該優先對計算密集型算子(如mul、matmul;conv2d、depthwise_conv2d;pooling(pool2d);concat;elementwise_add等)進行量化,對非線性算子(如softmax,tanh,sigmoid,GeLU等)和非計算密集layer的算子不做量化。
△圖3:ERNIE模型經過算子融合後的FP16推理耗時占比情況
在ERNIE模型推理時,利用性能分析工具(nsight等)觀察會發現,FC(對應paddle中mul)相關kernel耗時占比超過70%,BGEMM(對應paddle中matmul)相關kernel占比接近10%。是以可以重點從這兩類算子入手進行量化,某線上ERNIE模型(輸入資料batch size=10,max sequence length=128)的測試情況如下:
△圖4:ERNIE模型FP16和INT8推理時性能加速與離線名額對比
對于FC,如果按照在推理時算子融合後網絡中所處的位進行劃分的話,可以人為地分成4類:
- QKV FC:推理時Q、K、V位置的3個FC會被融合在1個kernel進行計算,後續将其作為一個整體來看待。
- multi-head att-FC:經過多頭注意力計算後的線性算子。
- FFN FC:FFN中的2個FC,第1個FC和激活函數(如relu)會融合成1個kernel,第2個FC是獨立的kernel。
- 業務FC(未展現在示意圖中):在主體ERNIE結構後增加若幹FC進行微調,應用于不同的業務場景。推理時可能也會有算子融合操作。
之是以按照上述方式進行劃分:一是劃分粒度更精細,便于觀察和判定量化誤差來源;二是盡可能與目前的推理實作邏輯保持一緻,減少不必要的複雜改動。在算子類别+數量的多重組合下,更細粒度的量化,能更好地平衡性能加速和精度。
3.1.2 量化算子的敏感性
某層算子量化不當所帶來的損失會在層間逐漸傳遞累積,模型層數越深、寬度越大,損失可能也會越大。每層内算子的量化誤差對端到端名額的影響也是不一樣的。在實踐中,不同業務場景或者不同模型版本之間,量化後的業務名額損失不同,不一定都能在可接受範圍内。這種情況下,最直接的方法是找出造成損失較大的算子,并将其跳過不做量化。被量化的算子減少,損失也會随之降低。一個12層ERNIE模型結構中至少有12*6個FC算子,絕大部分按INT8計算,隻有幾個仍按FP16計算,其性能加速變化不會大,模型名額損失卻能更小。通過周遊每個FC算子對模型名額的敏感性大小,就能判定哪些FC可以不做量化。
△圖5:量化算子的敏感性分析方法
其中,打skip quant标記的粒度與上一節中提到的FC劃分方法保持一緻,比如QKV内3個FC全量化或全不量化。EMD距離是指量化前後在某個小資料集上的輸出值之間的分布距離,距離越小則被認為敏感性越強。
案例1:線上某ERNIE模型經過多次微調疊代後,全FC量化後的離線評價名額下降了約1.4%。利用敏感性分析方法後,跳過前8個敏感FC後,量化模型的離線評價名額損失已經很小,性能加速仍有30%以上。
△圖6:全FC量化與跳過4個FC不作量化時的推理加速與離線名額對比
案例2:線上某ERNIE模型,全FC量化後的離線評價名額下降了2%左右。隻跳過前1個敏感FC後,就很好地拉回了離線評價名額。
△圖7:全FC量化與跳過1個FC不做量化時的推理加速與離線名額對比
通過這個方法,我們能很好地兼顧性能加速和模型精度。經過大量實驗後發現,FFN内FC往往更加敏感,對業務名額的影響更大。
3.1.3 數值統計分析
量化過程本質上是尋找合适的映射函數,讓量化前後的輸入/出矩陣或權重矩陣更加拟合。溯源分析,輸入/出矩陣和權重矩陣分布情況從根本上決定了量化效果的好壞。對于量化效果極差的模型,一般會對相關矩陣再進行可視化地數值統計分析,這樣我們能夠發現是否存在大量異常點,校準算法是否适用等,進而倒推出更優的解決方法。
△圖8:ERNIE模型某FC權重數值分布的直方圖統計
3.2 校準資料增強
校準資料的優劣是決定量化損失大小的重要因素之一。
在搜尋某資訊業務場景中,使用了多頭輸出(一個輸出打分對應一個子任務)的ERNIE模型,如下:
△圖9:多頭輸出的模型結構示意圖
針對這個模型進行量化時,采用了訓練時部分資料作為校準集,結果發現子任務二的離線效果變得很差。通過分析模型訓練微調的過程後,将子任務一和子任務二的訓練資料進行等比例混合随機後再作為校準集,量化後的離線效果均得到了滿足。
△圖10:資料增強前,子任務一和子任務二在測試集上的打分分布情況
△圖11:資料增強後,子任務一和子任務二在測試集上的打分分布情況
校準資料是從訓練/測試資料中抽取的一個小集合,應當盡可能地保持資料分布的一緻性。有些模型的離線測試集并不完善,離線名額不能很好的反應量化損失,也可能會出現離線效果與線上實驗評價不一緻的情況,此時可以将線上資料混入離線資料共同作為校準資料。另外,模型疊代通常是在解決bad case,校準資料中也應當注意bad case的比例。
3.3 超參自動尋優
量化包括不同的校準算法(正在使用avg、abs_max、mse、KL、hist等)、校準資料量大小(batch size/num)、是否開啟偏置校準等超參,不同模型采用一組相同的量化參數,其損失變化也不同,是以超參自動尋優是必不可少的。一方面,通過自動化可以提高疊代效率;另一方面,更大的搜尋空間能夠獲得比人工調參更優的量化後模型。
△圖12:超參自動尋優方法
具體實作步驟:
- 選擇初始若幹組參數産出量化後模型,推理計算量化前後模型在校準集上的輸出值之間的分布距離(earth mover's distance,EMD)
- 根據超參和分布距離,建構随機樹
- 随機采樣若幹組不同的參數組合,依次插入随機樹内進行推理并計算相關距離
- 按照上一個步驟中分布距離最短的若幹組參數進行實際量化
- 從第一步再循環執行,直到分布距離收斂
相比于人工調優,這種方法能夠更快地搜尋到更優的量化後模型。比如:
△圖13:超參自動尋優實踐案例
實際上,同類型業務場景下,模型結構不會有很大變動,多次微調疊代後,超參自動尋優的參數往往會被鎖定在一個小範圍内。是以,我們會以類漏鬥形式進行量化模型尋優,即優先在事先圈定的小範圍參數内周遊量化,損失不滿足要求後再進行大範圍的搜尋。
3.4 效果評估
搜尋業務場景多種多樣,離線評價方式各異。如果考慮量化方案的通用性和多元度評估能力,建設獨立量化損失評價名額是必要的。類似于EMD的距離度量,打分分桶分布等方法可以作為輔助性名額來使用。
△圖14:一組模型量化前後在測試集上打分/輸出的數值diff情況
GEEK TALK
04
量化感覺訓練
相對于訓練後量化,量化感覺訓練的模型精度更好,但流程較為複雜。一般情況下,量化感覺訓練作為改善訓練後量化損失的進階技術手段。
4.1 無侵入式量化訓練
為了降低量化訓練難度,實際上我們會采用無侵入式方法,即推理模型+訓練資料。首先,對推理模型進行梯度恢複,轉換成參數可訓練的網絡,并插入fake quant op再轉換成量化後網絡;然後使用量化推理模型對量化後網絡進行塊量化損失監督,進而降低量化損失。
4.2 全算子量化
因為精度問題,訓練後量化中一般隻對部分算子做量化。進一步提升推理性能,對全算子量化的話,需要和量化感覺訓練結合起來。全算子量化是除了mul或者matmul算子進行量化外,又增加了layer norm相關算子和中間傳參過程。
△全算子與部分算子INT8量化的模型網絡示意圖
全算子量化在中文場景下表現出一些特異性:
- 量化後激活分布異常值多,推理端量化累計誤差變大。
- QKV的輸出激活scale值較大,推理端中間層輸出為0,導緻精度錯誤。
經過摸索,可行的解決方案如下:
- 先進行訓練後量化,采用直方圖校準方式,将激活scale值限制在某個較小範圍内。
- 固定離線量化産出的激活scale值,再進行權重逐通道的量化訓練。
在搜尋相關性某ERNIE模型上,輸入資料batch size=20,max sequence length=128時,具體實驗情況如下:
△圖16:全算子INT8量化的性能加速與離線評價實驗結果
4.3 SmoothQuant
SmoothQuant是無訓練、保持精度和通用的訓練後量化方案,試圖解決大模型(>6.7B)量化問題。簡單來說,基于權重易量化、激活不易量化的事實,通過離線的數學等價變換将激活的難度遷移到權重上,将激活和權重都變得較容易量化。
△17:SmoothQuant核心原理 [1]
在某些量化損失較大的小模型上,我們采用量化感覺訓練+SmoothQuant進行了相關實驗,也能有不錯的表現。比如:
△圖18:SmoothQuant實驗結果
GEEK TALK
05
展望
目前INT8量化技術已經線上上大規模應用,使整體GPU資源利用效率得到了極大提升,也支撐了更多更複雜模型的演進。
通過總結大量實踐經驗和技術調研,更低比特量化(如INT4)、INT8量化+Token剪枝多壓縮手段融合等正在實驗和落地中。
因為線上業務子方向衆多,模型多&疊代快,将實踐經驗抽象出通用方案勢在必行,建設平台化、流水線式管理模型整個生命周期能夠大幅度提高效率。同時,也可以将通用方法論應用到其他模型壓縮技術的工程應用上。
近期,大模型相關技術方向的研究相當火熱,模型壓縮也是熱點之一。初步調研後,在小模型上有效的技術手段有一部分是可以直接平遷到大模型上的,有一些則需要改進。比如,大模型訓練相當複雜,量化感覺訓練看起來不是那麼經濟。根據相關業界動态,PTQ-Weight Only,LLM.int8(),SmoothQuant等技術正在被研究和使用。
作者:把酒問青天
來源:微信公衆号:百度Geek說
出處:https://mp.weixin.qq.com/s/ZTJ-4iice1KhnrxGxE38Qw