日本无码免费高清在线|成人日本在线观看高清|A级片免费视频操逼欧美|全裸美女搞黄色大片网站|免费成人a片视频|久久无码福利成人激情久久|国产视频一二国产在线v|av女主播在线观看|五月激情影音先锋|亚洲一区天堂av

  • 手機(jī)站
  • 小程序

    汽車(chē)測(cè)試網(wǎng)

  • 公眾號(hào)
    • 汽車(chē)測(cè)試網(wǎng)

    • 在線(xiàn)課堂

    • 電車(chē)測(cè)試

凌坤:好的自動(dòng)駕駛AI芯片更是“好用”的芯片

2022-03-18 21:24:31·  來(lái)源:地平線(xiàn)HorizonRobotics  
 
導(dǎo)讀地平線(xiàn)在智東西公開(kāi)課開(kāi)設(shè)「地平線(xiàn)AI芯片技術(shù)專(zhuān)場(chǎng)」。第二期課程中,地平線(xiàn)高級(jí)研發(fā)總監(jiān)凌坤就《好的自動(dòng)駕駛AI芯片更是“好用”的芯片》這一主題進(jìn)行了直播

導(dǎo)讀

地平線(xiàn)在智東西公開(kāi)課開(kāi)設(shè)「地平線(xiàn)AI芯片技術(shù)專(zhuān)場(chǎng)」。第二期課程中,地平線(xiàn)高級(jí)研發(fā)總監(jiān)凌坤就《好的自動(dòng)駕駛AI芯片更是“好用”的芯片》這一主題進(jìn)行了直播講解。


凌坤老師從軟件2.0的開(kāi)發(fā)范式講起,結(jié)合地平線(xiàn)自動(dòng)駕駛AI芯片的開(kāi)發(fā)實(shí)踐,從軟硬結(jié)合+軟硬解耦的平衡、AI芯片開(kāi)發(fā)原則、軟件2.0開(kāi)發(fā)范式的基礎(chǔ)設(shè)施艾迪AI開(kāi)發(fā)平臺(tái)、天工開(kāi)物工具鏈、豐富的軟件棧等方面深入講解如何打造一顆“好用”的自動(dòng)駕駛AI芯片。
首先歡迎大家來(lái)到本次課程,也感謝智東西公開(kāi)課提供的平臺(tái),讓我們有機(jī)會(huì)做相關(guān)的交流。上次課程中地平線(xiàn)羅恒博士重點(diǎn)講解了一個(gè)好的自動(dòng)駕駛芯片應(yīng)該是什么樣子,今天則是關(guān)于怎么樣把自動(dòng)駕駛芯片做成一個(gè)好用的芯片。

圖片


我叫凌坤,地平高級(jí)研發(fā)總監(jiān),畢業(yè)于中國(guó)科學(xué)院計(jì)算技術(shù)研究所,十余年專(zhuān)注于CPU/DSP/DSA上的編譯器&指令架構(gòu)聯(lián)合優(yōu)化和實(shí)現(xiàn);2016年加入地平線(xiàn),負(fù)責(zé)地平線(xiàn)天工開(kāi)物工具鏈和艾迪AI開(kāi)發(fā)平臺(tái)相關(guān)研發(fā)團(tuán)隊(duì)的管理;曾任地平線(xiàn)編譯器研發(fā)部負(fù)責(zé)人,先后參與多代地平線(xiàn)征程處理器的指令集架構(gòu)定義、編譯器和工具鏈研發(fā)、產(chǎn)品化、市場(chǎng)推廣及量產(chǎn)落地相關(guān)工作。


本次課程主要分為以下3個(gè)部分:1、關(guān)注軟硬結(jié)合前提下的軟硬解耦2、好用的關(guān)鍵:提升產(chǎn)品研發(fā)效率3、用軟件2.0基礎(chǔ)設(shè)施、工具鏈、開(kāi)放軟件棧和豐富樣例成就開(kāi)發(fā)者


過(guò)去很多年里,我們一直在做傳統(tǒng)意義上的算法和軟件研發(fā)。在這套體系下,程序員首先要理解清楚問(wèn)題是什么?怎么解?在此基礎(chǔ)上寫(xiě)好代碼,并讓代碼運(yùn)行起來(lái),看是否正確。而隨著芯片性能越來(lái)越高,存儲(chǔ)數(shù)據(jù)、模型容量越來(lái)越大,機(jī)器學(xué)習(xí)方法幫助我們解決了許多實(shí)際的問(wèn)題,因此進(jìn)入到軟件2.0時(shí)代。伴隨著未來(lái)摩爾定律的持續(xù)演進(jìn),基于軟件2.0的研發(fā)工作會(huì)越來(lái)越多,我們要準(zhǔn)備好迎接軟件2.0的開(kāi)發(fā)時(shí)代。

圖片


