手把手教你基於華為雲,實現MindSpore模型訓練

华为云开发者联盟發表於2024-05-28

本文分享自華為雲社群《【昇騰開發全流程】MindSpore華為雲模型訓練》,作者:沉迷sk。

前言

學會如何安裝配置華為雲ModelArts、開發板Atlas 200I DK A2。
並打通一個Ascend910訓練到Ascend310推理的全流程思路。

訓練階段

A. 環境搭建

MindSpore 華為雲 模型訓練

Step1 建立OBS並行檔案

登入華為雲 -> 控制檯 -> 左側導航欄選擇“物件儲存服務 OBS” ->

在左側導航欄選擇“桶列表” -> 單擊右上角“建立桶”

如下圖所示:

在左側列表中的“並行檔案系統” -> 單擊右上角“建立並行檔案系統”。

如下圖所示:

進行以下配置:

主要引數資訊如下,其餘配置請保持預設配置
區域:選擇“華北-北京四”
檔案系統名稱:自定義,本例使用modelarts0009
(請使用modelarts作為檔案系統字首,注意名稱為全域性唯一)
資料冗餘儲存策略:選擇“單AZ儲存”
策略:選擇“私有”

Step2 上傳資料檔案至OBS並行檔案系統

點選已建立的並行檔案系統 -> 點選“新建資料夾”

輸入資料夾的名稱,這裡命名為input

進入該資料夾中 -> 點選“上傳檔案”:

將準備好的專案工程檔案壓縮包上傳至該OBS中。

Step3 基於ModelArts建立Notebook程式設計環境

在“全域性配置”頁面檢視是否已經配置授權,允許ModelArts訪問OBS:

登入華為雲 -> 控制檯 -> 左側導航欄選擇“ModelArts” -> 在左側導航欄選擇“全域性配置” -> 單擊“新增授權”

首次使用ModelArts:直接選擇“新增委託”中的“普通使用者”許可權

登入華為雲 -> 控制檯 -> 左側導航欄選擇“ModelArts” -> 在左側導航欄選擇“開發環境”-> “Notebook” -> 點選“建立”

進行以下配置:

主要引數資訊如下,其餘配置請保持預設配置
名稱:自定義,本例使用notebook-test
自動停止:自行選擇,本例選擇4小時
映象:選擇“公共映象”,並選擇“mindspore_1.10.0-cann_6.0.1-py_3.7-euler_2.8.3”
資源型別:選擇“公共資源池”
磁碟規格:使用50GB

Step4 為Notebook程式設計環境新增訓練階段專案工程檔案

點選已建立的Notebook -> “儲存配置” -> “新增資料儲存”

進行以下配置:

本地掛載目錄:自定義建立本地掛載目錄,本例使用**/data/input**
儲存位置:選擇所建立的並行檔案系統(本例選擇已建立的moderarts0009),以及資料集所在的目錄input

返回Notebook介面 -> 點選“開啟”notebook-test ->

開啟“Terminal”命令列終端介面 ->

執行以下命令,建立用於測試的test檔案

touch /data/input/test

再執行以下命令,可以看到你剛建立的test檔案&先前上傳的檔案

ls /data/input

上傳

這裡選擇OBS檔案上傳,

因為這裡本地上傳限制為100M檔案。

解壓

開啟“Terminal”命令列終端介面 ->

執行以下命令,檢視是否在正確的路徑下

pwd

ls -l

執行以下命令,解壓專案工程檔案壓縮包

(這裡以工業質檢Unet為例,具體程式碼可參考文末學習資源推薦)

unzip unet.zip

unzip unet_sdk.zip

訓練階段工程目錄結構如下:
├──unet
    ├──data                            // 預處理後的資料集資料夾
    ├──raw_data                        // 原始資料集
    ├──out_model                       // 模型匯出儲存資料夾
    ├──pred_visualization              // 視覺化圖片儲存資料夾(需要自己建立)
    ├──src                             // 功能函式
    │   ├──unet_medical                   // U-Net網路
    │   ├──unet_nested                    // U-Net++網路
    │   ├──config.py                      // 配置檔案
    │   ├──data_loader.py                 // 資料載入
    │   ├──eval_callback.py               // 訓練時評估回撥
    │   ├──loss.py                        // 損失函式
    │   ├──utils.py                       // 工具類函式
    ├──draw_result_folder.py           // 資料夾圖片視覺化
    ├──draw_result_single.py           // 單張圖片視覺化
    ├──eval.py                         // 模型驗證
    ├──export.py                       // 模型匯出,ckpt轉air/mindir/onnx
    ├──postprocess.py                  // 後處理
    ├──preprocess.py                   // 前處理
    ├──preprocess_dataset.py           // 資料集預處理
    ├──train.py                        // 模型訓練
    ├──requirements.txt
