CANN黑科技解密|昇騰Ascend C編程語言 — 極簡易用的算子開發(fā)體驗
AI應(yīng)用的大腦是神經(jīng)網(wǎng)絡(luò),而構(gòu)成神經(jīng)網(wǎng)絡(luò)的基石是一個個算子。為了讓開發(fā)者的網(wǎng)絡(luò)在昇騰硬件上高效運行,昇騰異構(gòu)計算架構(gòu)CANN(Compute Architecture for Neural Networks)提供了豐富的高性能算子庫,包括神經(jīng)網(wǎng)絡(luò)庫、線性代數(shù)計算庫等,高性能算子數(shù)量達(dá)到1400+。有了高性能算子庫的支撐,主流神經(jīng)網(wǎng)絡(luò)可輕松在昇騰硬件上高效運行。

但隨著人工智能的爆發(fā)式增長,算法更新層出不窮,固定的高性能算子庫可能無法完全滿足開發(fā)者的多樣化創(chuàng)新需求,為了讓開發(fā)者提出的創(chuàng)新算法能夠在硬件上運行起來,自定義算子開發(fā)的能力必不可少。
但算子開發(fā)是個復(fù)雜的工程,需要考慮眾多因素,包括語言學(xué)習(xí)成本、功能邏輯的實現(xiàn)、硬件指令的適配、以及算子運行精度與性能的達(dá)標(biāo)等等。往往一個經(jīng)驗豐富的算法專家開發(fā)一個高性能的算子都要耗時數(shù)周甚至更長的時間。

為提升算子開發(fā)效率,降低算子開發(fā)成本,昇騰推出了面向算子開發(fā)場景的昇騰Ascend?C編程語言。昇騰Ascend?C編程語言原生支持C和C++標(biāo)準(zhǔn)規(guī)范,最大化匹配用戶開發(fā)習(xí)慣;通過多層接口抽象,屏蔽了底層硬件差異;通過自動并行計算等關(guān)鍵技術(shù),在保證性能的同時大大降低算子開發(fā)門檻。另外,昇騰Ascend?C提供了孿生調(diào)試功能,大大縮短了算子調(diào)測時間。

多層級高性能類庫接口
工欲善其事,必先利其器。為簡化開發(fā)邏輯,昇騰Ascend?C支持結(jié)構(gòu)化核函數(shù)編程,提供了面向不同場景的高性能類庫接口。開發(fā)者僅需通過類庫接口的組裝調(diào)用,即可輕松實現(xiàn)高性能算子。

AI應(yīng)用領(lǐng)域廣泛,開發(fā)者的背景與需求也各不相同。為滿足不同層級開發(fā)者的訴求,昇騰Ascend?C針對計算接口和數(shù)據(jù)搬移接口,進(jìn)行了分層分級,讓開發(fā)者可以根據(jù)自身需求選擇合適的接口。
針對計算類接口,當(dāng)前Ascend?C支持三個層級,其中級數(shù)越低,自由度越高,更易于表達(dá)復(fù)雜場景所需功能;級數(shù)越高,接口的封裝度越高,更易于表達(dá)常用語義,使用起來也更簡單。

針對搬移類接口,Ascend C將不同類型物理內(nèi)存間的數(shù)據(jù)搬移抽象為一個統(tǒng)一的數(shù)據(jù)搬運接口,通過參數(shù)控制不同的搬運級別,從而滿足不同數(shù)據(jù)搬運場景的需求。

