近日,昆侖芯科技應(yīng)邀出席百度技術(shù)沙龍第99期“智能芯片”專場(chǎng):昆侖芯一周年——構(gòu)筑國(guó)產(chǎn)數(shù)智基石,AI算力賦能千行百業(yè)。四位專家首次同臺(tái),揭秘十年磨一劍的中國(guó)芯的神秘技術(shù)面紗,并系統(tǒng)介紹昆侖芯兩代產(chǎn)品賦能千行百業(yè)的最新成果及應(yīng)用實(shí)踐。
本篇以下內(nèi)容整理于沙龍第三位演講嘉賓——昆侖芯科技基礎(chǔ)工具鏈開發(fā)負(fù)責(zé)人張釗題為 “強(qiáng)大易用的昆侖芯軟件棧助力生態(tài)發(fā)展”直播分享。
昆侖芯科技基礎(chǔ)工具鏈開發(fā)負(fù)責(zé)人張釗
我是昆侖芯科技基礎(chǔ)工具鏈開發(fā)負(fù)責(zé)人張釗,今天分享昆侖芯軟件棧的相關(guān)內(nèi)容,主要包含以下四個(gè)部分:
1)昆侖芯的硬件架構(gòu),包括最新一代昆侖芯XPU-R架構(gòu)以及其中的計(jì)算部分和存儲(chǔ)部分。
2)昆侖芯的軟件棧,包括運(yùn)行時(shí)環(huán)境、開發(fā)套件、高性能加速庫(kù)、通信庫(kù)和圖編譯加速庫(kù)。
3)昆侖芯的編程模型,包括編程模型、內(nèi)存層級(jí)和算子開發(fā)的方法。
4)昆侖芯和上層框架的合作,主要包括適配的方法和當(dāng)前支持推理和訓(xùn)練的場(chǎng)景情況。
昆侖芯的硬件架構(gòu)
第一部分,再次強(qiáng)調(diào)我們的新一代昆侖芯XPU-R架構(gòu),主要是為了更好地了解軟件棧。
昆侖芯XPU-R架構(gòu),大體分為計(jì)算、存儲(chǔ)、互聯(lián)和接口四個(gè)部分。
計(jì)算部分主要有SDNN和Cluster。這里面的SDNN就是軟件定義的神經(jīng)網(wǎng)絡(luò)引擎,是自研核心張量計(jì)算單元,加速卷積和矩陣乘法的計(jì)算。Cluster主要負(fù)責(zé)除了卷積和矩陣乘法之外的通用計(jì)算部分。
存儲(chǔ)部分主要包括GDDR6和Shared Memory,GDDR6是高速內(nèi)存,提供了512 GB/s的存儲(chǔ)帶寬,具有較高的能效比和性價(jià)比。Shared Memory是片上的共享內(nèi)存,保證所有計(jì)算單元高并發(fā)、低延時(shí)的訪問(wèn)。
片間互聯(lián)提供了高速的芯片間互聯(lián),有效地支持大規(guī)模、分布式的訓(xùn)練,減少通信的延遲。
接口支持PCIe4.0,同時(shí)也兼容PCIe3.0,可以靈活適配業(yè)界已經(jīng)上市的一些AI的服務(wù)器。
這一代的架構(gòu)XPU-R是采用SDNN加Cluster的融合架構(gòu),既有通用性,也兼顧了高性能。作為第二代架構(gòu)持續(xù)優(yōu)化,進(jìn)一步提升了計(jì)算性能,同時(shí)也增強(qiáng)了靈活的編程能力和通用性。
接下來(lái)看一下芯片架構(gòu)的計(jì)算部分。XPU-R主要包含有8個(gè)Cluster單元和6個(gè)SDNN單元。Cluster單元主要承擔(dān)通用計(jì)算任務(wù),支持SIMD指令,提供通用和靈活的編程能力。SDNN主要承擔(dān)MAC類計(jì)算和EW類計(jì)算,提供 128 TFLOPS@ FP16的算力。當(dāng)然,SDNN也具有靈活的可編程性,能夠輕松實(shí)現(xiàn)卷積、矩陣乘法、向量計(jì)算等功能。
架構(gòu)中的存儲(chǔ)部分,重點(diǎn)看片上高速存儲(chǔ)和外存GDDR6。L3 SRAM作為片上高速共享存儲(chǔ),容量為64MB,能夠被Cluster和SDNN共享訪問(wèn)。它能夠提供比片外GDDR6更低的延時(shí)和更高的帶寬。在我們軟件編程過(guò)程中,用好L3 SRAM是提高性能非常重要的手段之一。GDDR6不同的產(chǎn)品形態(tài)有不同的容量,比如16GB版本、32GB版本,能夠被Cluster和SDNN共享訪問(wèn)。GDDR6作為主要的存儲(chǔ)單元,與L3 SRAM的管理基本一致。
昆侖芯的軟件棧
接下來(lái)進(jìn)入核心的第二部分——昆侖芯的軟件棧。下圖是昆侖芯軟件棧架構(gòu)圖。
在應(yīng)用層,我們支持深度學(xué)習(xí)模型的訓(xùn)練和推理,也支持視頻智能分析以及一些科學(xué)計(jì)算。
在框架層,我們深度適配PaddlePaddle(百度飛槳),同時(shí)也支持常見的開源框架,如PyTorch、TensorFlow、ONNX等。
中間部分是昆侖芯的SDK——從下到上包括昆侖芯的驅(qū)動(dòng)、虛擬化模塊,還有昆侖芯的運(yùn)行時(shí)庫(kù),再往上是昆侖芯的一個(gè)以編譯器為核心的開發(fā)者套件、圖編譯引擎、高性能算子庫(kù)和高性能通信庫(kù)的部分。
之下的硬件部分是昆侖芯AI加速卡。
部署環(huán)境方面,支持公有云、計(jì)算中心和邊緣設(shè)備等。
接下來(lái)圍繞SDK中的各個(gè)模塊展開,分別介紹各個(gè)模塊的功能和作用。
昆侖芯的運(yùn)行時(shí)環(huán)境這個(gè)模塊主要包括昆侖芯AI芯片的底層驅(qū)動(dòng),這是一個(gè)內(nèi)核態(tài)的程序;也提供了方便易用的Runtime API,這個(gè)是用戶態(tài)的程序;同時(shí)昆侖芯運(yùn)行時(shí)環(huán)境包含了大量的管理工具,包括監(jiān)控、測(cè)試、debugger和profiler,這樣能更好提升昆侖芯板卡的可操控性,也為上層提供靈活的應(yīng)用接口。昆侖芯運(yùn)行時(shí)環(huán)境主要的特性包括支持多stream、支持SR-IOV虛擬化,也支持event的同步。昆侖芯的運(yùn)行時(shí)環(huán)境支持多個(gè)平臺(tái),如常見的x86-64平臺(tái)、Arm64平臺(tái),也適配國(guó)產(chǎn)主流平臺(tái)。
昆侖芯的模擬器實(shí)現(xiàn)了對(duì)昆侖芯AI芯片的完全模擬,使用上是由上層的昆侖芯運(yùn)行時(shí)根據(jù)上層的配置進(jìn)行AI加速卡和模擬器之間的控制切換,主要包括了對(duì)計(jì)算和存儲(chǔ)單元的模擬、昆侖芯芯片運(yùn)行時(shí)環(huán)境的完全模擬。同時(shí),昆侖芯的模擬器可以提供豐富的工具,包括debugger、profiler和測(cè)試工具,既實(shí)現(xiàn)了功能級(jí)模擬,做到了比特級(jí)的精確對(duì)齊,也提供了相應(yīng)的性能模擬,做到計(jì)算模塊的性能cycle級(jí)對(duì)齊的水準(zhǔn)。同時(shí)它支持多個(gè)應(yīng)用場(chǎng)景,包括一些軟件棧的功能驗(yàn)證、Kernel的開發(fā)和調(diào)試,以及Kernel性能的評(píng)估和優(yōu)化。同時(shí),昆侖芯模擬器可以做到和芯片無(wú)縫切換。
昆侖芯開發(fā)套件是以編譯器為核心的一組開發(fā)套件,作為昆侖芯的基礎(chǔ)工具鏈,它是基于LLVM開發(fā)的,實(shí)現(xiàn)了定制化的Clang前端并適配了昆侖芯XPU后端。它是一套完整的工具鏈,包括編譯器、匯編器、linker、compiler-rt(libs)和一些常用的編程工具;同時(shí)它支持AOT編譯和JIT的方式編譯,支持device和host文件的分割和混合編譯,向開發(fā)者提供一些debugger和profiler工具。
昆侖芯深度神經(jīng)網(wǎng)絡(luò)高性能加速庫(kù),專門為深度學(xué)習(xí)設(shè)計(jì),是一套高效靈活的軟件庫(kù),易于集成到機(jī)器學(xué)習(xí)框架中。我們目前集成的框架包括百度飛槳、TensorFlow,還有PyTorch等框架。這套加速庫(kù)提供了基于Context的一套API,支持多線程和多stream的應(yīng)用。同時(shí)它也支持DNN的一些常用算子,例如矩陣乘法、卷積前向和卷積反向、池化前向和池化反向、激活前向和激活反向等。
昆侖芯通信庫(kù),提供了芯片之間的數(shù)據(jù)傳輸能力,實(shí)現(xiàn)了broadcast、reduce等一系列的通信接口。主要特性包括數(shù)據(jù)壓縮、拓?fù)錂z測(cè)、多機(jī)多卡、跨代兼容的支持,還有異常檢測(cè)和恢復(fù)等。
昆侖芯的圖編譯加速庫(kù)是根據(jù)昆侖芯硬件相關(guān)的設(shè)計(jì),做圖層的分析和優(yōu)化,它是基于TVM進(jìn)行開發(fā)的,提供了大量的C++和Python的接口,方便易用。作為一個(gè)昆侖芯的推理引擎,可以對(duì)接主流的Deep Learning框架導(dǎo)出的模型,也可以直接導(dǎo)入百度飛槳模型、TensorFlow模型、PyTorch模型等。提供了一套編譯優(yōu)化器和運(yùn)行時(shí)分離的工作流程。如下圖可以看到一個(gè)AI的模型如何進(jìn)入我們這套圖編譯加速庫(kù),最終進(jìn)行上線部署的一套過(guò)程。
昆侖芯的編程模型
講完了軟件棧的各個(gè)模塊,接下來(lái)第三部分主要介紹昆侖芯XPU的編程模型。昆侖芯XPU編程模型是在典型的異構(gòu)計(jì)算場(chǎng)景中的一個(gè)多核并行計(jì)算的模型。其中有幾個(gè)概念。Kernel是描述昆侖芯XPU上的一個(gè)計(jì)算程序,比較常見;host端是通過(guò)設(shè)置Kernel函數(shù)的執(zhí)行參數(shù),并發(fā)送給昆侖芯device端進(jìn)行執(zhí)行。其中一種最簡(jiǎn)單的CPU和XPU混合編程的流程,可以從這個(gè)圖中看出,主機(jī)端也就是host端執(zhí)行一段串行的程序,然后通過(guò)調(diào)用內(nèi)核函數(shù)讓設(shè)備端并行執(zhí)行這些程序,如此交錯(cuò)進(jìn)行。CPU端和昆侖芯XPU端的內(nèi)存是相互獨(dú)立的,因此在運(yùn)行內(nèi)核函數(shù)之前,主機(jī)端需要調(diào)用內(nèi)存拷貝的函數(shù),將數(shù)據(jù)通過(guò)PCIe拷貝到設(shè)備端內(nèi)核,運(yùn)行結(jié)束之后,需要通過(guò)CPU再次調(diào)用內(nèi)存拷貝函數(shù),將數(shù)據(jù)拷回到主機(jī)端。這是比較常見的一個(gè)編程方式。
同時(shí)我們也支持event和stream的一些工作方式,讓CPU和昆侖芯XPU并行工作起來(lái),提升整體的效率。我們這套編程模型可以高效地處理數(shù)據(jù)。我們采用的是一種類似于CUDA的編程語(yǔ)法,對(duì)開發(fā)者來(lái)說(shuō)相對(duì)友好一些,學(xué)習(xí)和遷移的成本更低。
為了更好了解昆侖芯XPU的編程和開發(fā),我們必須要掌握其中兩個(gè)硬件的相關(guān)設(shè)計(jì)和架構(gòu)。其中第一個(gè)是我們的Cluster的架構(gòu),這個(gè)Cluster向外提供靈活的可編程能力。如圖所示,每個(gè)Cluster有64個(gè)core,每個(gè)core內(nèi)部有8KB的Local Memory,每個(gè)Cluster共享256KB的Shared Memory,支持SIMD指令,當(dāng)然也支持一些特殊的指令,例如內(nèi)存搬運(yùn)、同步和原子操作等。
另外一個(gè)需要我們掌握是內(nèi)存層級(jí),了解內(nèi)存層級(jí)才能進(jìn)行有效的昆侖芯XPU編程開發(fā)。從這個(gè)圖中可以看到,從內(nèi)部到外部主要分為L(zhǎng)ocal Memory、Shared Memory、L3 SRAM和Global Memory,依次向外分布,越靠?jī)?nèi)性能越高。我們可以簡(jiǎn)單地解釋為,從L0到L1、L2、L3、L4這些層級(jí)相應(yīng)的一些映射關(guān)系,如下表所示。
接下來(lái)講一下如何在昆侖芯XPU上開發(fā)一段程序。主要分為兩個(gè)部分:第一部分,在host端即CPU端上開發(fā)的代碼;另一部分,在device端開發(fā)的一段Kernel的代碼。在host端,實(shí)現(xiàn)一個(gè)調(diào)用Kernel的流程,大體上需要使用類似于CUDA的這種三個(gè)尖括號(hào)的語(yǔ)法。
舉一個(gè)簡(jiǎn)單的例子。比如一個(gè)relu的操作,實(shí)現(xiàn)的代碼大致是這樣:
第一步,我們要在設(shè)備端——昆侖芯XPU端分配空間,利用昆侖芯的運(yùn)行時(shí)接口,比如xpu_malloc來(lái)實(shí)現(xiàn)。
第二步,將左圖的這種data輸入數(shù)據(jù)拷貝到設(shè)備端。
第三步,讓我們的Kernel在設(shè)備上運(yùn)行,relu這個(gè)Kernel。這里面有幾個(gè)參數(shù),比如說(shuō)啟動(dòng)了8個(gè)Cluster,然后用到了每個(gè)Cluster里面的64個(gè)core,這樣我們的 Kernel函數(shù)就在device端運(yùn)行起來(lái),也就是我們左下角的這個(gè)relu.xpu的一個(gè)程序。
最后,在Kernel運(yùn)行完之后,我們需要主動(dòng)地去獲取輸出。拿到輸出之后也要釋放設(shè)備的空間。
在host的代碼大體流程是這個(gè)樣子。
接下來(lái)講一下我們?cè)赿evice端如何開發(fā)一個(gè)Kernel程序。
我們?cè)赿evice端實(shí)現(xiàn)的Kernel代碼,支持類似于CUDA的語(yǔ)法,是C++語(yǔ)言的一種擴(kuò)展。我們提供了core之間的同步機(jī)制,也提供了一些專有的NN的指令擴(kuò)展。還是以我們這個(gè)relu文件為例:我們實(shí)現(xiàn)了relu.xpu的一個(gè)Device Kernel。
首先,將讀入的數(shù)據(jù)進(jìn)行分塊——基于我們的Cluster_id 和core_id計(jì)算出相應(yīng)的tid,根據(jù)這個(gè)tid把輸入的數(shù)據(jù)進(jìn)行分塊,相應(yīng)的數(shù)據(jù)分給不同的core進(jìn)行計(jì)算;
第二步,每個(gè)core會(huì)把顯示的數(shù)據(jù)搬運(yùn)到Local Memory上。
接下來(lái),每個(gè)core啟動(dòng)計(jì)算,這是一個(gè)典型的relu的計(jì)算。
之后,會(huì)把結(jié)果顯示的寫回到Global Memory之上。
這就是我們一段完整的昆侖芯XPU的Device Kernel的程序。可以看得出來(lái),它和普通的C++的程序比較相似。
昆侖芯和上層框架的合作
講完了昆侖芯軟件棧的功能模塊,也講了如何開發(fā)一段算子,接下來(lái)講一下昆侖芯和上層框架的一些合作。
昆侖芯AI加速卡支持各種不同的開源框架,比如PyTorch 、TensorFlow等。這里我們重點(diǎn)講一下昆侖芯和百度飛槳的合作。
2018年,啟動(dòng)昆侖芯AI芯片和飛槳的合作,從飛槳的1.2版本開啟合作;
2019年之后,昆侖芯的代碼進(jìn)入了PaddlePaddle的社區(qū),當(dāng)時(shí)主要集中在Paddle Lite,也就是推理部分;
2020年,昆侖芯和百度飛槳進(jìn)行了一個(gè)小流量的上線。在2020年12月份發(fā)布的飛槳2.0版本完全支持昆侖芯的訓(xùn)練。
2021年1月,我們共同實(shí)現(xiàn)了實(shí)時(shí)在線推理服務(wù)、超大規(guī)模部署。
2022年5月,飛槳2.3發(fā)布并全面支持昆侖芯2代的產(chǎn)品。
昆侖芯和飛槳的深度合作形成了一個(gè)全棧式的AI技術(shù)生態(tài)。昆侖芯和百度飛槳是以PaddleCV、PaddleNLP這些產(chǎn)品向外提供知識(shí)和服務(wù)的,已經(jīng)完成了主流模型的適配性能優(yōu)化和精度對(duì)齊。
百度飛槳和昆侖芯的適配主要圍繞PaddlePaddle框架完成,我們共同完成了框架層面的適配,支持XPU Device和大部分算子,同時(shí)也支持分布式訓(xùn)練。昆侖芯的軟件棧已經(jīng)完全集成到了PaddlePaddle的框架里面,完成了適當(dāng)?shù)膶?duì)接和支持工作,最終我們可以在一些國(guó)產(chǎn)CPU和OS上共同完成生態(tài)建設(shè)。
重點(diǎn)講一下昆侖芯和飛槳在推理和訓(xùn)練部分的適配方式。
先看一下Paddle Lite和XPU的推理部分,我們?cè)谌齻€(gè)層面上進(jìn)行了適配:接口層、計(jì)算圖層、算子層。
接口層,基本實(shí)現(xiàn)修改三行代碼即可切換到昆侖芯的后端,實(shí)現(xiàn)了昆侖芯+CPU自動(dòng)混合推理。
計(jì)算圖層,實(shí)現(xiàn)了通用圖優(yōu)化,也做了基于XPU的一些圖優(yōu)化,例如融合、緩存優(yōu)化和權(quán)重預(yù)處理優(yōu)化等。
算子層面,我們做了深度學(xué)習(xí)算子優(yōu)化、自動(dòng)代碼生成。(上圖右)可以看到,通過(guò)我們的高性能算子庫(kù)和paddle進(jìn)行對(duì)接,也可以通過(guò)我們的圖優(yōu)化的引擎和paddle進(jìn)行對(duì)接。(昆侖芯支持的一些具體的模型列表可以參見百度飛槳官網(wǎng)。)
昆侖芯與飛槳合作的訓(xùn)練部分主要是昆侖芯XPU和PaddlePaddle框架的適配。這個(gè)我們基本上做到了只切換一行代碼便可指定到昆侖芯XPU的后端,低成本地從GPU切換到昆侖芯,滿足絕大部分用戶的需求。同時(shí),支持分布式訓(xùn)練。(具體的昆侖芯訓(xùn)練支持的模型介紹可以參見百度飛槳的官網(wǎng)。)
接下來(lái)講一下昆侖芯和飛槳現(xiàn)在的生態(tài)建設(shè)。
從上圖表中可以看出,從底層的AI算力組件到AI服務(wù)器,到國(guó)產(chǎn)的操作系統(tǒng),再到昆侖芯SDK之上,是端到端的AI開發(fā)平臺(tái)解決方案等。這是我們完成的一套端到端的國(guó)產(chǎn)AI計(jì)算系統(tǒng)的解決方案。昆侖芯原生支持百度飛槳框架、百度的機(jī)器學(xué)習(xí)BML平臺(tái),并且訓(xùn)練與飛槳社區(qū)進(jìn)行協(xié)同生態(tài)建設(shè),已經(jīng)開源,在國(guó)內(nèi)處于第一份額。昆侖芯加百度飛槳是百度人工智能生態(tài)端到端軟硬件一體解決方案的獨(dú)特產(chǎn)品組合,實(shí)現(xiàn)了國(guó)產(chǎn)AI計(jì)算生態(tài)的解決方案。
案例分享
分享一個(gè)昆侖芯與飛槳合作在工業(yè)質(zhì)檢方向的一個(gè)具體案例。客戶主要做手機(jī)上微小零件的質(zhì)量檢測(cè),一開始采用的是用人工檢測(cè)的辦法——用肉眼來(lái)檢查零部件缺陷。但目視檢測(cè)不僅速度非常慢,新老員工的檢測(cè)標(biāo)準(zhǔn)也非常不一致。中期,客戶升級(jí)到了PyTorch + GPU的方案,成本高且并非國(guó)產(chǎn)化方案。后期,通過(guò)百度飛槳和昆侖芯的合作和支持,完成了全部切換成百度飛槳加昆侖芯的方案。這是中國(guó)自研AI芯片在工業(yè)領(lǐng)域首次大規(guī)模應(yīng)用,實(shí)現(xiàn)成本降低65%、性能提升9%的效果。
總結(jié)
昆侖芯XPU誕生于AI場(chǎng)景,能夠滿足多樣的AI模型和場(chǎng)景需求,提供了較高的性能和能耗效率,給開發(fā)者提供了一個(gè)相對(duì)靈活、易用的編程模型。我們有大規(guī)模部署,超過(guò)兩萬(wàn)片的落地,在技術(shù)上能達(dá)到100%自主研發(fā),已與多款通用處理器、操作系統(tǒng)和AI框架完成端到端的適配。靈活易用方面,昆侖芯的SDK為開發(fā)者提供了全方位的軟件工具包,使開發(fā)者在轉(zhuǎn)換已有模型、開發(fā)新模型以及定義和使用定制化模型時(shí),能夠最大化地提高開發(fā)效率。