模型轉換工程目錄結構如下:
├── unet_sdk
    ├── model
    │   ├──air2om.sh                     // air模型轉om指令碼
    │   ├──xxx.air                       //訓練階段匯出的air模型
    │   ├──aipp_unet_simple_opencv.cfg   // aipp檔案

注:

接下來就可以開始旅程,進入訓練階段。

若中途暫停實驗,記得做停止資源操作,消耗最少費用;
若返回繼續實驗,再次啟動Notebook程式設計環境;
若完成了本實驗,最後是釋放資源操作,為了停止計費。

一. 配置檔案引數和資料預處理

MindSpore 資料集預處理preprocess_dataset.py檔案需呼叫如下指令碼:

檔案引數指令碼src/config.py檔案。

檔案引數指令碼為src/config.py,包括
unet_medical,
unet_nested,
unet_nested_cell,
unet_simple,
unet_simple_coco
共5種配置,表示模型與資料集之間的組合。
包含超引數、資料集路徑等檔案引數

Step 執行指令碼

新建NoteBook中:檢視是否在工程目錄unet/路徑下

!pwd

進入NoteBook中:執行示例

!python3 preprocess_dataset.py --data_url=./data/

其中–data_url:資料集預處理後的儲存路徑。

預計資料集預處理所需時間約為10分鐘。

預處理完的資料集會儲存在/unet/data/資料夾下。

輸出結果:

二. 模型訓練

MindSpore模型訓練 需呼叫如下指令碼:

preprocess_dataset.py:將類coco資料集 轉化成 模型訓練需要資料格式。
src/unet_xxx/:存放 unet/unet++ 模型結構。
src/data_loader.py:存放 資料載入功能函式。
src/eval_callback:存放 cb 函式,用於訓練過程中進行eval.
src/utils.py: mindspore 自定義 cb 函式,自定義 metrics 函式。
train.py

Step 執行指令碼

進入NoteBook中:執行示例

!python train.py --data_url=./data/ --run_eval=True

其中–data_url: 資料集輸入路徑。

其中–run_eval: True 表示訓練過程中同時進行驗證。

預計模型訓練所需時間約為36分鐘。

輸出結果:

三. 模型推理

MindSpore模型推理 需呼叫如下指令碼:

src/unet_xxx/:存放unet/unet++模型結構。
src/data_loader.py:存放資料預處理,資料載入功能函式。
src/utils.py:mindspore自定義cb函式,自定義metrics函式。
eval.py

Step 執行指令碼

進入NoteBook中:執行示例

!python eval.py --data_url=./data/ --ckpt_path=./ckpt_0/best.ckpt

其中–data_url:資料集輸入路徑。

其中–ckpt_path:ckpt 讀取路徑

預計模型推理所需時間約為2分鐘。

輸出結果:

注:

IOU(Intersection over Union)是一個度量函式,

用來描述兩個物體邊界框的重疊程度(取值範圍為[0,1]),

重疊的區域越大,IOU值就越大。

四. 結果視覺化

可以透過畫圖的方式將影像的結果視覺化,方便檢視。

視覺化方法有兩種。

方法一 單張圖片視覺化

draw_result_single.py:單張圖片視覺化,

輸出單張圖片的裁剪畫圖結果crop_plot.png和模型預測的結果predict_plot.png。

Step 執行指令碼

檢視工程目錄unet/路徑下

確保已經事先建立好

視覺化圖片儲存檔案pred_visualization資料夾

進入NoteBook中:執行示例

!python draw_result_single.py --data_url=./data/SW1hZ2VfMjAyMTA3MjcxNTEzMzYzNzk --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt

其中–data_url:資料集輸入路徑(到單張影像)。

其中–save_url:輸出影像儲存路徑。

其中–ckpt_path:ckpt讀取路徑。

單張圖片視覺化所需時間約為1分鐘。

視覺化完的圖片會儲存在/unet/pred_visualization資料夾下。

輸出結果:

方法二 資料夾圖片視覺化

draw_result_folder.py:資料夾圖片視覺化,

輸出資料夾內圖片的模型預測結果predict.png。

Step 執行指令碼

檢視工程目錄unet/路徑下

確保已經事先建立好

視覺化圖片儲存檔案pred_visualization資料夾

進入NoteBook中:執行示例

