摘要:以單算子開發爲例,帶你瞭解算子開發及測試全流程。
爲何要自定義算子
深度學習算法由一個個計算單元組成,咱們稱這些計算單元爲算子(Operator,簡稱Op)。算子是一個函數空間到函數空間上的映射O:X→X;從廣義上講,對任何函數進行某一項操做均可以認爲是一個算子。於咱們而言,咱們所開發的算子是網絡模型中涉及到的計算函數。在Caffe中,算子對應層中的計算邏輯,例如:卷積層(Convolution Layer)中的卷積算法,是一個算子;全鏈接層(Fully-connected Layer, FC layer)中的權值求和過程,也是一個算子。算法
Ascend 模型轉換導航編程
絕大多數狀況下,因爲昇騰AI軟件棧支持絕大多數算子,開發者不須要進行自定義算子的開發,只需提供深度學習模型文件,經過離線模型生成器(OMG)轉換就可以獲得離線模型文件,從而進一步利用流程編排器(Matrix)生成具體的應用程序。既然如此,爲何還須要自定義算子呢?這是由於在模型轉換過程當中出現了算子不支持的狀況,例如昇騰AI軟件棧不支持模型中的算子、開發者想修改現有算子中的計算邏輯、或者開發者想本身開發算子來提升計算性能,這時就須要進行自定義算子的開發了。json
TBE算子開發流程
昇騰AI軟件棧提供了TBE算子開發框架,開發者能夠基於此框架使用Python語言開發自定義算子。首先,咱們來了解一下什麼是TBE。TBE的全稱爲Tensor Boost Engine,即張量加速引擎,是一款華爲自研的算子開發工具,用於開發可以運行在NPU(Neural-network Processing Unit:神經網絡處理器)上的TBE算子,該工具是在業界著名的開源項目TVM(Tensor Virtual Machine)基礎上擴展的,提供了一套Python API來實施開發活動。在本次開發實踐中,NPU特指昇騰AI處理器。網絡
經過TBE進行算子開發的方式有兩種:特定域語言開發(DSL開發)和TVM原語開發(TIK開發)。DSL開發相對簡單,適用於入門級的開發者。其特色是TBE工具提供自動優化機制,給出較優的調度流程,開發者僅須要瞭解神經網絡和TBE DSL相關知識,即可指定目標生成代碼,進一步被編譯成專用內核。TIK開發難度較高,適用於對於TVM編程及達芬奇結構都很是瞭解的開發者使用。這種方式的接口偏底層,需開發者本身控制數據流及算子的硬件調度。做爲入門課程,咱們此次使用的DSL開發方式。框架
TBE算子開發流程函數
接下來,咱們就以一個簡單的單算子開發爲例,瞭解一下開發過程。工具
- 目標:
用TBE-DSL方式開發一個Sqrt算子性能
- 肯定算子功能:
Sqrt算子功能是對Tensor中每一個原子值求開方,數學表達式爲y=學習
- 肯定使用的計算接口:
根據當前TBE框架可支持的計算描述API,可採用以下公式來表達Sqrt算子的計算過程開發工具
算子代碼的實現可分爲如下步驟:
1)算子入參
shape:Tensor的屬性,表示Tensor的形狀,用list或tuple類型表示,例如(3, 2, 3)、(4, 10);
dtype:Tensor的數據類型,用字符串類型表示,例如「float32」、「float16」、「int8」等。
2)輸入Tensor佔位符
data = tvm.placeholder(shape, name="data", dtype=input_dtype)
tvm.placeholder()是TVM框架的API,用來爲算子執行時接收的數據佔位,通俗理解與C語言中%d、%s同樣,返回的是一個Tensor對象,上例中使用data表示;入參爲shape,name,dtype,是爲Tensor對象的屬性。
3)定義計算過程
4)定義調度過程
5)算子構建
6)測試驗證
誒等一等,還沒結束呢。只有在仿真環境中驗證了算子功能的正確性,自定義算子的開發纔算完成。
ST測試流程
咱們須要用ST測試(即System Test系統測試)在仿真環境中測試算子邏輯的正確性以及可否正確地生成.o和.json文件。想知道具體是怎麼測試的嗎?與其看一大段枯燥的文字描述,不如來沙箱實驗室親自體驗一番,必定更加直觀。
讀到這裏,你是否是對本身的自定義算子開發能力更加有信心了?何不來華爲雲學院學課程、作實驗、考證書來驗證一下呢?喏,就是這門微認證啦:基於昇騰AI處理器的算子開發