回看軟件2.0的開(kāi)發(fā)范式,它與軟件1.0完全不同。在軟件1.0中,當(dāng)我們要解決一個(gè)問(wèn)題時(shí),首先需要開(kāi)發(fā)者把問(wèn)題定義的十分清楚;然后把問(wèn)題分解成具體步驟,并把每一步的解決方法也想的非常明白;再寫(xiě)出代碼,代碼做好測(cè)試后集成起來(lái),看能否解決實(shí)際問(wèn)題。如果不能解決,反過(guò)來(lái)再看,是問(wèn)題沒(méi)有定義清楚?問(wèn)題沒(méi)有分解清楚?問(wèn)題的解決方法不正確?還是程序員代碼沒(méi)寫(xiě)好?反復(fù)檢查、調(diào)試、驗(yàn)證,以上就是軟件1.0開(kāi)發(fā)的閉環(huán)迭代過(guò)程。例如當(dāng)控制一輛車(chē)往前走時(shí),如果路上沒(méi)有超過(guò)限速,前方?jīng)]有障礙物,那接下來(lái)車(chē)輛可以加速,加速到多少時(shí)不能再加速,這是一個(gè)典型的 if-then-else問(wèn)題,所以整個(gè)軟件1.0時(shí)代的代碼程序都是圍繞 if-then-else、 for循環(huán)函數(shù)等典型的概念展開(kāi)。
當(dāng)?shù)搅塑浖?.0時(shí)代,面臨的是一個(gè)完全不同的開(kāi)發(fā)模式。首先需要定義問(wèn)題,同時(shí)需要大量的數(shù)據(jù),數(shù)據(jù)用來(lái)表示幾種不同的情況;然后再設(shè)計(jì)一個(gè)適當(dāng)?shù)哪P?,模型能夠?qū)?wèn)題做分類(lèi)或檢測(cè);之后在大量標(biāo)注數(shù)據(jù)上做模型訓(xùn)練,訓(xùn)練完成后再部署集成, 在場(chǎng)景中看大概有多少結(jié)果是正確的,多少結(jié)果是錯(cuò)誤的;再持續(xù)的采集數(shù)據(jù),做標(biāo)注、訓(xùn)練,或者更改模型的設(shè)計(jì),來(lái)解決這些錯(cuò)誤的badcase。
在過(guò)程中,沒(méi)有一個(gè)程序員能把問(wèn)題解法想得十分清楚。比如識(shí)別一只貓,貓的毛發(fā)是彎的還是直的、貓的顏色是花的還是純色,貓的兩只耳朵是豎著的還是彎著的,程序員并不是通過(guò)這種方式解決問(wèn)題。從每一個(gè)像素點(diǎn)定義的角度來(lái)看,這些問(wèn)題是一個(gè)數(shù)據(jù)驅(qū)動(dòng)的問(wèn)題,即通過(guò)100萬(wàn)張或1000萬(wàn)張不同的圖片給模型做訓(xùn)練。在這種模式下,程序員不需要對(duì)問(wèn)題應(yīng)該怎么解有非常深刻的認(rèn)識(shí),也不需要知道計(jì)算機(jī)每一步該怎么操作,只需關(guān)注卷積神經(jīng)網(wǎng)絡(luò)的容量和里面的信息,反向傳播時(shí)梯度是怎樣傳播的,激活函數(shù)應(yīng)該怎么設(shè)置等問(wèn)題。

圖片


軟件2.0時(shí)代的方法可以讓機(jī)器像人一樣看懂和聽(tīng)懂周?chē)氖澜?,所以它有廣泛的應(yīng)用場(chǎng)景,而且隨著摩爾定律的持續(xù)進(jìn)步,有非常大的成長(zhǎng)空間。關(guān)于自動(dòng)駕駛芯片的好用,也應(yīng)該圍繞著軟件2.0的開(kāi)發(fā)范式展開(kāi),因?yàn)?.0時(shí)代已經(jīng)有四五十年的積累,各種工具已經(jīng)非常完善,在此基礎(chǔ)上更多的是一些微創(chuàng)新,而2.0時(shí)代則是一種底層方法論層面的顛覆式創(chuàng)新。
在這套開(kāi)發(fā)范式下,對(duì)于機(jī)器來(lái)說(shuō),軟件2.0的技術(shù)可以讓它感知周?chē)氖澜?,知道自己在世界里處于什么位置,?dāng)世界里有很多自主移動(dòng)的目標(biāo)時(shí),可以預(yù)測(cè)周?chē)哪繕?biāo)的運(yùn)動(dòng)軌跡,可以規(guī)劃自身的動(dòng)作是繞開(kāi)目標(biāo),還是直著前進(jìn)或停下來(lái),進(jìn)而控制自己完成動(dòng)作。

01 關(guān)注軟硬結(jié)合前提下的軟硬解耦


首先回顧下歷史,在看歷史時(shí)會(huì)發(fā)現(xiàn)一個(gè)很重要的點(diǎn)是“應(yīng)用對(duì)性能的追求沒(méi)有止境”。在這種情況下,很多芯片一代一代的往前走。從1970年開(kāi)始,各種各樣的芯片、計(jì)算設(shè)備層出不窮,也造就了很多PC時(shí)代。

圖片


上圖左邊的藍(lán)色統(tǒng)計(jì)表來(lái)自于2021年ACM通訊的一個(gè)統(tǒng)計(jì)結(jié)果,該圖表明在過(guò)去的20多年里,微處理器性能的提升在逐漸放緩。同時(shí)站在供應(yīng)商的角度,從黃色統(tǒng)計(jì)表中可以看出,單位研發(fā)投入下微處理器的性能提升也在逐漸變小,所以未來(lái)在通用處理器上的研發(fā)投入產(chǎn)出比會(huì)越來(lái)越低。越來(lái)越多的公司會(huì)把更多精力投在多核和異構(gòu)加速器上,右圖就是一個(gè)很好的證明。
由于人們對(duì)性能的追求沒(méi)有止境,單個(gè)芯片上的晶體管數(shù)量會(huì)呈指數(shù)級(jí)增長(zhǎng)。而單個(gè)線(xiàn)程的性能,在2010年左右逐漸放緩。因?yàn)槲锢項(xiàng)l件的限制,頻率也不再增長(zhǎng),并隨著工藝制成的變化,整個(gè)芯片的功耗也處于一個(gè)停滯的狀況。與此同時(shí),單個(gè)芯片里的邏輯處理器核心變得很多,這會(huì)導(dǎo)致我們?cè)谧非蠓浅8哐舆t增強(qiáng)時(shí),由于單線(xiàn)程的性能沒(méi)有大的變化,使得我們無(wú)法通過(guò)單線(xiàn)程的通用處理器達(dá)到很好的效果,只能把代碼做并行,或引入異構(gòu)加速器來(lái)實(shí)現(xiàn)性能優(yōu)化。

圖片


