英特爾OpenVino 在異質平台開發AI應用上加速大解密

英特爾OpenVino AI開發時在異質平台應用上加速之奧義

 英特爾的AI開放式開發平台OpenVino可以說是進入AI世界的一條捷徑,簡單的幾個步驟,就可以在Windows10,Ubuntu,甚至Mac OS上面執行並看到AI的使用範例。更重要的是它允許使用者在自己的電腦上使用使用CPU或是GPU來跑同一個範例而不需要更改一行程式碼! 根據英特爾的說法,OpenVino所使用的源碼不但適用於CPU, GPU,同時在FPGA及VPU也是可以通用的,如圖一,當然這是如果硬件本身支援該AI模型所使用的所有算法層的話。到底英特爾是怎麼做到這點的呢?答案就是oneAPI , 今天我們就來談談oneAPI是什麼東西還有它是怎麼運作的。

圖一.OpenVino Inference Engine支援各式硬體架構

圖一.OpenVino Inference Engine支援各式硬體架構

什麼是oneAPI?

  oneAPI故其名就是讓英特爾的所有硬體平台能通過同一包(one)API程式碼來執行。以使用架構上來說,OneAPI是講求開放式,統一,及標準的簡化編程架構開發工具包。它使用 (Data Parallel)C ++的程式語言並行處理,英特爾稱它為DPC++。oneAPI提供一系列函式庫,包括業界領先的編譯器性能庫,用於深度學習和數據科學的庫。另外oneAPI中還包含了分析器和調試器以及工具來簡化跨體系結構的開發。英特爾oneAPI甚至提供所謂DPC ++兼容性工具來幫助開發人員將現有CUDA 代碼遷移到DPC ++(如圖二)。

圖二. oneAPI包含各式函式庫,開發用分析,調試器,和DPC ++兼容性工具

圖二. oneAPI包含各式函式庫,開發用分析,調試器,和DPC ++兼容性工具

根據英特爾的官方說法,當初在挑選一個適合的語言來讓其所有硬體平台可以共用程式碼時,考慮的不只有C++,也有考慮使用Java以及OpenCL,最後在考量開放,性能與可攜性的各項條件下選擇了C++,來做為通用架構的語言。

 

  那為什麼oneAPI的DPC++裡面包含了什麼架構讓英特爾的所有硬體平台都可以共用一包程式碼呢?關鍵是在於DPC++合併了Khronos Group的SYCL (如圖三),以支持數據並行性和異構編程。

圖三. 英特爾oneAPI採用了Khronos SYCL架構

圖三. 英特爾oneAPI採用了Khronos SYCL架構



什麼是SYCL?

 

SYCL將通用的(generic)程式模板化(template)和通用(generic) lambda函數結合使用,以便能夠在高階應用程式軟體上,進行各種已經由OpenCL優化過的算法內核代碼來流暢編碼。開發人員雖編程在高階應用程式軟體上,卻依然可以經由C / C ++庫和諸如OpenCV™或OpenMP™之類的框架與本機加速API無縫集成,從而呼叫到較底層低階的APIs,如圖四。

越來越多的供應商(vendor)提供了SYCL實現,其中除了OpenCL之外,還增加了對各種加速API後端的支持。

圖四. SYCL提供模板做上層編成並可呼叫到底層低階函式庫

圖四. SYCL提供模板做上層編成並可呼叫到底層低階函式庫

基本的oneAPI 使用

如圖五所示,最基本的oneAPI的運算為在一迴圈(loop)中使用range, 和id,及 range和item的兩種平行運算的寫法,其中range, 和id

  • range class用於表示迴圈中平行運算的迭代空間(iteration space)
  • id class用於表示迴圈中平行運算的一個範例(instance)算法核心(kernel)指標(index)
圖五. 基本的迴圈(loop)中使用range, 和id的平行運算

圖五. 基本的迴圈(loop)中使用range, 和id的平行運算


左邊為一般使用CPU做向量加法時所使用的迴圈,此時的kernel即為簡單的向量加法。當運用於oneAPI時,我們便可使用parallel_for這個api來讓此kernel(向量加法) 做平行運算。此時多個範例(multiple instances)便可完全不拘任何順序獨立的運作。

 

在某些狀況,我們每次處理的資料只是部份資料的運算,因此每次迴圈我們必須知道我們運算的是資料的哪個部分,此時就必須加入,來呼叫其衍生出的函式,get_id()和get_range()

 

 

  • item class用於代表迴圈中一個範例(instance)算法核心(kernel)所衍生出來用於探查(query)執行中range的函式
圖六. 基本的迴圈(loop)中使用range, 和item的平行運算

圖六. 基本的迴圈(loop)中使用range, 和item的平行運算


如果我們想要指定某個的硬體來做平行運算呢? 這時我們可以使用device_selector class來建立我們的硬體使用優先順序, 如圖七,my_device_selector繼承了device_selector並指定Intel圖形加速卡為優先使用硬體作為運算 (rating = 3),如果沒卡片有被偵測到的話,就會去偵測是否有其他硬體圖形加速卡(rating = 2),最後如果都沒加速卡的會,我們就會選擇CPU作為運算器。在main function 中,最後我們就可以把要運算的queue pass給selector,讓系統來照rating來決定使用哪個硬體來做運算。

圖七. device selector的使用範例

圖七. device selector的使用範例

英特爾目前提供免費訪問其DevCloud的功能,允許軟件工程師試用他們的工具並在雲中使用oneAPI和DPC ++進行修改。我將會於下篇文章介紹DevCloud上的oneAPI/DPC++, 以及更多算法的平行運算方法和細節,如果對這篇文章有興趣的同學,歡迎關注我的下篇文章 “英特爾異質平台加速開發套件oneAPI全攻略”,敬請期待!!

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論