隨着深度學習技術的快速發展,人工智能應用逐漸落地到各個生產生活場景,大大提升了生產效率,降低了生產成本。攜程旅遊的度假AI部門根據業務特徵需求,已將計算機視覺,自然語言處理,機器翻譯,語音識別和處理等多種主流AI技術逐步應用到旅遊業務的多個場景,包括智能客服平臺,搜索排序等。另外值得一提的是度假AI自主研發的機器翻譯技術爲全集團公司提供翻譯服務,將爲攜程推進國際化進程發揮重要作用。
爲了保證服務質量,模型複雜度逐漸提升,計算量不斷增加,由此帶來的問題也日益明顯:一是計算資源需求增加所帶來的成本上升;二是推理過程計算量過大導致響應時間延長,極大影響了用戶體驗,而訓練速度太慢則降低了生產效率。因此優化訓練和推理性能的需求尤爲迫切。
本文將着重介紹AI應用的推理性能優化方法,從系統以及模型等層面闡述推理性能優化的一般方法,並從實際應用出發,給出了具體優化的實踐案例和取得的部分成果以及對未來發展方向的一些展望和思考。
一、推理性能優化的背景和發展現狀
當前絕大多數人工智能應用都是基於深度學習技術,在數據驅動下建立算法模型,再經過訓練測試、工程部署和推理實現完成。某個具體的算法模型能否最終成功落地爲產品,滿足場景需求,推理性能是關鍵變量之一。影響這個關鍵變量的因素非常多,包括硬件配置,工程部署方式,算法和模型複雜度以及深度學習框架等。
1.1 推理服務的性能評價指標
深度學習推理服務根據應用需求和特徵不同,對性能需求也有所不同。比如計算機視覺和自然語言處理,機器翻譯等服務主要是計算密集型應用,對計算資源需求較高;搜索推薦類的應用的輸入數據特徵維度高,更偏向於I/O密集型。
無論是哪種應用,都用延遲和吞吐作爲常用的服務性能指標。在線類的應用延遲敏感,對響應時間要求高,而離線類的應用則側重於批量處理的高吞吐需求。
具體來說,延遲(latency)可以細分爲平均延遲,90線,95線和99線(99%的請求所達到響應時間)等,吞吐(throughput)則表示每單位時間處理的請求數(QPS/TPS),或者字符數(CPS)等,整體服務的併發度取決於兩者的共同表現。
除此之外,還有一系列用來反映服務處理質量的指標,跟深度學習模型和算法關係密切,主要有精確率,召回率等,或者針對具體應用的特定指標,比如機器翻譯常用的BLEU等。推理服務的終極目標就是滿足服務質量的指標需求,實現低延遲和高吞吐。
1.2 主流的深度學習框架
工業界將深度學習技術快速落地的便捷有效的方式就是藉助深度學習框架,部分框架兼顧訓練和推理,將二者合二爲一,比如TensorFlow,PyTorch和MXNet等主流框架,另外一些爲了實現推理的高性能,將訓練和推理進行分離,專門實現推理框架,比如ONNX Runtime,TensorRT等。
框架名稱 | 支持訓練 | 硬件平臺 | 模型種類 |
---|---|---|---|
Tensorflow | 是 | GPU/CPU/TPU | 較多 |
PyTorch | 是 | GPU/CPU | 多 |
MXNet | 是 | GPU/CPU | 多 |
TensorRT | 否 | GPU | 一般 |
ONNX Runtime | 否 | CPU/GPU | 一般 |
OpenVINO | 否 | CPU | 一般 |
PaddlePaddle | 是 | CPU/GPU | 多 |
針對推理的性能優化,除了開發新的推理框架,另一個方法是即時編譯技術(Just-In-Time)。即時編譯技術對於傳統的計算機編程已經不算是新名詞了,但是在AI領域的應用也是近兩年才發展起來。比較常用的編譯優化技術TVM目前已應用於深度學習的各個場景。
隨着tvm功能的逐步完善,業界也將tvm稱爲一種特殊的推理框架。TVM的設計初衷就是解決兼容性和推理性能問題,因爲硬件平臺越來越多樣化,深度學習框架也層出不窮,經過tvm編譯優化後可以方便地部署到不同硬件平臺,並且獲取滿意的推理性能。圖1是tvm的基本框架總覽圖,來自tvm主頁(https://tvm.apache.org/)。
Tvm主要優化包括:
- high level的計算圖優化,包括算子融合,內存複用,數據佈局轉換等,主要跟模型和框架相關;
- low level的算子優化,數據局部性優化,並行優化以及硬件原語優化等。結合傳統編譯優化技術,充分利用硬件平臺所提供的高性能數學庫,從而實現高性能。
- 另外值得一提的是,AutoTVM是它的突出特徵之一,在給定的搜索空間進行自動優化搜索,這一優化思想可以延伸到很多優化場景。
深度學習推理服務的性能跟其他傳統應用一樣受很多因素影響,包括模型本身的算法複雜度,硬件平臺,操作系統,部署方式,請求處理方式,是否緩存等等。深度學習框架的選擇和優化只是其中一個影響因子。
綜合來看,爲了實現深度學習的高性能推理服務,我們需要一套科學系統的推理優化方法論,基於該方法論,充分考慮各種影響因素並逐個擊破,才能達到最理想的符合應用場景需求的性能結果。
二、性能優化的一般方法論
無論是傳統應用還是深度學習應用,提升性能都有相應的方法論,使用正確的方法能夠事半功倍,大大提升效率。這一節內容我們重點探討深度學習的推理優化應該如何來展開。
2.1 優化流程
深度學習應用的優化流程如下圖所示。分爲以下幾步:
- 優化目標的確定取決於實際應用需求,主要體現在延遲目標和吞吐目標以及模型服務質量;
- 性能分析方法取決於所使用的深度學習框架,不同硬件平臺也會提供相應的分析工具;
- 性能瓶頸定位,確定最耗時的模塊和性能問題根源;
- 根據所定位的性能瓶頸,結合實際問題和已有優化經驗制定優化策略,評估優化方案;
- 執行優化策略,這一步是最耗費時間和人力成本的;
- 進行優化方案的性能測試,判斷是否達到目標,確保結果準確性和服務質量;
- 若不滿足要求,再進入下一輪性能分析、優化和測試;如此循環往復,直到達成目標,完成最終的優化方案。
2.2 優化方法
針對深度學習推理服務,很多優化方法跟傳統應用既有共性又有其特殊之處。從整體服務性能來看,可以簡單的將其分爲模型外的優化和針對模型的優化。其中模型外的優化跟傳統應用的優化類似,使用的方法也基本相同,比如添加多級緩存,異步處理,考慮負載均衡等。針對模型本身的優化是本節的重點,下圖是普通的深度學習推理服務的系統結構圖。基於該系統結構圖,本文將所有的優化分爲兩大類,分別是系統級優化和模型優化。
2.2.1 系統級優化
對於一個已訓練好的模型,模型複雜度和計算量都不變的前提下,通過優化代碼和運行時優化等手段提升軟件的執行效率,充分壓榨硬件平臺的性能和利用率,這樣的優化方式稱爲系統級優化。
系統級優化可以分爲多個層次,分別對應於深度學習推理服務的系統結構層,針對每一層都有相應的優化方法,根據不同硬件平臺有不同的實現。例如CPU平臺基於SIMD指令集加速和數學庫MKL-DNN加速,GPU平臺使用cuDNN加速等。下圖描述了系統級優化的不同層級和實現方法。
深度學習模型大多數是計算密集型應用,在優化的過程中,同樣需要遵循幾大原則,一是儘量提升代碼並行效率,充分發揮cpu或者gpu的核心利用率;二是提升計算訪存比,同時想辦法隱藏內存訪問延遲;三是儘量提升訪存命中率,降低訪存帶寬需求;四是充分發揮硬件的特殊性能,例如特定的硬件指令集等。
2.2.2 模型優化
實際AI應用部署時,充分提升硬件利用率的優化往往不足以達到推理目標需求,尤其對於計算複雜度較高的模型。因此需要保證模型質量的前提下,降低模型計算量,從而實現更好的優化效果,這種方式稱爲模型優化。模型優化的方式很多,如下圖所示。
這些方法可以同時使用,但是具體效果和對推理質量的影響取決於實際模型和應用。總結而言,低精度量化和模型剪枝廣泛應用於計算機視覺模型的壓縮優化,尤其是分類模型,但是優化效果依賴於硬件平臺的實現,例如CPU的VNNI指令集,GPU的Tensor core等。低秩估計更多是針對耗時較多的算子從數學角度進行優化,提升效果和壓縮效果比較有限。模型蒸餾概念比較廣泛,不依賴任何框架和硬件平臺,配合其他壓縮方法使用往往能收穫不錯的效果。模型優化除了提升性能,還可以減少參數量,從而減小了模型尺寸,降低內存佔用量,使得移動端部署更加可行。
將模型壓縮優化和系統級優化結合使用,能更好地提升總體推理性能。
三、優化實踐案例
本節內容將基於上述優化方法論提供一些優化案例。這些模型都已成功應用到攜程旅遊的實際業務中,包括圖形圖像,自然語言處理和機器翻譯等多個場景。
下面重點以Transformer翻譯模型爲例闡述優化實踐過程。Transformer翻譯模型基於Encoder-decoder結構,其中encoder主要包含self-attention, FFN(Feed Forward)和residual connection等結構,decoder包含self-attention,交叉attention,FFN和residual connection等。圖6給出的具體的圖結構。
無論是cpu還是gpu平臺,我們使用tensorflow的timeline進行性能分析發現:
- 典型的計算密集型應用,主要耗時集中在矩陣乘法,尤其是self-attention,交叉attention和ffn等;
- 對CPU和GPU的核心利用率都不高,cpu利用率只有40%左右;
- self-attention由大量零散的算子構成,同時還存在一些可避免的transpose操作;
由此可以確定優化方向:
- 優化矩陣乘法的性能,例如充分利用硬件平臺的高性能數學庫mkl和cuDNN
- 優化內存佈局,避免冗餘的訪存操作,尤其是transpose;因爲核心利用率低的原因之一很可能是內存訪問開銷過大,導致計算核心沒有充分利用,transpose操作和過多的數據存取操作或者內存佈局不合理都可能引起該問題;
- 針對硬件平臺進行微架構優化,提升多個核心的並行計算效率;
- 大量零散的python算子勢必帶來大量的op kernel啓動和存儲開銷,進行算子融合是最有效的解決方法。
因此,我們實現對transformer的算子融合和算子重寫,合理設計內存佈局,降低訪存開銷,再結合硬件平臺進行微架構和編譯運行優化,在cpu和gpu平臺都取得了明顯的提升。在實際線上業務部署時,同時採用批處理等模型外的優化措施,大大提升了翻譯服務的性能。
圖7 是Transformer翻譯模型基於T4 GPU平臺使用系統級優化和float16低精度優化後的結果,圖中給出的是token長度爲32不同batch大小時的響應時間。
實際測試中,我們發現token越大,float16的優勢越明顯。圖8是batch=1時,使用不同token長度進行測試的結果,縱座標表示優化前後的吞吐,每秒處理的token數。由於翻譯在GPU平臺耗時主要在於解碼,這裏的token指的都是解碼長度。
同樣的,對於其他模型,我們也是用類似的分析和優化措施,取得一定的優化成果,如圖9所示。所測試平臺爲CPU: Intel® Xeon® Silver 4210CPU @ 2.20GHz,CPU平臺使用8個邏輯核進行測試,以固定算例的平均響應延遲爲測試數據,優化後和優化前的加速比。其中,原始性能基於tensorflow1.14爲測試基準,Bert和Albert的batch_size=1, seq_len=128. Transformer翻譯模型的cpu結果展示的是token=16的算例結果。
目前展現的主要是系統級優化所取得的成果,經驗證,推理服務的質量指標也完全符合旅遊業務需求。對於推理服務的性能優化還在持續進行中,尤其是模型壓縮的優化,需充分權衡模型質量指標,值得更多嘗試,相信未來會有更大的提升。
四、未來發展與展望
AI理論和模型日益完善,應用場景對模型精度等推理服務質量有更高的要求,模型深度和寬度都可能變大,對推理服務的性能需求只會有增無減。業界各種優化方法也已廣泛使用並取得不錯的成效,但突出的問題是,如果每增加一個模型都需要手動一點點優化,對技術人員要求較高,而且需耗費大量時間和精力,長久來看通過自動優化提升效率是未來推理模型的發展趨勢。
尤其是編譯優化技術的推廣,tvm的出現便是一個先行者,就像當初各種語言編譯器的出現可以自動解決大部分傳統應用的性能問題一樣,深度學習的編譯優化技術也會在未來發揮更重要的作用。同時,自動優化的普及能極大提升優化效率,完成80%的優化工作,而對於性能的極致追求仍然依賴技術經驗由工程師手動優化來實現剩下的20%。
推理性能優化技術的逐步完善和提高將極大地降低人工智能應用的部署成本,提升生產效率,同時加快AI應用的落地,擴充應用場景,推動人工智能行業的整體發展。攜程度假AI也將持續結合實際業務需求,進一步提升模型性能,降低成本,推動AI技術在旅遊行業的全面落地,提供高質量的旅遊服務,更好地服務客戶。
作者介紹:
Shan Zhou,攜程算法專家,主要負責攜程度假AI應用在CPU和GPU平臺的性能優化,涉及計算機視覺,自然語言處理,機器翻譯和語音處理等多個領域。
本文轉載自公衆號攜程技術(ID:ctriptech)。
原文鏈接: