任務背景
01
情感分析
(Sentiment Analysis)
情感分析旨在對帶有情感色彩的主觀性文本進行分析、處理、歸納和推理,其廣泛應用于消費決策、輿情分析、個性化推薦等領域,具有很高的商業價值。例如:食行生鮮自動生成菜品評論標簽輔助用戶購買,并指導運營采購部門調整選品和促銷策略;房天下向購房者和開發商直觀展示樓盤的用戶口碑情況,并對好評樓盤置頂推薦;國美搭建服務智能化評分系統,客服運營成本減少40%,負面反饋處理率100%。
02
自然語言處理(NLP)技術
自然語言處理(英語:Natural Language Process,簡稱NLP)是計算機科學、信息工程以及人工智能的子領域,專注于人機語言交互,探討如何處理和運用自然語言。最近幾年,隨著深度學習以及相關技術的發展,NLP領域的研究取得一個又一個突破,研究者設計各種模型和方法,來解決NLP的各類問題,其中比較常見包括LSTM, BERT, GRU, Transformer, GPT等算法模型。
方案簡介
本方案采用PaddleNLP工具套件進行模型訓練,并基于OpenVINO 開發套件實現在Intel平臺上的高效能部署。本文將主要分享如何在OpenVINO 開發套件中“無縫”部署PaddlePaddle BERT模型,并對輸出結果做驗證。
01
PaddleNLP
PaddleNLP是一款簡單易用且功能強大的自然語言處理開發庫。聚合業界優質預訓練模型并提供開箱即用的開發體驗,覆蓋NLP多場景的模型庫搭配產業實踐范例可滿足開發者靈活定制的需求。
02
OpenVINO 開發套件
OpenVINO 開發套件是Intel平臺原生的深度學習推理框架,自2018年推出以來,Intel已經幫助數十萬開發者大幅提升了AI推理性能,并將其應用從邊緣計算擴展到企業和客戶端。英特爾于2022年巴塞羅那世界移動通信大會前夕,推出了英特爾 發行版OpenVINO 開發套件的全新版本。其中的新功能主要根據開發者過去三年半的反饋而開發,包括更多的深度學習模型選擇、更多的設備可移植性選擇以及更高的推理性能和更少的代碼更改。為了更好地對Paddle模型進行支持,新版OpenVINO 開發套件分別做了一下升級:
■直接支持Paddle格式模型
目前OpenVINO 開發套件2022.1發行版中已完成對PaddlePaddle模型的直接支持,OpenVINO 開發套件的Model Optimizer工具已經可以直接完成對Paddle模型的離線轉化,同時runtime api接口也可以直接讀取加載Paddle模型到指定的硬件設備,省去了離線轉換的過程,大大提升了Paddle開發者在Intel平臺上部署的效率。經過性能和準確性驗證,在OpenVINO 開發套件2022.1發行版中,會有13個模型涵蓋5大應用場景的Paddle模型將被直接支持,其中不乏像PPYolo和PPOCR這樣非常受開發者歡迎的網絡。
圖:OpenVINO 開發套件的MO和IE可以直接支持Paddle模型輸入
■ 全面引入動態輸入支持
為了適配更廣泛的模型種類,OpenVINO 2022.1版本的CPU Plugin已經支持了動態input shape,讓開發者以更便捷的方式部署類似NLP或者OCR這樣的網絡,OpenVINO 開發套件用戶可以在不需要對模型做reshape的前提下,任意送入不同shape的圖片或者向量作為輸入數據,OpenVINO 開發套件會自動在runtime過程中對模型結構與內存空間進行動態調整,進一步優化dynamic shape的推理性能。
圖:在NLP中的Dynamic Input Shape
詳細介紹可以參考:https://docs.openvino.ai/latest/openvino_docs_OV_UG_DynamicShapes.html
BERT原理簡介
01
BERT結構介紹
BERT (Bidirectional Encoder Representations from Transformers)以Transformer 編碼器為網絡基本組件,使用掩碼語言模型(Masked Language Model)和鄰接句子預測(Next Sentence Prediction)兩個任務在大規模無標注文本語料上進行預訓練(pre-train),得到融合了雙向內容的通用語義表示模型。以預訓練產生的通用語義表示模型為基礎,結合任務適配的簡單輸出層,微調(fine-tune)后即可應用到下游的NLP任務,效果通常也較直接在下游的任務上訓練的模型更優。此前BERT即在GLUE評測任務上取得了SOTA的結果。
圖:BERT的2階段訓練任務
不難發現,其模型結構是Transformer的Encoder層,只需要將特定任務的輸入,輸出插入到Bert中,利用Transformer強大的注意力機制就可以模擬很多下游任務。(句子對關系判斷,單文本主題分類,問答任務(QA),單句貼標簽(命名實體識別)),BERT的訓練過程可以分成預訓練和微調兩部分組成。
02
預訓練任務(Pre-training)
BERT是一個多任務模型,它的任務是由兩個自監督任務組成,即MLM和NSP。
■Task #1:Masked Language Model
所謂MLM是指在訓練的時候隨即從輸入預料上mask掉一些單詞,然后通過的上下文預測該單詞,該任務非常像我們在中學時期經常做的完形填空。正如傳統的語言模型算法和RNN匹配那樣,MLM的這個性質和Transformer的結構是非常匹配的。
■Task #2: Next Sentence Prediction
Next Sentence Prediction(NSP)的任務是判斷句子B是否是句子A的下文。如果是的話輸出’IsNext‘,否則輸出’NotNext‘。訓練數據的生成方式是從平行語料中隨機抽取的連續兩句話,其中50%保留抽取的兩句話,它們符合IsNext關系,另外50%的第二句話是隨機從預料中提取的,它們的關系是NotNext的。
微調任務 (Fine-tuning)
在海量單預料上訓練完BERT之后,便可以將其應用到NLP的各個任務中了。以下展示了BERT在11個不同任務中的模型,它們只需要在BERT的基礎上再添加一個輸出層便可以完成對特定任務的微調。這些任務類似于我們做過的文科試卷,其中有選擇題,簡答題等等。微調的任務包括:
■基于句子對的分類任務
■基于單個句子的分類任務
■問答任務
■命名實體識別
圖:BERT的4大下游微調任務
訓練與部署流程
本示例包含PaddleNLP訓練和OpenVINO 開發套件部署兩部分組成。
01
環境安裝
打開命令行終端,分別輸入以下命令,完成本地環境安裝和配置。
1.1安裝PaddlePaddle (AI studio環境中可以略過)
如果是CPU訓練環境需要執行以下命令進行安裝:
如果是GPU訓練環境需要執行以下命令進行安裝:
1.2安裝PaddleNLP與相關依賴
下載PaddleNLP:
安裝PaddleNLP相關依賴:
1.3安裝OpenVINO 開發套件
02
訓練部分
訓練部分是BERT在 Paddle 2.0上的開源實現,可以分為數據準備,BERT Encoder預訓練,SST2情感分類任務微調以及推理模型導出這四個步驟。
可以參考Paddle官方的案例說明,對以下過程做了簡要匯總,地址:
https://github.com/PaddlePaddle/PaddleNLP/tree/develop/model_zoo/bert
圖:Paddle BERT模型訓練流程
除此之外,我們也可以借助Paddle AI studio直接運行訓練腳本(無腦點擊運行就可以了: )),鏈接如下:
https://aistudio.baidu.com/aistudio/projectdetail/4193790?contributionType=1
2.1步驟一:數據準備(可略過)
PaddleNLP中BERT任務下自帶的create_pretraining_data.py 是創建預訓練程序所需數據的腳本。其以文本文件(使用換行符換行和空白符分隔,data目錄下提供了部分示例數據)為輸入,經由BERT tokenizer進行tokenize后再做生成sentence pair正負樣本、掩碼token等處理,最后輸出hdf5格式的數據文件。使用方式如下,在命令行輸入:
2.2步驟二:GPU訓練(可略過)
使用paddle.distributed.launch配置項運行run_pretrain.py訓練腳本,可以在多卡GPU環境下啟動BERT預訓練任務。命令行指令如下:
■model_type指示了模型類型,使用BERT模型時設置為bert即可。
■model_name_or_path指示了某種特定配置的模型,對應有其預訓練模型和預訓練時使用的 tokenizer。若模型相關內容保存在本地,這里也可以提供相應目錄地址。
■input_dir表示輸入數據的目錄,該目錄下所有文件名中包含training的文件將被作為訓練數據。output_dir 表示模型的保存目錄。
2.3步驟三:模型Fine-tunning
如果自己沒有準備訓練數據集的話,也可以跳過前面的步驟,直接使用huggingface提供的預訓練模型進行Fine-tuning,以GLUE中的SST-2任務為例,該腳本會自動下載SST-2任務中所需要的英文數據集,啟動Fine-tuning的方式如下:
■model_name_or_path指示了某種特定配置的模型,對應有其預訓練模型和預訓練時使用的 tokenizer。若模型相關內容保存在本地,這里也可以提供相應目錄地址。注:bert-base-uncased等對應使用的預訓練模型轉自huggingface/transformers
可以看到啟動Fine-tuning任務以后,腳本會自動下載bert-base-uncased預訓練模型,以及用于Fine-tuning的bert-base-uncased-vocab.txt數據集。
當訓練任務到達預先設定的step輪數以后,便會停止訓練,并且將.pdparam格式的模型權重保存在tmp目錄下。
2.4步驟四:模型導出
在Fine-tuning完成后,我們可以使用如下方式導出希望用來預測的Paddle靜態模型,并保存在infer_model路徑下:
導出后的模型文件包含以下內容時,推理時需要保證這三個文件在同一個目錄下:
model.pdmodel, model.pdiparams.info, model.pdiparams
圖:導出后的Paddle BERT靜態模型文件
03
部署部分
該示例將基于OpenVINO 開發套件進行Paddle的靜態模型部署,需要開發者提前準備好用于做部署的Intel平臺硬件,可以是個人電腦,也可以是云服務器虛機。整體流程可以分為以下幾個步驟:
圖:BERT模型部署流程
對于情感分析任務,BERT網絡的識別流程可以分成以下幾個步驟:
■ 輸入語句文本,并轉為相應的Token ID
■ 為每一行Token ID添加Padding,使其保持長度一致
■ Token ID作為輸入數據送入BERT模型進行推理 (模型內流程邏輯參考下圖),通過Embedding Layer將一個詞映射成為固定維度的稠密向量,降維后的向量會再通過Encoder提取Self-attentions后的向量間的關系特征,最后經過Classifier對情感分類任務做出判斷。
■ 獲取模型結果數據,通過后處理函數,計算分類標簽與每一類標簽的置信度
圖:BERT for SST2模型內部邏輯
BERT for SST2的輸入的編碼向量(長度不固定)是2個嵌入特征的單位和,這2個詞嵌入特征是:
■ input_ids:輸入文本被轉化為token后的單個字的id;
■ segment_ids:就是句子級別(上下句)的標簽,用于區分兩個句子,例如B是否是A的下文(對話場景,問答場景等)。由于在情感分析任務中沒有下句,所以這里segment_ids為全部為0的向量。
3.1步驟一:文本Token表示
定義數據轉換模塊,將原始的輸入語句轉化為input_ids與segment_ids,作為輸入數據。這邊我們將會使用PaddleNLP自帶的tokenizer()方法進行轉換。
3.2步驟二:Padding
需要保證input_ids與segment_ids數組在axis0方向的長度一致,由于這邊input_ids與segment_ids均為一維數組,所以也可以不進行該操作。
3.3步驟三:模型推理
部署代碼里最核心的部分就是要定義基于OpenVINO 開發套件的預測器,這里使用CPU作為模型的部署平臺,可以看到通過read_model這個函數接口我們可以直接讀取原始的.pdmodel格式模型,省去了之前繁雜的離線轉化過程。此外我們需要通過compile_model這個函數講讀取后的模型在指定的硬件平臺進行加載和編譯。最后創建infer_request推理請求進行推理任務部署。
由于輸入語句的長度往往不一致,這也導致編碼后的向量長度也不一致,這里OpenVINO 開發套件CPU Plugin的支持上已經全面引入了Dynamic Shape功能,無需再手動調整輸入數據的長度,OpenVINO 開發套件會在runtime過程中自動匹配并動態申請一定的內存空間進行推理,優化性能表現。
由于新版OpenVINO 開發套件已經全面支持Intel 12代酷睿處理器,為了取得更佳的推理性能,我們建議使用最新的硬件平臺進行測試。
3.4步驟四:結果后處理
此處得到的結果數據為兩種不同評價的可能性,我們需要將其通過softmax函數還原成百分比形式,并且找到可能性最大的那個評價序號所對應的標簽(Positive,Negative)。
最后我們找一組測試語句作為輸入數據,將其封裝成List以后,送入到識別器中進行識別,可以發現結果都是符合我們的先驗預期的。
該示例程序可以可以準確按SST2情感二分類任務要求,輸出每段輸入語句的分類情感標簽,并獲得每種情感對應的參考置信度。
小結
作為發布至今近4年以來最大的一次更新,OpenVINO 2022.1版本為了更好地支持NLP與語音相關的模型,在CPU plugin中已全面支持了動態input shape,并通過與百度PaddlePaddle框架的深度集成,用更便捷的API接口,更豐富的模型支持,提升雙方開發者在模型部署側的使用體驗,真正實現對PaddleNLP模型的“無縫”轉化與部署。
通過本次的全流程示例,我們看到OpenVINO 開發套件對Paddle BERT模型已經做到了很好的適配,從而加速在Intel平臺上的推理。以下github repository中已為大家提前準備好了OpenVINO 開發套件部署的參考實現與.pdmodel格式的BERT預訓練模型。
https://github.com/OpenVINO-dev-contest/openvino_notebooks/tree/PaddleBert/notebooks/005-hello-paddle-nlp
除此之外,為了方便大家了解并快速掌握OpenVINO 開發套件的使用,我們還提供了一系列開源的Jupyter notebook demo。運行這些notebook,就能快速了解在不同場景下如何利用OpenVINO 開發套件實現一系列、包括OCR在內的、計算機視覺及自然語言處理任務。OpenVINO notebooks的資源可以在Github這里下載安裝:
https://github.com/openvinotoolkit/openvino_notebooks
審核編輯 :李倩
-
自然語言處理
+關注
關注
1文章
614瀏覽量
13511 -
nlp
+關注
關注
1文章
487瀏覽量
22015
原文標題:基于OpenVINO? “無縫”部署 PaddleNLP 模型 | 開發者實戰
文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論