雖然單個(gè)線(xiàn)程的性能處于增長(zhǎng)緩慢甚至停滯的狀態(tài),但在軟件和算法層面,還有非常多的空間可以做優(yōu)化。上圖上半部分是對(duì)矩陣乘例子的優(yōu)化。當(dāng)我們用Python實(shí)現(xiàn)矩陣乘時(shí),假設(shè)它的速度為1,把 Python代碼改成Java或C時(shí),可以看到有11倍甚至47倍的提升。這是語(yǔ)言之間的變化,只是用不同的編程語(yǔ)言改寫(xiě),與芯片架構(gòu)無(wú)關(guān)。之后的循環(huán)并行利用到芯片上的多核;并行分置則是把矩陣分塊,然后放在緩存里;再用自動(dòng)向量化,自動(dòng)化的利用芯片里已經(jīng)提供的數(shù)據(jù)流并行CMD指令;當(dāng)使用較寬的AVX向量時(shí),在代碼里面直接寫(xiě)AVX函數(shù)調(diào)用,最多可以得到6萬(wàn)多的加速比。所以,當(dāng)我們圍繞軟件和算法的特點(diǎn)挖掘更多硬件特性時(shí),就能通過(guò)這種軟硬結(jié)合的方式獲得非常大的性能提升和極具性?xún)r(jià)比的計(jì)算平臺(tái)。
最近,有件有意思的新聞,Intel在新的大小核架構(gòu)中,為了保證軟件兼容性,放棄了部分芯片中AVX512支持。 
接下來(lái)看下軟硬結(jié)合和軟硬解耦過(guò)去在整個(gè)技術(shù)棧中是怎樣做的?當(dāng)我們看標(biāo)準(zhǔn)的C和C++代碼時(shí),這與芯片無(wú)關(guān),可以實(shí)現(xiàn)軟硬解耦,它是怎么做到的呢?我們以L(fǎng)LVM編譯器為例,編譯器里有前端、中端和后端,其中前端和中端里有很多的代碼分析、優(yōu)化和變換,這些都與芯片架構(gòu)無(wú)關(guān)。編譯器后端也有與芯片有關(guān)的部分,像ARM后端和RISC-V后端,通過(guò)這些之后,編譯器可以把代碼變成可執(zhí)行文件,這些可執(zhí)行文件可以部署在A(yíng)RM芯片或RISC-V芯片上運(yùn)行。
對(duì)比Intel AVX禁用的消息, 在最新的ARM處理器架構(gòu)上,引入了一個(gè)SVE向量處理單元,它可以用來(lái)取代NEON。NEON是在 ARM架構(gòu)上的一個(gè)SIMD擴(kuò)展指令集,它類(lèi)似于A(yíng)VX的單指令多數(shù)據(jù),但NEON是定寬的,即128比特。SVE則是變長(zhǎng)的,它可以實(shí)現(xiàn)128比特、256比特和512比特的寬度。在性能評(píng)估上,最高可以獲得3.5倍的加速比。在SVE指令集層面并沒(méi)有詳細(xì)規(guī)定{128、256、512},它是在具體芯片實(shí)現(xiàn)時(shí),硬件可以自己定一些常數(shù)來(lái)做,而所有的指令都是通過(guò)自己判斷或者加入一些參數(shù)的方式進(jìn)行,可以不考慮向量的實(shí)際寬度,即在相同的指令下,既可以在128比特寬度下執(zhí)行二進(jìn)制代碼,也可以在256比特或512比特寬度下執(zhí)行二進(jìn)制代碼,不會(huì)出現(xiàn)英特爾AVX512的情況。所以ARM在數(shù)據(jù)并行方面,在二進(jìn)制代碼兼容性的思考是比較超前的,它在想辦法規(guī)避掉問(wèn)題,保持二進(jìn)制兼容,通過(guò)這種方式能很好的支持底層晶體管為上面的服務(wù),同時(shí)保持好軟硬解耦。
剛剛講到了C和C++,在真正面向AI時(shí)代時(shí),不得不提到GPU,即CUDA。利用GPU里大量并行的單指令多線(xiàn)程架構(gòu),可以實(shí)現(xiàn)非常復(fù)雜的數(shù)據(jù)流并行運(yùn)算,進(jìn)而加速上層的張量計(jì)算,來(lái)獲得比較好的 AI性能加速。
這里很典型的CUDA是英偉達(dá)提出來(lái)的,它通過(guò)NVCC編譯器變成PDX代碼,PDX代碼在各代GPU上都會(huì)有自己的PTXToGPU編譯器,再通過(guò)驅(qū)動(dòng)就可以在A(yíng)mpere架構(gòu)GPU或Turing架構(gòu)GPU上運(yùn)行。在過(guò)去的很多年里,英偉達(dá)在這方面有非常多的積累,而且形成了比較強(qiáng)的市場(chǎng)主導(dǎo)地位。
在A(yíng)I時(shí)代,英偉達(dá)基本上是在唱主角的,雖然AMD最近市值有了比較大的提升,但AMD對(duì)AI方面的知識(shí)一直處于被動(dòng)的狀態(tài)。最近AMD比較大的動(dòng)作是提出了ROCm編譯器,雖然沒(méi)有明確的介紹,但可以認(rèn)為它是為了更好的兼容CUDA生態(tài),所以它會(huì)把CUDA代碼先通過(guò)一個(gè)轉(zhuǎn)換器轉(zhuǎn)成HIP代碼,再通過(guò)ROCm編譯器,最后在A(yíng)MD的GPU上運(yùn)行。

圖片


