您的位置:首頁>科技>正文

深度學習引擎的終極形態是什麼?

本文轉自OneFlow, 主要內容是老師木在微軟研究院的演講, 感謝老師木與OneFlow。

老師木于2018年1月17日回到微軟亞洲研究院分享深度學習框架方面的技術進展, 做了題為《打造最強深度學習引擎》的報告。 此次報告和GIAC 上所做《深度學習平臺技術演進》和AICon上所做《深度學習框架技術剖析》相比增加了一些新的見解, 小編對新增內容做簡要注解以饗讀者。

摘要:在這篇文章中讓我們打一起開腦洞想像一個最理想的深度學習引擎應該是什麼樣子的, 或者說深度學習引擎的終極形態是什麼, 看看這會給深度學習框架和AI專用晶片研發帶來什麼啟發。

注:講者認為此次報告的精華在第一部分和第五部分。 其中第二部分和第三部分在GIAC (全球互聯網架構大會)和AICon(全球人工智慧技術大會) 上做過分享, 本文僅對新增內容做注解, 對第二部分和第三部分感興趣的讀者可以去本公眾號查看歷史文章。

注:以大家耳熟能詳的卷積神經網路CNN 為例, 可以感覺一下目前訓練深度學習模型需要多少計算力。 這張表列出了常見CNN模型處理一張圖片需要的記憶體容量和浮點計算次數, 譬如VGG-16網路處理一張圖片就需要16Gflops。 值得注意的是, 基於ImageNet資料集訓練CNN, 資料集一共大約120萬張圖片, 訓練演算法需要對這個資料集掃描100遍(epoch), 這意味著10^18次浮點計算, 即1exaFlops。 簡單演算一下可發現, 基於一個主頻為2.0GHz的CPU core來訓練這樣的模型需要好幾年的時間。

注:上圖列了幾種最常使用的計算設備, CPU, GPU, TPU等。 眾所周知, 現在GPU是深度學習領域應用最廣的計算設備, TPU 據說比GPU 更加強大, 不過目前只有Google 可以用。 我們可以討論下為什麼CPU < GPU < TPU, 以及存不存在比TPU更加強大的硬體設備。 主頻為2GHz的單核CPU 只能串列執行指令, 1秒可以執行數千萬到數億次操作。 隨著摩爾定律終結, 人們通過在一個CPU上集成更多的核心來提高計算力,

