天天看點

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

演講:陳怡然

編輯:機器之心編輯部

不久之前,杜克大學電子計算機工程系教授陳怡然發表了主題演講《高效人工智能系統的軟硬體協同設計》,介紹了如何軟硬協同設計出高性能的人工智能系統,包括存内計算深度學習加速器、模型方面的優化,分布式訓練系統以及一些涉及自動化操作等内容。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

不久之前,機器之心AI科技年會線上上召開。杜克大學電子計算機工程系教授陳怡然發表了主題演講《高效人工智能系統的軟硬體協同設計》。

https://www.bilibili.com/video/BV1yP4y1T7hq?spm_id_from=333.999.0.0

以下為陳怡然在機器之心 AI 科技年會上的演講内容,機器之心做了不改變原意的編輯。

我經常用這張圖,來源于大概 32 年前的一本書《The Age OF Intelligent Machines》,作者是 Kurzweil 博士 ,他當時就預言了未來人工智能所需要的算力發展。我們對這張圖做了些延伸,單個器件上大概能夠內建多少計算能力。過去 100 年,計算能力幾乎呈指數增長趨勢,到現在,比如今天英偉達釋出會最新 GPU 的計算,包括上周蘋果釋出的 GPU 晶片,基本上可以帶來超過一個人腦級别的計算能力,為我們帶來了非常大的可能。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

人工智能計算平台分很多種,從大家比較熟悉的 GPU、FPGA、ASIC 到新型架構,實際都遵循了一個原則:要麼更高效,要麼更專業需要更長時間,要麼更靈活,不可能在多個次元達到統一,永遠存在一個設計上的沖突。

比如,在 GPU 上算力最高,功耗也最高。FPGA 上會實作一些非常容易可重構的計算,但能效比可能不是那麼好。ASIC 能效比非常好,但需要更長的開發周期 ,基本上是對特定應用做設計,當出貨量比較小的時候,不是特别有效。

大家比較熟悉馮 · 諾伊曼瓶頸,實際上是說計算能力可以通過不斷增加計算單元來實作,但最後瓶頸在于能不能把資料及時給到計算單元。過去四五十年,片上計算能力和片外資料通過存儲帶寬提供給片上的能力差距越來越大,也帶來了 “記憶體牆” 的概念。當然,實際具體設計中,比如不能及時挪走産生的熱量、不能無限制增大使用頻率等,(這些)都迫使我們尋找新的計算設計。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

現在比較熱門的是近存或存内計算設計,想法也非常簡單,既然瓶頸來源于資料間流動,尤其是存儲空間到計算空間的流動,能不能想一些辦法讓計算跟存儲發生在同一個地方?這實際上正好和馮諾依曼體系相對,後者是将兩者分開,這個要合在一起。

為什麼可以這麼做?因為新型計算,比如神經網絡或圖計算,經常有一方不變,另外一方不斷變化的情況。比如 A 乘上 B,A 不斷變化而 B 不變,這種情況下,可以在存儲 B 的地方進行計算,不需要把資料挪來挪去。

大家進行了非常多嘗試,比如用 DRAM 來做計存。最近,阿裡好像也寫了一篇文章講了存内計算,把存儲器設計成可以有計算單元,直接在裡面進行相應計算,這都是一些有益的嘗試。與在從外面拿到資料過來進行計算相比,這個計算能效強幾千倍,是非常有希望的未來發展方向。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

我們今天講的一些内容與這些相關,包括存内計算深度學習加速器、模型方面的優化,分布式訓練系統以及一些涉及神經網絡架構設計自動化方面的操作。

當你看到存内計算時,第一個想法是把神經網絡參數存到一個地方,資料進到這個地方後直接進行計算,避免資料搬運。一個比較常見的場景是,把這些參數存在一個特殊納米晶片上,(納米晶片裡的)一些器件上的阻值可以通過電流或電壓變化(而變化,進而可以被用)來進行程式設計,表現一個參數。

當涉及一個比較大的矩陣形式,所有輸入跟所有輸出可以在某些交叉節點上進行連接配接,非常像一個矩陣在神經網絡裡面的狀态,所有輸入相當于一個向量,向量乘以矩陣可以看做所有電壓進行輸入,電壓經過電流産生一個合并的電流就是他們所有統計的和。這就以一個非常高效的方式實作了向量跟矩陣的相乘。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

過去十幾年,我們在杜克做了大量相關嘗試,并設計了一些晶片。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

2019 年我們在 VLSI 發了一篇文章,可以用新型存儲器和傳統 CMOS 進行連接配接,內建之後可以将比如卷積神經網絡整個映射到這樣一個矩陣狀态裡,同時可以選擇精度,進行精度和能效之間的權衡(tradoff)。相比傳統 CMOS 設計,性能最後可以得到幾十倍的提高。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

今年在 ISSCC 上我們也有另外一個工作,主要是我們畢業的學生燕博南在北大的一個課題小組工作,這個設計思想還可以放到傳統 SRAM 。這個設計的一個特别之處在于,傳統設計通過電阻進行參數表達,實際上是一種模拟計算方式。換句話說,組織上連續态表達一個參數,這就需要模拟到數字的轉換,數模轉換非常昂貴。而我們在 ISSCC 上的工作:ADC-Less SRAM 實際上是一個二值的整數表達,比如零和一,這就有可能去掉數模轉換,直接實作數字狀态下的計算。這是當時實作的一個技術突破。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

可以看到下面這張圖 Digital CIM(最右邊, This Work), 能效大概可以達到 27.4 ( TOPS/W,8 比特狀态下 ),已經超過原先其他所有設計,整個 density 非常高,在 28 納米工藝情況下,每平方毫米上差不多有上兆的半導體。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

除了電路,還要有架構跟編譯器之間的支援才能夠實作整個計算系統的設計。2014-2015 年之前,我們就開始做相關設計,比如設計編譯器,找到可以用來加速的程式的一部分,同時在片上通過一些方式連接配接各種各樣的陣列,把大的網絡分成小的網絡,或在不同網絡層(layer)之間進行數值的轉換。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

比較值得一提的是,我們經常會在一個大的網絡裡遇到很多陣列,至少存在兩種網絡并行計算的方式——數字并行和模型并行。所謂數字并行,是指有很多輸入(input),些資料可以被并行的分到不同運算單元(PE)裡面去。對于模型并行來說也是一樣,大的模型可以被分塊進行計算。

但是,這兩種并行的方式并不排他。即使對于一個 Layer 來說,當你把這一個 layer 映射到不同 PE 上,在每個 PE 仍可能采用不同的并行方式。比如下圖用黑點和白點來表達,大部分并行方式是通過模型并行的方式來操作,也有少部分是數字并行。

為什麼會這樣?因為隻有內建不同并行的分布方式,才能使得在整個算力全部被表達的情況下,所有數字跟數字正好達到一個穩态平衡,整體能效最高。如果是單一表達,有的地方就空了或者算得比較慢,拖累了整個計算。這是 2019 年發表的文章 HyPar。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

2020 年我們發現一個新問題,我們實際上沒有太考慮卷積網絡本身的表達,而你經常會在卷積層裡一個層一個層地去計算,會有一些中間結果,直到最後才會被用到。這樣一來會産生第三種并行方式,就是 Tensor 并行的方式,比如下圖這種,輸入和輸出各有三種并行的可能。3 乘以 3,總共有 9 種表達方式。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

如果考慮到每個 PE 都有 9 種方式進行表達,就沒有辦法通過人工方式進行優化,必須通過自動化方式(比如線性規劃)完成整個系統的表達。同時,你也不可能逐個去找這些表達方式,需要一些的階層化的方式。

比如,先有些大的區分,再由小的區分一直到最後單個表達。如果用三種顔色來做表達,會發現即使在一個層次的映射下也有不同 PE 有不同運作表達來滿足整體上資料流動的最優。這樣,能效就能再推進一倍。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

