編者按:人工智慧先驅阿蘭.圖靈曾設想過這樣一個機器,它擁有電子的大腦,以攝像頭為眼睛,以輪為腳,可以在鄉間漫步,這其實是阿蘭.圖靈對人工智慧走入生活的一個憧憬。而在很長的時間之內,由於硬體條件的不成熟,智慧只能從無形的演算法入手,隨著深度學習研究的深入,在很多領域都取得了里程碑式的進展。
然而,要想讓人工智慧真正融入人們的生活,則亟需解決演算法在端側落地的問題,而晶片,作為銜接演算法與場景之間的橋樑,無可避免地成為了一大挑戰。
本文中,地平線聯合創始人、美國西北大學楊銘博士,來和大家分享“在晶片上加速神經網路用於視覺任務的挑戰”。
非常高興來到VALSE,來到美麗的大連,首先和大家分享一下人工智慧晶片的話題,另外介紹一下地平線在最近兩年做的工作。由於最近的熱點新聞,大家對晶片這個話題比較感興趣,希望今天的分享能給大家一個概念:為什麼人工智慧晶片非常重要,它的研發具有哪些挑戰,都需要做哪些工作。
這是我要分享的幾個要點,先簡介一下地平線,接著介紹一下AI晶片的背景,包括AI晶片研發的必要性,以及現在主流的AI晶片的型別和選擇。隨後會介紹關於AI晶片的兩個主要研究,一個是Google TPU的第一代,這應該是目前公開資料最多的AI晶片,另一個是地平線研發的BPU,最後是關於AI晶片的一個總結。
地平線機器人成立於2015年,我們的願景是希望能夠成為嵌入式人工智慧的領導者,為大家提供高效能、低功耗、低成本、完整開放的嵌入式人工智慧解決方案。主要業務面向智慧駕駛、智慧城市、智慧零售等應用場景,為多種終端裝置裝上人工智慧“大腦”,讓它們具有從感知、互動、理解到決策的智慧,賦能萬物,讓每個人的生活更方便、更安全、更美好。
從2015年7月開始運作,目前地平線已經成長為500人左右的公司,總部位於首都北京,主要進行演算法研發、硬體研發、晶片研發;2016年在南京成立了第二個研發基地,包括應用開發、硬體開發;2017年在上海成立了第三個研發中心,主要目標是把自動駕駛產品和方案落地,同時在深圳也有一個分部,主要負責完成客戶支援、銷售服務工作。
地平線的主要核心團隊都具有計算機視覺與機器學習的背景,我們選擇了從計算機視覺出發轉向於硬體晶片開發。餘凱博士是CEO創始人,黃暢博士負責基礎演算法的研發,吳強博士是在計算機體系結構以及雲端後臺伺服器的專家,也負責南京所有的研發工作。
首先談談我們為什麼需要人工智慧?在經歷了PC網際網路和移動網際網路時代以後,未來10年最大的可能就是讓萬事萬物所有的裝置本身都具備互聯能力和智慧功能。什麼是智慧功能?就是能夠自主感受環境,能夠根據感受環境的結果自主做出判斷和控制。相信在未來的10年、20年,包括無人車、無人機,也包括攝像頭和玩具,所有這些裝置慢慢都會具有智慧功能,都會具有自主判斷能力,同時這些裝置都會對人工智慧提出更高的要求。過去的10年,由於人工神經網路重新煥發出活力,為我們解決這些人工智慧問題提供了可能。
近幾年來,神經網路基本改變了我們對人工智慧問題解決的正規化,現在的基本模式是,資料入、結果出,由神經網路解決問題,只要能夠定義好資料格式,標註好資料,就很有可能在短時間內得到不錯的解決方案,這也是人工智慧被廣泛關注的重要原因。
同時,我們發現神經網路是一種非常靈活的建模語言,可以有效描述各種問題,之前的嘉賓也都談到它確實能解決很多不同領域的問題。
神經網路、深度學習正在慢慢改變著很多行業,首先是網際網路行業的廣告搜尋業務,之後是語音識別、影像識別,在金融領域也開始應用神經網路。近兩年來,自動駕駛領域、醫學影像識別、工業控制領域都逐步應用了神經網路技術。
大規模地應用深度學習還需要解決哪些核心的挑戰呢?我們總結了三個主要問題。
第一:如果將AI和神經網路應用到一些行業中去,必須對行業和應用場景有非常深入的理解,這些行業和應用場景有很多痛點,它們描述問題的語言和我們研究AI的語言並不是很相容的。比如說我們講識別率是99%,大家就會覺得這就很準確了,而我們要表達的是在多數情況下我們的識別率是100%,少數情況的識別率是0%,平均下來才是99%。另一方面,很多行業如果需要AI的話,並不是應用技術,往往需要應用完整的解決方案或者系統,我們需要做進一步深入的工作,才能把技術轉化為系統應用起來,也就是讓演算法和行業之間能夠有很好的交流和理解。
第二:目前還沒有低成本、低功耗,成本很經濟的硬體平臺。如果有了這樣很好的硬體平臺,應用範圍和難度也會降低很多。在各種行業中,包括無人車、無人機或者其它裝置都具有不同的限制,比如功耗、成本,以及散熱性和可靠性等。因此,缺少低成本、低功耗、高效能的硬體平臺限制了大規模應用AI和神經網路的解決方案。
第三:近年來,演算法發展非常迅速,帶來的問題是人們的期望也不斷提高,演算法的發展是不是能夠一直跟上期望值的增加呢?比如說隨便在一個應用場景只要應用神經網路就能夠達到很好的效能,這是不能保證的。神經網路存在解釋性的問題,它是一個黑匣子,用對了當然很好,如果效能很差,為什麼差呢?這是很難解釋的一個問題。神經網路是基於統計的,針對很少見的情況,比如說在自動駕駛中出現車禍的情況,訓練集能否覆蓋這種情況呢?在實際應用中很難給應用方解釋我們的方法是非常可靠的。
另外,雖然加大資料量可以解決一些問題,但是能不能夠把所有資料都標註呢?這也是值得思考的問題。AI或者神經網路距離大規模應用有這樣三個問題,我們今天想談的是第二個問題,能不能先做好硬體平臺準備。
我們也看到在整個行業中,眾多公司中最近幾年最受益於AI發展的是NVidia。這也說明現階段,有了很好的硬體平臺才能做應用,才能讓各種行業應用AI演算法。
為什麼神經網路適合專用晶片或者硬體來加速呢?神經網路結構這幾年有很大發展,從計算角度給大家帶來了新的挑戰。首先神經網路運算有大規模的並行性,所有運算都有共同基本單元,就是相乘累加,非常適合硬體實現的運算子方式。神經網路運算中間會產生很多中間結果,這些中間結果並不會被重用,這與之前的通用計算方式很不同。在神經網路計算中,無論是網路的權重還是資料本身,對硬體頻寬的需求都很高。
這些新的挑戰使得原來非常強大的CPU並不能高效計算神經網路,CPU計算方式還是序列的方式,即使有些指令可以處理多個資料。CPU設計花了很多精力最佳化多級的快取,可以方便獲取資料,這對一般運算來說非常好的,但是對於神經網路不必要。這些CPU的最佳化,如分支預測,讓一般運算非常高效,對神經網路來說額外開銷,因此用CPU來訓練神經網路效率是相對比較低的。因此我們發現近年來提出來很多CPU+X,對神經網路做專門的運算加速。
AI片基本上等價於神經網路加速,我們需要AI晶片的原因是,透過硬體工藝的提高已經很難大幅度提升計算效能,而需要專用晶片架構提高計算效能。例如,硬體工藝改進,隨著三極體數量增加,頻率更高,功耗不變,這條規律在2006年的時候已經不成立了;我們所熟知的摩爾定律,在2015、2016年也已經終結,單純透過硬體改善不太可能繼續提高計算效能,所以需要新的專用架構設計來幫助提高對神經網路計算效能。
通常來講,根據之前提到的神經網路計算的特點,神經網路晶片能採取的針對措施有以下幾點:
1.由於有大量資料吞吐,可試圖降低資料量,讓晶片上儲存更多的片上資料,儲存計算中間結果。
2.由於需平行運算很多,儘量用比較簡單的資料型別和資料大小,實現大量基本運算單元,不需要複雜的排程、分支預測、配置的管理,儘量減少管理排程所需晶片面積開銷。
3.神經網路運算資源排程最佳化工作讓軟體去做,而不是用硬體實現複雜的排程。那麼這個軟體是指哪些層面的軟體呢?後面可以會明確地提到。
下面介紹一下已有的神經網路加速晶片的型別,我們可以看到在過去幾年中,很多層出不窮的xPU出現。
首先是GPU,具有很強大的平行計算能力,但能耗比較高,也是目前最成熟的一個軟體工具平臺,有很多開源社群軟體的支援;
其次是DSP,利用一些單指令多資料的計算單元,一次性提供超過100個位元組的運算,優點是低功耗,並具有硬體支援的低開銷或無開銷迴圈及跳轉運算。問題在於DSP的指令集取決於其廠商與型號,不同型號的DSP的指令集都是不太一樣的,這樣給學習和程式設計開發造成了較大的困難。
FPGA是一種半定製化的硬體,採用程式設計方式,對片內閘電路進行程式設計,配置片內RAM使用,具有一定的靈活性和可修改性。從程式設計的角度來看,FPGA採用硬體描述語言,排程連線已有的LUT等運算單元,開發難度高一些;從功耗和成本來看,FPGA採用CMOS工藝,功耗低比GPU低,但比DSP之類ASIC高。
對於TPU,在後面的工作中會提到。
最後是IBM做的仿人腦的晶片,晶片的單元只有啟用狀態下才會工作,功耗會非常低。
設計AI晶片,主要有哪些挑戰呢?
1.設定合理恰如其分的目標。由於資源的限制,對行業理解的限制,設計一個放之四海而皆準、而全的晶片是很難的,如何去設定好支援哪些功能,如何設定好成本、功耗、可靠性的目標,這是最難的一個問題。另外,整個晶片設計流程週期長、成本高,並不能在實施期間隨意更改目標。
2.如何設計系統架構,包括指令集的設計,能夠讓架構儘可能滿足更多需求,實現更多型別的神經網路,這是一件不容易的事情。
3.為了讓神經網路晶片能廣泛可用,需要提供全面的工具支援,提高程式設計開發效率。而工具鏈的支援也是相當複雜的,需要訓練平臺,需要編譯器把神經網路轉換成可執行模組下載到晶片中去,需要模擬器在沒有晶片的時候可以模擬開發,並且能夠除錯分析效能,能夠設計出參考模型。這一系列軟體工具鏈的支援,對AI晶片能否成功起著關鍵性的作用。
當然由於這是一個非常複雜的過程,而任何人的資源都不是無限的,總是要做一些非常痛苦的抉擇和權衡,在成本、開發時間、各種資源條件限制下做一個權衡。
對於神經網路加速晶片,又會有哪些具體難題呢?
1.首先要確定支援的網路子集。神經網路多種多樣,新的演算法層出不窮,到底要支援到什麼程度,支援哪些網路結構啟用函式和操作。
2.支援哪些函式和資料型別,同時要考慮是否支援模型壓縮、量化方法,這些都需要在演算法層面上對神經網路目標做很好的設定。
3.設計晶片結構,比如片上記憶體和片下記憶體,片上記憶體當然越多越好,但是成本高,功耗和測試時間都會增加。儘量讓硬體本身簡易化,只完成神經網路加速,把任務排程、任務最佳化交給軟體去完成。這些最終都需要對開發者透明,需要由中介軟體工具鏈來做最佳化,這也是工作量非常大的一項工作。
4.最後還要提供很多參考模型和設計,完成具體應用場景中的功能示例。
這是一個非常簡化的開發AI晶片的流程,從需求(MRD)開始,首先是演算法的研發,要明確哪些神經網路模型是最重要的,是需要支援的,是否能夠滿足應用場景的要求;之後會生成很多參考模型,實現Golden C,在設計的時候可以參考C的實現;右邊是晶片設計的過程,實現架構設計,實現核心神經網路相關的程式設計,同時晶片需要訪問記憶體,訪問介面,需要IP整合,整合之後需要進行驗證,並需要實現FPGA平臺去做實際驗證;之後是後端設計,包括邏輯綜合、佈局佈線等;然後進行流片(Tapeout),這需要之前各種驗證都已經做得很充分之後,流片之後修改的機會就很少了,而且流片經濟成本和時間非常高。最後需要把硬體晶片放在一個硬體平臺上,啟動起來之後能夠開發中介軟體執行軟體。左邊是軟體相關工作,包括訓練平臺、編譯器、模擬器和偵錯程式,最終做到應用,再測試。可以看出,整個流程的工程量非常巨大。
具體介紹兩個例子。先看一下TPU,這是Google 2013年開發的,經歷了大約15個月,TPU的定位是對神經網路加速的晶片,它可以在資料中心使用,15個月的開發時間已經是相當快的速度,功耗大概是75瓦。TPU上有256×256×8bit的矩陣乘法器,這是最核心的計算單元,所有的設計目標都是希望能夠讓這個乘法器效率最高。每個TPU指令都是由伺服器透過PCIe匯流排傳送回來的;然後透過指令把資料調到24兆的緩衝區,安排好資料,同時把神經網路權重從外部DRAM調到晶片中去,讓矩陣乘法器不斷計算,並把中間結果、乘加結果存到4兆快取區中去;最後再透過啟用歸一化函式後存回到快取區。可以看到TPU實現了一個非常直觀的神經網路預測,並做了很多簡化和約束工作。
TPU的主要指令是從主儲存器中讀資料、讀權重,然後進行乘加,最後透過啟用函式把結果寫進去。
對比之前提到的幾個原則,TPU首先做了一些限制,只支援神經網路預測(inference),根據Google內部的業務的需求,主要支援MLP(Multi-layer Perceptron)網路。它支援整數運算,通常為8bit運算,也可以進行16bit或32bit的運算,但處理速度會降低一半或者4倍。從儲存角度上設計了24MB的SRAM來儲存中間結果,權重也是透過SRAM呼叫進去。它把最佳化工作基本上都交給軟體來完成,晶片本身的架構沒有非常複雜的最佳化,主要最佳化是在於讓乘法器核心能夠持續運算,同時把其它的運算並行起來。從分析和處理的角度來看,TensorFlow和TPU是相容的,TensorFlow能夠讓它的工作效率很高,因為很多Google軟體工程師針對TensorFlow和TPU進行了開發。
地平線也做了AI晶片,我們做的是什麼呢?首先也是針對於神經網路預測,同時這種預測還只針對影像和計算機影片的任務。我們做了一些限制,輸入是8bit 多通道的2D的矩陣,可以是灰度或YUV影像。我們針對的就是影像應用,目標是開發高效能、低功耗、低成本神經網路協同處理器,透過程式設計方式改變演算法架構和替換不同的神經網路。
開發過程首先從MxNet的訓練開始,同樣支援TensorFlow網路架構。主要支援8bit整數的運算,用晶片來實現的話,支援很多的資料型別成本和複雜度會提高。
我們的工作核心是把一個神經網路模型編譯成我們支援的組合語言,一方面我們知道具體的神經網路模型,另一方面我們知道這是一個檢測演算法,把檢測演算法對應的模型和演算法架構合併在一起,透過聯接器(Linker)得到機器語言的模型檔案,其實體地址沒有完全確定,如果是真實晶片則確定實體地址在晶片上執行,如果是軟體模擬器就則可模擬執行。
我們會提供比較全面的開發平臺支援,從演算法角度來說,能夠在不同尺度下進行圖象識別,在不同的影片中進行時間維度上的融合,可以支援分類、檢測、跟蹤、識別等任務。
從晶片架構來講,一個比較創新的思考方式是彈性的Tensor Core。把影像所需要的一些操作(卷積、池化等)進行硬體化,同時有很多片上記憶體,透過一個data routing bridge從SRAM中選擇這些操作所需的資料並同時儲存,把儲存跟運算作為兩個資源,透過程式設計方式靈活調動,實現更多的演算法。
這是影像所需要的一些基本操作,除了卷積以外,還包括升取樣,降取樣等操作。
第一代晶片在2017年流片,目前已經生產出來了,它支援單路高畫質影片進行30幀的物體檢測、跟蹤和識別。第二代晶片支援6~8路的物體檢測識別,包括畫素級的分割和識別。
這就是我們在2017年12月份釋出的產品,包括兩個系列,一個是面向自動駕駛,叫做“征程系列晶片(Journey)”;一個是面向智慧攝像頭的,叫做“旭日晶片(Sunrise)”。它們可以實現1路影片檢測,同時處理200個物體,並且功耗很低,可以實現物體級別的檢測識別。
這是我們能夠實現的一些功能,包括大範圍的非常密集的場景下的人臉識別(先抓拍,再識別人臉屬性),在本地可以做到一萬人左右的識別,我們已經有了樣機,大家可以體驗。也包含影片結構化的應用,在複雜的交通環境下,檢測機動車、非機動車、行人,區別屬性、車牌,這也是非常實用的功能,如果把這些功能應用到攝像頭中可以節省很多頻寬和成本。
這是第二代晶片架構,能達到畫素級別的識別,這是今年在拉斯維加斯的車上實測的結果,另外一個是在舊金山實時執行的結果,包括物體分割和檢測。
總結一下,在未來10-20年AI功能將無處不在,AI晶片將是非常必要的基礎設施,只有晶片成功才能讓AI演算法真正在生活中得到大規模應用。我們相信我們公司會堅定地致力於“演算法+晶片”,把演算法和晶片兩者結合,做一些創新的、有趣的工作,把AI演算法真正推向大家的生活中去,謝謝大家