天天看點

如何用AscendCL的接口開發網絡模型推理場景下應用?

作者:華為雲開發者聯盟

本文分享自華為雲社群《【CANN文檔速遞09期】應用開發之推理場景-雲社群-華為雲》,作者: 昇騰CANN 。

我們知道,使用AscendCL接口開發應用時,典型場景包括網絡模型推理、單算子執行等,本期我們來深入講解網絡模型推理場景下,具體怎麼做。

如何用AscendCL的接口開發網絡模型推理場景下應用?

首先,我們得先了解下,使用AscendCL時,經常會提到的“資料類型的操作接口” ,這是什麼呢?為啥會存在?

在C/C++中,對使用者開放的資料類型通常以Struct結構體方式定義、以聲明變量的方式使用,但這種方式一旦結構體要增加成員參數,使用者的代碼就涉及相容性問題,不便于維護,是以AscendCL對使用者開放的資料類型,均以接口的方式操作該資料類型,例如,調用某個資料類型的Create接口建立該資料類型、調用Get接口擷取資料類型内參數值、調用Set接口設定資料類型内的參數值、調用Destroy接口銷毀該資料類型,使用者無需關注定義資料類型的結構體長什麼樣,這樣即使後續資料類型需擴充,隻需增加該資料類型的操作接口即可,也不會引起相容性問題。

是以,總結下,“資料類型的操作接口”就是建立資料類型、Get/Set資料類型中的參數值、銷毀資料類型的一系列接口,存在的最大好處就是減少相容性問題。

接下來,進入我們今天的主題,怎麼用AscendCL的接口開發網絡模型推理場景下的應用。

01 AscendCL初始化與去初始化

使用AscendCL接口開發應用時,必須先初始化AscendCL ,否則可能會導緻後續系統内部資源初始化出錯,進而導緻其它業務異常。在初始化時,還支援以下跟推理相關的可配置項(例如,性能相關的采集資訊配置),以json格式的配置檔案傳入AscendCL初始化接口。如果目前的預設配置已滿足需求(例如,預設不開啟性能相關的采集資訊配置),無需修改,可向AscendCL初始化接口中傳入NULL,或者可将配置檔案配置為空json串(即配置檔案中隻有{})。

有初始化就有去初始化,在确定完成了AscendCL的所有調用之後,或者程序退出之前,需調用AscendCL接口實作AscendCL去初始化。

如何用AscendCL的接口開發網絡模型推理場景下應用?

02 運作管理資源申請與釋放

運作管理資源包括Device、Context、Stream、Event等,此處重點介紹Device、Context、Stream,其基本概念如下圖所示 。

如何用AscendCL的接口開發網絡模型推理場景下應用?

您需要按順序依次申請如下運作管理資源:Device、Context、Stream,確定可以使用這些資源執行運算、管理任務。所有資料處理都結束後,需要按順序依次釋放運作管理資源:Stream、Context、Device。

在申請運作管理資源時,Context、Stream支援隐式建立和顯式建立兩種申請方式。

如何用AscendCL的接口開發網絡模型推理場景下應用?
如何用AscendCL的接口開發網絡模型推理場景下應用?

03 媒體資料處理

如果模型對輸入圖檔的寬高要求與使用者提供的源圖不一緻,AscendCL提供了媒體資料處理的接口,可實作摳圖、縮放、格式轉換、視訊或圖檔的編解碼等,将源圖裁剪成符合模型的要求。後續期刊中會展開說明這個功能,本期着重介紹模型推理的部分,以輸入圖檔滿足模型的要求為例。

04 模型加載

模型推理場景下,必須要有适配昇騰AI處理器的離線模型(*.om檔案),我們可以使用ATC(Ascend Tensor Compiler)來構模組化型。如果模型推理涉及動态Batch、動态分辨率等特性,需在構模組化型增加相關配置。怎麼使用ATC來構模組化型,在往期文檔速遞中有介紹,可拖動到文末查閱。

有了模型,就可以開始加載了,目前AscendCL支援以下幾種方式加載模型:

• 從*.om檔案中加載模型資料,由AscendCL管理記憶體

• 從*.om檔案中加載模型資料,由使用者自行管理記憶體

• 從記憶體中加載模型資料,由AscendCL管理記憶體

• 從記憶體中加載模型資料,由使用者自行管理記憶體

