天天看點

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

作者:烏拉拉圭

一、MindStudio介紹

MindStudio提供了在AI開發所需的一站式開發環境,支援模型開發、算子開發以及應用開發三個主流程中的開發任務。依靠模型可視化、算力測試、IDE本地仿真調試等功能,MindStudio能夠實作在一個工具上高效便捷地完成AI應用開發。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

MindStudio開發環境

對推理任務而言,MindStudio提供了模型壓縮工具、模型轉換工具和模型可視化工具。模型轉換工具将開源架構的網絡模型 (如Caffe、TensorFlow等)轉換成昇騰AI處理器支援的離線模型,模型轉換過程中可以實作算子排程的優化、權值資料重排、記憶體使用優化等。

二、概述

bert-big-NER是一個經過微調的 BERT 模型,可用于命名實體識别任務(NER),并為NER任務實作一流的性能。它可以識别四種類型的實體:位置(LOC),組織(ORG),人員(PER)和其他(MISC)。具體而言,此模型是一個bert-large-cased模型,在标準CoNLL-2003命名實體識别(https://www.aclweb.org/anthology/W03-0419.pdf)資料集的英文版上進行了微調。

如果要在同一資料集上使用較小的 BERT 模型進行微調,也可以使用基于 NER 的 BERT(https://huggingface.co/dslim/bert-base-NER/) 版本。

本文介紹了如何使用MindStudio将hugging face上開源的bert_large_NER模型部署到Ascend平台上,并進行資料預處理、推理腳本的開發,在CoNLL-2003命名實體識别資料集上完成推理任務。

三、推理環境準備

3.1 Linux端環境準備

1. 配置conda環境、安裝依賴包

表1 項目所依賴的環境配置

依賴名稱 版本
ONNX 1.9.0
onnxruntime 1.12.1
Pytorch 1.8.0
TorchVision 0.9.0
numpy 1.20.3
transformers 4.21.1
tensorflow 2.9.1

建立conda環境,并安裝對應版本安裝項目依賴的包。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

項目所依賴的包

2. 配置環境變量

source /usr/local/Ascend/ascend-toolkit/set_env.sh #root使用者下
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/Ascend/driver/lib64/driver/source /usr/local/Ascend/ascend-toolkit/set_env.sh
npu-smi info #檢視npu資訊           
使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

檢視Ascend裝置資訊

3.2 windows端環境準備

按照MindStudio使用者手冊中的安裝指南—>本地安裝依賴:Python(版本要求:3.7~3.9)、MinGW、CMake,安裝MindStudio。

四、建立工程

4.1 建立工程

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

在MindStudio建立工程

添加遠端伺服器,選擇遠端伺服器中正确的CANN版本:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

添加遠端伺服器

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

連接配接遠端伺服器

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

選擇正确的CANN版本

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

連接配接遠端CANN

等待本地同步遠端伺服器CANN檔案,同步完成後,選擇ACL Projection(python)項目,點選完成,完成建立項目。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

建立推理項目

配置項目結構:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

配置項目結構

選擇add python SDK:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

配置遠端python ADK

選擇ssh interpreter,并配置正确的python解釋器:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

選擇遠端正确的python解釋器

配置本地檔案夾和遠端伺服器映射:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

配置本地檔案夾和遠端伺服器映射

4.2配置本地、遠端環境同步

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

配置本地、遠端環境同步

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

配置本地、遠端環境同步

工程目錄為:

├──bert_large_NER 
    └── bert-large-NER //hugging face提供的詞典等
    └── bert-large-OUT //推理結果輸出路徑 
    └── bert_bin //生成的推理用資料儲存路徑
    └── conll2003 //CoNll-2003資料集
    └── bert_metric.py //精度測試腳本 
    └── bert_onnx_inference.py //使用onnx模型推理腳本
    └── bin_create.py //生成om模型推理用資料腳本
    └── npy_dataset_generate.py //生成onnx模型推理用資料腳本           

五、執行推理

5.1 資料預處理

擷取原始資料集CoNLL-2003:資料集下載下傳連結:https://data.deepai.org/conll2003.zip

資料集目錄為:

├──conll2003 
    └── valid.txt //驗證集
    └── train.txt //驗證集 
    └── test.txt //測試集           

該資料集為從路透社的新聞文章中摘取的句子,并為這些單詞标記人名、地名群組織名稱。以測試集為例,資料集的主要形式如下:

詞 詞性 詞塊 實體

U.N. NNP I-NP I-ORG

official NN I-NP O

Ekeus NNP I-NP I-PER

heads VBZ I-VP O

for IN I-PP O

Baghdad NNP I-NP I-LOC

. . O O

在NER任務中,隻關心1、4列,其中,第一列代表單詞,最後一列代表實體對應的類别。實體類别NAME_ENTITY記錄為以下九類:

B-PER/I-PER表示單詞對應于個人實體的開頭。

B-ORG/I-ORG表示單詞對應于組織實體的開頭/内部。

B-LOC/I-LOC表示對應于位置實體開頭的單詞。

B-MISC/I-MISC表示單詞對應于其他實體的開頭。

0表示單詞非四大類實體。

資料預處理:将原始資料集轉換為模型輸入的二進制資料。

資料預處理腳本開發:

模型有三個輸入,input_ids,attention_mask,token_type_ids;input_ids表示将輸入的單詞經過bert_large_NER模型生成embedding,在這個過程中,設定sequence長度為512,padding為Ture,實作将input_ids補全為長度為512的向量。同時,在每一條句子對應的512個單詞中,哪些是句子的實際長度就将其對應的attention_mask設定為1,padding的部分就将對應的attention_mask設定為0。在一些任務中,存在模型的一條輸入超過一句話的情況,此時借助token_type_ids來區分不同的句子,但在NER任務中,CoNLL-2003這個語料庫裡每個語料隻有一句話,是以token_type_ids全都是0。

資料預處理的代碼實作如下:(bin_create.py、npy_dataset_generate.py)

首先,定義INPUT_KEYS和NAME_ENTITY兩個清單,分别記錄輸入和實體名稱:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

設定生成資料的檔案結構,并建立三個輸入token對應的檔案夾:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

加載bert_large_NER模型中定義的tokenizer:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

使用tokenizer中的convert_tokens_to_ids方法,将英語單詞根據對應的詞彙表轉換成embedding。手動将每個句子的長度填充到512,并根據句子長度填寫attention_mask的值。此外,處理每個單詞時,記錄其對應的實體類别,并将其記錄在annofile中,便于後續精度的計算。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

對于om模型而言,要求的輸入是.bin格式的,并将每條資料對應的三條輸入分别存入三個檔案夾。對于onnx模型而言,要求的輸入是.npy格式的,并将每條資料對應的三條輸入存入三個.npy檔案。是以,在腳本開發中檔案儲存時要注意格式要求。

執行bin_create.py腳本生成om模型需要的推理資料:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理
使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

在遠端運作bin_create.py

運作成功後生成:input_ids.npy、attention_mask.npy、token_type_ids.npy三個npy檔案,儲存在./bert_bin/bert_npy_2022xxxx-xxxxxx/檔案夾下,.anno檔案記錄token對應的label,儲存在./bert_bin檔案夾下。

執行npy_dataset_generate.py腳本生成onnx模型需要的推理資料:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

運作成功後生成:input_ids、attention_mask、token_type_ids三個檔案夾,儲存在./bert_bin/bert_bin_2022xxxx-xxxxxx/檔案夾下,檔案夾中存的資料格式為.bin,作為om模型的輸入。.anno檔案記錄token對應的label,儲存在./bert_bin/檔案夾下。

5.2 模型轉換

5.2.1 借助transformers[onnx]工具由path轉換成onnx

pip install transformers[onnx]           

使用transformers.onnx進行模型轉換:

python -m transformers.onnx --model=bert-large-NER --feature=token-classification onnx/           

■參數說明:

-- model:hugging face上下載下傳的開源模型

-- feature:用于導出模型的特征類型

-- onnx/:儲存導出的onnx模型的路徑

運作結束後生成model.onnx儲存在./onnx檔案夾下。

5.2.2 onnx轉換成om

使用ATC指令将onnx模型轉換為om模型:

atc --framework=5 --model=model.onnx --output=bert_large_bs16_seq512 --input_shape="input_ids:16,512;attention_mask:16,512;token_type_ids:16,512" --soc_version=Ascend310P3           

■參數說明:

--model:為ONNX模型檔案。

--framework:5代表ONNX模型。

--output:輸出的OM模型。

--input_shape:輸入資料的shape。輸入資料有三條,均為batch*512,其中512為sequence序列長度。

--soc_version:處理器型号。

運作成功後生成bert_large_bs16_seq512.om模型檔案。

對om模型進行可視化,觀察模型的輸入輸出。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

5.3 執行離線推理

轉換om模型成功後,使用MindStudio remote終端執行ais_infer推理。

啟動ssh session,切換conda環境,切換工作目錄:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

使用ais_infer工具進行推理:

a. 下載下傳推理工具ais_infer。

git clone https://gitee.com/ascend/tools.git           

b. 編譯、安裝推理工具

cd /home/lcy/RotaE/tools/ais-bench_workload/tool/ais_infer/backend/
pip3.7 wheel ./ #編譯 要根據自己的python版本
ls
pip install aclruntime-0.0.1-cp37-cp37m-linux_x86_64.whl           

精度測試(以batchsize=16為例):

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理
python ./tools/ais-bench_workload/tool/ais_infer/ais_infer.py --model ./bert_large_bs16_seq512_1.om --input "./bert_bin/bert_bin_20220928-061343/input_ids,.bert_bin/bert_bin_20220928-061343/attention_mask,./bert_bin/bert_bin_20220928-061343/token_type_ids" --output ./bert-large-OUT/bs16 --outfmt NPY           

■參數說明:

--model:為ONNX模型檔案。

--batchsize:模型的batchsize大小。

--input:模型的輸入,input_ids、attention_mask、token_type_ids三個檔案夾。

--output:輸出指定在./bert-large-OUT/bs16下。

--outfmt:推理結果儲存格式。

執行結束輸出儲存在./bert-large-OUT/bs16下。

5.4 精度驗證

推理成功,需要對推理結果進行後處理,通過bert_metric.py進行後處理,驗證推理結果,進行精度評估。

精度推理腳本開發:

首先擷取到./bert-large-OUT/bs16目錄下的推理結果檔案:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

根據預測正确的條數/總數量得到預測正确的準确率acc:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

在MindStudio運作bert_metric.py腳本進行精度驗證:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

運作成功後輸出模型預測結果的精度為90.73%,接近于hugging face中在測試集上的精度結果91.2%:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

六、性能調優

使用aoe工具進行自動性能調優。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

“No performance improvement”表明:自動性能調優未帶來模型推理性能的提升。

Q&A

1.由于bert_large_NER模型轉換得到的onnx模型較大,且三個輸入的形狀均為動态的[batch, sequence],是以在使用MindStudio進行onnx模型的可視化以及onnx模型向om模型轉換時出現報錯:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

故在模型轉換時直接使用ATC工具完成。

2.在資料預處理過程中,transformer庫提供的AutoTokenizer.tokenizer方法,生成的embedding存在兩個問題:①對未見過的單詞自動進行拆分,導緻生成的input_keys與原句子相比常常會變長,此時annofile中記錄的每個單詞對應的實體類别就會失效;②在句子的起始處和結尾處自動增加[CLS]、[SEP]作為起始符和終止符,在更加強調整句話語義的NLP任務中是至關重要的,但在關注每個單詞對應的實體類别的NER任務中是不重要的。在測試過程中,也推測出作者在進行模型訓練時,也是未增加起始、終止符的。

是以,選擇借助AutoTokenizer.convert_tokens_to_ids方法,先手動的對應詞彙表将英語單詞編碼為embedding,對于詞彙表中沒有的單詞會将其編碼成100。之後再對根據句子長度和sequence長度(512)對編碼後的input_ids進行padding,完成input_ids,attention_mask,token_type_ids的生成和annofile記錄單詞label的對應 。

bert_large_NER的vocab.txt如下所示:

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

由tokenizer方法生成的資料如下所示,101表示[CLS],102表示[SEP]。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

由convert_tokens_to_ids生成的資料如下所示,對詞彙表中未出現過的單詞會将其編碼為100。

使用 MindStudio 在CoNll2003資料集上進行 bert_large_NER 模型推理

若讀者在使用MindStudio過程中或推理過程中遇到問題,可在MindStudio昇騰論壇(https://bbs.huaweicloud.com/forum/forum-945-1.html)進行提問、讨論。

繼續閱讀