上圖右部分畫(huà)了虛線(xiàn),這是由于當(dāng)我們決策是買(mǎi)英偉達(dá)GPU,還是買(mǎi)AMD GPU做AI計(jì)算加速時(shí),大部分的開(kāi)發(fā)者都會(huì)去選擇英偉達(dá),因?yàn)椴挥脫?dān)心編譯器或Runtime的問(wèn)題,或者有些bug沒(méi)有被測(cè)到,進(jìn)而導(dǎo)致生產(chǎn)效率受到很大影響,所以右邊用了虛線(xiàn)。這條線(xiàn)雖然存在,但是好與壞,很多的用戶(hù)和開(kāi)發(fā)者都已經(jīng)用腳在投票,這是一個(gè)典型的軟硬結(jié)合和軟硬解耦不易做到權(quán)衡的問(wèn)題。而且在英偉達(dá)的歷代GPU上可以通過(guò)PTX代碼實(shí)現(xiàn)比較好的軟硬解耦。同時(shí),軟硬結(jié)合就體現(xiàn)在了NVCC編譯器和CUDA對(duì)芯片架構(gòu)的深層次挖掘和利用上,上面是軟件1.0。
再來(lái)看軟件2.0,它的整個(gè)開(kāi)發(fā)流程大概分成以下幾個(gè)階段:先對(duì)一個(gè)模型進(jìn)行訓(xùn)練,之后做量化,因?yàn)榱炕軒?lái)芯片功能和效能的提升,再來(lái)看精度是否達(dá)標(biāo),然后做模型編譯到芯片平臺(tái)上運(yùn)行。上述這些步驟,包括地平線(xiàn)在內(nèi),大部分芯片廠(chǎng)商都可以做到比較好的軟硬解耦。通過(guò)這種形式的軟硬解耦能夠保證開(kāi)發(fā)者過(guò)去寫(xiě)的一些歷史研發(fā)代碼可以在平臺(tái)上更好的運(yùn)行,同時(shí)也能保證一定的供應(yīng)鏈安全。
剛剛在回顧歷史,而面向 AI計(jì)算的軟硬件設(shè)計(jì)還需要一個(gè)比較完整的工程架構(gòu)來(lái)保證。首先要有性能,在此基礎(chǔ)上,再來(lái)看怎么樣做好軟硬件解耦。結(jié)合地平線(xiàn)的實(shí)踐,一般情況下會(huì)從硬件設(shè)計(jì)和軟件設(shè)計(jì)兩個(gè)層面來(lái)看,硬件設(shè)計(jì)主要針對(duì)存儲(chǔ)、張量計(jì)算組織、指令集設(shè)計(jì),軟件方面包括計(jì)算分析和并行優(yōu)化、數(shù)據(jù)并行和依賴(lài)分析優(yōu)化、片上存儲(chǔ)管理和指令調(diào)度。它們的核心目標(biāo)是為了能夠最大化硬件資源的利用率。
為了保證未來(lái)持續(xù)的競(jìng)爭(zhēng)力,需要更多的晶體管來(lái)做更多的事情,但是這些晶體管到底用來(lái)做什么?怎么樣保證最大化利用好這些資源,為上層AI算法和應(yīng)用提供足夠多的AI計(jì)算能力,就需要軟硬結(jié)合的一整套工程迭代框架。
地平線(xiàn)有一個(gè)BPU架構(gòu)建模工具,它可以對(duì)功耗、性能、面積做建模,輸入的是指令序列,建模工具為模型性能分析工具提供了一些硬件配置信息和指令性能信息。模型性能分析工具則提供了性能和精度方面的分析結(jié)果,同時(shí)為BPU架構(gòu)建模提供輸入。BPU架構(gòu)是在探索未來(lái)的芯片架構(gòu),模型性能分析工具則在探索接下來(lái)的編譯器、模型量化工具、訓(xùn)練工具應(yīng)該怎么做。它們有個(gè)很重要的輸入:Testing Benchmark。如果Testing Benchmark沒(méi)選好,整個(gè)閉環(huán)會(huì)轉(zhuǎn)歪,所以 Testing Benchmark選取十分重要。

圖片


Testing Benchmark的選取一定要把握好算法演進(jìn)趨勢(shì),由于Benchmark里面包含了豐富的、代表未來(lái)演進(jìn)趨勢(shì)的算法模型,利用好Benchmark和相關(guān)變換之后,就能更好的平衡軟硬結(jié)合和軟硬解耦。像地平線(xiàn)已經(jīng)達(dá)到百萬(wàn)芯片出貨量的征程二代和征程三代芯片里就有比較多的設(shè)計(jì),在2016年、2017年時(shí)已經(jīng)考慮到了相關(guān)一些算法的演進(jìn)趨勢(shì)。
地平線(xiàn)就有一個(gè)非常強(qiáng)大的算法軟件團(tuán)隊(duì),這個(gè)團(tuán)隊(duì)不停的去看、去聽(tīng)或去實(shí)踐算法的實(shí)際應(yīng)用情況,及未來(lái)的演進(jìn)趨勢(shì),更好的為T(mén)esting Benchmark提供輸入。

圖片


接下來(lái)將結(jié)合地平線(xiàn)的實(shí)際情況進(jìn)行說(shuō)明,希望可以給大家一些新的啟發(fā),或帶來(lái)一些不同的觀(guān)點(diǎn)和角度。在地平線(xiàn)的芯片架構(gòu)設(shè)計(jì)中,包括Testing Benchmark的選取,面向的都是未來(lái)重要場(chǎng)景里的關(guān)鍵算法,而且一定要在產(chǎn)品驅(qū)動(dòng)里做架構(gòu)迭代,要看產(chǎn)品里模型的泛化性怎樣,模型實(shí)際應(yīng)用起來(lái)運(yùn)行的如何,它對(duì)哪些目標(biāo)能夠識(shí)別的很好,哪些還有問(wèn)題,把這些點(diǎn)在產(chǎn)品層面盡量挖掘出來(lái),然后在產(chǎn)品驅(qū)動(dòng)敏捷架構(gòu)迭代和未來(lái)重要場(chǎng)景關(guān)鍵算法兩個(gè)層面的結(jié)合下形成Testing Benchmark。
同時(shí),地平線(xiàn)有很多世界領(lǐng)先的專(zhuān)家團(tuán)隊(duì),他們結(jié)合過(guò)去幾十年在計(jì)算架構(gòu)、軟件、硬件、芯片和算法方面的積累,預(yù)判在A(yíng)I計(jì)算層面還有哪些工作可以做相關(guān)的優(yōu)化和創(chuàng)新。這里首先看重效能,并要兼顧靈活,具體會(huì)從芯片架構(gòu)、算法和編譯器三個(gè)角度來(lái)做,而且這三個(gè)方面會(huì)有很多交叉領(lǐng)域的思維碰撞及工程實(shí)踐迭代。例如當(dāng)我們看指令集時(shí),不僅僅是看RISC-V指令集,而是看在編譯器眼中張量計(jì)算到底是什么。在這種情況下,我們應(yīng)該怎么樣做指令集,彈性張量核、片上存儲(chǔ)、可編程流處理架構(gòu)等這方面有哪些思維碰撞,通過(guò)這些方面的具體的技術(shù)點(diǎn)來(lái)給大家一個(gè)大概的感覺(jué),即軟硬結(jié)合和軟硬解耦在什么樣情況下可以找到平衡。
當(dāng)我們提到軟硬結(jié)合和軟硬解耦時(shí),最終芯片都需要最大化的解放開(kāi)發(fā)者的生產(chǎn)力,讓他們快速研發(fā)產(chǎn)品。所以地平線(xiàn)堅(jiān)持做好自動(dòng)化工具,自動(dòng)化的利用芯片特性,如果芯片特性不能被自動(dòng)化利用,那究竟是工具的問(wèn)題,還是芯片架構(gòu)設(shè)計(jì)的問(wèn)題,抑或是算法層面上的問(wèn)題,這些都需要嚴(yán)格的論證。在這個(gè)情況下,我們把工具做好,自動(dòng)化的利用這些特性,自動(dòng)的分析模型,分析依賴(lài),去變換、提高性能,并降低帶寬。
在編譯器優(yōu)化上,首先是把張量計(jì)算拆分開(kāi),通過(guò)對(duì)特征圖和卷積kernel的計(jì)算拆分,編譯器可以用更小的粒度描述計(jì)算,避免引入不必要的依賴(lài),提升數(shù)據(jù)并行性,創(chuàng)造潛在的調(diào)度機(jī)會(huì)。

