MindSpore后端运行类
MindSpore后端運行類
Q:如何在訓練過程中監控loss在最低的時候并保存訓練參數?
A:可以自定義一個Callback。參考ModelCheckpoint的寫法,此外再增加判斷loss的邏輯:
class EarlyStop(Callback):
def init(self):
self.loss = None
def step_end(self, run_context):
loss = ****(get current loss)
if (self.loss == None or loss < self.loss):
self.loss = loss
# do save ckpt
Q:mindspore/tests下怎樣執行單個ut用例?
A:ut用例通常需要基于debug版本的MindSpore包,官網并沒有提供。可以基于源碼使用sh build.sh編譯,然后通過pytest指令執行,debug模式編包不依賴后端。編譯選項sh build.sh -t on,用例執行可以參考tests/runtest.sh腳本。
Q:使用nn.Conv2d時,怎樣獲取期望大小的feature map?
A:Conv2d shape推導方法可以參考這里,Conv2d的pad_mode改成same,或者可以根據Conv2d shape推導公式自行計算pad,想要使得shape不變,一般pad為(kernel_size-1)//2。
Q:MindSpore安裝完成,執行訓練時發現網絡性能異常,權重初始化耗時過長,怎么辦?
A:可能與環境中使用了scipy 1.4系列版本有關,通過pip list | grep scipy命令可查看scipy版本,建議改成MindSpore要求的scipy版本。版本第三方庫依賴可以在requirement.txt中查看。 https://gitee.com/mindspore/mindspore/blob/{version}/requirements.txt
其中version替換為MindSpore具體的版本分支。
Q:使用MindSpore可以自定義一個可以返回多個值的loss函數?
A:自定義loss function后還需自定義TrainOneStepCell,實現梯度計算時sens的個數和network的輸出個數相同。具體可參考:
net = Net()
loss_fn = MyLoss()
loss_with_net = MyWithLossCell(net, loss_fn)
train_net = MyTrainOneStepCell(loss_with_net, optim)
model = Model(net=train_net, loss_fn=None, optimizer=None)
Q:MindSpore如何實現早停功能?
A:可以自定義callback方法實現早停功能。 例子:當loss降到一定數值后,停止訓練。
class EarlyStop(Callback):
def init(self, control_loss=1):
super(EarlyStep, self).init()
self._control_loss = control_loss
def step_end(self, run_context):cb_params = run_context.original_args()loss = cb_params.net_outputsif loss.asnumpy() < self._control_loss:# Stop trainingrun_context._stop_requested = True
stop_cb = EarlyStop(control_loss=1)
model.train(epoch_size, ds_train, callbacks=[stop_cb])
Q:請問自己制作的黑底白字2828的數字圖片,使用MindSpore訓練出來的模型做預測,報錯提示wrong shape of image是怎么回事?
A:首先MindSpore訓練使用的灰度圖MNIST數據集。所以,模型使用時,對數據是有要求的,需要設置為2828的灰度圖,就是單通道才可以。
Q:在Ascend平臺上,執行用例有時候會報錯run task error,如何獲取更詳細的日志幫助問題定位?
A:可以通過開啟slog獲取更詳細的日志信息以便于問題定位,修改/var/log/npu/conf/slog/slog.conf中的配置,可以控制不同的日志級別,對應關系為:0:debug、1:info、2:warning、3:error、4:null(no output log),默認值為1。
Q:使用ExpandDims算子報錯:Pynative run op ExpandDims failed。具體代碼:
context.set_context(
mode=cintext.GRAPH_MODE,
device_target=‘ascend’)
input_tensor=Tensor(np.array([[2,2],[2,2]]),mindspore.float32)
expand_dims=ops.ExpandDims()
output=expand_dims(input_tensor,0)
A:這邊的問題是選擇了Graph模式卻使用了PyNative的寫法,所以導致報錯,MindSpore支持兩種運行模式,在調試或者運行方面做了不同的優化:
? PyNative模式:也稱動態圖模式,將神經網絡中的各個算子逐一下發執行,方便用戶編寫和調試神經網絡模型。
? Graph模式:也稱靜態圖模式或者圖模式,將神經網絡模型編譯成一整張圖,然后下發執行。該模式利用圖優化等技術提高運行性能,同時有助于規模部署和跨平臺運行。
用戶可以參考官網教程選擇合適、統一的模式和寫法來完成訓練。
Q:使用Ascend平臺執行訓練過程,出現報錯:Out of Memory!!! total[3212254720] (dynamic[0] memory poll[524288000]) malloc[32611480064] failed! 如何解決?
A:此問題屬于內存占用過多導致的內存不夠問題,可能原因有兩種:
? batch_size的值設置過大。解決辦法:將batch_size的值設置減小。
? 引入了異常大的Parameter,例如單個數據shape為[640,1024,80,81],數據類型為float32,單個數據大小超過15G,這樣差不多大小的兩個數據相加時,占用內存超過3*15G,容易造成Out of Memory。解決辦法:檢查參數的shape,如果異常過大,減少shape。
? 如果以上操作還是未能解決,可以上官方論壇發帖提出問題,將會有專門的技術人員幫助解決。
Q:MindSpore執行GPU分布式訓練報錯如下,如何解決:
Loading libgpu_collective.so failed. Many reasons could cause this:
1.libgpu_collective.so is not installed.
2.nccl is not installed or found.
3.mpi is not installed or found
A:此問題為MindSpore動態加載集合通信庫失敗,可能原因如下:
? 執行環境未安裝分布式訓練依賴的OpenMPI以及NCCL。
? NCCL版本未更新至v2.7.6:MindSpore v1.1.0新增GPU P2P通信算子,該特性依賴于NCCL v2.7.6,若環境使用的NCCL未升級為此版本,則會引起加載失敗錯誤。
Q:啟動緩存服務器時,若提示找不到libpython3.7m.so.1.0文件,應如何處理?
A:嘗試在虛擬環境下查找其路徑并設置LD_LIBRARY_PATH變量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:{path_to_conda}/envs/{your_env_name}/lib
Q:緩存服務器異常關閉如何處理?
A:緩存服務器使用過程中,會進行IPC共享內存和socket文件等系統資源的分配。若允許溢出,在磁盤空間還會存在溢出的數據文件。一般情況下,如果通過cache_admin --stop命令正常關閉服務器,這些資源將會被自動清理。
但如果緩存服務器被異常關閉,例如緩存服務進程被殺等,用戶需要首先嘗試重新啟動服務器,若啟動失敗,則應該依照以下步驟手動清理系統資源:
? 刪除IPC資源。
- 檢查是否有IPC共享內存殘留。
一般情況下,系統會為緩存服務分配4GB的共享內存。通過以下命令可以查看系統中的共享內存塊使用情況。
$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x61020024 15532037 root 666 4294967296 1
其中,shmid為共享內存塊id,bytes為共享內存塊的大小,nattch為鏈接到該共享內存塊的進程數量。nattch不為0表示仍有進程使用該共享內存塊。在刪除共享內存前,需要停止使用該內存塊的所有進程。 - 刪除IPC共享內存。
找到對應的共享內存id,并通過以下命令刪除。
ipcrm -m {shmid}
? 刪除socket文件。
一般情況下,socket文件位于/tmp/mindspore/cache。進入文件夾,執行以下命令刪除socket文件。
rm cache_server_p{port_number}
其中port_number為用戶創建緩存服務器時指定的端口號,默認為50052。
? 刪除溢出到磁盤空間的數據文件。
進入啟用緩存服務器時指定的溢出數據路徑。通常,默認溢出路徑為/tmp/mindspore/cache。找到路徑下對應的數據文件夾并逐一刪除。
總結
以上是生活随笔為你收集整理的MindSpore后端运行类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MindSpore平台系统类
- 下一篇: MindSpore特性支持类