個,而Kernel size 為 5×5,所以出來的 Output feature map 為 6×28×28。C1 出來的 結果進到S2,根據採樣層的特性,其 Output feature map 的大小會直接減半為 6×
14×14。至於 C3 以及 S4 其性質與 C1、S2 差異不大,所以出來的 Output feature map 為 12×5×5。再把這些結果攤成一維向量,輸入到 F5 去做運算,根據 F5 提供 的 Label 個數,去判斷哪個所對應的 Label 向量是最大的,就作為最後的辨識結 果。
圖 3-1 本論文電路架構圖
本論文的電路每一級間都沒有安插 Pipelined register,所以每級電路間皆是 Overlapped,也因為這些重疊的部分,使得電路每級間皆有平行計算的能力,進而 增加電路運算速度,如圖3-2 所示。
圖 3-2 本論文電路 Latency 示意圖
3-2 C1 電路
這一小節會介紹C1 電路的架構,如圖 3-3 所示。C1 電路由 Shift register 以 及Kernel core 所組成,每個電路單元有各自的功能,Shift register 是使用 Data reuse
的架構所設計的電路,負責接收 Input 的資料。Kernel core 則是專門負責摺積運 算以及儲存權重的電路,根據軟體模型我們得知C1 提供 6 個 Kernel 個數,由圖 3-3 可以得知總共有兩個 Kernel core,所以每個 Kernel core 分到了 3 個權重。Input 每個Pixel 會隨著時脈依序對權重來運算,Kernel core 有三個權重所以需要花 3 個 時脈才會運算出第一個輸出值,輸出結果會交替的形式輸出到下一層電路,直到 Input 運算完為止。
圖 3-3 C1 電路架構圖 1
如果要看C1 電路的運算時間,除了最後一個 Pixel 之外的每個 Pixel 所需要 的延遲時間,還要再加上最後一個Pixel 所花的運算時間就是 C1 真正的執行時 間,如圖3-4 所示。
圖 3-4 C1 電路架構圖 2
3-3 S2 電路
由於上一層的輸出結果是以交錯的方式來進行,所以便以交錯的形式來當作 下一層的輸入。根據軟體模型採樣層的特性,有幾個 Input feature map 便會有幾 個Output feature map,所以當輸入為交錯的形式進來,輸出就會以交錯的形式輸 出到下一層。綜合以上兩種特性而設計出的架構如圖3-5 所示,由 Interleaved shift register 以及 Comparator core 所組成。Interleaved shift register 與上一節提到的 Shift register 概念相似,負責接收交錯的輸入資料。Comparator core 主要功能為找出 Input 部分區塊的最大值。當電路運算完,就會以交錯的形式來輸出到下一層。
圖 3-5 S2 電路架構圖 圖3-6 所示。C3 電路由 Interleaved shift register、Kernel core 以及 Output buffer 所 構成,我們可以從圖3-6 所看到 Input 是交錯的進來,平行的輸出,而根據軟體模 型我們可以得知C3 提供 12 個權重,Input feature map 總共有 6 張,所以總權重 為6×12=72 個。C3 電路總共有 6 個 Kernel core,每個 Kernel core 被分到 12 個
權重。每一輪運算有兩組輸入資料,每組輸入資料有3 筆,每筆輸入資料會與相
對應的權重來運算,我們會以顏色來依序對應,一個輸入資料需要花4 個 clock,
所以整組資料運算需要花12 個 clock 才會算出部分輸出結果。Output buffer 會接 收經由Kernel core 所算出來的部分結果,把這些結果所對應的 Output feature map 加總起來算出真正的Output feature map。
圖 3-6 C3 電路架構圖 1
根據上述所提到C3 電路的特性,我們會由 Kernel core 的個數來決定每組輸 入資料需要延遲多少 clock。如果 Kernel 個數多,所需要的延遲就會短,反之,
Kernel core 個數少,所需要的延遲就會長,進而影響整體電路的運算速度。除了 影響運算速度,還會影響到電路硬體資源消耗,Kernel core 是負責摺積運算的電 路單元,所以會使用到大量的浮點計算,如乘法器以及加法器,這些電路元件都 會使用到很多硬體資源,佔據本論文電路絕大部分的硬體資源消耗,使得電路設 計成本提高。我們舉兩個例子來呈現Kernel core 個數可以怎麼調整,給定權重總
分到 18 個權重,也就是每一組輸入資料需要花 18 個 clock 才能運算完。再換到 另一個例子,如圖3-8 所示,Kernel core 個數是 2,所以每個 Kernel core 被分到 36 個權重,所以每組輸入資料需要花 36 個 clock 來執行運算。經過這兩個例子的 說明,本論文可以根據需求的不同,透過調整Kernel core 的方式來改善運算速度 以及電路面積,使得電路設計更為彈性。
圖 3-7 C3 電路架構圖 2
圖 3-8 C3 電路架構圖 3
3-5 F5 電路
這一小節會先介紹全連接層電路的架構,再介紹其運作原理。首先,如圖
3-9 所示,這是全連接層電路架構,由 Computation core、Rom、AGU 以及 Partial accumulation buffer 組成,Computation core 是負責處理運算單元,ROM 是儲存權 重單元,AGU 為產生 ROM 的位址,Partial accumulation buffer 主要功能為暫存部 分的結果並持續做累加的計算。
圖 3-9 F5 電路架構圖
我們用一個例子來說明其全連接層電路的運作,假設權重總數為32,給定 I、
O、s 以及 t 分別為 16、2、4 以及 2,所以每次運算會需要 8 個權重,總共 4 組權 重,進而推導出 N 為 4 以及 R 為 1,如圖 3-10 所示。每次運算會丟 4 個輸入個 數以及 8 個權重(紅框的部分)去 Computatiom core 執行運算,我們用顏色來代表 每個輸入個數的總數,以及所對應的權重,每組輸入會對應一組權重。計算完後,
Computation core 會吐出運算完的資料丟進 Partial accumulation buffer 暫存起來,
直到有新的值要準備進到Buffer 中,再執行累加的動作。
圖 3-10 F5 電路運作圖 1
當電路運算完第一輪之後,紅框的部分會移動到下一個Pixel,而 AGU 會指 向 2,告訴 Rom 必須移動到所對應的位址。運算完之後吐出新的輸出結果(藍色 的部分),電路發出一個訊號告訴 Buffer 有新的值要進來可以準備接收,這時已經 再 Buffer 等候一段時間的輸出結果(前一輪的值,紫色的部分)得知有新的值準備 進來,執行累加的動作,算完的結果再存回 Buffer 中(深紅色的部分),如圖 3-11 所示。
圖 3-11 F5 電路運作圖 2
電路一樣的動作以此類推,Input 移動到下個 Pixel,權重指向於 AGU 所指定 的位址,新的輸出與舊的輸出執行累加運算,直到Input 算完為止,如圖 3-12 以 及3-13 為示。
圖 3-12 F5 電路運作圖 3
圖 3-13 F5 電路運作圖 4
3-6 Pipelined operations
這一小節會介紹到如何讓每級電路之間的溝通運作能夠正常的執行且出來 的運算結果是正確的,如果錯誤會發生什麼問題,所以同不同步的問題在這一小 節是重要的關鍵。接下來會先舉錯誤的電路運作例子來看看會發生什麼問題,如 圖3-14 所示。之後,再詳細的探討我們會利用什麼方法來解決問題。
圖 3-14 Pipeline operations 錯誤運作圖 1
首先,給定Input feature map 為𝑍1,C1 Kernel core 提供三個權重,C3 Kernel core 則提供 12 個權重,所以分別需要花 3 個 Clock 以及 12 個 Clock。電路執行 第一個Clock 時,如圖 3-15 所示,紅色的部分為電路當前執行的情況,都還是正 確的運作。然而當電路執行到第二個 Clock 時,如圖 3-16 所示,C1 的輸出結果 𝑋2對應錯誤的權重𝑊1,2,造成錯誤的運算結果。這一切發生錯誤的原因都是因為 每級電路間發生Clock 不同步而發生 Race condition 的問題,C1 運算速度比較快,
當C3 還在計算時 C1 已經丟新的一筆資料給 C3,直接中斷 C3 原有的運作流程,
導致錯誤的運算結果。
圖 3-15 Pipeline operations 錯誤運作圖 2
圖 3-16 Pipeline operations 錯誤運作圖 3
為了使每級電路之間可以同步執行運算,首先,必須要看每級電路間誰的每 組輸入資料需要花最多的 Latency,在圖 3-17 這個例子,我們假設是 C3 花最多 時間,所以每級電路都需要遷就於C3 電路。本論文使用 Finite state machine(Cntr) 來維持每級電路之間的Clock 的同步,透過這個方法可以控制每個輸入資料對應 到所匹配的權重,而解決電路Clock 不同步的問題。
圖 3-17 Pipeline operations 正確運作圖 1
電路執行第一個Clock 時,由圖 3-18 可以得知第一個狀態為紅色,電路會根 據Cntr 所指定的狀態來決定權重必須要停留多少個 Clock,所以𝑋1會與C3 的𝑊1,1 來執行運算。
圖 3-18 Pipeline operations 正確運作圖 2
緊接著電路執行第二個Clock,如圖 3-19 所示,Cntr 第二個狀態為紅色,
也就是𝑊1,1目前已經停了兩個Clock,所以 C1 出來的結果仍就是𝑋1,並與C3 的 𝑊1,2執行運算。
圖 3-19 Pipeline operations 正確運作圖 3
接著,同樣的運作原理不斷的重複,如圖3-20 所示。電路執行到第五個 Clock 時,也就是 C1 的𝑊1,1在這一輪已經運算完,必須換到下一個權重𝑊1,2,所 以C1 出來的運算結果為𝑋2,並與C3 的𝑊2,1執行運算。
圖 3-20 Pipeline operations 正確運作圖 4
當電路執行到第九個 Clock 時,如圖 3-21 所示,也就是 C1 的𝑊1,2在這一輪已經 運算完,必須換到下一個權重𝑊1,3,所以 C1 出來的運算結果為𝑋3,並與 C3 的 𝑊3,1執行運算,重複相同的動作以此類推,直到輸入資料算完為止。電路透過Finite state machine 控制的作法,完全避免了電路 Clock 非同步的問題,讓每級電路之 間可以彼此重疊,增加電路的平行計算能力,進而提升運算速度。
圖 3-21 Pipeline operations 正確運作圖 5
3-7 電路 Latency
上一小節有提到如果要使每級電路之間Clock 可以同步,必須取決於電路間 最大的延遲時間。我們定義符號 d 代表 Input 每個 Pixel 所延遲的時間,公式為 𝑚𝑎𝑥𝑖𝑚𝑢𝑚(𝑇3, 𝑅),其中𝑇3代表C3 每組 Input 所延遲的時間,而 R 則代表 F5 每組 Input 所延遲的時間,𝑇3公式為𝑤/𝑘,𝑤為 C3 的權重總數,𝑘為 C3 的 Kernel core 個數。為什麼 d 會從 C3 與 F5 找出最大的延遲時間呢?C3 與 F5 有個類似的地 方,就是權重總數較多,而怎麼調整每組 Input 與權重的關係是非常重要的,也 因為這相同的性質,必須從中找出最大的延遲時間,所有電路都需要配合,避免 Race condition 的問題。我們在 C1 的小節有介紹到,只看最後一個值去執行運算,
所花的時間再加上每個 Pixel 所延遲的時間,就是 C1 最後的執行時間,公式為 𝑑(𝐿12− 1) + 𝐷1,其中𝐷1為C1 Kernel Core 運算的時間。由於本論文的電路每級
推導出該級電路執行完的時間。𝐷2為Comparator Core 運算的時間,𝐷3為C3 Kernel core 運算的時間,𝐷4為Computation core 運算的時間。我們把上述提到的參數整 理成電路Latency 公式圖,如圖 3-22 所呈現。
圖 3-22 本論文電路 Latency 公式圖
3-8 人臉辨識系統架構
上述每個小節都是說明 CNN 電路層面的運作,這一小節會介紹本論文所設
計的CNN 電路怎麼與其他 IO 資源來整合,並結合軟體端提供人臉偵測演算法,
以實現人臉即時辨識系統。首先,Xilinx 所提供的 FPGA 有具備支援 Python 開發 的套件,透過Python 我們可以很輕易地連結到所需要使用到的 IO 周邊資源,型 號為Pynq-Z2,如圖 3-23 所示。Pynq-Z2 主要有兩大區塊,PS(Process System)處
以實現人臉即時辨識系統。首先,Xilinx 所提供的 FPGA 有具備支援 Python 開發 的套件,透過Python 我們可以很輕易地連結到所需要使用到的 IO 周邊資源,型 號為Pynq-Z2,如圖 3-23 所示。Pynq-Z2 主要有兩大區塊,PS(Process System)處