地址標準化服務AI深度學習模型推理優化實踐
導讀
深度學習已在面向自然語言處理等領域的實際業務場景中廣泛落地,對它的推理性能優化成為了部署環節中重要的一環。推理效能的提升:一方面,可以充分發揮部署硬體的能力,降低使用者回應時間,同時節省成本;另一方面,可以在保持回應時間不變的前提下,使用結構更為複雜的深度學習模型,進而提升業務精度指標。
本文針對地址標準化服務中的深度學習模型進行了推理效能最佳化工作。透過高效能算子、量化、編譯最佳化等最佳化手段,在精度指標不降低的前提下,AI模型的模型端對端推理速度最高可獲得了4.11倍的提升。
1. 模型推理效能最佳化方法論
模型推理效能最佳化是AI服務部署時的重要環節之一。一方面,它可以提升模型推理的效率,充分釋放硬體的效能。另一方面,它可以在保持推理延遲不變的前提下,使得業務採用複雜度更高的模型,進而提升精度指標。然而,在實際場景中推理效能最佳化會遇到一些困難。
1.1 自然語言處理場景最佳化難點
#典型的自然語言處理(Natural Language Processing, NLP)任務中,循環神經網路( Recurrent Neural Network, RNN)以及BERT[7](Bidirectional Encoder Representations from Transformers.)是兩類使用率較高的模型結構。為了便於實現彈性擴縮容機制和線上服務部署的高性價比,自然語言處理任務通常部署於例如Intel® Xeon®處理器這樣的x86 CPU平台。然而,隨著業務場景的複雜化,服務的推理計算效能要求越來越高。以上述RNN與BERT模型為例,其在CPU平台上部署的效能挑戰如下:
- RNN
##循環神經網路是一類以序列(sequence)資料為輸入,在序列的演進方向進行遞歸(recursion)且所有節點(循環單元)以鍊式連接的遞歸神經網路。實際使用常見的RNN有LSTM,GRU以及衍生的一些變體。在計算過程中,如下圖所示,RNN結構中每一次的後級輸出都依賴對應的輸入和前級輸出。因此,RNN可以完成序列類型的任務,近年來在NLP甚至是電腦視覺領域被廣泛使用。 RNN相較於與BERT而言,計算量較少,模型參數共享,但其計算時序依賴性會導致無法對序列進行平行計算。
RNN結構示意圖
BERT
- #BERT
BERT模型結構示意圖##########1.2 模型推理最佳化策略############基於上述推理效能挑戰的分析,我們認為從軟體堆疊層級進行模型推理最佳化,主要有以下策略:###############模型壓縮:包含量化、稀疏、剪枝等## ##########特定場景的高效能算子############AI編譯器最佳化################# #量化#########
模型量化是指將浮點激活值或權重(通常以32位元浮點數表示)近似為低位元的整數(16位元或8位元),進而在低位元的表示下完成計算的過程。通常而言,模型量化可以壓縮模型參數,進而降低模型儲存開銷;並且透過降低存取權和有效利用低位元運算指令(如Intel® Deep Learning Boost Vector Neural Network Instructions,VNNI),取得推理速度的提升。
給定浮點值,我們可以透過以下公式將其映射為低位元值:
其中和是透過量化演算法所得。基於此,以Gemm操作為例,假設存在浮點計算流程:
我們可以在低位元域完成對應的計算流程:
高效能算子
在深度學習框架中,為了保持通用性,同時兼顧各種流程(如訓練),算子的推理開銷存在著冗餘。而當模型結構確定時,算子的推理流程僅是原始全量流程個子集。因此,當模型結構確定的前提下,我們可以實現高性能推理算子,對原始模型中的通用算子進行替換,進而達到提升推理速度的目的。
在CPU上實現高效能算子的關鍵在於減少記憶體存取和使用更有效率的指令集。在原始算子的計算流程中,一方面存在著大量的中間變量,而這些變量會對記憶體進行大量的讀寫操作,進而拖慢推理的速度。針對這種情況,我們可以修改其計算邏輯,以降低中間變數的開銷;另一方面,算子內部的一些計算步驟我們可以直接呼叫向量化指令集,對其進行加速,如Intel® Xeon®處理器上的高效率的AVX512指令集。
AI編譯器最佳化
#隨著深度學習領域的發展,模型的結構、部署的硬體呈現出多樣化演進的趨勢。將模型部署至各硬體平台時,我們通常會呼叫各硬體廠商推出的runtime。而在實際業務場景中,這可能會遇到一些挑戰,如:
- #模型結構、算子類型的迭代的速度會高於廠家的runtime,使得有些模型無法快速基於廠商的runtime完成部署。此時需要依賴廠商進行更新,或是利用plugin等機制實現缺失的算子。
- 業務可能包含多個模型,這些模型可能由多個深度學習框架訓得,此外模型可能需要部署至多個硬體平台。此時需要將這些格式不同的模型轉換至各個硬體平台所需的格式,同時要考慮各推理框架實現的不同導致的模型精度性能變化等問題,尤其是像量化這類對於數值差異敏感度較高的方法。
AI編譯器就是為了解決上述問題而提出的,它抽象化了多個層次來解決上述的一些問題。首先,它接受各個前端框架的模型計算圖作為輸入,並透過各類Converter轉換產生統一的中間表示。隨後,算子融合、循環展開等圖優化pass會作用至中間表示,以提升推理表現。最後,AI編譯器會基於最佳化後的計算圖進行特定硬體平台的codegen,產生可執行的程式碼,過程中會引入諸如stitch、shape constraint等最佳化策略。 AI編譯器有很好穩健性、適應性、易用性,並且能夠收穫顯著優化收益。
本文中,阿里雲機器學習平台PAI團隊聯合英特爾資料中心軟體團隊、英特爾人工智慧和分析團隊、達摩院NLP位址標準化團隊,針對地址標準化服務的推理性能挑戰,合作實現了高性能的推理優化方案。
2. 地址標準化介紹
公安政務、電商物流、能源(水力發電)、營運商、新零售、金融、醫療等產業在業務開展的過程中往往涉及大量地址數據,而這些數據往往沒有形成標準結構規範,存在地址缺失、一地多名等問題。隨著數位化的升級,城市地址不標準的問題愈加凸顯。
地址應用現存問題
地址標準化[2](Address Purification)是阿里巴巴達摩院NLP團隊依托阿里雲海量的地址語料庫,以及超強的NLP演算法實力所沉澱的高效能及高準確率的標準地址演算法服務。地址標準化產品從規範地址資料、建立統一標準地址庫的角度出發,提供高效能地址演算法。
位址標準化優勢
此位址演算法服務能自動標準化處理位址數據,可有效解決一地多名,地址識別,地址真偽辨別等地址資料不規範、人工治理耗時耗力、地址庫重複建設問題,為企業,政府機關以及開發者提供地址資料清洗,地址標準化能力,使地址資料更好的為業務提供支援。地址標準化產品具有如下的幾個特點:
- 準確率高:擁有海量地址語料庫以及超強的NLP演算法技術,並持續優化迭代,地址演算法準確率高
- 超強效能:累積了豐富的專案建置經驗,能夠穩定承載大量資料
- 服務全面:提供20多種位址服務,滿足不同業務場景需求
- 部署靈活:支援公有雲、混合雲、私有化部署。
本次最佳化的模組屬於位址標準化中的搜尋模組。地址搜尋是指使用者輸入地址文字相關訊息,基於地址庫和搜尋引擎,對使用者輸入的地址文字進行搜尋和聯想,並返回相關興趣點(Point of Interest,POI)資訊。地址搜尋功能不僅能夠提升使用者資料處理體驗,同時也是多個地址下游服務的基礎,如經緯度查詢、門址標準化、地址歸一等,因此在整套地址服務系統中扮演了關鍵角色。
位址服務搜尋體系示意圖
#具體而言,本次最佳化的模型是基於多任務地理預訓練語言模型底座產出的多任務向量召回模型和精排模型。
多任務地理預訓練語言模型底座在掩碼語言模型(Masked Language Model, MLM) 任務的基礎上結合了相關興趣點分類與位址元素識別(省、市、區、POI 等),並透過元學習(Meta Learning)的方式,自適應地調整多個任務的採樣機率,在語言模型中融入通用的地址知識。
多任務位址預訓練模型底座示意圖
多任務向量回想模型基於上述底座訓練所得,包含雙塔相似度、Geohash (地址編碼) 預測、分詞和Term Weighting (詞權重) 四個任務。
多任務向量召回模型示意圖
作為計算位址相似度匹配的核心模組,精排模型則是在上述底座的基礎上,引入了海量點擊資料和標註資料訓練訓練所得[3],並透過模型蒸餾技術,提升了模型的效率[4]。最終用應用於召回模型召回的地址庫文件重新排序。基於上述流程訓練所得的4層單一模型能夠在CCKS2021中文NLP位址相關性任務[5]上獲得較12層基準模型較好的效果(詳見效能展示部分)。
精排模型示意圖
3.模型推理優化解決方案
阿里雲機器學習平台PAI團隊推出的Blade產品支持以上提及的所有最佳化方案,提供了統一的使用者接口,並擁有多個軟體後端,如高效能算子、Intel Custom Backend、BladeDISC等等。
Blade模型推理最佳化架構圖
#3.1 Blade
## Blade是阿里雲端機器學習PAI團隊(Platform of Artificial Intelligence)推出的通用推理最佳化工具,可透過模型系統聯合最佳化,使模型達到最佳推理效能。它有機融合了計算圖優化、Intel® oneDNN等vendor優化庫、BladeDISC編譯優化、Blade高性能算子庫、Costom Backend、Blade混合精度等多種優化手段。同時,簡潔的使用方式降低了模型優化門檻、提升了使用者體驗和生產效率。
PAI-Blade支援多種輸入格式,包括Tensorflow pb、PyTorch torchscript等。對於待優化的模型,PAI-Blade會對其進行分析,再應用多種可能的最佳化手段,並從各種最佳化結果中選取加速效果最明顯的為最終的最佳化結果。
為了在保證部署成功率的前提下獲得最大的最佳化效果,PAI-Blade採取了「圈圖」的方式進行最佳化,即:
- 將待優化子運算圖中,能夠被推理後端/高效能算子支援的部分轉換至相應的最佳化子圖;
- 無法被最佳化的子圖回退(fallback)至對應的原生框架(TF/Torch)執行。
#Blade Compression是Blade推出的面向模型壓縮的工具包,旨在協助開發人員進行高效的模型壓縮優化工作。它包含了多種模型壓縮功能,包括量化、剪枝、稀疏等。壓縮後的模型可以便捷地透過Blade實現進一步優化,以獲得模型系統聯合的極致優化。
量化方面,Blade Compression:
- #提供了簡潔的使用介面,透過呼叫幾個簡單api,即可完成量化改圖、校正(calibration)、量化訓練(Quantization-aware Training,QAT)、匯出量化模型等步驟。
- 提供了多種後端的支援,透過config檔的配置,即可完成不同裝置導向、不同後端的量化過程。
- 整合了PAI-Blade團隊在實際生產業務中自研的各種演算法,以獲得更高的量化精度。
同時,我們提供了豐富的原子能力api,以便於對特定情況進行客製化開發。
#BladeDISC是阿里雲機器學習平台PAI團隊推出的面向機器學習場景的動態shape深度學習編譯器,是Blade的後端之一。它支援主流的前端框架(TensorFlow、PyTorch)與後端硬體(CPU、GPU),同時也支援推理以及訓練的最佳化。
#
BladeDISC架構圖
3.2 基於Intel® Xeon®的高效能算子
神經網路模型中的子網路通常具有長期的通用性與普遍性,如PyTorch 中的Linear Layer 和Recurrent Layers 等,是模型建構的基礎模組,負責著特定的功能,透過這些模組的不同組合得到形形色色的模型,而這些模組也是AI編譯器重點優化的目標。據此,為了得到最佳性能的基礎模組,從而實現性能最佳的模型,Intel針對X86架構對這些基礎模組進行了多層次優化,包括使能高效的AVX512指令、算子內部計算調度、算子融合、快取優化,並行優化等等。
在位址標準化服務中,常會出現Recurrent Neural Network (RNN) 模型,且RNN模型中最影響效能的模組是LSTM或GRU等模組,本章節以LSTM為例,呈現在不定長且多batch的輸入時,如何實現對LSTM的極致性能優化。
通常,為了滿足不同使用者的需求和請求,追求高效能和低成本的雲端服務會將不同的使用者請求進行Batch,以實現運算資源的最大化利用。如下圖所示,總共有3個已經被embedding的句子,而且內容和輸入的長度是不相同的。
原始輸入資料
為了使得LSTM計算的更有效率,需要對Batched input採用PyTorch的pack_padded_sequence()函數進行padding和sort,得到下圖所示,一個paddding的資料tensor,一個描述資料tensor的batch size的tensor,一個描述資料tensor的原始序號tensor。
原始輸入資料
到目前為止,已經準備好了LSTM的輸入,對於LSTM的計算過程如下圖所示,對輸入的tensor進行分段批次計算,及跳過零值計算。
LSTM針對輸入的計算步驟
#更深入的LSTM的計算最佳化如下圖17所示,公式中的矩陣乘部分進行了公式間計算融合,如下圖所示,原先4次矩陣乘轉換成1次矩陣乘,並且採用AVX512指令進行數值計算,以及多線程並行優化,從而實現高效的LSTM算子。其中,數值計算指的是矩陣乘和後序的elementwise的元素操作,針對矩陣乘部分,本方案採用的是oneDNN庫進行計算,庫中具有高效的AVX512 GEMM實現,針對elementwise的元素操作,本方案將其採用AVX512指令集進行算子融合,提升了資料在快取中的命中率。
LSTM計算融合[8]
#3.3 推理後端Custom Backend
Intel custom backend[9]作為Blade的軟體後端,強有力地加速著模型量化和稀疏的推理效能,主要包含三個層面的最佳化。首先,採用Primitive Cache的策略對記憶體進行最佳化,其次,進行圖融合最佳化,最後,在算子層級,實現了包含稀疏與量化算子在內的高效算子庫。
Intel Custom Backend架構圖
低精度量化
稀疏與量化等高速算子, 得益於Intel® DL Boost加速指令集,如VNNI指令集。
VNNI 指令介紹
上圖為VNNI 指令, 8bits可以使用AVX512 BW三個指令來加速, VPMADDUBSW 先對2對由8bits組成的陣列做乘法與加法, 得到16bits資料, VPMADDWD將相鄰資料加總起來,得到32bits資料, 最後VPADDD加上一個常數, 此三函數可組成一個AVX512_VNNI,此指令可用來加速推理中的矩陣相乘。
圖融合
##除此之外,Custom Backend中也提供了圖融合,例如矩陣相乘後不輸出中間態臨時Tensor,而是直接運行後面指令,即將後項的post op與前級算子進行融合,如此減少資料搬運以減少運行時間,下圖為一個範例,紅框內的算子融合後可消除額外的資料搬移,成為新的算符。
圖融合
記憶體優化
內存分配與釋放會與作業系統進行通信,導致運行時的延時增加,為了減少這部分的開銷,Custom Backend中增加了Primitive Cache的設計,Primitive Cache用於快取已經被創建的Primitive,使得Primitive不能被系統回收,減少了下一次呼叫時的創建開銷。
同時為耗時較大的算子建立了緩存機制,以加速算符運行,如下圖所示:
Primitive Cache
量化功能如之前所說,模型大小減小後,計算與存取的開銷大幅減少,因此效能得到巨大的提升。
4. 整體效能展示
我們選取了位址搜尋服務中典型的兩個模型結構來驗證上述最佳化方案的效果。測試環境如下所示:
- 伺服器型號:阿里雲ecs.g7.large,2 vCPU
- ##測試CPU型號: Intel® Xeon® Platinum 8369B CPU @ 2.70GHz
- 測試CPU核數:1 vCPU
- PyTorch版本:1.9.0 cpu
- onnx版本:1.11.0
- onnxruntime版本:1.11.1
4.1 ESIM
ESIM[6]是一種專為自然語言推論而生的加強版LSTM,它的推理開銷主要來自於模型中的LSTM結構。 Blade利用Intel資料中心軟體團隊開發的高效能通用LSTM算子對其進行加速,取代PyTorch module中的預設LSTM (Baseline)。本次測試的ESIM中包含兩種LSTM結構,單算子優化前後的效能如表所示:
LSTM結構 |
#輸入shape |
優化前RT |
優化後RT |
#加速比 |
#LSTM - A |
#7x200 |
0.199ms |
||
3.02x
|
202x200 |
0.914ms |
||
|
LSTM - B |
#70x50 ####### #0.266ms##################0.098ms###### |
2.71x |
|
#202x50
0.804ms
#LSTM單算子最佳化前後推理效能 #優化前後,ESIM端到端推理速度如表所示,同時優化前後模型的 | 精度保持不變。
|
||
#模型結構
|
#ESIM[6]
|
#ESIM[6] Blade算子最佳化
|
ESIM模型最佳化前後推理表現
4.2 BERT
BERT[7]近年來在自然語言處理(NLP ) 、電腦視覺(CV)等領域廣泛採納。 Blade對該種結構有編譯最佳化(FP32)、量化(INT8)等多種手段。
速度測試中,測試資料的shape固定為10x53,各種後端及各種最佳化手段的速度效能如下表所示。可以看到,blade編譯最佳化後或INT8量化後的模型推理速度都優於libtorch與onnxruntime,其中推理的後端是Intel Custom Backend & BladeDisc。值得注意的是,經過量化加速後的4層BERT的速度是2層BERT的1.5倍,意味著可以在加速的同時,讓業務用上更大的模型,獲得更好的業務精度。
位址BERT推理效能展示
#精確度方面,我們基於CCKS2021中文NLP位址相關性任務[5]展示相關模型性能,如下表所示。達摩院地址團隊自研的4層BERT的macro F1精度高於標準的12層BERT-base。 Blade編譯優化可以做到精度無損,而經過Blade Compression量化訓練後的真實量化模型精度則略高於原始浮點模型。
#模型結構 |
macro F1(越高越好) |
#12層BERT-base |
#77.24 |
#位址-4層BERT | 78.72( 1.48) |
#位址-4層BERT Blade編譯最佳化 |
#78.72( 1.48) |
#-4層BERT Blade量化 |
78.85( 1.61) |
位址BERT相關精確度結果
#以上是地址標準化服務AI深度學習模型推理優化實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

