通過 Windows 命令提示符(cmd)在桌面新建文件夾,并在該文件夾中編譯、運行一段 Java 程序段
870
2025-03-31
有幸參加了MindSpore 21天實戰營,本篇其實是實戰營的第一堂課,作業體驗相對簡單,指導老師何蘆微。但因為我之前參加過MindSpore2日集訓營,之前略微有些基礎,已經不滿足于單純跑通或者完成作業了,想要來點更深入的體驗,于是嘗試走通全過程。在此過程中幾度遭遇波折,在某些關鍵點,我遇到的難度遠超我能力。嘗試的念頭幾近放棄,本文也遲遲未成文。幸得高手指點,我才完成了全流程的體驗,也才有了本文的發表。
接下來就是基于MindSpore Lite端側框架的移動端圖像分類應用的全流程體驗 ,請高手指正,也希望本文能成為不具備GPU硬件的小伙伴體驗的參考。
體驗的流程主要記錄為四個部分:
“一個艱難的開始”——Docker方式下CPU模式訓練Mobilenetv2
“步入正途”——Docker方式下CPU模式增量訓練Mobilenetv2
“修成正果”——Mslite生成android手機APP
“豎掃物體”——手機物體檢測APP掃描體驗
[Docker方式下CPU模式訓練Mobilenetv2]
首先,對小白來講要拿到Mobilenetv2的代碼,高手飛過。對代碼進行組織、除錯和訓練,這是開發的過程。其實,課上就被告知,代碼可以在GPU或者Ascend環境去訓練。但個人的本本是沒有配nvdia GPU的,這就有些尷尬了。聽大家在群里講WSL+Docker,我除了了解一下外并無感興趣的基礎。相反,之前在MindSpore 2日集訓營使用過本地CPU跑通Lenet模型的經歷,讓我十分有勇氣相信可以嘗試Docker+CPU環境,我覺得應該是能跑通的,以往都是可以修改代碼嘛。這個我懂!!!
1、Docker 安裝mindspore-cpu:0.7.0-beta環境;
1.1 管理員方式運行Microsoft PowerShell;
1.2 執行docker pull mindspore/mindspore-cpu:0.7.0-beta獲取mindspore 0.7.0 cpu beta版本image文件;
1.3 執行docker run -it -v /c/test:/mslite mindspore/mindspore-cpu:0.7.0-beta /bin/bash運行mindspore-cpu:0.7.0-beta容器環境;并在windows下C盤根目錄建立test文件夾,該文件夾與docker內mslite文件夾具有通用存儲空間。
2、mindspore-cpu:0.7.0-beta容器環境下,獲取github下mindspore/mindspore-21-days-tutorials/chapter1/mobilenetv2主倉文件;
2.3 在./mslite目錄下執行git init,初始化倉庫;
2.4執行git clone https://github.com/mindspore-ai/mindspore-21-days-tutorials.git獲取mobilenetv2主倉文件;
進入/mindspore-21-days-tutorials/chapter1#目錄,執行復制命令cp -r mobilenetv2 /mslite,將mobilenetv2文件夾復制到我設置的工作目錄./mslite目錄下。
3、下載CIFAR-10 phython version (suitable for Python programs)并解壓、拷貝至程序對應路徑。
3.1 下載完成后解壓縮;
3.2 在mslite目錄下執行mkdir –p /mslite/data/train和mkdir –p /mslite/data/eval,新建train和eval兩個文件夾,準備填充訓練和測試數據;將5個訓練數據集copy到/mslite/data/train目錄中;將1個訓練數據集copy到/mslite/data/eval目錄中。
Ps:因為本次運行container時,將c:\test目錄跟容器內\mslite目錄做了掛載操作,所以,copy文件就可以在windows下直接常規操作了。解壓也是如此。
3.3 執行git add mindspore-ai/,將mslite目錄添加到倉庫;
3.4 執行 git commit -m提交更改;
3.5 執行 git branch,可見對應的”master”主干;執行 git branch mobilenet_v2,新建mobilenet_v2的分支;執行 git checkout mobilenet_v2切換到mobilenet_v2分支;
Ps:在此執行3.3-3.5步,因為數據集基本操作完成,在此提交,有利于程序修改版本的維護!
4、使用vscode在windows環境下對args.py中訓練模式進行修改;
錯誤信息:
路徑
文件
v
原因:
硬件無GPU,默認訓練的模式值由“GPU”更改為“CPU”;
./mobilenetv2/src/
Args.py
Line31
parser.add_argument('--platform', type=str, default="GPU", choices=("CPU", ? "GPU", "Ascend"),??????????????????????? help='run platform, ? only support CPU, GPU and Ascend')
parser.add_argument('--platform', type=str, default="CPU", choices=("CPU", ? "GPU", "Ascend"),??????????????????????? help='run platform, ? only support CPU, GPU and Ascend')
結果
OK!
5、執行python train.py進行訓練時,遇到了幾個錯誤,記錄如下:
錯誤信息:
ImportError: cannot import name ? 'set_seed' from 'mindspore.common'
路徑
文件
v
原因:
本段程序是基于MindSpore_r1.0.0,而我運行的版本是MindSpore_r0.7.0beta,兩者set_seed所調用的位置是不同的。
./mobilenetv2/
train.py
Line31
from mindspore.common import set_seed
import mindspore.dataset as ds
Line41
set_seed(1)
ds.config.set_seed(1)
結果
OK!
錯誤信息:
AttributeError: 'ParameterTensor' object ? has no attribute 'set_data'
路徑
文件
v
原因:
本段程序是基于MindSpore_r1.0.0,而運行的版本是MindSpore_r0.7.0beta,兩者set_data方法及所調用的位置是不同的。
./mobilenetv2/src/
mobilenetV2.py
Line215
m.weight.set_data
m.weight.set_parameter_data
Line218
m.bias.set_data
m.bias.set_parameter_data
Line221
m.gamma.set_data
m.gamma.set_parameter_data
Line223
m.beta.set_data
m.beta.set_parameter_data
Line281
m.weight.set_data
m.weight.set_parameter_data
Line284
m.bias.set_data
m.bias.set_parameter_data
結果
OK!
錯誤信息:
ValueError: num_parallel_workers exceeds ? the boundary between 1 and 2!
路徑
文件
v
原因:
并行數目超出>2
./mobilenetv2/src/
dataset.py
Line56
ds = de.Cifar10Dataset(dataset_path, ? num_parallel_workers=8, shuffle=do_shuffle)
ds = de.Cifar10Dataset(dataset_path, ? num_parallel_workers=1, shuffle=do_shuffle)
結果
OK!
錯誤信息:
RuntimeError: Currently dataset sink mode ? is not supported when the device target is CPU.
路徑
文件
v
原因:
數據下沉模式是針對asic芯片做的優化 默認是開啟的,CPU不支持這種模式。CPU is not supported ? when?dataset_sink_mode is true. If dataset_sink_mode is True, data will ? be sent to device.
./mobilenetv2/
train.py
Line44
if args_opt.platform =="CPU":
args_opt.dataset_sink_mode ? = False
Line91
model.train(epoch_size, dataset, callbacks=cb)
model.train(epoch_size, dataset, ? callbacks=cb,dataset_sink_mode=args_opt.dataset_sink_mode)
結果
OK!
在老師的指導下,處理完顯性錯誤,訓練時停滯幾分鐘并輸出killed,走到這一步基本就沒思路了。后來安裝了mindspore-cpu:r1.0.0,重新開始,處理完顯性錯誤,跟之前是一樣的,訓練時停滯幾分鐘并輸出killed。這時,我意識到自己挖了一個大坑......老師也是建議可以做CPU增量訓練......
直到后來檢查batch_size值過大,改為15,之后又輸出了一個錯誤。
錯誤信息:
停滯并輸出killed
路徑
文件
v
原因:
batch_size=150,此值過大
./mobilenetv2/src/
config.py
28
batch_size":?150
batch_size":?15
結果
OK!
錯誤信息:
[WARN]Not registered CPU kernel:op[Tile]
路徑
文件
v
原因:
查閱Tile算子,目前其對CPU是不支持的。也就是說Docker跑mindspore-cpu這條路是走不通的,除非去改底層算子。
結果
Failed!
請教大神并查閱Tile算子,認為Docker容器中用CPU這條路是跑不通了,認定方向走CPU增量訓練的方式!
[Docker方式下CPU模式增量訓練Mobilenetv2]*官方教程
代碼:Gitee例倉? ./model_zoo/cv/mobilenetv2
1、下載checkpoint文件
查看目錄及文件,其中沒有預訓練完成的checkpoint文件。用戶需要根據不同處理器種類下載CPU/GPU預訓練模型或下載Ascend預訓練模型到以下目錄:./pretrain_checkpoint/
Ps:此處需要下載的是CPU訓練適用的預訓練模型。
在代碼目錄中建立路徑:
mkdir pretrain_checkpoint
下載預訓練完成的文件mobilenetv2_cpu_gpu.ckpt:
wget -P ./pretrain_checkpoint https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite/mobilenetv2_cpu_gpu.ckpt
2、準備數據
準備ImageFolder格式管理的數據集,運行run_train.sh時加入[dataset_path]參數,運行train.py時加入--dataset_path?[dataset_path]參數:
數據集結構如下:
└─ImageFolder
├─train
│?? class1Folder
│?? class2Folder
│?? ......
└─eval
class1Folder
class2Folder
......
因為下載的cifar-10數據集為非文件目錄的,需要轉換。可以編寫python轉換程序進行轉換。代碼及cifar-10數據集在例倉中./mobilenetv2/data/目錄中。
3、開始增量訓練
python train.py --platform CPU --dataset_path ./data/train/ --pretrain_ckpt ./pretrain_checkpoint/mobilenetv2_cpu_gpu.ckpt --freeze_layer backbone
4、錯誤處理:
錯誤信息:
ValueError: num_parallel_workers exceeds the boundary between ? 1 and 2!
路徑
文件
v
原因:
并行運算數目超過1
./mobilenetv2/src/
dataset.py
Line61
ds ? = de.ImageFolderDataset(dataset_path, num_parallel_workers=8, shuffle=True)
ds ? = de.ImageFolderDataset(dataset_path, num_parallel_workers=1, shuffle=True)
Line86
ds ? = ds.map(operations=trans, input_columns="image", num_parallel_workers=8)
ds ? = ds.map(operations=trans, input_columns="image", num_parallel_workers=1)
Line87
ds ? = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=8)
ds ? = ds.map(operations=type_cast_op, input_columns="label", num_parallel_workers=1)
結果
OK!
錯誤信息:
停滯并輸出killed
路徑
文件
v
原因:
batch_size=150,此值過大
./mobilenetv2/src/
config.py
Line28
batch_size":?150
batch_size":?15
結果
OK!
錯誤信息:
AttributeError:’EasyDict’ object has no ? attribute ‘run_distribute’
路徑
文件
v
原因:
參數缺少run_distribute項
./mobilenetv2/src/
config.py
Line43
"run_distribute": ? args.run_distribute,
結果
OK!
終于…...程序輸出打印batch信息……
經過漫長的等待,最終在./ckpt_0目錄下生成了15個.ckpt文件。
5、測試
python eval.py --platform CPU --dataset_path ./data/test --pretrain_ckpt ./ckpt_0/mobilenetv2_15.ckpt
精度尚可~~~
6、模型轉出
python export.py –platform CPU –pretrain_ckpt ./ckpt_0/mobilenetv2_15.ckpt
7、使用convert_lite離線轉換工具,生成端側模型.ms文件
執行bash build.sh -I X86_64 -j4 得到轉換所需的conver_lite工具。
使用mindspore lite離線工具convert_lite工具,將生成的.mindir模型轉換成 MindSpore Lite端側使用的.ms模型文件。
一行命令解決問題:./convert_lite --fmk =MINDIR?--modelFile=mobilenetv2-10_1562.mindir
[Mslite生成android手機APP]
參考教程鏈接:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/lite/object_detection?基本參考本教程,在此不復贅述!
[手機物體檢測APP掃描體驗]
通過本堂課的學習,使我們了解了作為端側APP使能AI的基本流程,對日后的學習和應用大有裨益。部分地方尚需深入學習!
-------------------------------------------------------------End----------------------------------------------------------------------
MindSpore 輕量級操作系統 LiteOS
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。