1. 程式人生 > >AI晶片設計與開發概覽

AI晶片設計與開發概覽

0. 引言

AI發展及其意義:

        學術界和產業界對於人工智慧的研究由來已久,但直到近期的2006年,伴隨著CNN、GPU加速和海量資料,人工智慧才伴隨著機器學習(Machine Learning)/深度學習(Deep Learning)的分支再次起飛,這一次,飛到現實應用。谷歌AlphaGo打敗人類最高棋手使得人工智慧引起普通民眾的注意。

        深度學習為現實世界普遍存在複雜非線性問題提供了一種通用框架——不是寫程式,而是通過框架和大量的資料經過高效能運算進行求解(訓練和預測)。深度學習更加接近人類智慧,並且有人類智慧無可比擬的一些優越性,這為從現實世界已有的大量資料中挖掘價值提供了有效的手段。

本文:

- 分析人工智慧在具體實現上的3個特點

- 探討AI晶片設計和開發的6個挑戰,以及相應的產業界方案、發展趨勢。

1. AI實現的特點

1.1 AI屬於典型的計算密集型應用

        AI以密集運算為主,典型的是向量點積,基本單元是乘累加(MAC),動輒在TFLOPS量級;且對於資料頻寬要求高,相應的運算延時要求主要在應用級,不像CPU一樣敏感。

        典型的通用處理器以ALU為中心,構建外圍控制、中斷和異常處理電路;為了高效能處理單元能夠填滿流水和快速運轉構建亂序和預測、cache等機制,為了對於事件快速響應。然而運算能力不強,並且整個晶片運算所佔的面積比重也很少。

        高效能運算的一個極端情況是全硬體並行實現,對於10點的點積運算運用多個MAC平行計算;所以計算速度快但是面積消耗也很大。

1.2 AI要求晶片具有靈活性

        AI演算法以CNN、RNN等為主幹,分支眾多;同樣的演算法體制,其具體引數(層數、寬度等)也不一樣;AI演算法本身在不斷的演進;AI演算法優化的一個方向是稀疏矩陣處理、低運算精度實現高精度類似的效能。

        然而,晶片設計的投入高、週期長、風險高;要讓晶片開發能夠應對演算法多樣化和快速演進的挑戰,需要一款晶片能夠應對不同型別的應用需求,這對於晶片的靈活性提出挑戰。

1.3 AI晶片設計跨越演算法和軟硬體

        鑑於上面的兩個挑戰,AI晶片設計從演算法開始,經歷架構設計、邏輯設計和驗證、物理設計和驗證。對於晶片開發和應用方法,乃至處理器架構和程式設計提出了挑戰。

2. AI晶片開發挑戰、現狀和趨勢

2.1 基於演算法框架實現演算法和晶片設計的介面

        AI晶片的涉及到演算法、軟體、硬體三個專業方向,為了有效的分工和協作、實現相互之間的可移植性,介面的劃分和定義很重要。

        應用層面見到的無非是訓練和測試資料,模型選擇和基本引數,理想情況下解決方案可以自動有效完成訓練和預測,正如當今沒有體系結構和程式語言基礎的的使用者可以快速掌握和使用office軟體。而下層實現當今深度學習的主流演算法,並且具有一定的可配置性和可除錯性。這部分在業界有多個演算法框架,典型的如谷歌的TensorFlow、亞馬遜的cafee等,也有在這些框架之上構建的封裝更好的平臺如Keras。

        框架的相互互動和底層實現多種多樣,平臺不同實現方案也不同。一個有益的工作是定義中間層格式(IR),IR的一個重要基礎是核心運算元。這裡有ONNX、NNVM等。

2.2 AI晶片架構

        前文提到,AI晶片密集型運算和可程式設計性的要求,普通處理器不能夠有效應對,需要大規模平行計算。

        FPGA和GPU相對於普通的CPU和DSP更加折中實現並行性和可程式設計性。然而,FPGA核心是LUT,實現相同功能所需的器件面積遠大於ASIC,同時執行頻率受限。GPU是傳統技術中最適合可程式設計並行運算的,但是GPU本質上是為了影象處理構建,架構與通用平行計算仍然有不少的距離;雖然GPGPU針對通用計算做了一些優化,但是仍然有不少的差距。

        通用可程式設計平行計算最適合的是流處理器和可重構處理器。早些年在尋求突破傳統處理瓶頸的時代不少學術和產業界專案做過嘗試,但是當時對於高效能運算的要求並不普遍、不迫切所以沒有有效的發展。隨著AI對於計算的需求,這些技術正如深入學習演算法走上演算法舞臺一樣,走向架構設計舞臺。

        具體來說,很多原本只是探索的技術會走上AI架構設計的舞臺,傳統的程式優化技術會普遍應用的架構設計。如深度流水、平行計算、資料區域性性原理相關的區域性儲存、延時隱藏、迴圈展開等。後面會有專門的文章介紹。

