摘要:本文將帶大家通過幾個小實踐快速上手MindSpore,其中包括MindSpore端邊雲統一格式及華為智慧終端背后的黑科技。
MindSpore介紹
MindSpore是一種適用於端邊雲場景的新型開源深度學習訓練/推理框架。 MindSpore提供了友好的設計和高效的執行,旨在提升數據科學家和算法工程師的開發體驗,並為Ascend AI處理器提供原生支持,以及軟硬件協同優化。
同時,MindSpore作為全球AI開源社區,致力於進一步開發和豐富AI軟硬件應用生態。
接下來我將帶大家通過幾個小實踐快速上手MindSpore:
1.MindSpore端邊雲統一格式— — MindIR
2.華為智慧終端背后的黑科技— —超輕量AI引擎MindSpore Lite
一、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的存儲路徑。
二、華為智慧終端背后的黑科技— —超輕量AI引擎MindSpore Lite
MindSpore Lite 1.1 在端側模型訓練、算子性能優化、模型小型化、加速庫自動裁剪工具、語音類模型支持、Java接口開放、模型可視化等方面進行了全面升級,升級后的版本更輕、更快、更易用
大家可以到官網下載對應的MindSpore Lite: https://www.mindspore.cn/tutorial/lite/zh-CN/r1.1/use/downloads.html
一、設計目標
1.端雲一體化
端雲IR統一,雲側訓練模型可直接支持端側重訓雲側混合精度訓練與端側推理協同提升推理性能
2.極致性能/輕量化
通過NPU/CPU/GPU異構並行最大化發揮硬件算力,高效內核算法+匯編指令優化縮短推理時延不依賴任何第三方庫,底層算子庫使用C語言+匯編開發。
3.快捷部署
支持第三方模型TensorFlow Lite、Caffe、ONNX離線轉換,使用戶可快速切換后端;提供量化工具、圖片數據處理等功能方便用戶的部署和使用;
4.全場景覆蓋
覆蓋手機、IoT等各種智能設備;支持ARM CPU、GPU、NPU等多種硬件平台、支持Android/iOS操作系統;支持端側推理及訓練;
二、關鍵特性
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文件。
三、一鍵部署在線推理服務— —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的高性能和高擴展性。
高可靠性設計(某個服務節點宕機,不影響客戶端正常服務),負載均衡(如何更合理的使用所有資源信息),彈性擴容縮容(根據業務的高峰低谷,動態調整資源)
四、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由服務器分配。
五、快速定位模型精度問題— —MindSpore調試器
在圖模式下,用戶難以從Python層獲取到計算圖中間節點的結果。MindSpore調試器是為圖模式訓練提供的調試工具,可以用來查看並分析計算圖節點的中間結果。
使用MindSpore調試器,可以:
(1)在MindInsight調試器界面結合計算圖,查看圖節點的輸出結果;
(2)設置監測點,監測訓練異常情況(比如檢查張量溢出),在異常發生時追蹤錯誤原因;
(3)查看權重等參數的變化情況。
一、常見精度問題和定位思路
(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.調試器展示的圖是優化后的最終執行圖。調用的算子可能已經與其它算子融合,或者在優化后改變了名稱。
參考
本文分享自華為雲社區《幾個小實踐帶你兩天快速上手MindSpore 》,原文作者:Jack20 。