由使用者自行管理記憶體時,需關注工作記憶體、權值記憶體。工作記憶體用于存放模型執行過程中的臨時資料,權值記憶體用于存放權值資料。這個時候,是不是有疑問了,我怎麼知道工作記憶體、權值記憶體需要多大?不用擔心,AscendCL不僅提供了加載模型的接口,同時也提供了“根據模型檔案擷取模型執行時所需的工作記憶體和權值記憶體大小”的接口,友善使用者使用 。

如何用AscendCL的接口開發網絡模型推理場景下應用?
如何用AscendCL的接口開發網絡模型推理場景下應用?

05 模型執行

在調用AscendCL接口進行模型推理時,模型推理有輸入、輸出資料,輸入、輸出資料需要按照AscendCL規定的資料類型存放。相關資料類型如下:

• 使用aclmdlDesc類型的資料描述模型基本資訊(例如輸入/輸出的個數、名稱、資料類型、Format、次元資訊等)。

模型加載成功後,使用者可根據模型的ID,調用該資料類型下的操作接口擷取該模型的描述資訊,進而從模型的描述資訊中擷取模型輸入/輸出的個數、記憶體大小、次元資訊、Format、資料類型等資訊。

• 使用aclDataBuffer類型的資料來描述每個輸入/輸出的記憶體位址、記憶體大小。

調用aclDataBuffer類型下的操作接口擷取記憶體位址、記憶體大小等,便于向記憶體中存放輸入資料、擷取輸出資料。

• 使用aclmdlDataset類型的資料描述模型的輸入/輸出資料。

模型可能存在多個輸入、多個輸出,調用aclmdlDataset類型的操作接口添加多個aclDataBuffer類型的資料。

如何用AscendCL的接口開發網絡模型推理場景下應用?
如何用AscendCL的接口開發網絡模型推理場景下應用?

準備好模型執行所需的輸入、輸出資料類型後,存放好模型執行的輸入資料後,可以執行模型推理了,如果模型的輸入涉及動态Batch、動态分辨率等特性,則在模型執行前,還需要調用AscendCL接口告訴模型本次執行時需要用的Batch數、分辨率等。

目前AscendCL支援同步模型執行、異步模型執行兩種方式,這裡說的同步、異步是站在調用者和執行者的角度。

• 若調用模型執行的接口後需等待推理完成再傳回,則表示同步的。當使用者調用同步模型執行接口後,可直接從該接口的輸出參數中擷取模型執行的結果資料,如果需要推理的輸入資料量很大,同步模型執行時,需要等所有資料都處理完成後,才能擷取推理的結果資料。

• 若調用模型執行的接口後不等待推理完成完成再傳回,則表示異步的。當使用者調用異步模型執行接口時,需指定Stream( Stream用于維護一些異步操作的執行順序,確定按照應用程式中的代碼調用順序在Device上執行),另外,還需調用aclrtSynchronizeStream接口阻塞程式運作,直到指定Stream中的所有任務都完成,才可以擷取推理的結果資料。如果需要推理的輸入資料量很大,異步模型執行時,AscendCL提供了Callback機制,觸發回調函數,在指定時間内一旦有推理的結果資料,就擷取出來,達到分批擷取推理結果資料的目的,提高效率。

如何用AscendCL的接口開發網絡模型推理場景下應用?

推理結束後,如果需要擷取并進一步處理推理結果資料,則由使用者自行編碼實作。最後,别忘了,我們還要銷毀aclmdlDataset、aclDataBuffer等資料類型,釋放相關記憶體,防止記憶體洩露。

06 模型解除安裝

在模型推理結束後,還需要通過aclmdlUnload接口解除安裝模型,并銷毀aclmdlDesc類型的模型描述資訊、釋放模型運作的工作記憶體和權值記憶體。

如何用AscendCL的接口開發網絡模型推理場景下應用?

07 更多介紹

了解更詳細的内容,登入昇騰社群,在開發者文檔中心(https://www.hiascend.com/document)閱讀相關文檔:

如何用AscendCL的接口開發網絡模型推理場景下應用?

昇騰CANN文檔中心緻力于為開發者提供更優質的内容和更便捷的開發體驗,助力CANN開發者共建AI生态。任何意見和建議都可以在昇騰社群回報,您的每一份關注都是我們前進的動力。

點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