Deep Learning 101, Taiwan’s pioneering and highest deep learning meetup, launched on 2016/11/11 @ 83F, Taipei 101

AI是一條孤獨且充滿惶恐及未知的旅程,花俏絢麗的收費課程或活動絕非通往成功的捷徑。
衷心感謝當時來自不同單位的AI同好參與者實名分享的寶貴經驗;如欲移除資訊還請告知。
TonTon Huang Ph.D. 發起,及其當時任職公司(台灣雪豹科技)無償贊助場地及茶水點心。

Deep Learning 101 Buy Me A Coffee

去 YouTube 訂閱 | Facebook | 回 GitHub Pages | 到 GitHub 點星 | 網站 | 到 Hugging Face Space 按愛心


大語言模型 語音處理 自然語言處理 電腦視覺
Large Language Model Speech Processing Natural Language Processing, NLP Computer Vision

用 AI 懂 AI

AI 技術 體驗/分享

手把手帶你一起踩 AI 坑https://www.twman.org/AI


AI 技術 開源/試用

Hardware Accelerators for Machine Learning YouTube

2019/08/23 林家銘


FPGA 在機器學習加速器中的應用與設計實作:新手入門關鍵重點

前言

大家好,我是目前在學術領域進行相關研究的博士生。很高興能根據這次分享的內容,為大家整理一份關於 FPGA 在機器學習加速器中應用與設計實作的入門級關鍵重點匯整。希望我的整理能幫助大家,特別是剛接觸這個領域的新手夥伴們,對這項技術有一個更清晰、更深入的理解。我們將特別聚焦於如何利用高階綜合(HLS)工具來簡化硬體設計的流程。

硬體加速的動機與特定應用硬體的崛起

首先,我們需要探討為什麼在當今計算領域,為特定應用設計硬體加速器變得日益重要。這背後有一個重要的觀點,被稱作 Dical 論述 [1, 2]。這個論述指出,雖然半導體製程不斷進步,電晶體的尺寸持續微縮,使得在單一晶片面積上可以集成的電晶體數量顯著增加,但晶片的整體功耗並未同比例下降 [1, 2]。這導致一個挑戰:我們無法同時以最高速度驅動所有電晶體,一部分電晶體可能必須處於關閉或降速狀態以控制功耗和散熱 [1-3]。

傳統的通用處理器,例如中央處理器(CPU),其設計目標是靈活處理各種任務,通常遵循一個多階段的執行流程,包括 Fetch(取指令)、Decode(解碼)、Execute(執行)、Memory Access(記憶體存取)和 Write Back(寫回) [3]。儘管通用處理器功能強大,但在處理需要大量平行運算的特定任務(例如機器學習中的矩陣運算或卷積)時,其循序執行的本質會導致效率不夠高 [1, 4-6]。因此,設計 特定應用硬體(Specialized Hardware) 成為了提升效能和效率的關鍵途徑 [1, 3, 7, 8]。

FPGA(可現場程式化邏輯閘陣列) [1, 7],正是一種重要的特定應用硬體 [7]。其核心優勢在於內部邏輯可以在製造後由使用者重新配置 [7]。這種可重配置性提供了比 ASIC(專用積體電路)更高的設計彈性 [1, 9]。更重要的是,FPGA 在處理平行運算方面比通用處理器具有顯著優勢 [4-6, 10, 11]。不同於通用處理器需要經過多個階段依序執行指令 [3],FPGA 內部可以複製多個執行單元或設計特定的邏輯電路來直接執行特定功能 [4, 12, 13]。這使得 FPGA 能夠同時執行多個操作,非常適合處理迴圈類或資料獨立性高的連續運算 [4, 10-13]。

高階綜合 (HLS) - 降低硬體設計門檻的利器

對於剛開始接觸硬體設計,特別是 FPGA 的新手來說,直接使用 Verilog 或 VHDL 等硬體描述語言(RTL, Register-Transfer Level) [7, 14] 來描述複雜的演算法門檻是相對較高的 [1, 15]。這時,高階綜合 (High-Level Synthesis, HLS) 工具就顯得尤為重要 [1, 7, 8, 14]。HLS 的主要目的是將 C、C++ 或 SystemC 等高階程式語言描述的演算法,自動轉換為 RTL 程式碼 [1, 7, 14]。這極大地簡化了硬體設計流程,提高了設計的 生產力 (Productivity) [6, 15]。

本次分享中使用的工具是 Xilinx 開發的 Vitis HLS (來源中提到 Vivado HLS 或 ad HLS,現已整合到 Vitis 中) [1, 8, 13]。HLS 的設計流程通常包含以下幾個關鍵部分:

  1. C/C++ 原始程式碼:這是描述待實現演算法的高階語言程式碼 [4, 13].
  2. 測試程式 (Test Bench):用於驗證 C/C++ 原始碼的功能正確性 [4, 13]。它通常也是用 C/C++ 編寫,用於模擬輸入並檢查輸出是否符合預期 [4, 13, 16].
  3. 指令 (Directive 或 Pragmas):這是給 HLS 工具的重要提示 [4, 7, 13, 15, 17]。它們類似於編譯器指令,用於指導 HLS 工具如何對 C/C++ 程式碼進行硬體層級的優化,例如指定如何對迴圈進行管線化或如何處理記憶體 [7, 13, 15, 17].

