0
本文作者: 奕欣 | 2017-05-25 10:47 | 專題:雷峰網(wǎng)公開課 |
基于神經(jīng)網(wǎng)絡(luò)的人工智能近年取得了突破性進(jìn)展,正在深刻改變?nèi)祟惖纳a(chǎn)和生活方式,是世界各國(guó)爭(zhēng)相發(fā)展的戰(zhàn)略制高點(diǎn)。
神經(jīng)網(wǎng)絡(luò)作為實(shí)現(xiàn)人工智能任務(wù)的有效算法之一,已經(jīng)在各種應(yīng)用場(chǎng)景獲得廣泛的應(yīng)用。從云端到移動(dòng)端,不同應(yīng)用場(chǎng)景也對(duì)神經(jīng)網(wǎng)絡(luò)的計(jì)算能力提出了不同的需求。
神經(jīng)網(wǎng)絡(luò)的廣泛應(yīng)用離不開核心計(jì)算芯片。目前的主流通用計(jì)算平臺(tái)包括CPU和GPU,存在著能效較低的問題(能效即能量效率,是性能與功耗的比值)。為了獲得更高的能效,我們需要設(shè)計(jì)一種專用的神經(jīng)網(wǎng)絡(luò)計(jì)算芯片來滿足要求。國(guó)際IT巨頭,如英特爾、谷歌、IBM,都在競(jìng)相研發(fā)神經(jīng)網(wǎng)絡(luò)計(jì)算芯片。
然而,神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)多樣、數(shù)據(jù)量大、計(jì)算量大的特點(diǎn),給硬件設(shè)計(jì)帶來了巨大挑戰(zhàn)。因此,在設(shè)計(jì)面向神經(jīng)網(wǎng)絡(luò)的高性能、高能效硬件架構(gòu)時(shí),我們需要思考清楚以下三個(gè)問題:
好的計(jì)算模式應(yīng)該是怎樣的?
為了支持這樣的計(jì)算模式,架構(gòu)應(yīng)該怎樣設(shè)計(jì)?
已經(jīng)實(shí)現(xiàn)的硬件架構(gòu),針對(duì)具體算法和應(yīng)用需求,如何配置成最優(yōu)的計(jì)算模式?
雷鋒網(wǎng)本期公開課特邀請(qǐng)到清華大學(xué)微納電子系四年級(jí)博士生涂鋒斌,為我們分享神經(jīng)網(wǎng)絡(luò)硬件架構(gòu)的設(shè)計(jì)經(jīng)驗(yàn)。他將通過介紹其設(shè)計(jì)的可重構(gòu)神經(jīng)網(wǎng)絡(luò)計(jì)算架構(gòu) DNA (Deep Neural Architecture),與大家分享在設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)硬件架構(gòu)時(shí)需要思考的問題。他在完成設(shè)計(jì)的同時(shí),解決了這些問題,并對(duì)現(xiàn)有的硬件優(yōu)化技術(shù)做出了總結(jié)。
本文根據(jù)雷鋒網(wǎng)硬創(chuàng)公開課演講原文整理,并邀請(qǐng)了涂鋒斌進(jìn)行確認(rèn),在此感謝。由于全文篇幅過長(zhǎng),分(上)(下)兩部分,敬請(qǐng)期待。
公開課視頻:
各位觀眾晚上好,我是來自清華大學(xué)的涂鋒斌,今天非常榮幸收到雷鋒網(wǎng) AI 科技評(píng)論的邀請(qǐng),在此給大家做一節(jié)硬創(chuàng)公開課,主題是《設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)硬件架構(gòu)時(shí),我們?cè)谒伎际裁矗俊?/p>
首先做一個(gè)自我介紹。我是清華大學(xué)微納電子系的博士生涂鋒斌,今年直博四年級(jí),我的導(dǎo)師是魏少軍教授和尹首一副教授,博士課題是高能效神經(jīng)網(wǎng)絡(luò)加速芯片設(shè)計(jì),研究興趣包括深度學(xué)習(xí),計(jì)算機(jī)體結(jié)構(gòu)及集成電路設(shè)計(jì)。
我作為核心架構(gòu)設(shè)計(jì)者,完成了可重構(gòu)神經(jīng)計(jì)算芯片 Thinker 的設(shè)計(jì)。該芯片作為清華大學(xué)代表性成果,參加了 2016 年全國(guó)雙創(chuàng)成果展,獲得李克強(qiáng)總理的高度贊許。相關(guān)研究成果已經(jīng)發(fā)表數(shù)篇國(guó)際頂級(jí)會(huì)議和權(quán)威期刊論文。
本次公開課將從以下五個(gè)方面展開。
研究背景
我將介紹神經(jīng)網(wǎng)絡(luò)的一些背景知識(shí)及特點(diǎn),它們給硬件設(shè)計(jì)帶來哪些挑戰(zhàn)?
計(jì)算模式
從算法和調(diào)度的角度分析神經(jīng)網(wǎng)絡(luò)需要怎樣的計(jì)算模式;而基于優(yōu)化的計(jì)算模式,我們需要怎樣的架構(gòu)支持神經(jīng)網(wǎng)絡(luò)的計(jì)算?
架構(gòu)設(shè)計(jì)
針對(duì)計(jì)算模式的需求,如何設(shè)計(jì)高性能、高能效的神經(jīng)網(wǎng)絡(luò)計(jì)算架構(gòu)?可重構(gòu)神經(jīng)網(wǎng)絡(luò)計(jì)算架構(gòu) DNA(Deep Neural Architecture)具有哪些特點(diǎn)?
實(shí)驗(yàn)結(jié)果
DNA 的性能與能效表現(xiàn)如何?與頂尖工作相比的情況如何?
總結(jié)思考
針對(duì)神經(jīng)網(wǎng)絡(luò)硬件架構(gòu)的設(shè)計(jì)展開一些思考和討論。
在經(jīng)過前面的學(xué)術(shù)風(fēng)暴后,我將打開攝像頭與大家互動(dòng),進(jìn)入提問環(huán)節(jié)。
隨著人工智能時(shí)代的到來,圖像識(shí)別、語音識(shí)別、自然語言處理等智能任務(wù)在生活中無處不在。而神經(jīng)網(wǎng)絡(luò)作為當(dāng)前實(shí)現(xiàn)這類智能任務(wù)最有效的算法之一,已經(jīng)獲得廣泛的應(yīng)用。
比方說:
百度圖片搜索;
微軟語音識(shí)別;
谷歌在線翻譯;
……
可以說,神經(jīng)網(wǎng)絡(luò)在我們的生活中真是無處不在。
那么什么是神經(jīng)網(wǎng)絡(luò)?我們不妨從神經(jīng)元開始理解。如圖所示,這是一個(gè)生物上的神經(jīng)元。它由樹突、細(xì)胞體、軸突和神經(jīng)末梢這四個(gè)部分構(gòu)成。
1. 通過樹突接受輸入信號(hào);
2. 在細(xì)胞體內(nèi)進(jìn)行信號(hào)處理;
3. 通過軸突和神經(jīng)末梢把輸出信號(hào)傳至其它神經(jīng)元;
4. 而大量的神經(jīng)元就構(gòu)成了我們的神經(jīng)系統(tǒng)。
而這就啟發(fā)了人工神經(jīng)元模型的誕生。我們可以看到,它的示意圖其實(shí)與神經(jīng)元是十分相似的。它仍然由左邊的多個(gè)輸入,經(jīng)過加權(quán)求和與非線性運(yùn)算得到輸出。
舉個(gè)簡(jiǎn)單的例子。在空間中有紅色和藍(lán)色兩類點(diǎn)。用簡(jiǎn)單的神經(jīng)元,我們可以在空間中做一套曲面,將這兩類點(diǎn)分開。這就是一個(gè)非常簡(jiǎn)單的分類問題。神經(jīng)網(wǎng)絡(luò)/神經(jīng)元非常擅長(zhǎng)用于做分類問題。
那么,當(dāng)我們有很多神經(jīng)元后,我們可以得到一個(gè)神經(jīng)網(wǎng)絡(luò),它又能用來做什么?
這幅圖給出了一個(gè)非常簡(jiǎn)單的典型單層神經(jīng)網(wǎng)絡(luò)。其中的每一個(gè)圓圈代表一個(gè)神經(jīng)元,它們相互連接,就構(gòu)成了一個(gè)神經(jīng)網(wǎng)絡(luò)。一個(gè)相對(duì)復(fù)雜的結(jié)構(gòu)可以做些什么?
如圖所示,空間中仍然有紅藍(lán)兩種顏色的點(diǎn),我們采用了相對(duì)復(fù)雜的神經(jīng)網(wǎng)絡(luò),可以在空間中畫一條分類的曲面,我們可以看到,問題比剛才的問題難度更大,圖中的這條粉色線勾勒出的這條曲面,才能對(duì)復(fù)雜問題進(jìn)行分類。
在 2012 年,神經(jīng)網(wǎng)絡(luò) AlexNet 在 ImageNet 圖像分類競(jìng)賽上取得突破,獲得了 85% 的準(zhǔn)確率,相較于之前最好的識(shí)別率提升了 10% 以上。這是一個(gè)非常大的突破,在當(dāng)時(shí)引起了非常廣泛的關(guān)注。而現(xiàn)在,每年舉辦的 ImageNet 的識(shí)別精確度已經(jīng)超過了 95%,已經(jīng)超過人類識(shí)別圖片的能力。這是一個(gè)非常驚人的結(jié)果。直至今年,每年拔得頭籌的團(tuán)隊(duì)都是采用神經(jīng)網(wǎng)絡(luò)。
AlexNet 是一個(gè)非常典型的、被大家廣泛研究的神經(jīng)網(wǎng)絡(luò),因?yàn)樗膶哟魏苌?,共?8 個(gè)層次,人們也稱之為深度神經(jīng)網(wǎng)絡(luò),而基于深度神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)算法,我們也給它取了一個(gè)非常好聽的名字叫「深度學(xué)習(xí)」。大家經(jīng)常會(huì)在媒體上聽到詞,其實(shí)它的本質(zhì)依然是神經(jīng)網(wǎng)絡(luò)。
而正是因?yàn)樯窠?jīng)網(wǎng)絡(luò)如此強(qiáng)大的能力,目前廣泛地應(yīng)用于各種應(yīng)用場(chǎng)景,例如:
云端:公司會(huì)架設(shè)一些服務(wù)器來提供人工智能的服務(wù);
移動(dòng)端:無論是智能手機(jī)、智能汽車、無人機(jī)或是機(jī)器人,都會(huì)運(yùn)用神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)圖像識(shí)別、物體跟蹤和語音識(shí)別的智能任務(wù)。
而不同應(yīng)用場(chǎng)景對(duì)神經(jīng)網(wǎng)絡(luò)也提出了不一樣的計(jì)算需求,比如:
在數(shù)據(jù)中心,大家非常關(guān)注計(jì)算的性能和并行度,對(duì)功耗的需求并不大,當(dāng)然,功耗自然是越低越好;
而在無人機(jī)的應(yīng)用場(chǎng)景下,大家會(huì)關(guān)注在滿足最基本的識(shí)別或智能需求,保證性能的前提下,盡可能地降低功耗。因?yàn)樵谝苿?dòng)端,電池容量非常有限,對(duì)低功耗自然有著很強(qiáng)的需求。
然而,現(xiàn)有通用計(jì)算平臺(tái)(CPU、GPU)具有一些不足。
以 CPU 為例,它的性能差,能效低。能效是能量效率的簡(jiǎn)稱,是性能與功耗的比值。我們通常用 GOPS/W (千兆操作數(shù)每秒每瓦) 的單位來描述能效,它是一個(gè)非常好地衡量計(jì)算效率的指標(biāo)。
我們這里討論的能效是考慮了片外存儲(chǔ)的系統(tǒng)級(jí)能效。后面提及的能效也是指的同一概念。
我們?cè)诜?wù)器上做了一個(gè)實(shí)驗(yàn),在 CPU 上計(jì)算 AlexNet 需要 254.5 ms,相當(dāng)于處理 4-5 張圖片,而功耗需要 80 W,總能效為 0.2 GOPS/W。而同樣的情況在 GPU 上計(jì)算,總能效為 1.7 GOPS/W,我們希望能效能達(dá)到 100 GOPS/W 甚至更高。
但是,神經(jīng)網(wǎng)絡(luò)的三大特點(diǎn)給硬件加速帶來巨大挑戰(zhàn)。
挑戰(zhàn)一:不同網(wǎng)絡(luò)的層次不同
我們列舉了四個(gè)非常經(jīng)典的神經(jīng)網(wǎng)絡(luò),分別是 AlexNet(11 層)、VGG(19 層)、GoogLeNet(22 層)與 ResNet(152 層),我們可以看到,因?yàn)樽R(shí)別精度的不同,我們往往會(huì)設(shè)計(jì)更深更復(fù)雜的神經(jīng)網(wǎng)絡(luò),會(huì)導(dǎo)致網(wǎng)絡(luò)層次變多,給硬件加速帶來很大挑戰(zhàn)。
同樣以 AlexNet 為例子,神經(jīng)網(wǎng)絡(luò)由三種主要層類型組成,包括卷積層(CONV)、池化層(POOL)與全連接層(FC)。圖中紅框部分即為卷積層,而藍(lán)框部分屬于池化層,綠框部分為全連接層。每一層的計(jì)算都有些許不同。
挑戰(zhàn)三:不同層的參數(shù)多樣,數(shù)據(jù)量、計(jì)算量大
以 AlexNet 為例,最左列呈現(xiàn)了所有層的類型和名字,后面的一系列參數(shù)表示它的核尺寸、步長(zhǎng)、輸入輸出圖尺寸等。因?yàn)閰?shù)不同,它們的數(shù)據(jù)量與計(jì)算量都不同,且非常大。
在卷積層上,它的計(jì)算量非常大;而全連接層中,計(jì)算量相比卷積層稍小,但數(shù)據(jù)量尤其是權(quán)重量則非常大。
這三大特點(diǎn)仍然使硬件加速的實(shí)現(xiàn)帶來一些挑戰(zhàn)。
1. 不同網(wǎng)絡(luò)的層數(shù)、參數(shù)不同——計(jì)算的靈活性比較高
2. 不同層的類型不同,參數(shù)多樣——計(jì)算復(fù)雜度高---降低硬件的性能
3. 數(shù)據(jù)量、計(jì)算量大——提高功耗
總體而言,我們需要一個(gè)靈活高效的硬件架構(gòu)支持我們的神經(jīng)網(wǎng)絡(luò)。
這樣一來,我們的設(shè)計(jì)目標(biāo)就確定了,即設(shè)計(jì)一個(gè)面向神經(jīng)網(wǎng)絡(luò)的高能效計(jì)算架構(gòu),它需要具備以下三個(gè)特點(diǎn):
首先它要靈活支持不同網(wǎng)絡(luò);
其次要兼顧性能與能效;
再者,在針對(duì)不同的應(yīng)用場(chǎng)景,我們得以進(jìn)一步優(yōu)化性能或能效,即選擇進(jìn)一步偏向性能優(yōu)先的實(shí)現(xiàn),或是偏向能效優(yōu)先的實(shí)現(xiàn)。
在本次公開課里面,我們會(huì)以我實(shí)現(xiàn)的一個(gè)計(jì)算架構(gòu)為設(shè)計(jì)實(shí)例,展開我的一些討論和思考。
設(shè)計(jì)實(shí)例是一款面向卷積神經(jīng)網(wǎng)絡(luò)(CNN)的計(jì)算架構(gòu),架構(gòu)的代號(hào)叫做「DNA」,它主要具有三大特點(diǎn):
特點(diǎn)一:可重復(fù)的數(shù)據(jù)傳輸通路
可以支持混合的數(shù)據(jù)服務(wù)模式來提高能效。
特點(diǎn)二:可重構(gòu)計(jì)算引擎
可以支持高效的映射方法,同時(shí)兼顧靈活性和性能。
特點(diǎn)三:具有調(diào)度框架
可以重復(fù) DNA 的架構(gòu)的計(jì)算資源來優(yōu)化性能,或者能效,或者說二者同時(shí)優(yōu)化。
這就是這款架構(gòu)的三大特點(diǎn)。
在展開我們的討論之前,也是我們?cè)谠O(shè)計(jì)這款架構(gòu)之前一直在思考的三個(gè)問題。要設(shè)計(jì)好一個(gè)架構(gòu)必須解決這三大問題:
問題一:對(duì)于神經(jīng)網(wǎng)絡(luò)來說,一個(gè)好的計(jì)算模式究竟是怎么樣的?
問題二:為了支持的一個(gè)計(jì)算模式,我們的硬件架構(gòu)需要怎樣去設(shè)計(jì)?
問題三:當(dāng)我們已經(jīng)實(shí)現(xiàn)了一款硬件架構(gòu),在針對(duì)具體的算法應(yīng)用的需求時(shí),我們?nèi)绾螌?duì)架構(gòu)進(jìn)行配置,使其配置成一個(gè)最優(yōu)的計(jì)算模式,滿足我們的計(jì)算需求?
我們總結(jié)的設(shè)計(jì)理念,也是我們?cè)谝恢必瀼赜谠O(shè)計(jì)過程當(dāng)中的一個(gè)理念:我們認(rèn)為計(jì)算模式與架構(gòu)的設(shè)計(jì)是相輔相成的;在設(shè)計(jì)計(jì)算模式的過程中,實(shí)際上也是在設(shè)計(jì)硬件架構(gòu),二者是不能完全分開的。
剛剛講完了研究的一些背景,還有我們一些基礎(chǔ)的思考,那么現(xiàn)在,我們會(huì)從算法和調(diào)度的角度,從算法的硬件用計(jì)算模式的角度來進(jìn)行分析和優(yōu)化,來看看怎樣才是一個(gè)好的計(jì)算模式。
首先我們要先明確一下我們的研究對(duì)象。
在本次公開課里面,我們主要以卷積層的計(jì)算為主要的研究對(duì)象。有兩大原因:
卷積層的計(jì)算占到總計(jì)算量的 90% 以上,因此優(yōu)化卷積層本身是很有必要的。
其他層的計(jì)算剛剛提到的池化層和全連接層,它們的計(jì)算模式與卷積層是非常類似的,因此我們對(duì)卷積層的優(yōu)化方可以很容易地遷移到其它層的計(jì)算上。
我們?cè)敿?xì)地來看看卷積層計(jì)算。如圖所示,是一個(gè)卷積層的計(jì)算示意圖,它的輸入是一個(gè) 3D 的特征圖(Input Map),經(jīng)過一個(gè) 3D 的卷積核(kernel)的掃描,在對(duì)應(yīng)點(diǎn)做一些運(yùn)算后,就會(huì)得到一張輸出的 Output Map。我們可以看到,3D 的輸入特征圖,它總共有 N 個(gè) channel,也就是 N 張?zhí)卣鲌D。
我們總共有 M 個(gè) kernel,經(jīng)過輸入特征圖進(jìn)行計(jì)算之后就可以得到 M 張,或者說有 M 個(gè) channel 的 Output Map,就是卷積層的計(jì)算。
我們?cè)龠M(jìn)一步看下卷積運(yùn)算又是怎么一回事。
剛剛講到的卷積核(kernel)會(huì)在左邊 5×5 的 Input Map 上進(jìn)行掃描,黃色的方框是一個(gè) 3×3 的卷積核。我們可以看到,每一個(gè)黃色小框的右下角會(huì)有一個(gè)權(quán)重分析,也就是具體的權(quán)重值。卷積核進(jìn)行掃描的每個(gè)位置都會(huì)進(jìn)行神經(jīng)元的計(jì)算,并得到右邊 3×3 的 Output Map 上的每一個(gè)點(diǎn)。可以看到,隨著卷積核在 Input Map 的掃描,就可以得到 Output Map 上的每一個(gè)點(diǎn),而具體的神經(jīng)元計(jì)算其實(shí)和我們之前提及的人工神經(jīng)元模型計(jì)算是完全一致的,這就是一個(gè)卷積運(yùn)算的過程。
在講完研究對(duì)象之后,我們還要再講一下架構(gòu)模型。
如圖所示,這是我們歸納出來的一個(gè)神經(jīng)網(wǎng)絡(luò)的硬件架構(gòu)模型,它主要由片上和片外兩部分構(gòu)成。
左邊的大矩形就是我們要設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò)硬件架構(gòu),而右邊架構(gòu)的外部有一個(gè)主處理器和一個(gè)片外存儲(chǔ)叫做 Off-Chip DRAM,這兩個(gè)東西是掛載在芯片外部的,而我們主要設(shè)計(jì)的,就是左邊大矩形內(nèi)部的結(jié)構(gòu)。
在架構(gòu)里面有一個(gè)核心控制器 controller,然后片上通常會(huì)有三塊 buffer,即 Input Buffer、Output Buffer 及 Weight Buffer,分別存儲(chǔ)神經(jīng)網(wǎng)絡(luò)的輸入數(shù)據(jù)、輸出數(shù)據(jù)和權(quán)重。而中間的黃色部分為 Computing Core 也就是計(jì)算核心。
在核心的內(nèi)部會(huì)有一些計(jì)算器,比如 Input REGs 與 Output REGs(輸入輸出寄存器),而最最核心的計(jì)算單元就是這里的「CE」它的全稱叫做 convolution engine,即卷積引擎或者說計(jì)算引擎。輸入的數(shù)據(jù)會(huì)經(jīng)過局部的計(jì)算器傳輸?shù)接?jì)算引擎上,而計(jì)算機(jī)內(nèi)部再繼續(xù)剖開,就是一個(gè)一個(gè)的計(jì)算單元,我們稱之為 PE,英文叫做 processing element(處理單元),做的是最基本的運(yùn)算。
神經(jīng)網(wǎng)絡(luò)內(nèi)部最基本的運(yùn)算是乘加運(yùn)算,這就是我們最基礎(chǔ)的一個(gè)硬件架構(gòu)模型,后面我們的所有討論都會(huì)基于的一個(gè)模型來展開。
在講完了我們的硬件架構(gòu)模型以及研究對(duì)象以后,我們還要再講一講優(yōu)化目標(biāo)。剛剛也提到了兩個(gè)優(yōu)化目標(biāo),一個(gè)是能效(energy efficiency),另一個(gè)是性能。
剛剛我們也提過,能效的單位是 GOPS/W,表示的是每單位的功耗可以獲得怎樣的性能,它表征的是一個(gè)計(jì)算效率的問題。
在公開課里面,我會(huì)盡量少用公式做過多的討論,為了方便大家理解,我經(jīng)常會(huì)用一些例子來解釋,但是因?yàn)檫@兩個(gè)公式非常重要,后面的討論都是基于它們,所以我必須花一點(diǎn)篇幅來解釋。
首先,energy efficiency 是性能與功耗的比值,而性能我們通常用每秒做多少操作數(shù)來衡量,即 Operation/T(操作數(shù)除以計(jì)算的總時(shí)間),而 Power 是 Energy/T (總能耗除以時(shí)間) 的一個(gè)結(jié)果,我們可以看到 T 就被約掉了。
而另外我們注意到的一點(diǎn)是,對(duì)于神經(jīng)網(wǎng)絡(luò)固定的一個(gè)算法來說,它的總操作數(shù)也是一個(gè)固定的值,所以我們首先得到一個(gè)結(jié)論:能效值與能耗值是成反比的。那么如果要優(yōu)化能效,其實(shí)我們只需要優(yōu)化能耗就好了。我們的能耗越低,那能效也會(huì)越高。因此,我們把問題轉(zhuǎn)化成了能耗問題。
我們繼續(xù)分析能耗。能耗主要由兩部分構(gòu)成。
一個(gè)是訪問存儲(chǔ)器的能耗,簡(jiǎn)稱訪存能耗,用 EnergyMA 來表示。
另一部分即計(jì)算能耗,用 EnergyCompute 來表示。
那么它們分別可以用怎樣的形式來建模?我們也分別對(duì)這兩個(gè)式子做一個(gè)細(xì)致的分析。
訪存能耗有片上的存儲(chǔ)也有片外的存儲(chǔ),另外就是 MADRAM,也就是 DRAM 的訪問次數(shù), 而 EDRAM 則是單位 DRAM 的訪問能耗。二者相乘就得到了 DRAM 的總訪問能耗,另外一部分就是訪問 buffer 的能耗。
這里的表達(dá)式與 DRAM 是類似的,也是由訪問次數(shù)乘以單位訪問能耗構(gòu)成的,而對(duì)于計(jì)算的能耗,它是由兩個(gè)因子來相乘得到的,一個(gè)是總的計(jì)算操作數(shù) Operation,另外一個(gè)就是單位操作能耗 Eoperation,
對(duì)于一個(gè)給定的 CNN 模型,它的總操作數(shù)是固定的,那么我們可以認(rèn)為總的計(jì)算能耗,在單位操作能耗不變的情況下,它也可以認(rèn)為是一個(gè)固定的值,因此,影響能耗的關(guān)鍵因素,就是說對(duì) DRAM 的訪問次數(shù)以及 buffer 的訪問次數(shù)。
我們可以看到,能效的優(yōu)化問題,其實(shí)最后就轉(zhuǎn)化為對(duì) DRAM 以及 buffer(注意 buffer 就是片上緩存)的訪問次數(shù)的優(yōu)化。如果我們的訪問次數(shù)很少的話,那么它的能耗就會(huì)比較低,能效就會(huì)比較高,此后我們就集中對(duì)這兩個(gè)關(guān)鍵因素進(jìn)行討論就可以了。
第二個(gè)優(yōu)化目標(biāo)是性能。我仍然要具體介紹一個(gè)公式。
前面我們提及性能(Performance)的單位是 GOPS,即每秒的操作數(shù),而我們定義了 Performance 的一個(gè)公式,由幾個(gè)因子相乘。
第一項(xiàng)是硬件乘加單元數(shù) MAC,我們這里定義為就是硬件上的總的乘加單元的個(gè)數(shù)或者說基本計(jì)算單元的個(gè)數(shù)。硬件有一個(gè)總的計(jì)算單元的個(gè)數(shù),相當(dāng)于是一個(gè)常量。
第二項(xiàng)是計(jì)算單元的利用率,簡(jiǎn)稱 PE Utilization,指的是在整個(gè)計(jì)算的過程當(dāng)中,硬件計(jì)算單元的實(shí)際利用率是多高;
第三項(xiàng)是計(jì)算核心的頻率(Frequency),硬件在工作的時(shí)候會(huì)有一個(gè)計(jì)算的頻率,頻率的高低會(huì)直接影響到總的性能高低。如果硬件乘加單元數(shù)越高,利用率高,計(jì)算核心頻率高,那么我的總性能肯定是越好的;而對(duì)于一個(gè)給定的一個(gè)硬件架構(gòu),影響它的性能的關(guān)鍵因素就是計(jì)算單元,在整體的計(jì)算工作過程當(dāng)中,它的利用率是高還是低,PE 越高,它的性能就會(huì)越高,這是我們的一個(gè)觀點(diǎn)。
由此,我們也同樣把性能關(guān)鍵的優(yōu)化目標(biāo)轉(zhuǎn)換成能夠具體分析甚至可以優(yōu)化的一個(gè)對(duì)象,叫做 PE Utilization,也就是我們計(jì)算資源的利用率。
我們簡(jiǎn)單總結(jié)一下,剛剛分別討論了兩個(gè)重要的優(yōu)化目標(biāo),分別是能效和性能。通過對(duì)能效和性能的表達(dá)式的分析,我們將分別從訪存次數(shù) MA 以及計(jì)算單元的利用率 PE Utilization 這兩個(gè)角度,對(duì)計(jì)算模式進(jìn)行優(yōu)化。
到此為止,我們對(duì)研究對(duì)象、目標(biāo)的架構(gòu)以及優(yōu)化目標(biāo)都做了非常細(xì)致的分析,那我們就可以展開討論了。
在設(shè)計(jì)里面,我們采用一種逐層加速的策略來針對(duì)層數(shù)不同的神經(jīng)網(wǎng)絡(luò),因?yàn)閯倓傄蔡岬剑窠?jīng)網(wǎng)絡(luò)本身的計(jì)算量非常大,特別是在現(xiàn)在網(wǎng)絡(luò)層次越來越深的情況下,基本上不太可能在硬件上直接把一個(gè)神經(jīng)網(wǎng)絡(luò)直接映射到一個(gè)硬件上去做計(jì)算,所以我們采用一種大家現(xiàn)在慣常使用的計(jì)算方法,叫做逐層加速,即一層一層的來計(jì)算神經(jīng)網(wǎng)絡(luò),最終得到輸出結(jié)果。
我們的核心方法是使用循環(huán)變換的方法來優(yōu)化其計(jì)算模式,圖中的代碼其實(shí)表示的就是一個(gè)卷積層的計(jì)算,它是由四層循環(huán)來表示的,其中 R、C、M、N 還有 K,這些參量都是和之前提到的基本卷積層計(jì)算參量是一一對(duì)應(yīng)的。
我們通過對(duì)循環(huán)進(jìn)行優(yōu)化,實(shí)際上就可以把它轉(zhuǎn)換成對(duì)神經(jīng)網(wǎng)絡(luò)特別是卷積層的計(jì)算模式優(yōu)化,并采用循環(huán)變換一個(gè)很好的方法,對(duì)計(jì)算模式進(jìn)行優(yōu)化。
那么什么叫做計(jì)算模式?我們?nèi)匀皇墙Y(jié)合之前的架構(gòu)圖來介紹。
計(jì)算模式主要由兩部分來構(gòu)成。
一部分我們稱為數(shù)據(jù)復(fù)用模式(藍(lán)色箭頭)。數(shù)據(jù)復(fù)用模式指的是,我們存儲(chǔ)在存儲(chǔ)器當(dāng)中的數(shù)據(jù)以及權(quán)重,無論是存在片外還是片內(nèi),它如何進(jìn)行數(shù)據(jù)的交互,如何進(jìn)行數(shù)據(jù)的傳輸數(shù)據(jù)。也就是說,數(shù)據(jù)服務(wù)模式主要描述的是數(shù)據(jù)傳遞的傳輸方式。
而第二個(gè)部分就是我們稱之為卷積映射方法(紅框),對(duì)于最核心的計(jì)算核心來說,數(shù)據(jù)傳遞到了計(jì)算核心內(nèi)部之后,如何進(jìn)行具體的計(jì)算映射。
二者構(gòu)成的就是數(shù)據(jù)傳輸及計(jì)算映射,或者構(gòu)成了一個(gè)整體,也就是計(jì)算模式,而我們的分析都會(huì)針對(duì)這兩個(gè)部分分別展開。
我們?cè)谶@里主要采用兩類循環(huán)變換方法。
一類叫做循環(huán)交換(Loop Interchange):
主要優(yōu)化的是數(shù)據(jù)的復(fù)用模式減少訪存次數(shù)。
第二個(gè)循環(huán)變換方法叫做循環(huán)分塊(Loop Tiling):
主要優(yōu)化的是卷積映射方法,提高計(jì)算資源的利用率。
值得注意的是,訪問次數(shù)以及計(jì)算資源利用率,就是我們剛剛提煉出來的、需要主動(dòng)優(yōu)化的兩類主要參量,它們會(huì)直接對(duì)應(yīng)到性能和能耗這兩個(gè)優(yōu)化目標(biāo)。
首先我們來講講數(shù)數(shù)據(jù)的復(fù)用模式。
在我們的工作當(dāng)中,我們提出了三類基本的數(shù)據(jù)的復(fù)用模式,分別是:輸入復(fù)用(Input Reuse,IR)、輸出復(fù)用(Output Reuse,OR)、權(quán)重復(fù)用(Weight Reuse,WR),他們分別充分地利用了輸入數(shù)據(jù)、輸出數(shù)據(jù)及權(quán)重的復(fù)用性,我們給出了三種基本復(fù)用模式的示意圖以及對(duì)應(yīng)的偽代碼,這里就不做特別細(xì)致地展開了。
需要值得一提的是,在我們領(lǐng)域的兩個(gè)頂級(jí)會(huì)議上,即 ISCA 16 以及 ISSCC 17 的 Tutorial 上均指出之前的工作都只采用一種固定的數(shù)據(jù)復(fù)用模式。我們?cè)诤竺娴姆治鰰?huì)告訴大家,采用固定的服務(wù)模式并不是一種特別好的策略。
在我們的方法里面,我們將多種數(shù)據(jù)復(fù)用模式組合在一起,按照具體的計(jì)算以及算法的需求來進(jìn)行調(diào)度,這是我們的一個(gè)核心想法。
這里會(huì)結(jié)合輸入復(fù)用(Input Reuse)來做稍微細(xì)致一點(diǎn)的分享,但不會(huì)涉及到過多的數(shù)學(xué)或者說特別細(xì)致的代碼講解。
對(duì)于輸入復(fù)用來說,我們這里有一個(gè)簡(jiǎn)單的示意圖,中間還是一個(gè)計(jì)算核心,而圍繞在旁邊的還是片上的 buffer,所謂的輸入復(fù)用表示的是,,我們讀取一部分存儲(chǔ)在 Input Buffer 里面的數(shù)據(jù),放到計(jì)算核心內(nèi)部,再對(duì)這些輸入的數(shù)據(jù)進(jìn)行充分的復(fù)用。具體來說,我們會(huì)讀入 TN 個(gè)小的 map,在核心內(nèi)部會(huì)做充分的計(jì)算,將這一層對(duì)應(yīng)的 M 個(gè) map,即所有和它相關(guān)的輸出數(shù)據(jù)都遍歷一遍,把對(duì)應(yīng)的計(jì)算都完成。在這個(gè)過程中計(jì)算核心需要與片上的 Output Buffer 進(jìn)行頻繁的交互,與此同時(shí),權(quán)重 Buffer 也需要有頻繁的訪問。但是因?yàn)樵谶^程中我對(duì)輸入數(shù)據(jù)進(jìn)行了充分的復(fù)用,所以我們?cè)谶@種模式下面對(duì)于輸入數(shù)據(jù),它僅僅需要從 Input Buffer 里面導(dǎo)入一次,導(dǎo)入到 Core 內(nèi)部就好了。
這個(gè)過程叫做輸入復(fù)用,所對(duì)應(yīng)的循環(huán)表達(dá)就是下面一個(gè)式子,不做具體的展開。我們可以看到,紅色虛線框的這部分就是核心內(nèi)部完成的計(jì)算,而輸入復(fù)用對(duì)應(yīng)的一種循環(huán)表達(dá),其實(shí)是對(duì)外部的四層循環(huán)做一個(gè)次序的調(diào)整,就是我之前提到的循環(huán)次序調(diào)換,而其中涉及到的 Tm、Tn、Tr、Tc,分別對(duì)應(yīng)的是之前提到的 M、N、R、C。我們這里稱為 Tiling 參數(shù),因?yàn)楹诵膬?nèi)部的局部存儲(chǔ)非常有限,所以我們將 Input Buffer 內(nèi)部的這些數(shù)據(jù)和權(quán)重導(dǎo)入到核心內(nèi)部的時(shí)候就要做一個(gè)分塊,也就是說我計(jì)算任務(wù)是一部分一部分來完成的,采用這樣一種方式完成整個(gè)的計(jì)算任務(wù)。而剛提到的 Output Reuse 與 Weight Reuse,它其實(shí)所改變的就是外部存儲(chǔ)循環(huán)的計(jì)算次序,也就是 Loop Interchange。
針對(duì)這樣的數(shù)據(jù)復(fù)用方式,我們會(huì)展開一些分析。
我們之前有提到,我們需要分析的是它的訪存的總能耗是怎么樣的,其中的一個(gè)關(guān)鍵因素就是訪問次數(shù)(Memory Access)如何,簡(jiǎn)稱 MA,是由這樣一個(gè)公式來得到的。
至于公式 TI、TO、TW 只是當(dāng)前層的輸入、輸出和權(quán)重的總量,TPO 表示的是當(dāng)前層的最終輸出數(shù)據(jù)總量,它是一個(gè)常數(shù);αi、αo、αw對(duì)應(yīng)的就是輸入輸出權(quán)重的復(fù)用因子,我就不過多解釋了。
這里我們直接上結(jié)論,對(duì)于片上 buffer 的訪問來說,因?yàn)槭禽敵鰪?fù)用,所以 αi 是 1,但是輸出和權(quán)重需要多次的訪問,所以它們會(huì)乘上一個(gè)大于 1 的一個(gè)因子,是由 Tiling 參數(shù)和計(jì)算參數(shù)決定的;而對(duì)于低端的訪問,它是一個(gè)相對(duì)復(fù)雜一點(diǎn)的公式,主要體現(xiàn)在 αo 和 αw 上,它是一個(gè)與片上緩存容量相關(guān)的一個(gè)表達(dá)形式,但因?yàn)槭禽斎霃?fù)用,所以其復(fù)用次數(shù)仍然是 1(用紅色表示)。對(duì)于輸入復(fù)用來說,訪問是 1,我們可以很容易地推測(cè)出來。
對(duì)于輸出數(shù)據(jù)還有權(quán)重來說,它的訪問次數(shù)也應(yīng)該是最小的,這里我就不做過多的展開了。
那我們有了一個(gè)能效訪問次數(shù)的分析模型之后,就能以此做一個(gè)能耗的分析模型,公式也很簡(jiǎn)單,我們之前已經(jīng)詳細(xì)的討論過了。而我們也提到,計(jì)算能耗是一個(gè)固定的值,因此會(huì)著重對(duì)訪存能耗進(jìn)行分析,而用剛剛的訪存分析模型,我們已經(jīng)得到了最低端訪問次數(shù)的模型(紅色部分)和 buffer 的訪問次數(shù)模型,那么單位的 DRAM 的訪存和 buffer 的訪存分別是怎樣一個(gè)值?其實(shí)這和具體的設(shè)計(jì)有關(guān),我們也會(huì)做一些實(shí)驗(yàn)。
在我們的設(shè)計(jì)中,對(duì)于 DDR3 的,因?yàn)槊總€(gè) Dram 的單位訪存能耗是 70pj/bit,而片上 buffer 的單位訪存能耗是 0.42pj/bit。我們其實(shí)對(duì)訪存能耗式子中的每一個(gè)項(xiàng)都做了非常精確的一個(gè)刻畫,那么,我們通過一個(gè)能效的分析模型就可以評(píng)估出不同的計(jì)算模式,在不同的參數(shù)上面它的能耗是多大,這樣就能我們的優(yōu)化目標(biāo)掛鉤了。
我們這里做一個(gè)簡(jiǎn)單的分析,用 AlexNet 的 CONV3 做一個(gè)訪存次數(shù)的分析。我直接給了一個(gè)分析的圖,這里簡(jiǎn)單解釋一下,橫坐標(biāo)是 Tiling 的參數(shù),左邊縱坐標(biāo)是片上 buffer 的總次數(shù),而三個(gè)顏色的柱子分別對(duì)應(yīng)的是 IR、OR 與 WR,表示它們?cè)诓煌?Tiling 參數(shù)的訪存次數(shù),為了方便我們直接來看比較結(jié)果。
這三種基本的計(jì)算模式,它們兩兩作比得到的比值如圖。這里紅色的曲線表示是已知唯一的一個(gè)基準(zhǔn)線,
首先,對(duì)于不同的數(shù)據(jù)復(fù)用模式以及不同的 Tiling 參數(shù)來說,訪存次數(shù)是有差異的,而在不同的情況下,最好的數(shù)據(jù)復(fù)用模式也會(huì)有所不同。
其次,傳統(tǒng)的或者是當(dāng)下的工作通常采用一種相對(duì)固定的數(shù)據(jù)復(fù)用模式,
而在我們的工作里,我們將三種基本的數(shù)據(jù)復(fù)用模式結(jié)合起來,構(gòu)成一種混合的數(shù)據(jù)復(fù)用模式,根據(jù)具體情況來選擇最優(yōu)的一種模式。
剛剛講完的數(shù)據(jù)復(fù)用模式,是計(jì)算模式很重要的一個(gè)部分,那么現(xiàn)在我們來簡(jiǎn)單講講卷積映射方法。我們?nèi)匀灰砸粋€(gè)實(shí)際例子來簡(jiǎn)明地給大家解釋一下。
這是卷積計(jì)算的一個(gè)示意圖,有一個(gè) 3×3 的一個(gè) Input Map,kernel 的大小是 2×2,然而卷積的步長(zhǎng)是 1,那么就經(jīng)過一個(gè)卷積之后得到結(jié)果它是一個(gè) 2×
2 的 Output Map,而這里彩色的箭頭表示就是說對(duì)于每一個(gè) Output Map 上的點(diǎn),它所對(duì)應(yīng)的輸入數(shù)據(jù)來自哪一個(gè)區(qū)域,具體來說就是說對(duì)于 Output Map 的 O0 點(diǎn),它所需要的數(shù)據(jù)是 I0、I1、I3 和 I4,而對(duì)于 O1 點(diǎn)來說,他的數(shù)據(jù)是 I1、I2、I4 和 I5 這四個(gè)點(diǎn)。
我們可以看到,這四個(gè)輸出點(diǎn),它們所對(duì)應(yīng)的輸入數(shù)據(jù)的范圍是相互覆蓋的,我們看到是 I1、I3、I4、I5 和 I7 這五個(gè)點(diǎn),它們是處于重疊部分的一個(gè)區(qū)域。就是說,實(shí)際上這些點(diǎn)在計(jì)算的過程中是存在數(shù)據(jù)復(fù)用的。數(shù)據(jù)復(fù)用就是說數(shù)據(jù)可以重復(fù)利用。比如說,用于 O0 點(diǎn)的計(jì)算的數(shù)據(jù)是可以給到 O1 點(diǎn)進(jìn)行計(jì)算的,即 I1 和 I4,其他的也是類似原理,也就是它存在數(shù)據(jù)復(fù)用的一個(gè)機(jī)會(huì)。
這里我們就給出大家經(jīng)常使用的一種卷積映射方法,仍然以剛剛卷積的例子為例,但我們會(huì)結(jié)合具體的一個(gè)硬件結(jié)構(gòu),CE(計(jì)算引擎)的尺寸是 2×2,意味著它內(nèi)部有 2×2 總共四個(gè) PE(最基本的計(jì)算單元)構(gòu)成,而這幅圖給出來的是一個(gè)卷積映射方法的具體過程。
首先,對(duì)于 Output Map 上的四個(gè)點(diǎn),計(jì)算任務(wù)與 PE 2×2 的陣列是對(duì)應(yīng)的,我們這里就是你看就是 O0 點(diǎn)的計(jì)算任務(wù)會(huì)映射到 PE0 的計(jì)算單元上,其他三個(gè)點(diǎn)也以此類推,意味著對(duì)于某一個(gè) PE 來說,所需要承擔(dān)的計(jì)算就是對(duì)應(yīng)點(diǎn)所需要進(jìn)行的計(jì)算。特別強(qiáng)調(diào)一點(diǎn),所謂的計(jì)算任務(wù)(乘加計(jì)算過程)也就是在上面完成。
第二個(gè)要點(diǎn),輸入輸入數(shù)據(jù)會(huì)按照如圖所示的一個(gè)軌跡(一個(gè) S 形的折線軌跡)進(jìn)行掃描,最開始輸入的是左上角的四個(gè)點(diǎn)(I0、I1、I3 和 I4),通過掃描 PE0 上的數(shù)據(jù),比如 I1 和 I4,會(huì)傳遞到 PE1 上,然后通過掃描將外部數(shù)據(jù)送入到 PE 內(nèi)部,數(shù)據(jù)兩兩之間又會(huì)進(jìn)行一個(gè)數(shù)據(jù)傳遞,就用到了我們剛剛所提到的數(shù)據(jù)復(fù)用的機(jī)會(huì)。
第三點(diǎn),對(duì)于權(quán)重來說,它緊跟著輸入數(shù)據(jù)的節(jié)拍,先后輸入陣列,整體的過程就是卷積映射的方法,這個(gè)方法是一個(gè)非常經(jīng)典的、大家通常會(huì)使用的方法。在現(xiàn)有很多的當(dāng)前的工作中都采用類似的一些方法,比方說像一些利用陣列形式計(jì)算的硬件架構(gòu)都會(huì)通常采取類似的方法,當(dāng)然在細(xì)節(jié)上會(huì)稍許的不同,不過基本上的原理是類似的。
但剛剛講的映射方法仍然存在一些問題,主要是因?yàn)橛?jì)算參數(shù)的多樣性會(huì)導(dǎo)致計(jì)算資源利用率的問題。我剛才提到,利用計(jì)算資源利用率和性能會(huì)直接掛鉤,具體來說它主要有兩方面因素的影響,
一方面就是卷積的步長(zhǎng)大于 1,
另外一方面就是計(jì)算資源的形態(tài),或者說它的結(jié)構(gòu)不匹配。
具體來說,仍然以實(shí)例講解一下。卷積步長(zhǎng)如果大于 1,這里以卷積步長(zhǎng)為 2 作為例子,PE 的陣列規(guī)模是 8×8,要計(jì)算的是 4×4 的一個(gè) Output Map。再用剛剛的方式進(jìn)行計(jì)算,實(shí)際發(fā)揮有效計(jì)算的 PE 其實(shí)是 1357 這些點(diǎn)(紅色區(qū)域)。也就是說,間隔的點(diǎn)會(huì)做一些有效計(jì)算,而灰色的點(diǎn)雖然實(shí)際也在工作,但是它并沒有做有效的計(jì)算,所計(jì)算出來的數(shù)據(jù)并不是我們所需要的。
在這個(gè)例子里,PE 的利用率僅僅只有 25%,這是比較低的一個(gè)數(shù)字。
第二點(diǎn),從我們計(jì)算的圖的尺寸,特別是 Output Map 的尺寸,它會(huì)與計(jì)算資源的規(guī)模以及形態(tài)會(huì)不匹配,具體來說,如果要計(jì)算一個(gè) 6×6 的一個(gè)圖,但是我的陣列大小是 8×8。顯而易見的,只有 6×6 部分他做了有效的計(jì)算,而其余的邊緣部分并沒有做有效的階段,甚至直接沒有用。這樣的話,我們計(jì)算出來的利用率僅僅只有 56.25,將近一半的計(jì)算資源沒有用上,實(shí)在太可惜了。
因此我們希望在計(jì)算過程當(dāng)中,計(jì)算資源可以一直工作,或者說它的利用率盡可能接近百分之百,就能達(dá)到很高的一個(gè)利用率以及性能,這是我們希望看到的。
我們提出一種叫做「并行卷積計(jì)算方法」的一種映射方式,大家看這個(gè)圖就很容易明白。因?yàn)檫@個(gè)方法本身的概念上其實(shí)很容易理解。
左邊是剛剛講的例子,采用我們方法后,我們?cè)噲D在陣列上面同時(shí)計(jì)算四張 Map,利用率能從 25% 提升到將近 100%,這是一個(gè)很好的計(jì)算結(jié)果,它的并行度能提升四倍,那主要是因?yàn)槲覀兺瑫r(shí)計(jì)算四個(gè) Output Map。值得一提的是 Output Map 所需要用到的輸入數(shù)據(jù)其實(shí)是一樣的,或者說它們的數(shù)據(jù)是共享的,這也就直接指導(dǎo)了我們后面的硬件架構(gòu)設(shè)計(jì)。
第二個(gè)例子,我們?nèi)匀皇褂貌⑿芯矸e映射的方法,雖然處理方式有所不同,但是概念上還是非常接近的,為了解釋方便,我們這里換了一種表達(dá)的形式。
這里我們給出時(shí)間軸上的一個(gè)展開圖,左邊是傳統(tǒng)的情況,右邊就是用我們的方法之后的一種情況,簡(jiǎn)單來說,傳統(tǒng)方法是在 8×8 的陣列上計(jì)算 6×6 的輸出圖,如果要計(jì)算 16 張不同的 Map(用不同顏色表示),那我們總共需要 16 次迭代,我們可以認(rèn)為一次迭代代表一次時(shí)鐘周期,那么 PE 的利用率只有 56.25%。
我們采取了另一個(gè)操作,對(duì)每一個(gè) map 做一個(gè)更深層次的一個(gè) Tiling,分塊地將一個(gè) 6×6 的塊分割成一個(gè)一個(gè) 2×2 的小塊,把 16 張 Map 的 2×2 小塊映射到陣列上面。也就是說,我們同時(shí)在一個(gè)陣列上計(jì)算 16 個(gè)運(yùn)行的 Map,但是每個(gè) Map 尺寸更小,那么我計(jì)算完一張 map 的迭代次數(shù)只有 9 次,原來是 6×6,現(xiàn)在是 2×2,我只要 9 次迭代就可以完成,但是因?yàn)槠渌?map 都是并行計(jì)算,所以其他的計(jì)算也可以同時(shí)完成。這樣的一種方式將原來的計(jì)算的 16 次迭代就縮短為 9 次迭代,PE 利用率接近 100%。
另外值得一提的是,這些不同的 Map 所需要的數(shù)據(jù)仍然是共享形式,這一點(diǎn)之后我們會(huì)提到。
我們提出一種并行卷積映射方法,這個(gè)公式與傳統(tǒng)卷積映射方法公式有些許的改變,主要體現(xiàn)在引入了一個(gè)更深層次的 Tiling 參數(shù) Trr 和 Tcc,在分子上面引入了一個(gè)并行的因子 P。
主要的核心思想就是通過并行地計(jì)算更多的輸出圖,以獲得更高的計(jì)算資源應(yīng)用率。在核心內(nèi)部的計(jì)算過程,我們另外引入兩層 Tiling 來實(shí)現(xiàn)并行操作。
以上為硬創(chuàng)公開課上集,下集敬請(qǐng)期待。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。