嗶哩嗶哩大規模 AI 模型推理實踐
本期作者
戴彥
嗶哩嗶哩資深算法工程師
楊典
嗶哩嗶哩資深開發工程師
一、背景
-
AI 算法複雜度逐年上升,需要高效的方式支持 AI 模型的推理和部署。
-
隨着應用規模的擴大,算力資源消耗也在快速增長,對線上資源產生極大的壓力。
-
B 站 AI 涉及計算機視覺(CV)、自然語言處理(NLP)、語音等多個場景,服務於內容安全審覈、內容理解和創作的上百個應用場景。
二、挑戰和目標
挑戰
-
線上資源隨着流量線性增長,在降本增效的背景下,希望控制線上資源的增長。
-
隨着大語言模型在工業界的推廣和落地,NLP 場景部署了 BERT,GPT,T5-Large 模型,模型複雜度明顯提升。
-
幀級別的視頻處理。例如,在 OCR(Optical character recognition) 場景下,24 小時內累計處理超過 10 億張 720p 圖片。這給模型推理和模型服務帶來了極大的壓力。
-
流量的增長和算法複雜度的提升給線上服務的 Response Time 和 QPS 帶來了巨大的挑戰。
-
大量長尾場景需要有統一的方式接入。
目標
-
提高推理的吞吐,降低資源增長速度。
-
改進 Response Time,提升服務的質量。
-
擴展新業務,落地更多場景。
三、InferX 推理框架 介紹
針對上述的問題,我們自研了推理框架,內部研發代號 InferX。架構圖如下所示。
通用推理框架可以拆分爲 Interpreter, Graph Optimizer 和 Backend 等組件。除了上述組件之外,InferX 支持若干模型計算前鏈路優化,例如稀疏化和量化。
近期 InferX 迭代主要包括瞭如下幾個方面。
-
支持 ONNX 鏈路,通過 ONNX 鏈路支持 Tensorflow 和 paddle 模型。提高模型的部署效率。
-
改進 InferX 運行時,優化資源獲取方式,減少了 CPU 佔用
-
模型前鏈路優化的能力:支持 int8 和 sparsity
-
擴展了圖像算子的能力。
四、InferX 推理框架計算前鏈路
InferX 計算前鏈路指模型在上線前進行的若干離線處理,當前主要包括量化和稀疏化。
模型量化:
-
相比於 FP16, INT8 TensorCore 的性能翻倍。
-
InferX 實現了量化 SDK,能夠較爲方便地進行模型量化。
-
PTQ 量化已經在 OCR 和版權場景落地。
-
上圖展示了 InferX 量化的流程。需要注意的是,InferX 實現了 TensorRT Lowering Graph Optimizer。如果跳過上述的 Graph Optimizer,量化的模型將會沒有任何加速。
-
下圖顯示了量化在版權模型推理場景的收益。量化模型精度近乎無損,同時實現了 2x 的加速比。
模型結構化稀疏:
-
NVidia 從 Ampere 架構開始支持 2:4 稀疏方案,2:4 Sparsity 能夠利用 Sparsity TensorCore 的性能。
-
訓練後 pruning,與算法協同完成 sparsity 模型的鏈路
-
支持稀疏化構建
-
相比於 dense 的 TensorCore,稀疏化 TensorCore 加速比爲 2x。但是由於稀疏化 tensor-core 只能作用於卷積,linear 算子,因此,模型總體的加速比低於 2x。例如,下圖中,長尾 kernel 無法使用 sparsity-tensorcore 進行優化。
- FP16 sparsity tensor-core 在部分模型上有精度的問題,工程上可以通過混合精度計算解決。
五、使用 InferX 優化重點場景
—— 以 OCR 爲例
項目背景:
-
OCR 是審覈能力的重要組成部分。
-
OCR 需要進行逐幀的處理,需要消耗大量的計算資源。
需要注意的是,本章節討論瞭如何優化一個重點場景,涉及到的技術不限於 InferX。
模型適配:
由於 OCR 中存在第三方的算子,無法直接導出,針對這一缺陷,InferX 支持了 ONNX 作爲模型的交換格式,實現了 ONNX Parser 將 ONNX 模型轉換爲圖中間表示。同時由於 OCR 中有第三方的算子可變形卷積(deformable convolution),需要在後端中添加算子的實現。後續 deformable convolution 這一技術在多個檢測場景中都得到了複用。
基於 CUDA 的可變形卷積的實現
-
通過優化 cuda 算子提高性能
-
實現了 NHWC 版本 deformable convolution,改進了 im2col 操作的訪存效率。
-
實現內存對齊,將矩陣乘法的 m/n/k 補齊到 8 的倍數,確保使用 tensor-core 進行計算(需要注意的是,這是 CUDA11 之前的約束,CUDA11 之後,TensorCore 的使用已經沒有了上述限制)。
-
下圖中展示 NCHW 和 NHWC Layout 在進行 im2col 時的差別,相比於原始的 NCHW 內存佈局,NHWC 是更加內存和 Cache 友好的內存佈局,能夠進行合併的內存訪問(Memory Coalescing)。
基於結構化稀疏的模型加速
-
InferX 支持稀疏化模型的構建並且支持顯式定義層精度,解決精度問題。
-
識別模型加速大約爲 25%。
基於 CUDA 的 JPEG Decoder 優化
-
libjpeg 的 decode 是 CPU 密集型任務, 過高的 CPU 佔用會影響服務的穩定性並且由於 libjpeg 已經非常成熟,很難優化。
-
實現了 inferx_cv 解碼庫,封裝了 nvjpeg,支持硬件解碼,CUDA 解碼和 CPU 解碼。
-
使用 CUDA 進行 jpeg 解碼, cuda 以非常低的 GPU 利用率解碼 jpeg,耗時僅爲 CPU 的 1/4。
視頻 / 直播 OCR 資源複用和同步化改造
-
舊的架構中,視頻 / 直播 OCR 是不同的模型服務。
-
舊的架構爲異步執行的 GRPC,但是視頻 / 直播 OCR 的協議不同。
-
通過模型服務的同步改造,統一了協議,視頻和直播共享模型服務,Response Time 和服務的穩定性都得到了提升。
-
模型服務增加優先級的支持,直播請求有更高的優先級。
-
通過利用視頻和直播服務的流量趨勢的差異,大幅提高了線上機器的 GPU 利用率。
基於上述優化的 OCR 服務,能夠以 80% 的 GPU 利用率穩定運行,並且保證服務具有較低的 response Time。與未優化前相比,總資源數節省了 63%。
六、Triton 模型服務介紹
相比於推理框架,模型服務的關注點是不同的,更加側重於提高吞吐和並行,提升整體資源利用率。
挑戰:
-
對於不同業務使用的不用類型的模型,提供統一的工程鏈路幫助模型快速上線。
-
部門自研的推理加速框架 InferX 能縮短推理時間,但同樣需要提高吞吐以增加 GPU 資源利用率。
-
很多業務使用了多個模型,模型間會有邏輯及依賴關係,需要對模型串聯 / 並聯提供編排能力。
針對上述問題,我們調研了常用的開源框架(Triton, TF-Serving 等),最終選擇了基於 Nvidia Triton Inference Server 的模型推理服務,它提供了以下功能:
-
支持多種深度學習框架,包括 Pytorch,Tensorflow,ONNX,Python,DALI,TensorRT 等框架生成的模型均可部署。並支持自定義的模型框架。
-
支持模型編排 BLS。對於多模型串聯 / 並聯場景可以使用 Python 編寫模型編排代碼來完成 (1) 前處理,(2)分發 tensor 到各個模型推理並回收結果,(3)後處理的整個流程。
-
支持動態 batch。即向模型服務發送請求不需要提前組 batch,Triton 可以根據需要自動完成組 batch 操作,並且可以配置 batch 的參數,如 prefered batch size,queue size,default timeout 等。
-
提供 HTTP/gRPC client,可以方便推理服務上游分發側接入。
-
支持 Metrics,自動採集服務實時 QPS,錯誤數,耗時,GPU 利用率等參數。
七、Triton 模型服務
+InferX 推理框架
我們將 InferX 推理框架集成進 Triton 模型服務,則構成了 AI 模型推理的終極狀態:低延時 + 高吞吐。
推理過程:
-
模型併發 http/gRPC 請求到達 Triton 後進入模型隊列,根據請求到達時間動態組成 batch,其實現效率遠高於手動組 batch,能使請求更加均衡。
-
batch 請求通過模型編排腳本 bls 的方式,異步分發到各個子模型上,使用 InferX 推理框架的子模型通過推理加速,在最短的時間內完成推理請求。
-
對於多模型並聯的場景,同樣的輸入 tensor,多個模型實現完美的並行操作,並在內部異步回收結果,對外整體仍是同步接口。
-
對於多模型串聯的場景,通過流水線複用覆蓋了多個請求的網絡傳輸及隊列等待時間,使得 GPU 能夠儘量少的處於 idle 狀態。
-
同步返回推理結果,並且統一上報監控指標。
性能收益:
-
AI 目前已經大量部署了 Triton 模型服務,相比於手寫的 python 服務框架,平均單實例的吞吐都有 3-8 倍的提高,節省了 50% 的 GPU 卡數,壓力測試下實現 GPU 利用率 >90%。
-
結合 InferX 推理框架 4-7 倍的推理加速,基本上把顯卡的性能壓榨到極致,在不增加 GPU 採購的情況下支持業務流量增長。
八、總結
通過自研 InferX 推理框架 + Triton 模型服務部署,顯著提升了計算資源使用效率,降低資源成本,保證服務響應時間和穩定,同時降低了 ai 服務開發部署成本,更快捷地支持各類型業務落地。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/S1047-0dLXL7Nw1tzuolgg