HLS 工具根據這些輸入生成 RTL 程式碼 [4, 13, 18],然後將這些程式碼封裝成可重複使用的硬體功能模組,稱為 智慧財產 (IP, Intellectual Property) [1, 5, 7, 8, 13, 19]。這些 IP 可以被整合到更大的 FPGA 系統或 SOC (System on Chip) 設計中 [4, 7, 13, 20].

HLS 的優勢、限制與硬體思維

儘管 HLS 提高了設計生產力 [6, 15],但其自動生成的 RTL 程式碼在 效率 (Efficiency) 和資源利用上可能不如經驗豐富的硬體工程師手寫的 RTL 程式碼 [6, 11, 15, 21]. 這點在硬體設計領域有普遍共識 [10, 11, 21]. 這是因為軟體開發和硬體設計的思維模式存在根本差異 [5, 6, 10, 11]。軟體思維傾向於線性執行(一條指令接一條指令) [5, 6, 10],而硬體思維則更側重於 平行處理資料流 [5, 6, 10].

一個簡單的軟體迴圈,如果沒有經過適當的優化(例如 Directive 的指導) [4, 7, 13, 15, 17],直接轉換成硬體可能無法充分發揮硬體的平行能力 [10, 11],導致效率低下 [6]. 因此,即使使用 HLS,我們仍然需要學習如何以硬體思維去理解和優化 C/C++ 程式碼 [5, 6, 10, 11],並透過 Directive 來指導 HLS 工具生成更高效的硬體 [4, 7, 13, 15, 17]. 軟體工程師在轉向硬體設計時,最常犯的錯誤就是用寫軟體的邏輯來寫硬體 [5, 11].

HLS 設計實作案例與優化技巧

分享中透過兩個常見的案例來展示 HLS 的設計和優化過程:FIR 濾波器矩陣乘法 [1, 13, 22, 23].

FIR 濾波器 (Finite Impulse Response Filter)

FIR 濾波器是一個在通訊或訊號處理中常用的演算法 [1, 3, 16, 22],本質上是一個一維的 卷積 (Convolution) [1, 3, 7, 16, 22]. 它的運算需要頻繁地存取一組過去輸入訊號的陣列 [17, 19, 22]. 這個陣列的存取模式具有很高的資料重複使用率 [17, 19, 22],每次新的輸入進來,都需要用到前 N-1 個舊資料 [17, 19, 22]. 在 FPGA 上,這種具有局部性(Data Locality)的資料存取模式非常適合實現為 Shift Register [17, 19, 22, 24]. Shift Register 能夠更高效地處理這種資料流 [17, 22, 24],允許在單一 週期 (Cycle) 內同時存取多個所需的資料 [17, 22, 24],相較於使用通用的內部記憶體塊(Block RAM, BRAM)更為有利 [3, 7, 17, 24]. Block RAM 雖然速度快,但在每個週期通常只允許有限次的存取(例如雙埠 BRAM 在一個週期可以同時讀取或寫入兩次) [3, 25]. 透過 HLS 的 Directive [4, 7, 13, 15, 17],我們可以指示工具將特定的陣列實現為 Shift Register,從而優化效能 [17, 22].

此外,分享中也展示了對 FIR 濾波器的迴圈進行 管線化 (Pipeline 或 Loop Pipelining) 的優化 [1, 3, 7, 11, 12, 15, 22-24, 26]. 管線化的核心概念是讓迴圈的不同迭代在硬體中重疊執行 [3, 12, 23],就像工廠的流水線一樣 [3, 23]. 這樣可以減少完成整個迴圈所需的總週期數(降低 Latency) [3, 7, 11, 23, 26],增加在單位時間內完成的操作數量(提高 Throughput, 吞吐量) [3, 7, 12, 23],特別是降低連續操作開始的時間間隔(Initiation Interval, II) [7, 12]. 分享中顯示,對 FIR 濾波器進行 Loop Pipeline 優化後,延遲(Latency)顯著降低,速度幾乎提升一倍 [11, 26],從未優化前的約 56 個 Cycle 降低到約 25 個 Cycle [11, 26]. 再結合 Shift Register 的優化,延遲可以進一步減少約 10 個 Cycle [17, 26]. 值得一提的是,在 HLS 中為迴圈加上 標籤 (Label) 是個好習慣 [3, 19],可以幫助工具識別並針對特定迴圈進行優化分析 [3, 19],並在生成的報告中更清晰地顯示優化結果和資源使用情況 [3, 19, 21].

