摘要:昇騰Ascend C程式語言,讓基於昇騰AI的演演算法創新更加簡單。
本文分享自華為雲社群《CANN黑科技解密|昇騰Ascend C程式語言 — 極簡易用的運算元開發體驗》,作者:昇騰CANN 。
AI應用的大腦是神經網路,而構成神經網路的基石是一個個運算元。為了讓開發者的網路在昇騰硬體上高效執行,昇騰異構計算架構CANN(Compute Architecture for Neural Networks)提供了豐富的高效能運算元庫,包括神經網路庫、線性代數計算庫等,高效能運算元數量達到1400+。有了高效能運算元庫的支撐,主流神經網路可輕鬆在昇騰硬體上高效執行。
但隨著人工智慧的爆發式增長,演演算法更新層出不窮,固定的高效能運算元庫可能無法完全滿足開發者的多樣化創新需求,為了讓開發者提出的創新演演算法能夠在硬體上執行起來,自定義運算元開發的能力必不可少。
但運算元開發是個複雜的工程,需要考慮眾多因素,包括語言學習成本、功能邏輯的實現、硬體指令的適配、以及運算元執行精度與效能的達標等等。往往一個經驗豐富的演演算法專家開發一個高效能的運算元都要耗時數週甚至更長的時間。
運算元開發總體流程
為提升運算元開發效率,降低運算元開發成本,昇騰推出了面向運算元開發場景的昇騰Ascend C程式語言。昇騰Ascend C程式語言原生支援C和C++標準規範,最大化匹配使用者開發習慣;通過多層介面抽象,遮蔽了底層硬體差異;通過自動平行計算等關鍵技術,在保證效能的同時大大降低運算元開發門檻。另外,昇騰Ascend C提供了孿生偵錯功能,大大縮短了運算元調測時間。
Ascend C程式語言在異構計算架構CANN中的位置
工欲善其事,必先利其器。為簡化開發邏輯,昇騰Ascend C支援結構化核函數程式設計,提供了面向不同場景的高效能類庫介面。開發者僅需通過類庫介面的組裝呼叫,即可輕鬆實現高效能運算元。
Ascend C提供的類庫介面
AI應用領域廣泛,開發者的背景與需求也各不相同。為滿足不同層級開發者的訴求,昇騰Ascend C針對計算介面和資料搬移介面,進行了分層分級,讓開發者可以根據自身需求選擇合適的介面。
針對計算類介面,當前Ascend C支援三個層級,其中級數越低,自由度越高,更易於表達複雜場景所需功能;級數越高,介面的封裝度越高,更易於表達常用語意,使用起來也更簡單。
計算介面分層分級與範例
針對搬移類介面,Ascend C將不同型別實體記憶體間的資料搬移抽象為一個統一的資料搬運介面,通過引數控制不同的搬運級別,從而滿足不同資料搬運場景的需求。
資料搬運介面分層分級與範例
另外,多層級的類庫介面封裝,可以更好地遮蔽不同型號硬體間的差異,輕鬆實現運算元程式碼對不同硬體的相容。
多層級的類庫介面可以讓開發者輕鬆實現運算元的演演算法邏輯,達成預期功能。但一個好的運算元,計算效率也是必須考慮的重要指標。眾所周知,將任務並行處理是提高計算效率的關鍵手段,但AI處理器的記憶體層次結構比較複雜、資料通路多,資料之間的依賴關係複雜,這種場景下,平行計算之間的流水如何排布,各任務間的資料同步如何實現,往往是比較困難的。
為了方便開發者實現高效的平行計算,昇騰Ascend C採用SPMD(Single-Program Multiple-Data)並行模式,開發者僅需關注一個計算核心上的運算元程式實現,程式呼叫時,可自動啟動N個執行範例(我們稱之為Block),每個範例都可部署到不同的計算核心上執行。由此,大大簡化了開發者在多個計算核心上的並行程式設計邏輯。
單程式多資料SPMD平行計算
在運算元邏輯實現上,Ascend C基於流水線並行的程式設計正規化,將運算元核心邏輯劃分為「搬入、計算、搬出」,開發者只需聚焦實現「搬入、計算、搬出」內容,程式執行時,系統會自動將核內資料進行分片,每一片資料都專注完成單一功能,實現計算效能最大化。
核內多片資料流水線並行排程
昇騰Ascend C提供的多層級類庫介面以及自動平行計算功能,給開發者提供了輕鬆高效的編碼體驗。但在上一代運算元開發的整個流程中,程式碼編寫的時間往往僅佔不到30%,剩下70%多的時間都在進行功能與效能偵錯,好的偵錯能力對提升端到端開發效率的重要性不言而喻。
開發時間佔比範例
那為什麼運算元偵錯如此耗時呢?究其主要原因,一方面是由於NPU環境下本身偵錯困難;另一方面是因為程式設計過程隱藏了並行細節,導致同步死鎖、地址越界、資料溢位等問題難定位。
為提升運算元偵錯效率,Ascend C提供了孿生偵錯能力,開發者既可以在CPU域進行偵錯調優,又可以在NPU側進行調優驗證,通過CPU域與NPU域相結合的方式,降低偵錯難度,提升偵錯效率。
在CPU域,開發者可通過業界標準C++工具GCC編譯器進行編譯,並通過GDB通用偵錯工具進行單步偵錯,精準驗證程式執行流程是否符合預期。另外,昇騰Ascend C還提供了主動Bug分析工具,方便開發者快速進行問題定位;在NPU域,昇騰Ascend C提供了模擬偵錯能力與上板偵錯能力,開發者可以通過模擬偵錯的Profiling流水圖、指令紀錄檔以及資料紀錄檔,精準進行效能調優,也可以通過上板偵錯進行真實行為的驗證。孿生偵錯的能力,在提升運算元偵錯效率的同時又可保證精度與效能的達標。
Ascend C孿生偵錯
人工智慧蓬勃發展,演演算法創新層出不窮。昇騰提供的Ascend C程式語言,通過易上手、高效能、易調測的優勢,為開發者的創新演演算法更輕鬆高效地在昇騰平臺執行奠定了基石,讓基於昇騰平臺的AI創新更加簡單。
點選如下連結,快速體驗Ascend C運算元開發