圖片


接著是指令調(diào)度,指定調(diào)度也是非常經(jīng)典的編譯器優(yōu)化方法,我們?cè)诰幾g器層面也做了很多工作。首先它是張量,相對(duì)于寄存器來(lái)說(shuō),很大的不同在于張量是變化的,它有不同的channel、kernel,卷積核。因此,需要對(duì)張量數(shù)據(jù)做建模,同時(shí)在軟件方面要有很強(qiáng)的指令流水線(xiàn)調(diào)度,即是軟流水。
軟流水的流程如左上角圖所示,做完Load、Conv、Store后,再做Load、Conv、Store。由于兩個(gè)Load之間沒(méi)有必然的聯(lián)系,可以用如左下角圖的方式做成流水線(xiàn),可以看到每一組的方塊本身就是一個(gè)循環(huán)體,但是循環(huán)體內(nèi)部的三條指令沒(méi)有必然的聯(lián)系,通過(guò)這種方式三個(gè)指令就能自由靈活的同時(shí)運(yùn)行。右下角圖表示一個(gè)實(shí)際的網(wǎng)絡(luò)執(zhí)行過(guò)程,可以看到卷積陣列基本上是完全排滿(mǎn)的,沒(méi)有任何縫隙。ddr_load在中間配合著為卷積陣列提供輸入,同時(shí)會(huì)有一些別的運(yùn)算。整體上可以獲得非常高的卷積利用率。
上面是提到了卷積切分和指令調(diào)度,但很關(guān)鍵的問(wèn)題是這么多層該怎么樣切分?這首先想到了C語(yǔ)言編譯器是怎么做的,它針對(duì)每一個(gè)函數(shù)內(nèi)部做分析、編譯,然后看函數(shù)內(nèi)部的這些代碼該怎樣做相互之間的優(yōu)化。同理,當(dāng)把卷積神經(jīng)網(wǎng)絡(luò)的一次Inference看成一個(gè)函數(shù)時(shí),應(yīng)該通盤(pán)去看函數(shù)內(nèi)部的整個(gè)執(zhí)行過(guò)程中計(jì)算要怎樣去做。

圖片


在地平線(xiàn)的實(shí)踐中,我們利用了一套計(jì)算融合技術(shù),把算子綜合去看。如上圖左邊所示,把operator整個(gè)融合在一起,因?yàn)槠系膍emory總是很有限的,而且很貴,必要時(shí)溢出一些數(shù)據(jù)到DDR里,騰出一塊片上空間來(lái)保證執(zhí)行可以進(jìn)行下去,這塊空間越小越好,這樣整個(gè)DDR的訪(fǎng)存帶寬可以很小。
右下角這張圖是720p圖片輸入到ResNet101網(wǎng)絡(luò)中,可以看到開(kāi)始是先把圖片裝載到芯片內(nèi)部,然后通過(guò)中間的運(yùn)算,再把它存到DDR里。中間的過(guò)程只有三次DDR的訪(fǎng)問(wèn),這三次實(shí)現(xiàn)了一些數(shù)據(jù)的搬進(jìn)、搬出,前面大概是一個(gè)18層的層融合輸出,再有一個(gè)14層的層融合輸出,最后是一個(gè)三層的融合輸出,通過(guò)這種方式可以最小化整個(gè)Inference過(guò)程中對(duì)DDR帶寬的訪(fǎng)存壓力。與此同時(shí),還可以看片上的memory到底被利用的怎樣,挖掘接下來(lái)memory怎樣被利用滿(mǎn),是在編譯器上優(yōu)化,還是在芯片架構(gòu)或算法張量大小上做更合理的調(diào)整。

圖片


上圖是把所有的效果放在一起宏觀(guān)展示,可以看到有全局的計(jì)算融合,單層計(jì)算拆分和全局計(jì)算融合和依賴(lài)分析與指令調(diào)度。

02 好用的關(guān)鍵:提升產(chǎn)品研發(fā)效率


什么是“好用”?我認(rèn)為好用是把開(kāi)發(fā)者頭腦里對(duì)產(chǎn)品的思考,利用芯片上所能提供的輔助設(shè)施,以最快的方式打造出他最想要的產(chǎn)品,來(lái)提升研發(fā)效率。

圖片


怎么樣提升研發(fā)效率,也不是一個(gè)容易衡量的詞,所以先看歷史。上圖是過(guò)去100年時(shí)間里整個(gè)計(jì)算技術(shù)的發(fā)展,從最早利用機(jī)械搖桿的密碼破譯、線(xiàn)纜插拔的彈道計(jì)算,到商用計(jì)算、辦公游戲云服務(wù),再到大家比較熟悉的移動(dòng)通信,包括安卓和iOS。在此之前都無(wú)法繞開(kāi)圖靈機(jī)以及控制圖靈機(jī)的編程模型,去實(shí)現(xiàn)人們想要機(jī)器做的行為。
如果大家摸索過(guò)幾種不同的編程語(yǔ)言時(shí),可以看到不管是C、C++、Java或Python,它的核心還是if-else、循環(huán)、跳轉(zhuǎn),只不過(guò)在用途、編譯計(jì)算等方面會(huì)有一些不同,但基礎(chǔ)東西是沒(méi)有變的。但是到了自主機(jī)器人時(shí)代是完全不同的,機(jī)器可以看懂和聽(tīng)懂周?chē)氖澜纾@是一個(gè)數(shù)據(jù)驅(qū)動(dòng)的可微分編程方式。在貫穿在整個(gè)過(guò)程中,應(yīng)用場(chǎng)景和開(kāi)發(fā)范式都在持續(xù)迭代。
再回過(guò)頭來(lái)看,2.0時(shí)代越來(lái)越重要,所以圍繞著2.0時(shí)代的“好用”,就是2.0時(shí)代的開(kāi)發(fā)。但會(huì)遇到一個(gè)問(wèn)題,到底應(yīng)該做什么樣的事情,以什么樣的標(biāo)準(zhǔn)來(lái)衡量,才能把軟件2.0時(shí)代的開(kāi)發(fā)做得好。我請(qǐng)教了一個(gè)老師:C++之父,他在2020年發(fā)表了一篇paper,這篇paper在講2006年到2020年14年間C++的發(fā)展。

