1. 程式人生 > 其它 >帶你學習MindSpore中運算元使用方法

帶你學習MindSpore中運算元使用方法

摘要:本文分享下MindSpore中運算元的使用和遇到問題時的解決方法。

本文分享自華為雲社群《【MindSpore易點通】運算元使用問題與解決方法》,作者:chengxiaoli。

簡介

運算元的呼叫是構建模型的基礎,準確的找到能滿足需求的運算元並能正確的使用,可以有事半功倍的效果。本次就分享下MindSpore中運算元的使用和遇到問題時的解決方法給大家。

圖中是簡單的歸納了運算元使用的這幾個步驟,本文的內容主要是根據圖中的步驟再進行解析說明。

分析使用需求

首先了解下什麼是運算元,通俗的說對一個函式進行某一項操作都可以認為是一個運算元,最基礎的就是加減乘除這些操作。所以運算元並不難理解,只是很多運算元它包含的計算會更加的複雜。

一般情況下在自定義網路模型時會用到各種型別的運算元,MindSpore中分為Primitive運算元和nn運算元,Primitive運算元是開放給使用者的最低階運算元介面,一個Primitive運算元對應一個原語,它封裝了底層的Ascend、GPU、AICPU、CPU等多種運算元的具體實現,為使用者提供基礎運算元能力。

還可以繼續分為計算運算元和框架運算元。計算運算元主要負責具體的計算,而框架運算元主要用於構圖,自動微分等功能,都可以從mindspore.ops模組匯入使用。同時mindspore.nn模組是對mindspore.ops模組的封裝。所以在構建網路模型時建議使用mindspore.nn模組,優點是使用方便,當然如果想要探索更多運算元的資訊,建議使用mindspore.ops模組。

需求大致可以分成兩種,自定義網路模型時的運算元需求和從第三方框架遷移模型時對標運算元的需求。

這裡給大家提供一個對比第三方框架運算元使用的樣例給大家參考。

樣例:nn.Embedding 層與pytorch相比缺少了Padding操作,有其餘的運算元可以實現嗎?

分析:在PyTorch中padding_idx的作用是將embedding矩陣中padding_idx位置的詞向量置為0,並且反向傳播時不會更新padding_idx位置的詞向量。

方法:在mindspore中,可以手動將embedding的padding_idx位置對應的權重初始化為0;並且在訓練時通過mask的操作,過濾掉padding_idx位置對應的Loss。MindSpore中與Mask相關的運算元有:nn.Dropout、RandomChoicWithMask、NMSWithMask。

類似樣例中的情況,就需要我們對計算過程分析清楚,當沒有完全匹配的運算元時也需要考慮將需求拆分為多步進行。當然我們不可能對所有運算元的特性都瞭解,所以當遇到疑惑是請訪問這裡:宇宙盡頭

官網查詢介面

在清楚需求之後,就需要找到能夠實現需求的運算元了,查詢這一步相對簡單,官網中有運算元的目錄和詳細的使用介紹頁面,能迅速定位到相同型別運算元的位置,檢視運算元詳情頁檢視是否有合適的運算元,在將運算元加入到複雜的指令碼前,建議先只單獨執行運算元樣例試一試。

自檢:當然即使找到了符合需求的運算元,並且單獨執行時也沒有問題,也不能夠避免在加入到自己的專案程式碼中完全不報錯。在運算元使用中通常的報錯原因是使用的MindSpore版本和參考的教程不一致、運算元不支援目前的硬體環境以及傳入的引數不符合運算元要求,所以為了避免不必要的報錯,下面給大家提供幾個檢視介面的正確姿勢:

  • 根據自己安裝的MindSpore版本查詢對應版本的介面;
  • 第三方模型遷移時建議先通過API對映查詢;
  • 檢視運算元是否支援自己的硬體平臺以及記憶體大小;
  • 重點:到運算元詳情頁檢視引數和引數的型別。

BUG:報錯不要慌,論壇來幫忙:如果以上幾點方法還是不能夠避免報錯,並且報錯的資訊也不能夠幫助定位並解決問題,那麼請到論壇發求助帖子,或許您是遇到BUG啦。

這裡找出兩個運算元的特性和用法給大家參考:

樣例1:如何讓運算元輸出之一為tuple型別或list型別?

方法:框架的運算元輸出只支援Tensor型別,不支援tuple或list。

樣例2:mindspore中可以直接列印卷積核的引數嗎?

方法1:是可以直接列印的

net = nn.Conv2d(***)
print(net.weight)
print(net.weight.asnumpy)

方法2:也可以使用for迴圈遍歷

for *** net.get_parameters()

運算元的自定義

MindSpore也在一直更新和完善中,也會有暫不支援的運算元,遇到這種情況歡迎大家提需求到論壇或者Gitee中,官網也有完整的自定義運算元教程,歡迎大家進行運算元的開發,感謝大家的貢獻。

自定義運算元教程:

自定義運算元(CPU):https://mindspore.cn/tutorials/experts/zh-CN/master/operation/op_cpu.html#

自定義運算元(GPU):https://mindspore.cn/tutorials/experts/zh-CN/master/operation/op_gpu.html#

自定義運算元(Ascend):https://mindspore.cn/tutorials/experts/zh-CN/master/operation/op_ascend.html

樣例:怎樣自定義讓一個Tensor包含的值作為另一個Tensor的下標?

方法:既然是自定義運算元,第一個tensor可以改為int型別或者listint型別啊。下面的sizes是listInt,exclude_outside是int

attr.list=sizes,exclude_outside
attr_sizes.type=listInt
attr_sizes.value=all
attr_sizes.paramType=required
attr_exclude_outside.type=int
attr_exclude_outside.value=all
attr_exclude_outside.paramType=optional
attr_exclude_outside.defaultValue=0

乾貨分享:除了以上的教程和樣例,也有優秀的論壇成員分享的自定義運算元的詳細過程和體會:

  • 自定義運算元(CPU)windows版本:

https://bbs.huaweicloud.com/forum/thread-175270-1-1.html

  • 深夜:在?我用本地環境pytest帶你玩自定義運算元:

https://bbs.huaweicloud.com/forum/thread-177908-1-1.html

通過上圖指導,在遇到使用報錯或者自定義運算元報錯時,也可以到論壇或者Gitee中展示遇到的問題。

總結

以上就是分析使用需求、選擇運算元、解決報錯的過程,歡迎大家多嘗試,因為有論壇在給您保駕護航,重要發現:宇宙的盡頭是論壇。

 

點選關注,第一時間瞭解華為雲新鮮技術~