摘要:本文將帶你們經過幾個小實踐快速上手MindSpore,其中包括MindSpore端邊雲統一格式及華爲智慧終端背後的黑科技。
MindSpore介紹
MindSpore是一種適用於端邊雲場景的新型開源深度學習訓練/推理框架。 MindSpore提供了友好的設計和高效的執行,旨在提高數據科學家和算法工程師的開發體驗,併爲Ascend AI處理器提供原生支持,以及軟硬件協同優化。html
同時,MindSpore做爲全球AI開源社區,致力於進一步開發和豐富AI軟硬件應用生態。linux
接下來我將帶你們經過幾個小實踐快速上手MindSpore:git
1.MindSpore端邊雲統一格式— — MindIRgithub
2.華爲智慧終端背後的黑科技— —超輕量AI引擎MindSpore Lite算法
1、MindSpore端邊雲統一格式— — MindIR
MindIR • 全稱MindSpore IR,是MindSpore的一種基於圖表示的函數式IR,定義了可擴展的圖 結構以及算子的IR表示。它消除了不一樣後端的模型差別,通常用於跨硬件平臺執行推理任務。後端
(1)MindSpore經過統一IR定義了網絡的邏輯結構和算子的屬性,將MindIR格式的模型文件 與硬件平臺解耦,實現一次訓練屢次部署。緩存
(2)MindIR做爲MindSpore的統一模型文件,同時存儲了網絡結構和權重參數值。同時支持 部署到雲端Serving和端側Lite平臺執行推理任務。性能優化
(3)同一個MindIR文件支持多種硬件形態的部署:服務器
- Serving部署推理網絡
- 端側Lite推理部署
1-1導出LeNet網絡的MindIR格式模型
因而我參照着大佬的簡單的寫了一個py解決了這題
1.定義網絡
LeNet網絡不包括輸入層的狀況下,共有7層:2個卷積層、2個下采樣層(池化層)、3個全鏈接層。每層都包含不一樣數量的訓練參數,以下圖所示:
咱們對全鏈接層以及卷積層採用Normal進行參數初始化。
MindSpore支持TruncatedNormal、Normal、Uniform等多種參數初始化方法,默認採用Normal。具體能夠參考MindSpore API的mindspore.common.initializer模塊說明。
使用MindSpore定義神經網絡須要繼承mindspore.nn.Cell。Cell是全部神經網絡(Conv2d等)的基類。
神經網絡的各層須要預先在__init__方法中定義,而後經過定義construct方法來完成神經網絡的前向構造。按照LeNet的網絡結構,定義網絡各層以下:
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官網爲咱們提供了LeNet的Checkpoint文件, 提供了不一樣版本的:https://download.mindspore.cn/model_zoo/official/cv/lenet/
*Checkpoint • 採用了Protocol Buffers格式,存儲了網絡中全部的參數值。通常用於訓練任務中斷後恢復訓練,或訓練後的微調(Fine Tune)任務。
在這裏我選擇了CPU,由於題目說能夠不用訓練,因此定義完網絡我就直接使用了
2.模型轉換
import time import mindspore.nn as nn from datetime import datetime from mindspore.common.initializer import Normal lenet = LeNet5() # 返回模型的參數字典 param_dict = load_checkpoint("./lenet.ckpt") # 加載參數到網絡 load_param_into_net(lenet, param_dict) input = np.random.uniform(0.0, 1.0, size=[32, 1, 32, 32]).astype(np.float32) # 以指定的名稱和格式導出文件 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訓練一個ResNet50網絡。使用訓練好的checkpoint文件,導出MindIR格式模型
訓練ResNet50網絡生成checkpoint
參照着官網的教程使用MindSpore訓練了一個ResNet50網絡圖像分類模型,官網的教程裏那個文檔適用於CPU、GPU和Ascend AI處理器環境。 使用ResNet-50網絡實現圖像分類:https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/cv_resnet50.html
(1)數據集的準備,這裏使用的是CIFAR-10數據集。
(2)構建一個卷積神經網絡,這裏使用ResNet-50網絡。
這裏擔憂本身電腦跑不起來,使用了ModelArts平臺提供的Notebook來跑 8vCPU+64G+1 x Tesla V100-PCIE-32G,不得不說性能很強
這裏對訓練好的ResNet50網絡導出爲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')
爲了保存數據,我把它下載了下來,結果發現原訓練好的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的存儲路徑。
2、華爲智慧終端背後的黑科技— —超輕量AI引擎MindSpore Lite
MindSpore Lite 1.1 在端側模型訓練、算子性能優化、模型小型化、加速庫自動裁剪工具、語音類模型支持、Java接口開放、模型可視化等方面進行了全面升級,升級後的版本更輕、更快、更易用
你們能夠到官網下載對應的MindSpore Lite: https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/downloads.html
1、設計目標
1.端雲一體化
端雲IR統一,雲側訓練模型可直接支持端側重訓雲側混合精度訓練與端側推理協同提高推理性能
2.極致性能/輕量化
經過NPU/CPU/GPU異構並行最大化發揮硬件算力,高效內核算法+彙編指令優化縮短推理時延不依賴任何第三方庫,底層算子庫使用C語言+彙編開發。
3.快捷部署
支持第三方模型TensorFlow Lite、Caffe、ONNX離線轉換,使用戶可快速切換後端;提供量化工具、圖片數據處理等功能方便用戶的部署和使用;
4.全場景覆蓋
覆蓋手機、IoT等各類智能設備;支持ARM CPU、GPU、NPU等多種硬件平臺、支持Android/iOS操做系統;支持端側推理及訓練;
2、關鍵特性
1.性能優化
(1)算子融合:支持多達20+常見的融合,減小內存讀寫和計算量
(2)算子替換:支持常見的算子替換,經過參數值替換減小計算量
(3)算子前移:移動slice相關算動到計算圖前,減小冗餘計算
2.算子優化
對於CPU硬件,影響算子指令執行速度的關鍵因素包括了L1/L2緩存的命中率以及指令的流水布,MindSpore端側CPU算子優化手段包括:
(1)數據的合理排布:MindSpore CPU算子採用NHWC的數據排布格式,相比NC4HW,channel方向不須要補齊至4,更省內存;相比NCHW,卷積單元的點更加緊湊,對緩存更友好;此外,算子間也再也不涉及layout轉換。
(2)寄存器的合理分配:將寄存器按照用途,劃分爲feature map寄存器、權重寄存器和輸出寄存器,寄存器的合理分配能夠減小數據加載的次數。
(3)數據的預存取,經過prefetch/preload等指令,能夠提早將數據讀到cache中。
(4)指令重排,儘可能減小指令的pipeline stall。
(5)向量化計算,使用SIMD指令,如ARM NEON指令,X86 SSE/AVX指令等
3.訓練後量化
豐富的量化策略,精度接近無損
MindSpore Lite訓練後量化工具提供權重量化和全量化兩種方法,支持1~16bit量化,支持分類,檢測,NLP等多種模型
4.Micro for IoT
移動終端上的推理框架,經過模型解釋的方式來進行推理,這樣的方式能夠支持多個模型以及跨硬件平臺,可是須要額外的運行時內存(MCU中最昂貴的資源)來存儲元信息(例如模型結構參數)。MindSpore for Micro的CodeGen方式,將模型中的算子序列從運行時卸載到編譯時,而且僅生成將模型執行的代碼。它不只避免了運行時解釋的時間,並且還釋放了內存使用量,以容許更大的模型運行。這樣生成的二進制大小很輕,所以具備很高的存儲效率。
5.異構自動並行
6.端雲統一
MindSpore在框架的設計上進行了分層設計,將端雲共用的數據結構和模塊解耦出來,在知足端側輕量化的同時,保持了端雲架構的一致性
(1)統一IR:MindSpore core的統一lR,保證了端雲模型/算子定義的一致性,使得雲側訓練的模型能夠無縫的部署在端側。同時,對於端側訓練,能夠和雲側使用一致的R進行模型的重訓。
(2)公共pass:爲了提高性能,訓練好的模型在執行推理前,須要提早作一些優化手段,這些優化包括了融合、常量摺疊、數據排布的調整等等。對於端雲共享的優化,一樣也是包含在MindSporecore模塊中,只不過對於雲側推理,這些優化是在線推理時去執行的,而對於移動終端這些優化在執行推理前離線完成。
(3)統一接口:MindSpore設計了端雲統一的C++接口。統一的C++接口的用法儘可能與Python接口保持了一致,下降了學習成本。經過統一接口,用戶可使用一套代碼在不一樣的硬件上進行推理。
7.端側訓練
(1)支持30+反向算子,提供SGD、ADAM等常見優化器及CrossEntropy/SparsCrossEntropy/MSE等損失函數;既可從零訓練模型,也可指定特定網絡層微調,達到遷移學習目的;
(2)已支持LeNet/AlexNet/ResNet/MobileNetV1/V2/V3和EffectiveNet等網絡訓練,提供完整的模型加載,轉換和訓練腳本,方便用戶使用和調測;
(3)MindSpore雲側訓練和端側訓練實現無縫對接,雲側模型可直接加載到端側進行訓練;
(4)支持checkpoint機制,訓練過程異常中斷後可快速恢復繼續訓練;
實踐一下:
2-1在 MindSpore model_zoo下載模型mobilenetv2.mindir( https://download.mindspore.cn/model_zoo/official/lite/mobilenetv2_openimage_lite), 使用MindSpore lite converter 轉成.ms 模型,請保留所使用的模型轉換命令和模型轉換截圖
1.按要求打開連接找到指定的模型文件下載下來備用
2.把文件放到MindSpore lite converter文件夾下
由於我這裏是直接把文件夾放到了桌面,在CMD中進到這個文件環境目錄裏
cd c: \Users\Administrator\Desktop\MindSporePetClassification\converter
3.將.mindir模型轉換爲.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定義轉換後MS文件的名稱。
成功後,會在converter文件夾中生成對應的.ms文件。
3、一鍵部署在線推理服務— —MindSpore Serving
MindSpore Serving就是爲實現將深度學習部署到生產環境而產生的
MindSpore Serving是一個簡單易用、高性能的服務模塊,旨在幫助MindSpore開發者在生產環境中高效部署在線推理服務
注:MindSpore Serving當前僅支持Ascend 310和Ascend 910環境。
你們能夠在MindSpore官網下載對應版本安裝包實踐:https://www.mindspore.cn/versions
特色
(1)簡單易用
提供Python接口配置和啓動Serving服務,對客戶端提供gRPC和RESTful訪問接口,提供Python客戶端接口,經過它,你們能夠輕鬆定製、發佈、部署和訪問模型服務。
安裝:
pip install mindspore_serving-1.1.0-cp37-cp37m-linux_aarch64.whl
1)輕量級部署
服務端調用Python接口直接啓動推理進程(master和worker共進程),客戶端直接鏈接推理服務後下發推理任務。 執行master_with_worker.py,完成輕量級部署服務:
import os from mindspore_serving import master from mindspore_serving import worker def start(): servable_dir = os.path.abspath(".") worker.start_servable_in_master(servable_dir, "add", device_id=0) master.start_grpc_server("127.0.0.1", 5500) if __name__ == "__main__": start()
當服務端打印日誌Serving gRPC start success, listening on 0.0.0.0:5500時,表示Serving服務已加載推理模型完畢。
2)集羣部署
服務端由master進程和worker進程組成,master用來管理集羣內全部的worker節點,並進行推理任務的分發。
部署master:
import os from mindspore_serving import master def start(): servable_dir = os.path.abspath(".") master.start_grpc_server("127.0.0.1", 5500) master.start_master_server("127.0.0.1", 6500) if __name__ == "__main__": start()
部署worker:
import os from mindspore_serving import worker def start(): servable_dir = os.path.abspath(".") worker.start_servable(servable_dir, "add", device_id=0, master_ip="127.0.0.1", master_port=6500, worker_ip="127.0.0.1", worker_port=6600) if __name__ == "__main__": start()
輕量級部署和集羣部署啓動worker所使用的接口存在差別,其中,輕量級部署使用start_servable_in_master接口啓動worker,集羣部署使用start_servable接口啓動worker。
(2)提供定製化服務
支持模型供應商打包發佈模型、預處理和後處理,圍繞模型提供定製化服務,並一鍵部署,服務使用者不須要感知模型處理細節。
舉個栗子:實現導出兩個tensor相加操做的模型
import os from shutil import copyfile import numpy as np import mindspore.context as context import mindspore.nn as nn import mindspore.ops as ops import mindspore as ms context.set_context(mode=context.GRAPH_MODE, device_target="Ascend") class Net(nn.Cell): """Define Net of add""" def __init__(self): super(Net, self).__init__() self.add = ops.TensorAdd() def construct(self, x_, y_): """construct add net""" return self.add(x_, y_) def export_net(): """Export add net of 2x2 + 2x2, and copy output model `tensor_add.mindir` to directory ../add/1""" x = np.ones([2, 2]).astype(np.float32) y = np.ones([2, 2]).astype(np.float32) add = Net() output = add(ms.Tensor(x), ms.Tensor(y)) ms.export(add, ms.Tensor(x), ms.Tensor(y), file_name='tensor_add', file_format='MINDIR') dst_dir = '../add/1' try: os.mkdir(dst_dir) except OSError: pass dst_file = os.path.join(dst_dir, 'tensor_add.mindir') copyfile('tensor_add.mindir', dst_file) print("copy tensor_add.mindir to " + dst_dir + " success") print(x) print(y) print(output.asnumpy()) if __name__ == "__main__": export_net()
構造一個只有Add算子的網絡,並導出MindSpore推理部署模型,該模型的輸入爲兩個shape爲[2,2]的二維Tensor,輸出結果是兩個輸入Tensor之和。
(3)支持批處理
用戶一次請求可發送數量不定樣本,Serving分割和組合一個或多個請求的樣本以匹配模型的實際batch,不只僅加速了Serving請求處理能力,而且也簡化了客戶端的使用。
主要針對處理圖片、文本等包含batch維度的模型。假設batch_size=2,當前請求有3個實例,共3張圖片,會拆分爲2次模型推理,第1次處理2張圖片返回2個結果,第2次對剩餘的1張圖片進行拷貝作一次推理並返回1個結果,最終返回3個結果。
對於一個模型,假設其中一個輸入是數據輸入,包括batch維度信息,另外一個輸入爲模型配置信息,沒有包括batch維度信息,此時在設置with_batch_dim爲True基礎上,設置額**數without_batch_dim_inputs指定沒有包括batch維度信息的輸入信息。
from mindspore_serving.worker import register # Input1 indicates the input shape information of the model, without the batch dimension information. # input0: [N,3,416,416], input1: [2] register.declare_servable(servable_file="yolov3_darknet53.mindir", model_format="MindIR", with_batch_dim=True, without_batch_dim_inputs=1)
(4) 高性能高擴展
支持多模型多卡併發,經過client/master/worker的服務體系架構,實現MindSpore Serving的高性能和高擴展性。
華爲Ascend主打芯片低功耗、高算力等特性,MindSpore提供高效的內核算法、自動融合,自動並行等能力。支持多模型多卡併發,經過client/master/worker的服務體系架構,實現MindSpore Serving的高性能和高擴展性。
高可靠性設計(某個服務節點宕機,不影響客戶端正常服務),負載均衡(如何更合理的使用全部資源信息),彈性擴容縮容(根據業務的高峯低谷,動態調整資源)
4、AI數據高速加載直通車— —單節點數據緩存
Cache單節點緩存模塊可用於緩存預處理後的訓練數據,加速數據加載,提高數據複用率,下降數據預處理所需的CPU算力
對於須要重複訪問遠程的數據集或須要重複從磁盤中讀取數據集的狀況,可使用單節點緩存算子將數據集緩存於本地內存中,以加速數據集的讀取。 緩存算子依賴於在當前節點啓動的緩存服務器,緩存服務器做爲守護進程獨立於用戶的訓練腳本而存在,主要用於提供緩存數據的管理,支持包括存儲、查找、讀取以及發生緩存未命中時對於緩存數據的寫入等操做。
對比使用數據緩存和不使用數據緩存的數據加載流程pipeline,第一個,是不使用數據緩存服務的常規數據處理流程
1.緩存加載後的原始數據,用戶能夠在數據集加載算子中使用緩存。這將把加載完成的數據存到緩存服務器中,後續若需相同數據則可直接從中讀取,避免從磁盤中重複加載。
2.緩存通過數據加強操做後的數據,用戶也可在Map算子中使用緩存。這將容許咱們直接緩存數據加強(如圖像裁剪、縮放等)處理後的數據,避免數據加強操做重複進行,減小了沒必要要的計算量。
3. 以上兩種類型的緩存本質上都是爲了提升數據複用,以減小數據處理過程耗時,提升網絡訓練性能。
Cache的三個重要組件
(1)緩存算子
1.對於mappable的數據集(如ImageFolder)的pipeline,Cache將建立名爲CacheLookupOp和CacheMergeOp的兩個緩存算子,並對pipeline作出相應的調整。
2.見於上圖Mappable數據集圖示,左邊的數據處理pipeline,當用戶在MapOp後插入緩存算子後,通過Cache變換調整過程,將對pipeline進行變換並最終將其調整爲右圖中包含CacheLookupOp和CacheMergeOp兩個緩存算子的結構
3.對於包含non-mappable的數據集(如TFRecord)的pipeline,咱們將建立名爲CacheOp的緩存算子,並在pipeline相應位置插入CacheOp。見於上圖Non-mappable數據集圖示,左邊的數據處理pipeline,當用戶在MapOp後插入緩存算子後,通過Cache變換調整過程,將對pipeline進行變換並最終將其調整爲右圖中包含CacheOp緩存算子的結構。
(2)緩存服務器
主要負責響應緩存客戶端所發送的請求,提供緩存數據的查找、讀取,以及發生緩存未命中時對於緩存數據的寫入等功能。緩存服務器擁有本身的工做隊列,不斷循環從工做隊列中獲取一個請求去執行並將結果返回給客戶端。同一個緩存服務器能夠爲多個緩存客戶端提供服務,且緩存服務器經過緩存客戶端的session_id以及該緩存客戶端所對應的數據處理pipeline的crc碼來惟一肯定該緩存客戶端。所以,兩個徹底一致的pipeline能夠經過指定相同的session_id來共享同一個緩存服務,而不一樣的pipeline若試圖共享同一個緩存客戶端則會報錯。
1.Cache_server如何啓動?
Cache Server的服務由一個外部守護進程提供,在用戶使用Cache服務以前,須要先在mindspore外部啓動一個服務器守護進程,來與緩存客戶進行交互溝通;
ms_cache_server start|session [–m <mem_size>] [-d <spill_path>] [-nospill] [-h <host>] [-p <port>] #Command: start | session #start #– starts the service #session #– creates a new caching session, returning the session_id as output
而後啓動
cache_admin --start
2.cache_server建立時默認的port端口號是多少?
默認對IP爲127.0.0.1(localhost)且端口號爲50052的服務器執行操做
(3)緩存客戶端
主要負責與緩存服務器創建通信,向緩存服務器發起數據讀取、數據寫入、狀態查詢等請求。緩存客戶端與服務器之間經過gRPC進行通信,以下圖所示:當客戶端須要發起請求時,僅須要將請求添加到gRPC函數庫所提供的gRPC隊列,由gRPC線程不斷循環從gRPC隊列中獲取一個請求並將該請求發送到緩存服務器的工做隊列中。當緩存服務器須要將處理後的響應數據返回給客戶端時,也經過相似的方式將響應數據添加到gRPC隊列中,並依賴gRPC實際將數據傳輸至客戶端。
3.cache_client實體在建立時,其<session_id>如何獲取?
惟一標識與緩存服務的鏈接session。應該從ms_cache_service session命令返回的session_id。當給出該選項時,緩存的大小和溢出行爲取自session。若是未給出值,則假設這是惟一的通道,沒有其餘通道將共享此緩存。在這種狀況下,將自動生成一個session_id。
ms_cache_server start|session [–m <mem_size>] [-d <spill_path>] [-nospill] [-h <host>] [-p <port>] #Command: start | session #– creates a new caching session, returning the session_id as output
若緩存服務器中不存在緩存會話,則須要建立一個緩存會話,獲得緩存會話id:
其中3231564523爲端口50052的服務器分配的緩存會話id,緩存會話id由服務器分配。
5、快速定位模型精度問題— —MindSpore調試器
在圖模式下,用戶難以從Python層獲取到計算圖中間節點的結果。MindSpore調試器是爲圖模式訓練提供的調試工具,能夠用來查看並分析計算圖節點的中間結果。
使用MindSpore調試器,能夠:
(1)在MindInsight調試器界面結合計算圖,查看圖節點的輸出結果;
(2)設置監測點,監測訓練異常狀況(好比檢查張量溢出),在異常發生時追蹤錯誤緣由;
(3)查看權重等參數的變化狀況。
1、常見精度問題和定位思路
(1)常見現象
- loss:跑飛,不收斂,收斂慢
- metrics:accuracy、precision等達不到預期
- 梯度:梯度消失、梯度爆炸
- 權重:權重不更新、權重變化太小、權重變化過大
- 激活值:激活值飽和、dead relu
(2)常見問題
- 模型結構問題:算子使用錯誤、權重共享錯誤、權重凍結錯誤、節點鏈接錯誤、 loss函數錯誤、優化器錯誤等
- 超參問題:超參設置不合理等
- 數據問題:缺失值過多、異常值、未歸一化等
(3)經常使用定位思路
1)定位準備
回顧算法設計,全面熟悉模型
•算法設計、超參、loss、優化器、數據處理等
•參考論文、其它實現
熟悉可視化工具
•安裝MindInsight https://www.mindspore.com/install
•加入SummaryCollector callback,收集訓練信息
•在summary_dir的父目錄中啓動MindInsight
•mindinsight start
•熟悉調試器使用
熟悉調試器
•MindSpore調試器是爲圖模式訓練提供的調試工具
•在MindInsight調試器界面結合計算圖,查看圖節點的輸出結果;
•設置監測點,監測訓練異常狀況(好比檢查張量溢出),在異常發生時追蹤錯誤緣由;
•查看權重等參數的變化狀況。
使用指南請見 https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html
•debugger使用指南請見https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/debugger.html
2)檢查代碼、超參、模型結構
1.走讀腳本,檢查代碼
•小黃鴨調試法
•檢查代碼同模型設計、論文、參考腳本等是否一致
2.超參常見問題:
•學習率不合理
•權重初始化參數不合理等
3.MindInsight輔助檢查:訓練列表->訓練參數詳情
4.模型結構常見問題:
•算子使用錯誤(使用的算子不適用於目標場景,如應該使用浮點除,錯誤地使用了整數除),
•權重共享錯誤(共享了不該共享的權重),
•權重凍結錯誤(凍結了不該凍結的權重),
•節點鏈接錯誤(應該鏈接到計算圖中的block未鏈接),
•loss函數錯誤,
•優化器算法錯誤(若是自行實現了優化器)等。
5.MindInsight輔助檢查:訓練列表->訓練看板->計算圖
3)檢查輸入數據
1.輸入數據常見問題:
•數據缺失值過多
•每一個類別中的樣本數目不均衡
•數據中存在異常值
•數據標籤錯誤
•訓練樣本不足
•未對數據進行標準化,輸入模型的數據不在正確的範圍內
•finetune和pretrain的數據處理方式不一樣
•訓練階段和推理階段的數據處理方式不一樣
•數據處理參數不正確等。
2.MindInsight輔助檢查:訓練列表->訓練看板->數據抽樣
4)檢查loss曲線
1.常見現象
•loss跑飛
回顧腳本、模型結構和數據,
•檢查超參是否有不合理的特別大/特別小的取值,
•檢查模型結構是否實現正確,特別是檢查loss函數是否實現正確,
•檢查輸入數據中是否有缺失值、是否有特別大/特別小的取值。
使用參數分佈圖檢查參數更新是否有劇烈變化
使用調試器功能對訓練現場進行檢查
•配置「檢查張量溢出」監測點,定位NAN/INF出現位置
•配置「檢查過大張量」監測點,定位出現大值的算子
•配置「檢查權重變化過大」、「檢查梯度消失」、「檢查梯度過大」監測點,定位異常的權重或梯度
•loss收斂慢
2.MindInsight輔助檢查:訓練列表->訓練看板->標量曲線/參數分佈圖
3.調試器定位
5)檢查精度是否達到預期
1.回顧代碼、模型結構、輸入數據和loss曲線,
•檢查超參是否有不合理的值
•檢查模型結構是否實現正確
•檢查輸入數據是否正確
•檢查loss曲線的收斂結果和收斂趨勢是否存在異常
2.嘗試使用「溯源分析」和調參器優化超參
•mindoptimizer --config ./config.yaml --iter 10
3.嘗試模型解釋
4.嘗試優化模型算法
注意事項
1.場景支持
•調試器暫不支持分佈式訓練場景。
•調試器暫不支持推斷場景。
•調試器暫不支持單機多卡/集羣場景。
•調試器暫不支持鏈接多個訓練進程。
•調試器暫不支持CPU場景。
2.性能影響
•使用調試器時,會對訓練性能產生必定影響。
•設置的監測點數目過多時,可能會出現系統內存不足(Out-of-Memory)的異常。
3.GPU場景
•在GPU場景下,只有知足條件的參數節點能夠與自身的上一輪次結果做對比:使用下一個節點執行過的節點、使用運行到該節點時選中的節點、做爲監測點輸入的參數節點。其餘狀況均沒法使用上一輪次對比功能。
•因爲GPU上一個輪次是一個子圖(而非完整的圖),GPU上多圖作從新檢查時,只能從新檢查當前的子圖。
4.從新檢查只檢查當前有張量值的監測點。
5.檢查計算過程溢出須要用戶開啓異步Dump的所有溢出檢測功能,開啓方式請參照異步Dump功能介紹
6.調試器展現的圖是優化後的最終執行圖。調用的算子可能已經與其它算子融合,或者在優化後改變了名稱。
參考
[1]www.mindspore.cn
[2]gitee.com/mindspore
本文分享自華爲雲社區《幾個小實踐帶你兩天快速上手MindSpore 》,原文做者:Jack20 。