圖片


上圖的縱坐標(biāo)是C++社區(qū)的活躍程度,橫坐標(biāo)是時(shí)間,可以看到C++在一個(gè)很快速的上升期之后,在2000年左右出現(xiàn)了下降,在2006年出現(xiàn)了一個(gè)拐點(diǎn),之后推出了C++11,C++14,C++ 17 ,C++20,軟件開(kāi)發(fā)者的數(shù)量開(kāi)始有了非常大的提升。


在這14年里,Bjarne帶領(lǐng)整個(gè)C++標(biāo)準(zhǔn)委員會(huì)討論究竟需要把什么樣的內(nèi)容放到C++標(biāo)準(zhǔn)里,讓全世界的C++開(kāi)發(fā)工程師利用他們手上能拿到的編譯器做好開(kāi)發(fā),比如C++11在Windows下編程可能是Visual Studio ,在Linux下編程可能是GCC或LVM或者其他一些商用的編譯器,那究竟要增加什么樣的特性,C++才能更好用?要用什么樣的標(biāo)準(zhǔn)來(lái)衡量“好用”?


他總結(jié)了兩個(gè)點(diǎn):C++一定要讓?xiě)?yīng)用能夠非常好的利用硬件性能特性來(lái)提升硬件效能,同時(shí)更好的管控底層的編程復(fù)雜度。這兩句話(huà)也很矛盾,高效利用硬件,像是某種形式的軟硬結(jié)合。有效降低復(fù)雜度,是某種情況下的軟硬解耦。同時(shí),他也提出來(lái)一條原則,要能夠讓程序員寫(xiě)出好的代碼,并創(chuàng)造出好的應(yīng)用,而不是預(yù)防程序員出bug。一種是補(bǔ)補(bǔ)丁,一種是更好的牽引,來(lái)成就更好的開(kāi)發(fā)者。


從這點(diǎn)讓我們更加堅(jiān)信AI芯片上的開(kāi)發(fā)也需要充分釋放硬件的性能,降低開(kāi)發(fā)的復(fù)雜度,讓AI開(kāi)發(fā)者們?cè)?AI芯片平臺(tái)上開(kāi)發(fā)自己最主要的應(yīng)用,并把它變成一個(gè)很好的產(chǎn)品,推向客戶(hù)、市場(chǎng)。結(jié)合C++ 14年的發(fā)展歷史,我們認(rèn)為這樣的平臺(tái)才是一個(gè)“好用”的開(kāi)發(fā)平臺(tái)。

03 用軟件2.0基礎(chǔ)設(shè)施、工具鏈、開(kāi)放軟件棧和豐富樣例成就開(kāi)發(fā)者


結(jié)合軟件2.0的編程模式和編程范式,究竟應(yīng)該怎么做才能做出一個(gè)好用的芯片、上層軟件開(kāi)發(fā)環(huán)境。在這方面地平線(xiàn)也在一直實(shí)踐,所以下面將結(jié)合地平線(xiàn)的實(shí)踐,從軟件2.0的基礎(chǔ)設(shè)施、工具鏈、開(kāi)放軟件棧和豐富樣例幾個(gè)層面來(lái)介紹一些相關(guān)的思考,我們也相信這可能是通往好用芯片,尤其是好用AI芯片、自動(dòng)駕駛芯片,一定要走的路。


AI芯片需要一個(gè)工具鏈和軟件2.0基礎(chǔ)設(shè)施,在基礎(chǔ)設(shè)施方面要有數(shù)據(jù)標(biāo)注、模型訓(xùn)練平臺(tái),它可以支持算法開(kāi)發(fā)和訓(xùn)練、算法評(píng)測(cè)、端到端的數(shù)據(jù)閉環(huán),這樣才能把更多的數(shù)據(jù)回傳到基礎(chǔ)設(shè)施里做數(shù)據(jù)驅(qū)動(dòng)的軟件2.0開(kāi)發(fā)。而軟件1.0經(jīng)過(guò)40多年的時(shí)間已經(jīng)變得非常成熟,我們?cè)谏厦嬉矔?huì)堅(jiān)持做微創(chuàng)新。


另外一方面是模型部署優(yōu)化和性能分析,AI算法放在芯片上運(yùn)行起來(lái)時(shí)要很快、性能要好、精度要高,出問(wèn)題后要知道怎樣分析。當(dāng)把算法用起來(lái)時(shí)是整套應(yīng)用的開(kāi)發(fā),它最終會(huì)幫助開(kāi)發(fā)者達(dá)到最終產(chǎn)品的目標(biāo)。


首先講下基礎(chǔ)設(shè)施,這里會(huì)結(jié)合地平線(xiàn)艾迪AI開(kāi)發(fā)工具平臺(tái)的實(shí)踐。艾迪AI開(kāi)發(fā)工具平臺(tái)是一個(gè)高效的軟件2.0訓(xùn)練、測(cè)試、管理的工具平臺(tái)。它由有幾部分組成,比如在邊緣側(cè)有車(chē)、芯片,通過(guò)加密傳輸把數(shù)據(jù)傳過(guò)來(lái)。在云端也是一套完整的基礎(chǔ)設(shè)施,包括半/全自動(dòng)的標(biāo)注工具,自動(dòng)化模型訓(xùn)練,長(zhǎng)尾場(chǎng)景管理、軟件自動(dòng)集成、自動(dòng)化回歸測(cè)試,最后這整套模型通過(guò)OTA升級(jí)部署到芯片上。同時(shí),在端上還有影子模式、量產(chǎn)相關(guān)的模型部署、功能安全和信息安全方面的工作。


這一整套工作不僅僅面向地平線(xiàn)的芯片,其他的芯片也一樣,只是模型部署有所不同,但面向軟件2.0的方法論都是一樣的。開(kāi)發(fā)者圍繞關(guān)鍵場(chǎng)景的問(wèn)題挖掘,模型迭代全流程的自動(dòng)化,可以大幅改善算法的研發(fā)效率,而且可以開(kāi)放的對(duì)接到各類(lèi)的終端上面。通過(guò)這種方式,大大提升了算法研發(fā)人員的研發(fā)效率。