!python draw_result_folder.py --data_url=./data/ --save_url=./pred_visualization --ckpt_path=./ckpt_0/best.ckpt

其中–data_url:資料集輸入路徑(到影像資料夾)。

其中–save_url:輸出影像儲存路徑。

其中–ckpt_path:ckpt讀取路徑。

資料夾圖片視覺化所需時間約為10分鐘。

視覺化完的圖片會儲存在/unet/pred_visualization資料夾下。

輸出結果:

五. 模型儲存

如果想在昇騰AI處理器上執行推理,

可以透過網路定義和CheckPoint生成AIR格式模型檔案。

Step 執行指令碼

進入NoteBook中:執行示例

!python export.py --ckpt_file="./ckpt_0/best.ckpt" --width=960 --height=960 --file_name="out_model/unet_hw960_bs1" --file_format="AIR"

其中–-ckpt_file: ckpt路徑。

其中–width: 模型輸入尺寸。

其中–height: 模型輸入尺寸。

其中–file_name: 輸出檔名。

其中–file_format: 輸出格式,必須為[“ONNX”, “AIR”, “MINDIR”]。

模型儲存即匯出模型的輸出結果在out_model/unet_hw960_bs1.air

最後將匯出的模型下載至本地,供後續推理階段實驗使用:

右鍵 -> Download

六. 模型轉換

此處模型轉換需要用到ATC工具。

詳細內容&錯誤碼請參考昇騰官網文件-使用ATC工具轉換模型

Step1 上傳air模型

將訓練階段實驗模型儲存的air模型上傳至華為雲ModelArts的unet_sdk/model/目錄下

這裡因為模型中有optype[ArgMaxD],因此需要在Ascend910系列晶片上執行模型轉換才能成功。
(此次華為雲ModelArts使用的正是Ascend910A)
而一般情況,模型訓練完進行的模型轉換是可以選擇在開發者套件(Ascend310系列晶片)和Ubuntu系統中執行的。
(具體方法請參考昇騰官網文件-轉換模型

Step2 模型轉換命令

開啟unet_sdk/model/air2om.sh檔案

使用atc命令如下,可根據實際開發情況進行修改。

atc --framework=1 --model=unet_hw960_bs1.air --output=unet_hw960_bs1 --input_format=NCHW --soc_version=Ascend910A --log=error --insert_op_conf=aipp_unet_simple_opencv.cfg

本實驗將訓練階段實驗模型儲存的air模型轉為昇騰Al處理器支援的om格式離線模型
注意:air 模型轉 om 只支援靜態 batch,這裡 batchsize=1。

其中–framework:原始框架型別。

其中–model:原始模型檔案路徑與檔名。

其中–output:轉換後的離線模型的路徑以及檔名。

其中–input_format:輸入資料格式。

其中–soc_version:模型轉換時指定晶片版本。
(這句話指的是當前執行模型轉換時候所在機器的晶片版本,可透過命令列終端輸入npu-smi info檢視)

其中–log:顯示日誌的級別。

其中–insert_op_conf:插入運算元的配置檔案路徑與檔名,這裡使用AIPP預處理配置檔案,用於影像資料預處理。

Step3 執行指令碼

確保在工程目錄unet_sdk/model/路徑下,首先檢視檔案許可權

ls -l

(如果檔案許可權列中沒有x,你才需要繼續下一命令賦予它執行許可權)

輸入

chmod +x air2om.sh

執行示例

輸入

./air2om.sh

輸出結果:

注:

到此我們在華為雲上使用MindSpore的訓練階段實驗就結束了。

有了匯出的air模型及其模型轉換出的om模型,我們就可以繼續進入下一篇章:AscendCL推理階段。

結束後記得及時關閉雲上環境,避免資源浪費和產生額外的費用!!!

學習資源推薦

昇思官網

  • 昇思官網教程1.9:模型訓練
    https://www.mindspore.cn/tutorials/zh-CN/r1.9/beginner/train.html
  • 影片教程
    1. 初學入門昇思MindSpore初學教程(1h33m39s)
    2. 昇思MindSpore進階課程(4h)
    3. MindSpore CV與NLP類模型復現解析(1h50m37s)
    4. 昇思MindSpore實踐指南:MindSpore基礎網路構建及CV類網路遷移除錯(1h40m4s)
    5. 昇思MindSpore實踐指南:基於MindSpore的NLP模型開發、遷移與除錯(2h)
GitHub程式碼倉mindspore-ai / models
https://github.com/mindspore-ai/models/tree/master/official/cv

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章