大多數計算技術專家都承認,全球數據每兩年會翻一番。預計到2020年,對那些與人工智能(AI)相關的高級應用(如機器學習、機器人技術、自動駕駛和分析以及金融市場)來說,數據集將超過21ZB(zettabyte)或更多。
這些類型的應用都依賴於大數據,這就需要一些實時計算非常小、但層級很多的軟件算法,但如今的多核處理器和架構在性能和效率方面不能很好地滿足這些算法的需要。
問題:“所有的性能都去哪了?”
直到21世紀初,計算機性能與處理器的時鐘頻率相關,根據摩爾定律,每18個月頻率會增加一倍。2005年後,摩爾定律顯示,約每隔18個月處理器核數翻一番。傳統觀點認為,計算性能的進步將來自於向傳統處理器添加更多的核。然而,如圖1所示,最終結果卻發生了邊際效益遞減的情況。
![大数据和AI应用的新计算架构](http://p2.ttnews.xyz/loading.gif)
為提高傳統軟件算法的性能而添加的核越多,增量增益越小(有一些值得注意的例外)。因此,核數量止步不前。每代的晶體管數量增加一倍,多出的晶體管用來使“少量”核的速度稍微快一些,而不是用來增加更多的核。晶體管資源的指數增長被浪費了,只能給我們帶來性能上小的線性增益,如圖2所示。
![大数据和AI应用的新计算架构](http://p2.ttnews.xyz/loading.gif)
需要處理的數據量正在以指數速度增長。目前這一代“雲”由充滿“少量核”的服務器的海量機架組成。其結果是大量的網絡服務器正在造成大規模的數據中心蔓延,所有這些都導致全球用電量和碳排放量大幅增加。
關鍵的是,對大數據和機器學習工作負載的檢查表明,它們與現有處理器數十年來設計和優化的工作負載大不相同。大數據/機器學習代碼大小以kLOC(千行代碼)為單位,而傳統軟件(考慮你最喜愛的辦公套件,甚至最喜愛的操作系統)是以mLOC(百萬行代碼)為單位進行度量的。例如,在中國科學院為SPARK應用框架提供的流行的BigDataBench 3.2上的一個簡單的LOC grep(Globally search a Regular Expression and Print/正則表達式全局搜索並打印,一種強大的文本搜索工具),就涵蓋了十幾個不同的基準測試,顯示總計不超過1000行SCALA代碼的累計kLOC。Yahoo!的 Streaming Benchmark,則少於300行的SCALA代碼。谷歌的TensorFlow MNIST,整個教程有多個副本,有超過1000行python代碼。
主要觀察結果如下:
1.我們需要在大數據/機器學習中處理的工作負荷是獨一無二的、每個都很小,而且性能體現在在許多,許多服務器之間複製這些代碼。
2.需要處理的數據量每年呈指數級增長,本質上是流式傳輸,並具有一些實時要求(考慮自動駕駛汽車或即時移動廣告)。
3.由於硅供應商的研發,晶體管數量仍然呈指數級增長。
- ...然而,我們從每代處理器中獲得的計算性能只是線性增長。
假設:需要一種適合目前工作負荷的新處理架構,它應能提供一種可擴展、大規模並行、海量核的方法。讓我們使用晶體管預算,通過添加大量核來提供更多計算,而不是試圖加速一些核。
硅谷的一家人工智能高性能計算公司CORNAMI正在處理這些過程問題,並將計算性能提升到非凡水平。CORNAMI利用併發技術開發出獲得專利的新計算體系架構,該技術可以獨特地改變軟件性能並降低功耗、延遲和平臺尺寸。
其結果是在每個處理核都具有獨立決策能力的大規模並行體系架構,穿插著高速存儲器,並且所有這些都通過生物啟發式(biologically-inspired)網絡互連以產生可擴展的海量核。該體系架構基於CORNAMI開發的獨特結構,稱為TruStream計算結構(TSCF,TruStream Compute Fabric),可跨多個芯片、電路板和機架進行擴展,每個核可獨立編程。
通過使用TruStream編程模型(TSPM,TruStream Programming Model),多核處理器資源被抽象為共同的同質核池。TruStream在軟件和硬件上均實施,並可在TruStream計算結構中運行。程序員可通過嵌入到更高級別標準語言中的CORNAMI的TruStream控制結構輕鬆實現併發性。
機器學習處理引擎的核心
最近來自微軟的關於其卷積神經網絡加速器、谷歌關於其用於神經網絡加速的張量處理單元(TPU),以及來自NVIDIA的關於其深度學習GPU的Volta的發佈都揭示了加速機器學習算法的類似方法。 要加速的算法都是三維濾波器的變體(圖3)。重型升降機(消耗CPU/GPU最大算力或硅面積的算法)是種三維卷積濾波器——這是卷積神經網絡(CNN)的核心和靈魂。
為了加速這些算法,使用了二維硅結構—— 一種稱為脈動陣列(systolic arrays)(《用於VLSI的脈動陣列》,H.T.Kung和Charles E.Leiserson,1978)的硅加速器。圖4顯示了要相乘的兩個簡單的3×3矩陣;圖5顯示了將執行乘法的3×3乘法累加單元的脈動陣列。
例如,輸出矩陣元素C11包含在A和B輸入數據完成流入之後的結果A11•B11+A12•B21+A13•B3。較大維數的陣列允許發生大量並行操作;陣列元素之間更復雜的互連增加了帶寬;每個元素更復雜的功能允許執行卷積和其它功能;而更復雜的控制電路允許結果流出,因為更多的數據流入和更多的計算被執行。
這些是用於生產部件的技術。消除複雜性及核心思想很簡單。請注意,輸入矩陣按照特定的順序流入陣列的左側和頂部,並將結果從陣列中流出。一個脈動陣列的屬性(即能夠連續大量數據流入和流出的結構;同時操作所有元素;以及中間值保存在脈動陣列內部的事實;並且不需要被“保存”到內存中)提供所需的性能。
基於上述情況,我們現在可以得出以下幾個關鍵見解:
•脈動陣列的每個元素都是元胞自動機的一種形式,它使用簡單的規則對其周圍的數據作出反應。
•微軟、谷歌和NVIDIA高性能機器學習硅部件中的脈動陣列(如本文前面所討論的)將陣列視為固定功能硅加速器,其中尺寸、元件功能和互連都是ASIC掩模組創建完成時就固定了的。
•用於機器學習的新型硅加速器的快速發佈速度表明,算法仍處於高度變化中。幾乎每週都會發布新的、更高效的新處理方法。在硅上運用機器學習算法後,它會在下週的公告中迅速就變得過時。
假設:如果我們允許編程人員通過軟件來定義任何脈動陣列的維度、功能和互連性,該怎麼辦?也就是說,要保持機器學習所需的高性能,這是脈動陣列的一個副作用;但允許軟件程序員通過完全允許在軟件中進行更改來跟上新算法的發展。
另外的好處是,這種軟件方法應用範圍相當廣泛,遠遠超出了機器學習的範圍,其中,對二維或更高維陣列的元素(單元、像素、體素),及其鄰元素進行操作。應用範圍舉例如下:
•機器學習
•圖像處理
•壓縮/解壓縮
•編碼/解碼
•三維(3D)建模
•流體動力學
•有限元分析
•密碼學
•糾錯編碼
•建模物理現實
最簡單的脈動陣列——康威生命遊戲
讓我們來看一個前面提到的軟件定義脈動陣列方法的完整實例,該實例使用了TruStream編程模型(TSPM),以在海量核TruStream計算結構(TSCF)上執行軟件。為了說明將TruStream應用到這些問題中的技術,我們選擇了生命遊戲元胞自動機(Game of Life cellular automaton),它由二維方格細胞組成,每個細胞只與以自身為中心的相鄰八格細胞進行交互。幾乎所有的軟件編程人員都應該很熟悉這點,並且很容易就可以說明這些機制。當在TSCF上運行生命遊戲的TSPM程序時,每個生命遊戲細胞都運行在其自己獨特的TSCF核上。
TruStream編程模型
自從亨利福特時代以來,組裝脈動陣列的問題與工廠設計師一直在處理的問題非常相似。工廠建構師將問題看作是組織一系列實體(機器、機器人和工人)的問題,這些實體通過從一個實體流向另一個實體的小部件流進行交互。當這些建構師繪製其工廠圖時,他們繪製框圖,而不是流程圖。然而,在進行工廠設計時,流程圖的作用是:它們非常適合描述單個機器、機器人和工人的順序行為。總結來說:
確定工人執行任務和佈置工廠的順序是兩個根本不同的活動。
正是這些觀察激發了我們對計算的看法:計算機是組裝數據值的工廠;激發了我們對編程的看法:程序的某些部分可最容易且自然地表示為流程圖,程序的其它部分最容易且自然地表示為框圖。或者等價地:程序的某些部分在TSPM線程域中最容易和自然地表達;程序的某些部分在TSPM流域中最容易和自然地表達。
根據這些,我們創建了TruStream編程模型,該模型基於五個C++類,如下所示:
為了更直觀地瞭解這些類,請參閱圖7和圖8,它們提供了五種TruStream對象的圖形表示。
圖7顯示了TruStream編程模型的兩個關鍵特性,如下所示:
•TruStream拓撲可能是循環的(或非循環的)。
•通過嵌套streamModules創建分層拓撲。
TruStream編程模型有三個獨特屬性,如下所示:
•TSPM代碼分為兩個域:線程域和流域。
•TSPM僅在流域中表示並行性。
•TSPM依靠單一機制來同步線程:TruStreams。
第一個屬性體現了關注點分離的設計原則,允許程序員專注於每個領域內的單獨關注。
•在線程域,程序員處理嚴格的順序問題。
•在流域,程序員處理流和流上的轉換。
由於這種關注的分離,線程域程序員和流域程序員都不擔心多線程或將代碼映射到單個處理器內核。
第二個屬性意味著線程域程序員(編寫順序代碼的程序員),不必處理並行性。這與傳統的並行編程方法顯著不同。
第三個屬性意味著線程域程序員和流域程序員都不必處理基於線程的並行性結構引起的同步問題(參見圖10)。然而,儘管沒有這些構造,TruStream程序員可以訪問所有形式的並行。
TruStream計算結構
TruStream計算結構是一個可擴展的海量核處理器,包含處理核和片上SRAM。所有核都可獨立編程,並且可並行進行獨立決策(與現代圖形處理單元不同),並且該架構可以跨越多個芯片、主板和機架進行擴展。像大多數程序員不會過度關注他們使用的RAM數量一樣,TruStream程序員也不必過於關心他們使用的核數量。
TSCF和TSPM之間的連接包含在以下三個屬性中:
•TruStream程序中的每個threadModule都有自己的TruStream計算結構核。
•在TruStream計算結構核中運行的唯一代碼是封裝在threadModule中的線程域代碼
•TruStream程序中的每個streamModule在TruStream計算結構中配置一個TruStream拓撲。
TruStream計算結構的主要特性概括如下:
•TSCF針對TruStream編程模型進行了優化,因此TSCF(如TSPM)支持所有形式的並行。
•TSCF對TruStreams提供硬件支持、對TruStream提供gets和puts支持,使TSCF能夠非常高效地運行TSPM程序。
•TSCF中唯一運行的代碼是應用代碼!僅此而已。沒有列出結構中運行的11個膨脹代碼(bloat code)。
•TruStream計算結構中的線程等待輸入數據和輸出空間。除此之外,線程不會等待。
•每個TSCF核最多支持一個線程,因此不存在上下文切換。這意味著不需要調度程序(scheduler)或分發程序(dispatcher)。
•TSCF性能來自並行性,而不是蠻力的速度,因此我們有優化TSCF的能源效率的優勢。
•由於芯外(off-die)操作是性能殺手,TSCF提供大量片上SRAM。
每個TSCF核都有自己的存儲器端口,因此TSCF提供特別(高)的聚合存儲器帶寬。
總之,這些特性導致:(1)延遲顯著降低;(2)性能顯著提高;以及(3)計算能力顯著增加。
TruStreams中的生命遊戲元胞自動機
生命遊戲,又稱生命棋,是由英國數學家約翰·何頓·康威(John Horton Conway)於1970年發明的元胞自動機。
該“遊戲”是一款零玩家遊戲,這意味著它的演變取決於它的初始狀態,不需要進一步的輸入。通過創建初始配置並觀察它的演變方式、或通過創建具有特定屬性的模式(對於高級“玩家”)來與生命遊戲進行交互。
規則:
生命遊戲的宇宙是一個方形細胞的無限二維正交網格,每個方格處於兩種可能的狀態之一,即活著或死亡(或“有人居住”或“無人居住”)。每個細胞與它相鄰的八個細胞相互作用,這八個細胞是水平、垂直或對角相鄰的細胞。在每個介入(step-in)時間,都會發生以下轉換:
-
任何少於2個活的鄰居的活細胞會死亡,模擬生命數量稀少。
-
任何有2個或3個活著的鄰居的活細胞都會存活至下一代。
-
任何有3個以上活著的鄰居的活細胞會死亡,模擬生命數量過多。
-
有三個活的鄰居的任何死細胞變成活細胞,模擬繁殖。
就該定義,我們做兩個簡單修改,如下所示:
• 下面的TruStream程序實現了一個8◊8單元網格,而非正方形單元的無限二維正交網格。
•陣列的南北和東西邊緣是環繞的,以便當經典的生命遊戲滑翔機(glider)到達陣列的東南角時,它會瓦解,僅在陣列的西北角重新組裝。
在下面的章節中描述了用於生命遊戲的TruStream程序,假定清單1中顯示了#includes和#defines。 1.
單元線程模塊
清單2中所示的單元線程模塊類實現了上述的生命遊戲單元,包括四個轉換規則。
GameOfLifeArray流模塊
GameOfLifeArray流模塊(清單3)構建了生命遊戲陣列:
顯示線程模塊
顯示線程模塊(清單4)印出GameOfLifeArray流模塊的連續幾代的單元狀態。
GameOfLife流模塊
GameOfLife流模塊(清單5)將GameOfLifeArray連接到顯示器以構建生命遊戲。
主要功能
我們現在看我們的生命遊戲程序中最簡單的部分:運行它。
如清單6所示,運行一個TruStream程序包含三個步驟:
-
GameOfLife GOL;
-
GOL.run;
此次調用使TruStream計算結構的65個核運行10,000代生命遊戲程序——GOL陣列的64個核和用於顯示的一個核。在生命遊戲輸出(圖12)中,我們看到了經典的“生命遊戲”滑翔機(a)在世代0到16中向東南方向滑行;(b)在世代17到26中分解;(c)在第27代中重新組裝;(d)在第32代中恢復到初始狀態。
-
GOL.wait;
該調用導致main函數等到程序完成。
結語
TruStream技術重新定義了計算的含義。在過去的70年中,一直以線程為中心的觀點已一去不返。取而代之的是這樣一個模型:線程仍扮演一個角色,但是個支持角色(可以完全消除線程;例如,用純功能語言編寫的功能代碼替換順序線程域代碼,以及用棧機替換馮諾依曼核)。
該技術最顯著的特點是:(a)將代碼分成兩個域:線程域和流域;(b)僅在流域中表達並行性;以及(c)依賴單一機制(TruStreams)用於同步線程。
這些功能有很多好處,其中主要有以下幾點:
•在軟件內快速構建任意多維脈動陣列並使其在核計算結構上運行的能力。你可以實現當今最喜歡的機器學習算法,並且當更好的機器學習算法出現時,就取而代之。當系統工作負荷發生變化時,軟件可以實時更改脈動陣列的大小和性質。需要結合機器學習功能執行復雜和任意的控制功能嗎?編碼它!我們無論怎樣強調軟件靈活性的優勢都不過分。利用用於機器學習的高性能硅加速器,你會被ASIC流片時制定的設計決策所束縛,而且硅加速器仍然需要訪問通用處理器核,以便控制決策。
•可任意擴展的多核架構。大多數多核方法都有一個集中式資源(例如調度程序或分發程序)作為限制系統規模的瓶頸。在TruStream計算結構中,沒有這樣的瓶頸。一旦TruStream拓撲下載到TSCF並開始運行,拓撲中的每個線程模塊都是獨立的。它從輸入流獲取數據值、執行計算、並將數據值放入輸出流中。僅此而已。沒有運行時間調度或分發,並且沒有同步原語(synchronization primitive)——超越TruStreams。而且,由於每個線程模塊都有自己的核,所以沒有上下文切換。多個IC可以連接在一起構建更大的計算結構;機架中的多個服務器可以連接在一起;並且多個機架可以結合在一起來處理更大的工作負荷。
•對於大數據和機器學習應用,優勢轉向擁有越來越多的更小的核,而不是試圖盡力提高大型傳統處理器核的性能。技術節點的變化通常使你可將放在同一尺寸芯片上的晶體管數量加倍。在今天的技術節點實踐中,這意味著你會得到另外幾十億只晶體管。傳統方法將利用這些晶體管並將其轉化為15%至30%的性能增益。現在,你可以將它們轉換為額外的4,000個處理器核。
Paul Master是CORNAMI公司的聯合創始人兼CTO。 Frederick Furtek是CORNAMI公司的聯合創始人兼首席科學家。
閱讀更多 EET電子工程專輯 的文章