同樣的思路不僅僅可以用到深度學習裡面。深度學習隻是一個圖計算特例。而任何可用圖方式來表達資料流動的計算都是圖計算,深度學習雖然很豐富但仍然隻是圖計算的一種特殊表達。是以,你可以用存内計算方式來進行圖計算。

這是我們另外一個 HPCA 2018 上的工作。我們發現是圖計算,尤其是深度優先或者網絡優先搜尋這類算法,可以把他們在矩陣上的表達,用圖計算的方式來實作。相對于在傳統 CPU 平台上的計算,能效會有上百倍提高。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

講完整個架構設計,在算法上如何繼續優化計算能效?下一個例子是結構稀疏化。稀疏化早就被熟知,當神經網絡的一些權重很小或者近乎于零,無論輸入多大,對輸出沒有影響,這個時候,你根本不需要算結果,直接丢掉這個結果(其實是零)就可以了。

2016 年以前,所有針對神經網絡的稀疏化操作基本都是非結構稀疏化,隻要你看到一個零,就把它去掉。這就帶來一個問題——所有資料在計算機存儲的時候有一個 locality(局域性),因為有時域跟空域的局域性,當用到一個數,基本上會有一個預期,這個數字會不斷被用到,或者存儲在其周圍的數也會在未來被不斷用到。當你把很多零去掉後,會産生很多洞。當你找到一個數之後,會期待下一個數,但你根本沒有存。整個緩存會陷入一個狀态:不斷到很遠地方把數字弄過來,結果你發現這不是需要的,然後繼續去找。

怎麼解決這個問題?做稀疏化的時候,仍然希望把去掉的這些零或者計算,以某種局域性來做表達,比如整行或者整列全部去掉。這樣就可以在滿足存儲局域性的前提下,仍然達到計算優化。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

說起來容易,關鍵是怎麼做?我們 2016 年 NeurIPS 有篇文章講了結構稀疏化,這篇文章後來也變得很有名。(文章講的是)基本上可以找到這些參數,對應了某種存儲結構,這種結構使得這些數以一塊一塊方式進行存儲。這樣在清零時,把整個行或者列全部清零,仍然能夠在滿足優化條件的前提下同時滿足 局域性。這個可以用在 CNN、LSTM、RNN 甚至一些更複雜計算。這項技術現在基本上已經是神經網絡優化的一個标配。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

另一個常用的神經網絡優化是量化. 網絡訓練需要高精度,但推理時并不需要高精度。這就産生了一個很有趣的事情:究竟什麼樣的精度,優化是最好的,而且這個精度用什麼方式去表達。

傳統上,大家可以逐個去找最佳結果。比如,一個 bit、兩個 bit、四個 bit...... 去找就對了。但你會發現,還要考慮到這個 bit 怎麼在存儲進行表達。比如,對這個 layer 來講,當有某個 bit 于所有數字來說都是零,那就不需要存這一整個 bit。舉個例子,隻要保證你隻要這四個 bit 裡的第二個和第四個存在,而不是每個都需要,這就豐富了整個精度的優化。這也是我們第一次将結構稀疏化運用到 bit 水準的稀疏化研究上。

我們用 Group LASSO 的方式,把資料表達裡面整個 column 或者整個結構為零的 bit 全部去掉,這樣就極大降低存儲成本。這是我們 2021 年的一篇文章。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

再往下就是訓練,這是一個很複雜的事情。我們經常教學生 loss function 要趨近于飽和。但在公司,永遠不可能有足夠的算力讓你算到飽和,基本上給你一百台機器訓練 24 小時,無論你訓練成什麼樣,你都得結束,這使得訓練本身要非常高效。

傳統上我們采取分布式伺服器的做法,把模型複制很多遍,但每個複制的模型隻用一部分資料來訓練。那麼怎麼保證最後得到的結果考慮到所有的資料?你就需要把這些神經網絡在訓練中禅城的梯度送到參數伺服器裡面,做平均之後再發回去來更新本地的神經網絡。這就産生了一個問題:當節點伺服器特别多的時候,最後整個系統就完全的被梯度傳輸産生的資料流所占據。