另外,多層級的類庫接口封裝,可以更好地屏蔽不同型號硬件間的差異,輕松實現(xiàn)算子代碼對不同硬件的兼容。
自動并行計算
多層級的類庫接口可以讓開發(fā)者輕松實現(xiàn)算子的算法邏輯,達(dá)成預(yù)期功能。但一個好的算子,計算效率也是必須考慮的重要指標(biāo)。眾所周知,將任務(wù)并行處理是提高計算效率的關(guān)鍵手段,但AI處理器的內(nèi)存層次結(jié)構(gòu)比較復(fù)雜、數(shù)據(jù)通路多,數(shù)據(jù)之間的依賴關(guān)系復(fù)雜,這種場景下,并行計算之間的流水如何排布,各任務(wù)間的數(shù)據(jù)同步如何實現(xiàn),往往是比較困難的。
為了方便開發(fā)者實現(xiàn)高效的并行計算,昇騰Ascend?C采用SPMD(Single-Program Multiple-Data)并行模式,開發(fā)者僅需關(guān)注一個計算核心上的算子程序?qū)崿F(xiàn),程序調(diào)用時,可自動啟動N個運行實例(我們稱之為Block),每個實例都可部署到不同的計算核心上執(zhí)行。由此,大大簡化了開發(fā)者在多個計算核心上的并行編程邏輯。

在算子邏輯實現(xiàn)上,Ascend?C基于流水線并行的編程范式,將算子核心邏輯劃分為“搬入、計算、搬出”,開發(fā)者只需聚焦實現(xiàn)“搬入、計算、搬出”內(nèi)容,程序運行時,系統(tǒng)會自動將核內(nèi)數(shù)據(jù)進(jìn)行分片,每一片數(shù)據(jù)都專注完成單一功能,實現(xiàn)計算性能最大化。

核內(nèi)多片數(shù)據(jù)流水線并行調(diào)度
孿生調(diào)試
昇騰Ascend?C提供的多層級類庫接口以及自動并行計算功能,給開發(fā)者提供了輕松高效的編碼體驗。但在上一代算子開發(fā)的整個流程中,代碼編寫的時間往往僅占不到30%,剩下70%多的時間都在進(jìn)行功能與性能調(diào)試,好的調(diào)試能力對提升端到端開發(fā)效率的重要性不言而喻。

那為什么算子調(diào)試如此耗時呢?究其主要原因,一方面是由于NPU環(huán)境下本身調(diào)試?yán)щy;另一方面是因為編程過程隱藏了并行細(xì)節(jié),導(dǎo)致同步死鎖、地址越界、數(shù)據(jù)溢出等問題難定位。
為提升算子調(diào)試效率,Ascend C提供了孿生調(diào)試能力,開發(fā)者既可以在CPU域進(jìn)行調(diào)試調(diào)優(yōu),又可以在NPU側(cè)進(jìn)行調(diào)優(yōu)驗證,通過CPU域與NPU域相結(jié)合的方式,降低調(diào)試難度,提升調(diào)試效率。
在CPU域,開發(fā)者可通過業(yè)界標(biāo)準(zhǔn)C++工具GCC編譯器進(jìn)行編譯,并通過GDB通用調(diào)試工具進(jìn)行單步調(diào)試,精準(zhǔn)驗證程序執(zhí)行流程是否符合預(yù)期。另外,昇騰Ascend?C還提供了主動Bug分析工具,方便開發(fā)者快速進(jìn)行問題定位;在NPU域,昇騰Ascend C提供了仿真調(diào)試能力與上板調(diào)試能力,開發(fā)者可以通過仿真調(diào)試的Profiling流水圖、指令日志以及數(shù)據(jù)日志,精準(zhǔn)進(jìn)行性能調(diào)優(yōu),也可以通過上板調(diào)試進(jìn)行真實行為的驗證。孿生調(diào)試的能力,在提升算子調(diào)試效率的同時又可保證精度與性能的達(dá)標(biāo)。

人工智能蓬勃發(fā)展,算法創(chuàng)新層出不窮。昇騰提供的Ascend?C編程語言,通過易上手、高性能、易調(diào)測的優(yōu)勢,為開發(fā)者的創(chuàng)新算法更輕松高效地在昇騰平臺運行奠定了基石,讓基于昇騰平臺的AI創(chuàng)新更加簡單。
點擊如下鏈接,快速體驗Ascend C算子開發(fā)
Ascend C算子開發(fā)快速體驗