矩陣乘法 (Matrix Multiplication)

矩陣乘法是另一個重要的數學運算,在機器學習中應用廣泛 [1, 7, 23]. 直觀的 C 語言實現通常使用三重巢狀迴圈 [22, 23, 27]. 在嘗試對其進行 Loop Pipeline 優化時,分享者遇到了挑戰 [22, 23, 27],特別是 外部 IO 存取 (External IO Access) 可能造成的效能瓶頸 [3, 9, 15, 22, 27]. 當硬體模組需要從外部記憶體(如 DDR 或其他片外記憶體)讀取或寫入資料時,這些 IO 操作可能需要等待,阻礙了內部運算的管線化效率 [3, 15, 27]. 即使是使用 FPGA 內部的 Block RAM [3, 7],也可能因為其單週期存取次數的限制(例如大多數 Block RAM 每個週期只能支援兩次獨立存取) [3, 25] 而無法充分餵飽管線化的運算單元 [25].

為了解決這個問題,分享中嘗試了 記憶體分割 (Memory Partitioning) 的優化技術 [7, 15, 24-26, 28]. Memory Partitioning 可以將一個大的陣列在硬體層面分割成多個更小的記憶體塊 [24, 25],使得在同一個週期內可以同時存取多個元素 [24, 25],提高記憶體存取頻寬 [24, 25],減少 IO 延遲對管線化的影響 [15, 24, 28]. 雖然這可能會增加硬體資源消耗 [25],但對於提升矩陣乘法等需要大量平行記憶體存取的演算法效能非常關鍵 [24, 28]. 分享中展示了對矩陣陣列進行 Partition 優化後,記憶體讀取可以在一個週期內完成 [25],從而改善了整體效能 [25, 28].

FPGA 在機器學習推論 (Inference) 中的應用與挑戰

FPGA 作為機器學習 推論 (Inference) [1, 9] 的加速器具有潛力 [1, 9, 29, 30],特別是在端側(Edge)或工業應用(如 AOI - 自動光學檢測)等對延遲和功耗有特定要求的場景 [1, 9, 29]. 然而,目前將複雜的神經網路模型(例如 CNN 的核心運算如卷積、池化等)部署到 FPGA 上仍處於實驗性質 [1, 9, 20],並且面臨一些挑戰:

與 GPU 和 ASIC 相比,FPGA 各有優劣 [9, 29, 30, 32].

將視訊處理與深度學習結合並在 FPGA 上實現高效加速,目前還沒有看到非常成熟的方案,這是一個潛在的研究方向 [9, 31].

給新手入門的建議

對於想要深入這個領域的初學者,作為一個研究人員,我建議從以下幾個方面著手,逐步建立對這個領域的掌握:

  1. 熟悉 HLS 工具與 Directive:深入研究 HLS 的 Directive [4, 7, 13, 15, 17] 以及各種優化技巧 [9, 11, 24-26, 28]. 這是利用高階語言進行硬體設計的基礎 [1, 7, 14].
  2. 打下硬體基礎:學習數位邏輯、計算機結構 [9, 33] 以及 FPGA 底層硬體結構(如 Block RAM [3, 7, 17, 25], DSP slice, Shift Register [7, 17, 19, 22, 24] 等) [9, 31]. 理解這些底層原理有助於更好地理解 HLS 生成的硬體 [9],並在必要時進行人工優化或更精確的效能預估 [6, 9, 11, 21, 33]. 硬體思維模式與軟體思維模式有本質區別,理解電路如何平行工作至關重要 [5, 6, 10, 11, 33].
  3. 實踐操作:設法取得 FPGA 開發板(例如來源中提到的 Zynq Z2 這樣的低階板卡可能是個不錯的開始) [31] 進行實際操作和測試 [9]. 將理論知識應用於實際硬體,進行燒錄和測試,是掌握這些技術不可或缺的一步 [9, 20].
  4. 研究相關文獻:參考相關的硬體設計課程和文獻 [9, 31],特別是關於硬體加速、平行處理和電路結構設計的內容 [9-11, 31, 33].
  5. 了解平台特性:熟悉不同 FPGA 平台的特性、可用的資源以及限制 [9, 18, 31, 33],以及如何針對特定平台進行優化 [9, 20, 29].

目前的學習和實作進度主要聚焦於 HLS 的優化練習 [9, 11, 18, 20],透過實際案例(如 FIR 濾波器和矩陣乘法) [1, 13, 22, 23] 深入理解 HLS 工具的使用和硬體優化技巧 [9, 11, 18, 20],目標是為未來在 FPGA 上實現更複雜的 AI 演算法(如深度學習網路) [1, 9, 20] 打下堅實基礎 [9, 20]. 這個領域充滿挑戰,但也充滿機會,期待大家一起學習和探索!