圖片


上圖是根據(jù)算法人員研發(fā)效率做的初步分析和建模,得到了一些效率提升的數(shù)字來(lái)供大家做參考。比如數(shù)據(jù)挖掘,包括一些長(zhǎng)尾數(shù)據(jù)管理和影子模式,在端上的影子模式像小朋友做考試題一樣,一個(gè)小朋友做100道題,可能只錯(cuò)一道,但剩下的99道都沒(méi)有什么用,關(guān)鍵的這一道題要放在我們的錯(cuò)題本上,持續(xù)的去溫習(xí)、迭代。所以影子模式和長(zhǎng)尾數(shù)據(jù)管理,都是AI模型非常寶貴的錯(cuò)題本。通過(guò)這種方式,數(shù)據(jù)上傳和存儲(chǔ)相關(guān)的效率會(huì)有很大的提升。
接下來(lái)是數(shù)據(jù)標(biāo)注,原來(lái)是對(duì)所有的圖片做標(biāo)注。但在車(chē)輛實(shí)際運(yùn)行過(guò)程中,它是一個(gè)時(shí)間和空間連續(xù)的狀態(tài),在連續(xù)的狀態(tài)里,比如在兩個(gè)不同的車(chē)道上,超一輛速度稍微低一些的車(chē)時(shí),可能接下來(lái)的10秒內(nèi),車(chē)都在我的視野中,之后從視野里一點(diǎn)一點(diǎn)的消失。在這10秒范圍內(nèi),如果按照1秒鐘30幀去捕捉圖片并標(biāo)注,這會(huì)非常費(fèi)時(shí)、費(fèi)力。其實(shí)只需標(biāo)注好一張圖片,并利用時(shí)間和空間的連續(xù)性,可以實(shí)現(xiàn)自動(dòng)化標(biāo)注,甚至可以用自主學(xué)習(xí)方式訓(xùn)練一個(gè)大模型來(lái)做標(biāo)注,標(biāo)注完之后只需稍微校準(zhǔn)下,就可以獲得非常大標(biāo)注效率的提升。


地平線(xiàn)艾迪平臺(tái)上背后有一套與車(chē)上面的芯片和板子完全一致的設(shè)備集群,這套設(shè)備集群可以讓每一個(gè)板子像車(chē)一樣運(yùn)行,只不過(guò)它在機(jī)房里,并且輸入不是大街上采集的圖片,而是一些回灌的視頻圖片,在上面我們做很多的探索,像AI模型的探索、編譯架構(gòu)的探索,也可以做很多應(yīng)用代碼的修改和回歸調(diào)試,這大大地降低了整個(gè)設(shè)備、代碼和軟件算法測(cè)試的成本。


除此之外,還有Badcase管理系統(tǒng), Badcase不僅僅是圖片,還可能是某些輸入,或是軟件1.0、軟件2.0在面向自動(dòng)駕駛上的一些小case。


通過(guò)這些case的管理,能夠更好的讓算法開(kāi)發(fā)者直接找到錯(cuò)題本,看怎么做來(lái)解決問(wèn)題,大大提升的研發(fā)效率。經(jīng)過(guò)這一整套研發(fā)效率的提升,可以更好的服務(wù)芯片上的產(chǎn)品開(kāi)發(fā)。


接下來(lái)再講下工具鏈和應(yīng)用開(kāi)發(fā)。如果大家有在英偉達(dá)平臺(tái)上的開(kāi)發(fā)經(jīng)驗(yàn),流程大概如下:先進(jìn)行浮點(diǎn)模型訓(xùn)練,然后量化,看精度是否達(dá)標(biāo),如果不達(dá)標(biāo)再做迭代,接下來(lái)模型編譯放在平臺(tái)上運(yùn)行。地平線(xiàn)也很尊重開(kāi)發(fā)者的開(kāi)發(fā)習(xí)慣來(lái)做工具鏈和應(yīng)用開(kāi)發(fā)。

圖片


地平線(xiàn)天工開(kāi)物已經(jīng)服務(wù)了100多家客戶(hù),這100多家客戶(hù)中的開(kāi)發(fā)者,用這些工具、讀這些文檔、看這些例子,然后在基礎(chǔ)上,把他們的想法、創(chuàng)造性發(fā)揮出來(lái),遇到問(wèn)題時(shí)去分析調(diào)試。


我們把他們看到的問(wèn)題、想法,在發(fā)揮創(chuàng)造性上面遇到的阻礙,反過(guò)來(lái)幫助我們改進(jìn)和提升天工開(kāi)物工具鏈,這套千錘百煉的工具鏈就可以更好的提升效率。除此之外,因?yàn)槭敲嫦蜍?chē),所以地平線(xiàn)也遵循著完整的ISO26262流程去做開(kāi)發(fā)。在今年預(yù)計(jì)會(huì)完成整個(gè)功能安全的認(rèn)證,讓整套工具鏈交付給客戶(hù)和開(kāi)發(fā)者時(shí),讓他們更放心、更安全。

圖片


訓(xùn)練后量化工具也是一個(gè)很典型的軟硬解耦工具,任何訓(xùn)練的符合規(guī)范要求的浮點(diǎn)模型,通過(guò)這個(gè)工具都可以部署在地平線(xiàn)芯片上。這個(gè)工具本身是一個(gè)軟件,與芯片一起做了很多的聯(lián)合優(yōu)化,聯(lián)合優(yōu)化反過(guò)來(lái)可以提升量化精度,即經(jīng)過(guò)量化工具的轉(zhuǎn)換,不用做訓(xùn)練,它的精度的損失與英偉達(dá)量化后的精度對(duì)比如上圖所示,可以看到量化的精度都是比英偉達(dá)量化后要好的。這是一個(gè)很典型的追求軟硬解耦,同時(shí)通過(guò)軟硬結(jié)合的方式,來(lái)打造一個(gè)對(duì)程序員和開(kāi)發(fā)者更好用工具的過(guò)程。


在訓(xùn)練工具上,我們也有類(lèi)似的創(chuàng)新,比如訓(xùn)練的Plugin,在優(yōu)化和編譯器方面也有很多相關(guān)的工具,它們都是來(lái)自于客戶(hù)的寶貴建議和開(kāi)發(fā)者的實(shí)際訴求。


