天天看點

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

本文的視訊教程可通路下面連結:

https://www.bilibili.com/video/BV1iB4y1E75V

動态Batch/動态分辨率基本概念介紹

若模型推理時包含動态Batch/動态分辨率特性,在模型推理時,需調用pyACL提供的接口設定模型推理時需使用的Batch數/分辨率。

關鍵原理說明如下:

  1. 加載模型。模型加載成功後,傳回辨別模型的ID。

對于動态Batch/動态分辨率,模型支援的Batch數已提前在構模組化型時配置(構模組化型的說明請參見《ATC工具使用指南》中的“ATC工具使用指南”章節),構模組化型成功後,在生成的om模型中,會新增一個輸入(下文簡稱動态Batch輸入/動态分辨率輸入),在模型推理時通過該新增的輸入提供具體的Batch值/分辨率。

例如,a輸入的Batch數/分辨率是動态的,在om模型中,會有與a對應的b輸入來描述a的Batch數/分辨率。在模型執行時,準備a輸入的資料結構請參見準備模型推理的輸入/輸出資料,準備b輸入的資料結構、設定b輸入的資料請依次參見2、3。

加載模型資料分為以下4種方式:

acl.mdl.load_from_file:從檔案加載離線模型資料,由系統内部管理記憶體。

acl.mdl.load_from_mem:從記憶體加載離線模型資料,由系統内部管理記憶體。

acl.mdl.load_from_file_with_mem:從檔案加載離線模型資料,由使用者自行管理模型運作的記憶體(包括工作記憶體和權值記憶體)。

acl.mdl.load_from_mem_with_mem:從記憶體加載離線模型資料,由使用者自行管理模型運作的記憶體(包括工作記憶體和權值記憶體)。

  1. 建立aclmdlDataset類型的資料,用于描述模型的輸入資料、輸出資料。
  2. 申請動态Batch/動态分辨率輸入對應的記憶體前,需要先調用acl.mdl.get_input_index_by_name接口根據輸入名稱(固定為"ascend_mbatch_shape_data")擷取模型中辨別動态Batch/動态分辨率輸入的index。
  3. 調用acl.mdl.get_input_size_by_index、acl.mdl.get_output_size_by_index接口根據index擷取輸入、輸出記憶體大小。
  4. 調用acl.rt.malloc接口根據2.b中的大小申請記憶體。申請動态Batch/動态分辨率輸入對應的記憶體後,無需使用者設定記憶體中的資料(否則可能會導緻業務異常),使用者調用3.b中的接口後,系統會自動向記憶體中填入資料。
  5. 調用acl.create_data_buffer接口建立aclDataBuffer類型的資料,用于存放輸入/輸出資料的記憶體位址、記憶體大小。
  6. 調用acl.mdl.create_dataset接口建立aclmdlDataset類型的資料,并調用acl.mdl.add_dataset_buffer接口向aclmdlDataset類型的資料中增加aclDataBuffer類型的資料。
  7. 在成功加載模型之後,執行模型之前,設定動态Batch數/動态分辨率(模型的輸入圖檔的寬和高)。
  8. 調用acl.mdl.get_input_index_by_name接口根據輸入名稱(固定為"ascend_mbatch_shape_data")擷取模型中辨別動态Batch/動态分辨率輸入的index。
  9. 調用acl.mdl.set_dynamic_batch_size / acl.mdl.set_dynamic_hw_size接口設定動态Batch數/動态分辨率。

此處設定的Batch數/分辨率隻能是模型轉換時通過dynamic_batch_size/dynamic_image_size參數設定的Batch/分辨率檔位中的某一個,模型轉換的詳細說明請參見《ATC工具使用指南》。

也可以調用acl.mdl.get_dynamic_batch/acl.mdl.get_dynamic_hw接口擷取指定模型支援的Batch/分辨率檔位數以及每一檔中的Batch數/寬、高。