譬如一個CPU上集成20個計算核心(所謂多核, muti-core)可以把CPU計算能力提高幾十倍。 GPU 比多核更進一步, 採用眾核(many-core), 在一個晶片上集成數千計算核心(core), 儘管每個核心的主頻要比CPU核心主頻低(通常不到1GHz), 並行度還是提升了百倍, 而且訪存頻寬要比CPU高10倍以上, 因此做稠密計算的吞吐率可以達到CPU的10倍乃至100倍。 GPU 被詬病的一點是功耗太高, 為解決這個問題, TPU 這樣的專用AI晶片橫空出世, 專用晶片可以在相同的面積裡集成更多深度學習需要的運算單元, 甚至用專用電路實現某些特定運算使得完成同樣計算需要的時間更短 (TPU 揭秘參見 https://cloud.google.com/blog/big-data/2017/05/an-in-depth-look-at-googles-first-tensor-processing-unit-tpu)。 有比TPU更快的專用晶片嗎? 肯定有, 極端情況下, 任給一個神經網路, 都不計成本去專門實現一款晶片,一定比TPU這種用來支援最廣泛神經網路類型的晶片要效率高得多。

注:專用硬體比通用硬體(如CPU,GPU)快,有多種原因,主要包括:(1)通用晶片一般經歷“取指-解碼-執行”(甚至包括“取資料”)的步驟才能完成一次運算,專用硬體大大減小了“取指-解碼”等開銷,資料到達即執行;(2)專用硬體控制電路複雜度低,可以在相同的面積下集成更多對運算有用的器件,可以在一個時鐘週期內完成通用硬體需要數千上萬個時鐘週期才能完成的操作;(3)專用硬體和通用硬體內都支援流水線並行,硬體利用率高;(4)專用硬體片內頻寬高,大部分數據在片內傳輸。顯然,如果不考慮物理現實,不管什麼神經網路,不管問題的規模有多大,都實現一套專用硬體是效率最高的做法。問題是,這行得通嗎?

注:如果對任何一個神經網路都實現一套專用硬體,運行效率最高,可是開發效率不高,需求一變更(神經網路拓撲結構,層數,神經元個數),就需要重新設計電路,而硬體研發週期臭名昭著的長。這讓人聯想起馮諾依曼發明“存儲程式”電腦之前的電子電腦(上圖即第一台電子電腦ENIAC 的照片),電腦的功能通過硬連線(hard-wired)電路實現,要改變電腦的功能就需要重新組織器件間的連線,這種“程式設計”方式又慢又難以調試。

注:剛才設想的無限大的專用硬體顯然面臨幾個現實問題:(1)晶片不可能無限大,必須考慮硬體製造工藝的限制(散熱,時鐘信號傳播範圍等);(2)硬連線的電路靈活性太差,改變功能需要重新連線;(3)改變連線後,流水線調度機制可能要做相應調整,才能最大化硬體利用率。因此,我們設想的“不計成本的”,“無限大的”專用硬體面臨了嚴峻挑戰,如何克服呢?

注:現實中,不管是通用硬體(如GPU)還是專用硬體(如TPU) 都可以通過高速互聯技術連接在一起,通過軟體協調多個設備來完成大規模計算。使用最先進的互聯技術,設備和設備之間傳輸頻寬可以達到100Gbps或者更多,這比設備內部頻寬低上一兩個數量級,不過幸好,如果軟體“調配得當”,在這個頻寬條件下也可能使得硬體計算飽和。當然,“調配得當”技術挑戰極大,事實上,單個設備速度越快,越難把多個設備“調配得當”。

注:當前深度學習普遍採用隨機梯度下降演算法(SGD),一般一個GPU處理一小塊兒資料只需要100毫秒的時間,那麼問題的關鍵就成了,“調配”演算法能否在100毫秒的時間內為GPU處理下一塊資料做好準備,如果可以的話,那麼GPU就會一直保持在運算狀態,如果不可以,那麼GPU就要間歇性的停頓,意味著設備利用率降低。理論上是可以的,有個叫運算強度(Arithmetic intensity)的概念,即flops per byte,表示一個位元組的資料上發生的運算量,只要這個運算量足夠大,意味著傳輸一個位元組可以消耗足夠多的計算量,那麼即使設備間傳輸頻寬低於設備內部頻寬,也有可能使得設備處於滿負荷狀態。進一步,如果採用比GPU更快的設備,那麼處理一塊兒資料的時間就比100毫秒更低,譬如10毫秒,在給定的頻寬條件下,“調配”演算法能用10毫秒的時間為下一次計算做好準備嗎?事實上,即使是使用不那麼快(相對於TPU 等專用晶片)的GPU,當前主流的深度學習框架在某些場景(譬如模型並行)已經力不從心了。

注:一個通用的深度學習軟體框架要能對任何給定的神經網路和可用資源都能最高效的“調配”硬體,這需要解決三個核心問題:(1)資源配置,包括計算核心,記憶體,傳輸頻寬三種資源的分配,需要綜合考慮局部性和負載均衡的問題;(2)生成正確的資料路由(相當於前文想像的專用硬體之間的連線問題);(3)高效的運行機制,完美協調資料搬運和計算,硬體利用率最高。事實上,這三個問題都很挑戰,本文暫不討論其解法,假設我們能夠解決這些問題的話,會有什麼好處呢?

注:假設我們能解決前述的三個軟體上的難題,那就能“魚與熊掌兼得”:軟體發揮靈活性,硬體發揮高效率,任給一個深度學習任務,使用者不需要重新連線,就能享受那種“無限大專用硬體”的性能,何其美好。更令人激動的是,當這種軟體得以實現時,專用硬體可以比現在所有AI晶片都更簡單更高效。讀者可以先想像一下怎麼實現這種美好的前景。近期,我們也會在公眾號陸續分享一些OneFlow的設計思想,看我們是不是想到一塊兒去了。

注:讓我們重申一下幾個觀點:(1)軟體真的非常關鍵;(2)我們對宏觀層次(設備和設備之間)的優化更感興趣;(3)深度學習框架存在一個理想的實現,正如柏拉圖心中那個最圓的圓,當然現有的深度學習框架還相距甚遠;(4)各行各業的公司,只要有資料驅動的業務,最終都需要一個自己的“大腦”,這種“大腦”不應該只被少數巨頭公司獨享。

本文內容比較天馬行空,歡迎讀者踴躍留言交流!

都不計成本去專門實現一款晶片,一定比TPU這種用來支援最廣泛神經網路類型的晶片要效率高得多。

注:專用硬體比通用硬體(如CPU,GPU)快,有多種原因,主要包括:(1)通用晶片一般經歷“取指-解碼-執行”(甚至包括“取資料”)的步驟才能完成一次運算,專用硬體大大減小了“取指-解碼”等開銷,資料到達即執行;(2)專用硬體控制電路複雜度低,可以在相同的面積下集成更多對運算有用的器件,可以在一個時鐘週期內完成通用硬體需要數千上萬個時鐘週期才能完成的操作;(3)專用硬體和通用硬體內都支援流水線並行,硬體利用率高;(4)專用硬體片內頻寬高,大部分數據在片內傳輸。顯然,如果不考慮物理現實,不管什麼神經網路,不管問題的規模有多大,都實現一套專用硬體是效率最高的做法。問題是,這行得通嗎?

注:如果對任何一個神經網路都實現一套專用硬體,運行效率最高,可是開發效率不高,需求一變更(神經網路拓撲結構,層數,神經元個數),就需要重新設計電路,而硬體研發週期臭名昭著的長。這讓人聯想起馮諾依曼發明“存儲程式”電腦之前的電子電腦(上圖即第一台電子電腦ENIAC 的照片),電腦的功能通過硬連線(hard-wired)電路實現,要改變電腦的功能就需要重新組織器件間的連線,這種“程式設計”方式又慢又難以調試。

注:剛才設想的無限大的專用硬體顯然面臨幾個現實問題:(1)晶片不可能無限大,必須考慮硬體製造工藝的限制(散熱,時鐘信號傳播範圍等);(2)硬連線的電路靈活性太差,改變功能需要重新連線;(3)改變連線後,流水線調度機制可能要做相應調整,才能最大化硬體利用率。因此,我們設想的“不計成本的”,“無限大的”專用硬體面臨了嚴峻挑戰,如何克服呢?

注:現實中,不管是通用硬體(如GPU)還是專用硬體(如TPU) 都可以通過高速互聯技術連接在一起,通過軟體協調多個設備來完成大規模計算。使用最先進的互聯技術,設備和設備之間傳輸頻寬可以達到100Gbps或者更多,這比設備內部頻寬低上一兩個數量級,不過幸好,如果軟體“調配得當”,在這個頻寬條件下也可能使得硬體計算飽和。當然,“調配得當”技術挑戰極大,事實上,單個設備速度越快,越難把多個設備“調配得當”。

注:當前深度學習普遍採用隨機梯度下降演算法(SGD),一般一個GPU處理一小塊兒資料只需要100毫秒的時間,那麼問題的關鍵就成了,“調配”演算法能否在100毫秒的時間內為GPU處理下一塊資料做好準備,如果可以的話,那麼GPU就會一直保持在運算狀態,如果不可以,那麼GPU就要間歇性的停頓,意味著設備利用率降低。理論上是可以的,有個叫運算強度(Arithmetic intensity)的概念,即flops per byte,表示一個位元組的資料上發生的運算量,只要這個運算量足夠大,意味著傳輸一個位元組可以消耗足夠多的計算量,那麼即使設備間傳輸頻寬低於設備內部頻寬,也有可能使得設備處於滿負荷狀態。進一步,如果採用比GPU更快的設備,那麼處理一塊兒資料的時間就比100毫秒更低,譬如10毫秒,在給定的頻寬條件下,“調配”演算法能用10毫秒的時間為下一次計算做好準備嗎?事實上,即使是使用不那麼快(相對於TPU 等專用晶片)的GPU,當前主流的深度學習框架在某些場景(譬如模型並行)已經力不從心了。

注:一個通用的深度學習軟體框架要能對任何給定的神經網路和可用資源都能最高效的“調配”硬體,這需要解決三個核心問題:(1)資源配置,包括計算核心,記憶體,傳輸頻寬三種資源的分配,需要綜合考慮局部性和負載均衡的問題;(2)生成正確的資料路由(相當於前文想像的專用硬體之間的連線問題);(3)高效的運行機制,完美協調資料搬運和計算,硬體利用率最高。事實上,這三個問題都很挑戰,本文暫不討論其解法,假設我們能夠解決這些問題的話,會有什麼好處呢?

注:假設我們能解決前述的三個軟體上的難題,那就能“魚與熊掌兼得”:軟體發揮靈活性,硬體發揮高效率,任給一個深度學習任務,使用者不需要重新連線,就能享受那種“無限大專用硬體”的性能,何其美好。更令人激動的是,當這種軟體得以實現時,專用硬體可以比現在所有AI晶片都更簡單更高效。讀者可以先想像一下怎麼實現這種美好的前景。近期,我們也會在公眾號陸續分享一些OneFlow的設計思想,看我們是不是想到一塊兒去了。

注:讓我們重申一下幾個觀點:(1)軟體真的非常關鍵;(2)我們對宏觀層次(設備和設備之間)的優化更感興趣;(3)深度學習框架存在一個理想的實現,正如柏拉圖心中那個最圓的圓,當然現有的深度學習框架還相距甚遠;(4)各行各業的公司,只要有資料驅動的業務,最終都需要一個自己的“大腦”,這種“大腦”不應該只被少數巨頭公司獨享。

本文內容比較天馬行空,歡迎讀者踴躍留言交流!

Next Article
喜欢就按个赞吧!!!
点击关闭提示