2.3 層次化實現和驗證

        AI晶片的大規模和並行特點,導致AI晶片的設計複雜並且有很大難度:展平式尋優策略在計算機演算法上是NP問題,晶片設計每個流程的執行時間也很長,因而短時間找到最優方案並實現極具挑戰,所以需要使用分治策略分層實現,以尋求現實的次優解。

        分層體現在系統設計的處理單元(processing elements)-簇(cluster)-子系統-SoC晶片;體現在結構設計關注關鍵引數-邏輯設計關注微架構和週期一級-後端設計關注具體頻率sign-off,不同的階段有不同的關注點,通過上層設計明確關鍵引數,逐步往下漸進明細。相應的驗證也是如此,通常架構設計明確主要引數和主體運算週期,邏輯設計除了關注具體時序,很多的是保證與演算法設計bit對準來驗證行為,而後端驗證主要關注微架構的時序是否能夠實現。

        這方面主要是開發流程的規劃和整合,不同的IP供應商會提供C++/SystemC模型供架構設計模擬,模擬平臺有純SystemC,也有Synopsys PA(集成了不少常用模型和系統構建除錯機制)

2.4 演算法和軟硬體協同設計

        傳統晶片頂層設計中軟硬體劃分是一個重要主題。而AI晶片設計還需要關注演算法,比如:卷積核的運算需求,資料儲存和傳輸需求;卷積核的運算協作和資料互動需求等。以及引言部分提到的利用低精度運算實現類似高精度運算的演算法精度,利用矩陣稀疏性簡化運算同時保證演算法效能等。這些優化本質上源於演算法,但是需要晶片設計配合,但其在架構及優化對整個晶片PPA的優化立竿見影。對於熟悉傳統晶片設計流程的晶片團隊式巨大的挑戰。

        這裡主要是演算法優化方案在演算法和模型層面,涉及到C/Python/SystemC。

2.5 應用開發工具鏈

        AI晶片的大規模和並行特點,導致AI晶片的開發也極具挑戰。以編譯器為例,運算單元或者cluster內部涉及到並行編譯和排程;整個演算法在晶片上的實現也是很難展平開發,更多的是運算單元或者cluster為單位,根據資料流特徵進行劃分和對映,以及相應的通訊和儲存配備設計進行分治處理。

        本質上當今的演算法描述語言C/Python只描述演算法的邏輯功能,不具備時空資訊,不具備儲存和傳輸資訊,所以很多演算法是先經過同時熟悉晶片架構和演算法的工程師的規劃,再通過工具鏈預定的指令指示工具鏈處理。這方面通用意義上有StreamC/KernalC,產業界NVIDIA的CUDA針對其GPU比較成功,谷歌針對TensorFlow的XLA,華盛頓大學針對GPU的TVM。更為普遍的使用LLVM的開放型構建自己的工具鏈。但目前工具鏈的自動化和效能與實際要求差別較大,很多大規模案例會有工具鏈和手工優化結合,方案供應商多以SDK形式提供,不同的應用提供不同的SDK,且SDK的版本不斷更新。

        大規模平行計算的除錯和跟蹤也是一個挑戰,傳統意義上的單步除錯需要協調不同處理器核心之前的狀態;而跟蹤除了核間協調還需要dump大量的實時執行資料,這需要佔用大量的片上頻寬和晶片介面資源,還涉及到資料壓縮和視覺化。這方面比較典型的是UltraSoC。

2.6 產業格局

        演算法設計、晶片設計、應用設計、系統方案供應商、應用方案供應商、具體企業和個人使用者是AI潮流的相關者。但是由於產業尚在迅速發展,尚未成熟,尚不能形成明確的的專業分工。並且一體化設計和應用也是不同方案差異化競爭力的體現,是構建技術壁壘的一種重要途徑。

        在這種環境下,AI的從業者大體可以分為供應商、使用者、供應商和使用者三種。前者主要是傳統的晶片設計公司如英特爾、華為和新興獨角獸公司。後者主要是大的網際網路公司,他們是AI的企業使用者主體,由於業務體量的需求開始逐步構建自己的AI晶片方案,如谷歌、BAT等。中間的是中小使用者,需要並認可AI的價值,但尚不具備構建AI晶片和全棧方案的資金和技術實力,需要依附專門的AI公司,或者在網際網路公司的雲端方案構建自己的方案。

        筆者接觸到的行業前後兩類的公司差別很大,傳統的晶片設計公司具有很強的IC設計開發能力,但是不能夠很好地理解AI應用,因而設計的晶片針對性欠缺;同時由於過多的傳統晶片設計包袱,不能夠果斷地擁抱新的晶片設計架構和方法學。網際網路公司的晶片設計團隊晶片設計能力略有欠缺,但是可以很好的理解應用,擁抱新的架構和方法學;另外,由於目前AI尚不能明確分工的特點,網際網路公司的晶片設計和應用可以有效協作,填補設計流程上不能自動化的挑戰,儘早實現AI晶片的價值,即使設計可能不是很優秀。所以,哪一派最終能夠勝出尚不明瞭。

參考: