幾個小實踐帶你兩天快速上手MindSpore(上)
MindSpore介紹
MindSpore是一種適用于端邊云場景的新型開源深度學(xué)習(xí)訓(xùn)練/推理框架。 MindSpore提供了友好的設(shè)計和高效的執(zhí)行,旨在提升數(shù)據(jù)科學(xué)家和算法工程師的開發(fā)體驗,并為Ascend AI處理器提供原生支持,以及軟硬件協(xié)同優(yōu)化。
同時,MindSpore作為全球AI開源社區(qū),致力于進一步開發(fā)和豐富AI軟硬件應(yīng)用生態(tài)。
接下來我將帶大家通過幾個小實踐快速上手MindSpore:
1.MindSpore端邊云統(tǒng)一格式— — MindIR
2.華為智慧終端背后的黑科技— —超輕量AI引擎MindSpore Lite
一、MindSpore端邊云統(tǒng)一格式
— — MindIR
MindIR ? 全稱MindSpore IR,是MindSpore的一種基于圖表示的函數(shù)式IR,定義了可擴展的圖 結(jié)構(gòu)以及算子的IR表示。它消除了不同后端的模型差異,一般用于跨硬件平臺執(zhí)行推理任務(wù)。
(1)MindSpore通過統(tǒng)一IR定義了網(wǎng)絡(luò)的邏輯結(jié)構(gòu)和算子的屬性,將MindIR格式的模型文件 與硬件平臺解耦,實現(xiàn)一次訓(xùn)練多次部署。
(2)MindIR作為MindSpore的統(tǒng)一模型文件,同時存儲了網(wǎng)絡(luò)結(jié)構(gòu)和權(quán)重參數(shù)值。同時支持 部署到云端Serving和端側(cè)Lite平臺執(zhí)行推理任務(wù)。
(3)同一個MindIR文件支持多種硬件形態(tài)的部署:
- Serving部署推理
- 端側(cè)Lite推理部署
1-1導(dǎo)出LeNet網(wǎng)絡(luò)的MindIR格式模型
于是我參照著大佬的簡單的寫了一個py解決了這題
1.定義網(wǎng)絡(luò)
LeNet網(wǎng)絡(luò)不包括輸入層的情況下,共有7層:2個卷積層、2個下采樣層(池化層)、3個全連接層。每層都包含不同數(shù)量的訓(xùn)練參數(shù),如下圖所示:
我們對全連接層以及卷積層采用Normal進行參數(shù)初始化。
MindSpore支持TruncatedNormal、Normal、Uniform等多種參數(shù)初始化方法,默認采用Normal。具體可以參考MindSpore API的mindspore.common.initializer模塊說明。
使用MindSpore定義神經(jīng)網(wǎng)絡(luò)需要繼承mindspore.nn.Cell。Cell是所有神經(jīng)網(wǎng)絡(luò)(Conv2d等)的基類。
神經(jīng)網(wǎng)絡(luò)的各層需要預(yù)先在__init__方法中定義,然后通過定義construct方法來完成神經(jīng)網(wǎng)絡(luò)的前向構(gòu)造。按照LeNet的網(wǎng)絡(luò)結(jié)構(gòu),定義網(wǎng)絡(luò)各層如下:
import mindspore.nn as nn from mindspore.common.initializer import Normal class LeNet5(nn.Cell): """ Lenet network structure """ #define the operator required def __init__(self, num_class=10, num_channel=1): super(LeNet5, self).__init__() self.conv1 = nn.Conv2d(num_channel, 6, 5, pad_mode='valid') self.conv2 = nn.Conv2d(6, 16, 5, pad_mode='valid') self.fc1 = nn.Dense(16 * 5 * 5, 120, weight_init=Normal(0.02)) self.fc2 = nn.Dense(120, 84, weight_init=Normal(0.02)) self.fc3 = nn.Dense(84, num_class, weight_init=Normal(0.02)) self.relu = nn.ReLU() self.max_pool2d = nn.MaxPool2d(kernel_size=2, stride=2) self.flatten = nn.Flatten() #use the preceding operators to construct networks def construct(self, x): x = self.max_pool2d(self.relu(self.conv1(x))) x = self.max_pool2d(self.relu(self.conv2(x))) x = self.flatten(x) x = self.relu(self.fc1(x)) x = self.relu(self.fc2(x)) x = self.fc3(x) return x
MindSpore官網(wǎng)為我們提供了LeNet的Checkpoint文件,提供了不同版本的:https://download.mindspore.cn/model_zoo/official/cv/lenet/
*Checkpoint ? 采用了Protocol Buffers格式,存儲了網(wǎng)絡(luò)中所有的參數(shù)值。一般用于訓(xùn)練任務(wù)中斷后恢復(fù)訓(xùn)練,或訓(xùn)練后的微調(diào)(Fine Tune)任務(wù)。在這里我選擇了CPU,因為題目說可以不用訓(xùn)練,所以定義完網(wǎng)絡(luò)我就直接使用了
2.模型轉(zhuǎn)換
import time import mindspore.nn as nn from datetime import datetime from mindspore.common.initializer import Normal lenet = LeNet5() # 返回模型的參數(shù)字典 param_dict = load_checkpoint("./lenet.ckpt") # 加載參數(shù)到網(wǎng)絡(luò) load_param_into_net(lenet, param_dict) input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32) # 以指定的名稱和格式導(dǎo)出文件 export(lenet, Tensor(input), file_name='lenet.mindir', file_format='MINDIR',) t = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(" ") print("============== Model conversion succeeded ==============") print(t)
1-2訓(xùn)練一個ResNet50網(wǎng)絡(luò)。使用訓(xùn)練好的checkpoint文件,導(dǎo)出MindIR格式模型
訓(xùn)練ResNet50網(wǎng)絡(luò)生成checkpoint
參照著官網(wǎng)的教程使用MindSpore訓(xùn)練了一個ResNet50網(wǎng)絡(luò)圖像分類模型,官網(wǎng)的教程里那個文檔適用于CPU、GPU和Ascend AI處理器環(huán)境。使用ResNet-50網(wǎng)絡(luò)實現(xiàn)圖像分類:https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/cv_resnet50.html
(1)數(shù)據(jù)集的準(zhǔn)備,這里使用的是CIFAR-10數(shù)據(jù)集。
(2)構(gòu)建一個卷積神經(jīng)網(wǎng)絡(luò),這里使用ResNet-50網(wǎng)絡(luò)。
這里擔(dān)心自己電腦跑不起來,使用了ModelArts平臺提供的Notebook來跑 8vCPU+64G+1 x Tesla V100-PCIE-32G,不得不說性能很強這里對訓(xùn)練好的ResNet50網(wǎng)絡(luò)導(dǎo)出為MindIR 格式
import numpy as np from resnet import resnet50 from mindspore.train.serialization import export, load_checkpoint, load_param_into_net from mindspore import Tensor resnet = resnet50(batch_size=32, num_classes=10) # return a parameter dict for model param_dict = load_checkpoint("./models/ckpt/mindspore_vision_application/train_resnet_cifar10-10_1562.ckpt") # load the parameter into net load_param_into_net(resnet, param_dict) input = np.random.uniform(0.0, 1.0, size=[32, 3, 224, 224]).astype(np.float32) export(resnet, Tensor(input), file_name='resnet_Jack20.mindir', file_format='MINDIR')
為了保存數(shù)據(jù),我把它下載了下來,結(jié)果發(fā)現(xiàn)原訓(xùn)練好的Checkpoint文件文件過大超過了100MB不能直接下載,于是找到了另一種解決方法:
在Notebook中,新建一個“ipynb”文件,使用MoXing先將大文件從Notebook上傳到OBS中,然后我再從我OBS桶了下載不就完了嘛
import moxing as mox mox.file.copy('./train_resnet_cifar10-10_1562.ckpt', 'obs://bucket_name/train_resnet_cifar10-10_1562.ckpt')
注:其中"./train_resnet_cifar10-10_1562.ckpt”為文件在Notebook中的存儲路徑,"train_resnet_cifar10-10_1562.ckpt”為該文件上傳到OBS的存儲路徑。
二、華為智慧終端背后的黑科技
— —超輕量AI引擎MindSpore Lite
MindSpore Lite 1.1 在端側(cè)模型訓(xùn)練、算子性能優(yōu)化、模型小型化、加速庫自動裁剪工具、語音類模型支持、Java接口開放、模型可視化等方面進行了全面升級,升級后的版本更輕、更快、更易用
大家可以到官網(wǎng)下載對應(yīng)的MindSpore Lite:?https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/downloads.html
一、設(shè)計目標(biāo)
1.端云一體化
端云IR統(tǒng)一,云側(cè)訓(xùn)練模型可直接支持端側(cè)重訓(xùn)云側(cè)混合精度訓(xùn)練與端側(cè)推理協(xié)同提升推理性能
2.極致性能/輕量化
通過NPU/CPU/GPU異構(gòu)并行最大化發(fā)揮硬件算力,高效內(nèi)核算法+匯編指令優(yōu)化縮短推理時延不依賴任何第三方庫,底層算子庫使用C語言+匯編開發(fā)。
3.快捷部署
支持第三方模型TensorFlow Lite、Caffe、ONNX離線轉(zhuǎn)換,使用戶可快速切換后端;提供量化工具、圖片數(shù)據(jù)處理等功能方便用戶的部署和使用;
4.全場景覆蓋
覆蓋手機、IoT等各種智能設(shè)備;支持ARM CPU、GPU、NPU等多種硬件平臺、支持Android/iOS操作系統(tǒng);支持端側(cè)推理及訓(xùn)練;
二、關(guān)鍵特性
1.性能優(yōu)化
(1)算子融合:支持多達20+常見的融合,減少內(nèi)存讀寫和計算量
(2)算子替換:支持常見的算子替換,通過參數(shù)值替換減少計算量
(3)算子前移:移動slice相關(guān)算動到計算圖前,減少冗余計算
2.算子優(yōu)化
對于CPU硬件,影響算子指令執(zhí)行速度的關(guān)鍵因素包括了L1/L2緩存的命中率以及指令的流水布,MindSpore端側(cè)CPU算子優(yōu)化手段包括:
(1)數(shù)據(jù)的合理排布:MindSpore CPU算子采用NHWC的數(shù)據(jù)排布格式,相比NC4HW,channel方向不需要補齊至4,更省內(nèi)存;相比NCHW,卷積單元的點更加緊湊,對緩存更友好;此外,算子間也不再涉及l(fā)ayout轉(zhuǎn)換。
(2)寄存器的合理分配:將寄存器按照用途,劃分為feature map寄存器、權(quán)重寄存器和輸出寄存器,寄存器的合理分配可以減少數(shù)據(jù)加載的次數(shù)。
(3)數(shù)據(jù)的預(yù)存取,通過prefetch/preload等指令,可以提前將數(shù)據(jù)讀到cache中。
(4)指令重排,盡量減少指令的pipeline stall。
(5)向量化計算,使用SIMD指令,如ARM NEON指令,X86 SSE/AVX指令等
3.訓(xùn)練后量化
豐富的量化策略,精度接近無損
MindSpore Lite訓(xùn)練后量化工具提供權(quán)重量化和全量化兩種方法,支持1~16bit量化,支持分類,檢測,NLP等多種模型
4.Micro for IoT
移動終端上的推理框架,通過模型解釋的方式來進行推理,這樣的方式可以支持多個模型以及跨硬件平臺,但是需要額外的運行時內(nèi)存(MCU中最昂貴的資源)來存儲元信息(例如模型結(jié)構(gòu)參數(shù))。MindSpore for Micro的CodeGen方式,將模型中的算子序列從運行時卸載到編譯時,并且僅生成將模型執(zhí)行的代碼。它不僅避免了運行時解釋的時間,而且還釋放了內(nèi)存使用量,以允許更大的模型運行。這樣生成的二進制大小很輕,因此具有很高的存儲效率。
5.異構(gòu)自動并行
6.端云統(tǒng)一
MindSpore在框架的設(shè)計上進行了分層設(shè)計,將端云共用的數(shù)據(jù)結(jié)構(gòu)和模塊解耦出來,在滿足端側(cè)輕量化的同時,保持了端云架構(gòu)的一致性
(1)統(tǒng)一IR:MindSpore core的統(tǒng)一lR,保證了端云模型/算子定義的一致性,使得云側(cè)訓(xùn)練的模型可以無縫的部署在端側(cè)。同時,對于端側(cè)訓(xùn)練,可以和云側(cè)使用一致的R進行模型的重訓(xùn)。
(2)公共pass:為了提升性能,訓(xùn)練好的模型在執(zhí)行推理前,需要提前做一些優(yōu)化手段,這些優(yōu)化包括了融合、常量折疊、數(shù)據(jù)排布的調(diào)整等等。對于端云共享的優(yōu)化,同樣也是包含在MindSporecore模塊中,只不過對于云側(cè)推理,這些優(yōu)化是在線推理時去執(zhí)行的,而對于移動終端這些優(yōu)化在執(zhí)行推理前離線完成。
(3)統(tǒng)一接口:MindSpore設(shè)計了端云統(tǒng)一的C++接口。統(tǒng)一的C++接口的用法盡量與Python接口保持了一致,降低了學(xué)習(xí)成本。通過統(tǒng)一接口,用戶可以使用一套代碼在不同的硬件上進行推理。
7.端側(cè)訓(xùn)練
(1)支持30+反向算子,提供SGD、ADAM等常見優(yōu)化器及CrossEntropy/SparsCrossEntropy/MSE等損失函數(shù);既可從零訓(xùn)練模型,也可指定特定網(wǎng)絡(luò)層微調(diào),達到遷移學(xué)習(xí)目的;
(2)已支持LeNet/AlexNet/ResNet/MobileNetV1/V2/V3和EffectiveNet等網(wǎng)絡(luò)訓(xùn)練,提供完整的模型加載,轉(zhuǎn)換和訓(xùn)練腳本,方便用戶使用和調(diào)測;
(3)MindSpore云側(cè)訓(xùn)練和端側(cè)訓(xùn)練實現(xiàn)無縫對接,云側(cè)模型可直接加載到端側(cè)進行訓(xùn)練;
(4)支持checkpoint機制,訓(xùn)練過程異常中斷后可快速恢復(fù)繼續(xù)訓(xùn)練;
實踐一下:
2-1在 MindSpore model_zoo下載模型mobilenetv2.mindir(?https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite), 使用MindSpore lite converter 轉(zhuǎn)成.ms 模型,請保留所使用的模型轉(zhuǎn)換命令和模型轉(zhuǎn)換截圖
1.按要求打開鏈接找到指定的模型文件下載下來備用
2.把文件放到MindSpore?lite converter文件夾下
因為我這里是直接把文件夾放到了桌面,在CMD中進到這個文件環(huán)境目錄里
cd c: \Users\Administrator\Desktop\MindSporePetClassification\converter
3.將.mindir模型轉(zhuǎn)換為.ms?模型
call converter_lite --fmk=MINDIR --modelFile=c:\Users\Administrator\Desktop\MindSporePetClassification\converter\mobilenetv2.mindir --outputFile=Jack20
注意:其中c:\Users\Administrator\Desktop\MindSporePetClassification\converter\mobilenetv2.mindir代表生成的mindir文件,而--outputFile定義轉(zhuǎn)換后MS文件的名稱。
成功后,會在converter文件夾中生成對應(yīng)的.ms文件。
明天我將繼續(xù)為大家?guī)恚?/p>
1.一鍵部署在線推理服務(wù)— —MindSpore Serving
2.AI數(shù)據(jù)高速加載直通車— —單節(jié)點數(shù)據(jù)緩存
3.快速定位模型精度問題— —MindSpore調(diào)試器
參考
[1]www.mindspore.cn
[2]gitee.com/mindspore
[3]github.com/mindspore-ai
MindSpore 機器學(xué)習(xí) 深度學(xué)習(xí)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。