SQL 中通過使用 ALTER TABLE 語句為現有表添加新列。具體步驟包括:確定表名稱和列信息、編寫 ALTER TABLE 語句、執行語句。例如,為 Customers 表添加 email 列(VARCHAR(50)):ALTER TABLE Customers ADD email VARCHAR(50);

SQL 中添加列的語法為 ALTER TABLE table_name ADD column_name data_type [NOT NULL] [DEFAULT default_value]; 其中,table_name 是表名,column_name 是新列名,data_type 是數據類型,NOT NULL 指定是否允許空值,DEFAULT default_value 指定默認值。

提高 SQL 清空表性能的技巧:使用 TRUNCATE TABLE 代替 DELETE,釋放空間並重置標識列。禁用外鍵約束,防止級聯刪除。使用事務封裝操作,保證數據一致性。批量刪除大數據,通過 LIMIT 限制行數。清空後重建索引,提高查詢效率。

為新添加的列設置默認值,使用 ALTER TABLE 語句:指定添加列並設置默認值:ALTER TABLE table_name ADD column_name data_type DEFAULT default_value;使用 CONSTRAINT 子句指定默認值:ALTER TABLE table_name ADD COLUMN column_name data_type CONSTRAINT default_constraint DEFAULT default_value;

是的,DELETE 語句可用於清空 SQL 表,步驟如下:使用 DELETE 語句:DELETE FROM table_name;替換 table_name 為要清空的表的名稱。