在此基礎(chǔ)上是一個(gè)非常豐富的軟件棧,軟件站里底層是OS,再底層是一些開(kāi)發(fā)板,往上是一些軟件和開(kāi)發(fā)的參考方案。當(dāng)各位拿到我們的芯片或工具時(shí),它里面包含了一整套的工具鏈和開(kāi)發(fā)組件,這些開(kāi)發(fā)組件可以降低開(kāi)發(fā)中的復(fù)雜度。與此同時(shí),上面還會(huì)有很多的應(yīng)用參考解決方案,以白盒或開(kāi)源的方式提供給開(kāi)發(fā)者。我們相信通過(guò)這些也可以大大提升開(kāi)發(fā)者的效率,讓開(kāi)發(fā)者可以做出更好的產(chǎn)品,同時(shí)得到好用的效果。


總之,地平線(xiàn)在艾迪平臺(tái)和天工開(kāi)物上,包括了算法開(kāi)發(fā)和應(yīng)用、算法評(píng)測(cè)、端到端的數(shù)據(jù)閉環(huán),AI算法部署,應(yīng)用開(kāi)發(fā),診斷、調(diào)試、性能調(diào)優(yōu)。這個(gè)過(guò)程都是面向開(kāi)發(fā)者的,完全為開(kāi)發(fā)者服務(wù),而且是為開(kāi)發(fā)者的產(chǎn)品研發(fā)效率服務(wù)。所以在這個(gè)過(guò)程中,一定要秉承開(kāi)放、靈活、兼容,并且要做到高性能的原則。在這些原則的指引下,參考比較多的歷史經(jīng)驗(yàn)和教訓(xùn),以史為鑒去看接下來(lái)怎么做來(lái)實(shí)現(xiàn)更好用的AI芯片開(kāi)發(fā)工具。


上面講了一個(gè)好用的開(kāi)發(fā)工具,但它需要在市場(chǎng)上做相關(guān)的驗(yàn)證和迭代。當(dāng)去看整個(gè)市場(chǎng)上的車(chē)載芯片時(shí),我們發(fā)現(xiàn)中國(guó)尤其是國(guó)產(chǎn)的自主品牌,已經(jīng)成為全球頂級(jí)汽車(chē)智能芯片和算法、計(jì)算平臺(tái)的“角斗場(chǎng)”。比如2021年 Mobileye的EyeQ5,高通的Snapdragon Ride,英偉達(dá)的Xavier和Orin都是在國(guó)內(nèi)自主品牌的自主車(chē)型上面首發(fā),包括地平線(xiàn)征程3和征程5。


最后,再回顧下今天的內(nèi)容,結(jié)合地平線(xiàn)的實(shí)踐,我們正在做一個(gè)更好用的、世界一流的人工智能計(jì)算平臺(tái),它的目標(biāo)是讓開(kāi)發(fā)者更好在上面開(kāi)發(fā)基于A(yíng)I的產(chǎn)品。包括旭日和征程芯片,芯片架構(gòu)、編譯器、SoC、AI算法、深度學(xué)習(xí)框架的技術(shù)交融,軟硬協(xié)同優(yōu)化,通過(guò)BPU微架構(gòu)、版圖、時(shí)序、片上網(wǎng)絡(luò)、指令架構(gòu)、運(yùn)行調(diào)度、通信、功耗等方面提升性能和可靠性,流片驗(yàn)證,把它用在機(jī)器上,讓機(jī)器像人一樣可以看懂、聽(tīng)懂周?chē)氖澜纭_@點(diǎn)是保證了好用芯片里面軟硬結(jié)合和軟硬結(jié)合的核心。


除此之外,天工開(kāi)物工具鏈沉淀了最領(lǐng)先的輕量化模型研發(fā)實(shí)踐、模型壓縮、量化訓(xùn)練、訓(xùn)練后量化、深度學(xué)習(xí)框架、運(yùn)行時(shí)環(huán)境、AI應(yīng)用方案到工具鏈中,通過(guò)自動(dòng)化、工具化、樣例化,服務(wù)萬(wàn)千開(kāi)發(fā)者,普惠AI,讓賦能機(jī)器更高效。


地平線(xiàn)的艾迪平臺(tái),通過(guò)端云協(xié)同、數(shù)據(jù)閉環(huán)、自動(dòng)數(shù)據(jù)挖掘、自動(dòng)化標(biāo)注提升算法研發(fā)效率,通過(guò)評(píng)測(cè)集群和硬件在環(huán)測(cè)試提升邊緣側(cè)迭代效率。它背后還有一整套的硬件和評(píng)測(cè)集群,為了完成模型的訓(xùn)練,還要對(duì)GPU集群做管理,同時(shí)這些數(shù)據(jù)也要有存儲(chǔ)管理,整個(gè)過(guò)程都要自動(dòng)化高效調(diào)度。如果前面是為了提升算法的研發(fā)效率,后面就是為了提升硬件資源的利用率。


上面看到的是產(chǎn)品,產(chǎn)品背后是一整套的軟件代碼和基礎(chǔ)架構(gòu)。這包括怎么樣寫(xiě)代碼來(lái)實(shí)現(xiàn)高系統(tǒng)吞吐率、低延遲、高性能、低內(nèi)存占用,并讓系統(tǒng)正確且確定地運(yùn)行的代碼。從最基礎(chǔ)芯片里的啟動(dòng)裝載器,到芯片上的架構(gòu)設(shè)計(jì),架構(gòu)設(shè)計(jì)上的匯編代碼類(lèi)似于張量指令代碼,然后操作系統(tǒng)的驅(qū)動(dòng)到內(nèi)核,到編譯器和Runtime的環(huán)境,再到深度學(xué)習(xí)框架、量化,這一整套的技術(shù)棧都是用代碼一點(diǎn)點(diǎn)累積出來(lái)的。它還會(huì)用到多線(xiàn)程、高性能算法庫(kù)、單核多線(xiàn)程、多核多線(xiàn)程、多SoC上的通訊調(diào)度、車(chē)規(guī)級(jí)的功能安全,這些方面都需要在軟件層面考慮到。

分享到:
 
反對(duì) 0 舉報(bào) 0 收藏 0 評(píng)論 0
滬ICP備11026917號(hào)-25