怎麼辦?我們後來發現,當參數足夠多的情況下,産生的梯度會滿足某一個分布,根本不需要傳輸原始資料,隻需要算分布的一些參數和一些諸如資料多還是少之類的,把他們傳過去,就可以完全在另外一端複制這個分布,得到相應結果。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

我們在手機端就完成了這樣一個操作,聯合很多手機進行訓練,同時還可以做推理。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

做推理的時候,我們采取了聚類的方式,将那些非零的數字盡量以行列變換的方式調整到一塊兒,然後發到手機上集中進行計算,減少手機間的通信,提高運算效率。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

我們曾經跟一家公司做測試,在全球找了幾千個 CDN 網絡伺服器,搞了一個 Style Transfer(風格轉換)應用,通過分布計算跟表達完成整個計算,效果非常好。基本上可以即時通過手機跟伺服器關聯,完成整個訓練和推理。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

剛才講了這麼多,實際上有一個問題:所有這些東西都需要一些非常有經驗、非常貴的工程師來設計相應的神經網絡。這也是現在神經網絡落地成本中非常大的一部分。我們可以通過自動化方式,比如增強學習、優化方式來優化整個神經網絡,因為可以将它模拟成某種優化過程,但這些傳統的優化過程非常昂貴。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

我們曾經想通過圖表達的方式來做這個。通過一個有向圖而且是一個沒有環路的有向圖來表達深度神經網絡架構,它有很多個 cell,不同 cell 疊加在一起完成整個神經網絡架構。我們要找的是這個 cell 裡面的拓撲結構,來看最後這個神經網絡設計是否滿足要求。這就是一個對拓撲結構比較敏感的研究。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

另外,你會發現:當做這些事情的時候,拓撲結構比較相似的神經網絡的準确度也都差不多,有相關性,相關系數雖然不是 1,但基本上也是一個比較高的數。是以,可以通過架構預測這樣一個架構是不是可以滿足我們的性能要求,這種預測可以指引完成整個神經網絡架構的搜尋。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

這是一些具體結果。我們把一些離散态的架構或者拓撲結構映射到連續态的空間裡,産生向量之間的夾角(相似性)作為一個性能的關鍵表達,可以通過這樣方式預測得到優化是什麼樣的,不斷接近優化結果。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

顯然,這個方式是跟人的設計是相反的,人不是這麼設計神經網絡的。人是看哪裡有小模型能不能滿足要求,滿足不了再往上加。我們也做過這樣的嘗試,叫 Automated network depth discovery , 設計一些規則,使得你可以從最小網絡不斷往上加,每個層裡加不同 layer,或者加很多層,看到什麼樣架構最後滿足這個要求。當然,你要設計一些具體規則或者做一些嘗試。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

這些嘗試還挺有意思。最後你總能優化到設計平衡前沿面的某一個點上,但沒有辦法固定優化到某一個點,你隻能到這個前沿面上的某個點,慢慢讓它自由流動。我們還是沒有足夠的了解,使得我們完全可以控制優化的方向跟範圍。是以,這個工作還需要更深一步研究,我們隻是證明了可行性,但沒有對規則的完備性做更多研究。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

最後,硬體跟軟體協同設計,有很多參數需要考慮,包括軟硬協同、具體電路跟架構設計、以及算法本身針對硬體的優化。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

我們團隊内部做了很多年的積累,從 2012 年開始研究神經網絡在不同硬體上的表達,到後來做架構設計、分布式設計,到自動化設計等,做了非常多的嘗試。大概看到了如何從一個最簡單的表達,一直最後隻需到按一個鈕,完成了 AI 軟硬體結合的建設。

杜克大學陳怡然:高效人工智能系統的軟硬體協同設計

謝謝大家!

繼續閱讀