詳情請見官網開發文檔合集(華為 CANN 配置手冊、産品文檔、PDF - https://support.huawei.com/enterprise/zh/ascend-computing/cann-pid-251168373)

  1. 執行模型。

調用acl.mdl.execute接口執行模型。

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

圖1 動态Batch/動态分辨率流程圖

Ascend昇騰開發環境極速搭建

開發環境搭建可選擇A.Ubuntu環境下或者B.Windows環境下遠端連接配接已經配置完畢的伺服器

Ubuntu環境

注意分為昇騰裝置和非升騰裝置。非昇騰AI裝置無需安裝固件與驅動,僅能用于代碼開發、編譯等不依賴于昇騰裝置的開發活動。在昇騰AI裝置上安裝開發環境,支援代碼開發和編譯,同時可以運作應用程式或進行訓練腳本的遷移、開發&調試。

  1. 安裝Ubuntu依賴

開發架構CANN開發環境支援多種作業系統,如這裡的Ubuntu 18.04。請在root使用者下執行如下指令檢查源是否可用:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

安裝一些OS依賴庫,具體可執行如下指令:

·apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev

·sudo apt-get install -y unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev libncursesw5-dev

因為此處我們已經安裝過了,是以顯示都已經是最新版

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

CANN 還依賴于Python3.7 ,是以首先确認一下本地的Python版本,執行指令python3 --version,如果python版本在3.7.0~ 3.7.11之間則可以跳過Python安裝過程,預設情況下,Ubuntu 18.04安裝的Python是3.6.9 。是以需要重新安裝python3.7.5。在目錄/home/jack/mysoft下,執行如下指令:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

稍等片刻後,會在mysoft目錄中下載下傳完成此安裝包Python-3.7.5.tgz。解壓源碼包:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

進入解壓後的檔案夾,執行配置、編譯和安裝指令:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

其中“--prefix”參數用于指定python安裝路徑,使用者根據實際情況進行修改。“--enable-shared”參數用于編譯出libpython3.7m.so.1.0動态庫。“--enable-loadable-sqlite-extensions”參數用于加載libsqlite3-dev依賴。安裝完成後,如果輸入python3還是未生效,需要配置環境變量。可以執行如下指令設定python3.7.5環境變量,執行如下指令:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

具體可以參考官網 https://www.hiascend.com/software/mindstudio

  1. Ubuntu依賴安裝

之前的配置Python環境變量,隻能在目前的Shell視窗有效,當開啟新的指令視窗,則環境變量失效,示意如下所示:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

下面設定永久的環境變量,指令如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

增加的内容如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

執行如下指令生效:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

為後續安裝CANN軟體包、運作CANN軟體環境變量設定腳本時能夠自動配置python3.7.5環境變量,使用者需提前建立好檔案“use_private_python.info”,執行如下指令(root使用者):

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

内容如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 安裝CANN開發工具

在基礎Linux環境搭建完成後,需要登入華為相關網站(下載下傳軟體有權限要求,否則可能無法下載下傳),并擷取相關權限後,首先可以在Windows作業系統上下載下傳兩種架構(x86和aarch64)的CANN toolkit開發套件包Ascend-cann-toolkit_xxx.run 。

請根據CPU架構(x86_64、aarch64)擷取對應的軟體包。

例如本次安裝的版本為CANN 5.1.RC1:

Ascend-cann-toolkit_5.1.RC1_linux-aarch64.run

Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run

對于x86_64則: ./Ascend-cann-toolkit_{version}_linux-x86_64.run

對于運作環境為aarch64而開發環境為x86_64的場景,需同時擷取兩種架構的開發套件包。

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

({version}表示軟體版本号,{arch}表示CPU架構。)

其主要用于使用者開發應用、自定義算子和模型轉換。開發套件包包含開發應用程式所需的庫檔案、開發輔助工具如ATC模型轉換工具。

  1. 驗證完整性
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

然後打開終端指令行,執行如下指令進行CANN toolkit安裝:

./Ascend-cann-toolkit_{version}_linux-x86_64.run --check

./Ascend-cann-toolkit_{version}_linux-aarch64.run --check

./Ascend-cann-toolkit_{version}_linux-x86_64.run --install

./Ascend-cann-toolkit_{version}_linux-aarch64.run --install

輸入如下指令設定可執行權限:

chmod +x Ascend-cann-toolkit_5.1.RC1_linux-aarch64.run

chmod +x Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

輸入如下指令進行安裝

./Ascend-cann-toolkit_5.1.RC1_linux-x86_64.run --install

安裝過程如下

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

安裝完成顯示如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

輸入如下指令進行安裝

./Ascend-cann-toolkit_5.1.RC1_linux-aarch64 --install

安裝過程同上

  1. 配置交叉編譯環境

最後,對于Atlas 200 AI加速子產品 (RC場景)和Atlas 500 小站(運作環境aarch64架構)來說,當開發環境是一台X86 PC進行環境搭建時,需要在開發環境中安裝交叉編譯工具,具體指令如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

安裝成功後,再次驗證,執行如下指令:

此處已經配置完成

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 安裝MindStudio

去昇騰社群官網,選擇對應版本,下載下傳安裝包。

網址:https://www.hiascend.com/software/mindstudio/download

将MindStudio_{software version}_ubuntu18.04-x86_64.tar.gz軟體包上傳至MindStudio安裝伺服器。并解壓

使用MindStudio的安裝使用者進入軟體包解壓後的MindStudio/bin目錄,執行如下指令啟動:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

第一次運作時會檢查環境,MindStudio依賴JDK和Python3等環境,檢查過程示意如下:

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

首先根據提示安裝相關庫,執行如下指令:

·apt-get -y install xterm fonts-wqy-zenhei fonts-wqy-microhei fonts-arphic-ukai fonts-arphic-uming

·pip3.7 install --user grpcio coverage gnureadline pylint matplotlib pandas xlrd==1.2.0 absl-py

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. MindStudio配置

打開軟體後,到setting配置CANN的路徑

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

在裡面配置MindX sdk

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 安裝必要的pip包

python3 -m pip install numpy decorator sympy cffi pyyaml pathlib2 psutil protobuf scipy requests grpcio pylint absl-py --user -i https://pypi.tuna.tsinghua.edu.cn/simple

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

B.Windows環境

在官網選擇MindStudio Windows版本進行下載下傳

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

這裡選擇軟體包下載下傳,點選軟體包下載下傳,跳出安裝界面進行安裝

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

使用者根據需要勾選安裝選項

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  • Create Desktop Shortcut:建立桌面快捷方式,使用者可根據系統配置選擇“32-bit launcher”或者“64-bit launcher”。
  • Update PATH variable(restart needed):将MindStudio的啟動檔案路徑加入環境變量PATH中,可從系統指令行直接啟動MindStudio。如果勾選此項,MindStudio安裝配置完成後會重新開機作業系統。
  • Update context menu:勾選“Add "Open Folder as Project"”後,右鍵單擊檔案夾,可以作為MindStudio工程打開。
  • Create Associations:預設不勾選。
  • 點next進入下一步

Windows SSH連接配接配置:

  • 在菜單欄依次選擇File > Settings... > Tools > SSH Configurations進入SSH連接配接配置。
  • 在歡迎界面依次選擇Customize> All Settings... > Tools > SSH Configurations進入SSH連接配接配置。
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

點選Test Connection

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

顯示連接配接成功

動态Batch/動态分辨率設定總體流程

  1. 模型選擇:在某些場景下,模型每次輸入的BatchSize或分辨率是不固定的,如檢測出目标後再執行目辨別别網絡,由于目标個數不固定導緻目辨別别網絡輸入BatchSize不固定。需要選擇支援動态Batch/動态分辨率調整的模型,即輸入BatchSize數值/分辨率數值可以動态調整的模型。

動态Batch:使用者執行推理時,其Batch數是動态可變的。

動态分辨率H*W: 使用者執行推理時,每張圖檔的分辨率H*W是動态可變的。

  1. 工程建立:通過MindStudio工具建立MyApp工程,根據模闆建立後會自動生成模型、資料集和加載模型的運作檔案的存儲路徑。
  2. 轉換模型:
  3. 下載下傳caffe或者pb等格式模型到指定的路徑下。
  4. 使用MindStudio工具提供的模型轉換功能将模型封裝為om格式。
  5. 點選模型轉換,成功将模型轉換為om格式。
  6. 加載模型:模型加載的詳細流程,請參見模型推理,模型加載成功後,傳回辨別模型的ID。模型轉換完成後,在生成的om模型中,會新增一個輸入,在模型推理時通過該新增的輸入提供具體的Batch值/分辨率值。例如,a輸入的Batch數/分辨率是,在om模型中,會有與a對應的b輸入來描述a的Batch數/分辨率取值。
  7. 建立aclmdlDataset類型的資料:用于描述模型執行的輸入資料、輸出資料。
  8. 設定動态Batch/動态分辨率:成功加載模型之後,執行模型之前,設定動态Batch/動态分辨率的參數值。

注意:

對同一模型不能同時調用接口設定動态Batch、動态分辨率和動态次元。

對同一模型,AIPP(包括靜态AIPP和動态AIPP)與動态次元(ND格式)不能同時使用。

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

圖2 動态Batch/動态分辨率設定總體流程圖

動态Batch/動态分辨率設定例子詳解

  1. MindStudio,選擇AscendApp建立工程項目
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 點選next之後我們可以選擇MindStudio提供的模闆進行工程建立
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 這裡我們選擇官網提供的圖像分類的Resnet50模型的模闆
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 我們先到Pytorch官網下載下傳Resnet50的pth檔案,再到碼雲官網中找到Ascend 開源倉庫,并找到Resnet50_Pytorch_Infer項目,然後根據裡面的教程進行模型轉換
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 我們需要先将pth格式檔案轉換成onnx格式檔案,為此我們需要使用Resnet50_Pytorch_Infer項目下的pth2onnx.py腳本檔案。首先使用MindStudio建立如下圖所示的運作配置,并點選運作(注意這裡我們使用本地環境,須保證電腦有完整的Pytorch環境)
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 運作腳本檔案可以得到轉換後的檔案,并把它放在項目檔案夾中
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 為了進行onnx模型到om模型的轉換,需要使用MindStudio轉換工具以及華為的遠端CANN環境(這裡我們已經連接配接上了)。點選MindStudio中的Ascend選項,并選擇Model Converter
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 由于動态Batch和動态分辨率不能同時使用,故而我們分别使用MindStudio轉換成支援動态batch和動态分辨率的離線模型。首先轉換成支援動态Batch的離線模型,我們在Model Converter中選擇部署在伺服器中的onnx格式檔案,選擇輸出路徑(我們選擇在本項目下的model檔案夾),在輸出形狀中将Batch大小改為-1,并在Dynamic Batch中進行檔位的輸入(我們的檔位為1,2,4,8),完成後一直點選next直到最後點選finsh ,直到控制台列印轉換成功則模型轉換完成,此時我們可以發現在modelzoo檔案下出現了我們轉換成功的離線模型檔案
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 同理,将onnx檔案轉換成支援動态分辨率的離線模型,操作步驟和步驟8中是相似的,隻需将長度和寬度兩個次元設定為-1,并在Dynamic Image Size中進行檔位的輸入(我們的檔位為224,224;448,448),并等待轉換的完成
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 上述操作完成後我們便得到了支援動态Batch/動态分辨率的離線模型
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 打開模型的結構圖,我們可以看到om模型對比原始模型,從原來的一個輸入變為了兩個輸入,新增的輸入就是用于調節可變Batch/分辨率設定的輸入
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 點選模型的輸入,我們可以看到模型此時的最大輸入為動态Batch/動态分辨率最大檔位的輸入;而在項目代碼中資料預處理的函數處理後的單張圖檔分辨率為224x224。我們利用這個函數實作動态Batch/動态分辨率(選擇檔位224x224)的輸入資料預處理。須知,對同一個模型,不能同時調用acl.mdl.set_dynamic_batch_size接口和acl.mdl.set_dynamic_hw_size接口。
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 對于動态Batch設定,我們使用的檔位是8,故而我們需要先加載支援動态Batch的離線模型resnet50_dybatch.om。該離線模型有兩個輸入,我們需要為兩個輸入配置設定記憶體,但是支援動态Batch的輸入記憶體不需要向其中放入資料;對于動态分辨率設定,我們使用的檔位是224x224,同理先加載支援動态Batch的離線模型resnet50_dyhw.om。該離線模型有兩個輸入,需要為兩個輸入配置設定記憶體,但是支援動态分辨率的輸入記憶體不需要向其中放入資料。動态Batch/動态分辨率的輸入名為ascend_mbatch_shape_data,為此我們可以通過接口方法acl.mdl.get_input_index_by_name(輸入固定名稱ascend_mbatch_shape_data)獲得該輸入的index,進而避免往其中放入資料
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 之後調用acl.mdl.create_dataset接口建立aclmdlDataset類型的資料,并調用acl.mdl.add_dataset_buffer接口向aclmdlDataset類型的資料中增加aclDataBuffer類型的資料
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 在準備好輸入和輸出的資料結構之後,我們就可以對動态Batch/動态分辨率進行設定了,須知我們輸入的檔位必須是符合轉換模型時設定的檔位。對于動态Batch,我們調用acl.mdl.set_dynamic_batch_size接口設定動态Batch數;對于動态分辨率,我們調用acl.mdl.set_dynamic_hw_size接口設定動态分辨率。

這裡我們需要注意設定動态batch和動态分辨率的操作必須在模型執行前進行,否則程式會報錯。

MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 在設定完動态Batch/動态分辨率之後,我們調用模型的函數對模型進行測試。輸入兩張動物的圖檔,并對圖檔進行分類,最後的分類結果如圖所示;到此動态Batch/動态分辨率的設定就結束了。
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理
  1. 最後總結,對于使用離線模型使用動态Batch/動态分辨率的整體流程如下圖所示
MindStudio基于AscendCL應用開發使用動态batch/動态分辨率進行模型推理

詳情請見昇騰社群https://www.hiascend.com/

繼續閱讀