Redis內存碎片是指分配的內存中存在無法再分配的小塊空閒區域。應對策略包括:重啟Redis:徹底清空內存,但會中斷服務。優化數據結構:使用更適合Redis的結構,減少內存分配和釋放次數。調整配置參數:使用策略淘汰最近最少使用的鍵值對。使用持久化機制:定期備份數據,重啟Redis清理碎片。監控內存使用情況:及時發現問題並採取措施。

要使用 phpMyAdmin 創建數據表,以下步驟必不可少:連接到數據庫並單擊“新建”標籤。為表命名並選擇存儲引擎(推薦 InnoDB)。通過單擊“添加列”按鈕添加列詳細信息,包括列名、數據類型、是否允許空值以及其他屬性。選擇一個或多個列作為主鍵。單擊“保存”按鈕創建表和列。

創建Oracle數據庫並非易事,需理解底層機制。 1. 需了解數據庫和Oracle DBMS的概念;2. 掌握SID、CDB(容器數據庫)、PDB(可插拔數據庫)等核心概念;3. 使用SQL*Plus創建CDB,再創建PDB,需指定大小、數據文件數、路徑等參數;4. 高級應用需調整字符集、內存等參數,並進行性能調優;5. 需注意磁盤空間、權限和參數設置,並持續監控和優化數據庫性能。 熟練掌握需不斷實踐,才能真正理解Oracle數據庫的創建和管理。
