Giới thiệu dự án

Trong kỷ nguyên bùng nổ của trí tuệ nhân tạo biên (Edge AI) và thị giác máy tính, nhu cầu xử lý các mô hình học sâu (Deep Learning) theo thời gian thực với mức tiêu thụ năng lượng thấp ngày càng trở nên cấp thiết. Theo các báo cáo nghiên cứu công nghiệp, các trung tâm dữ liệu và thiết bị biên sử dụng GPU/CPU truyền thống đang đối mặt với bài toán nghẽn cổ chai về hiệu suất năng lượng (Performance-per-Watt) và độ trễ xử lý. Cụ thể, các nền tảng GPU tiêu thụ từ hàng chục đến hàng trăm Watts, gây quá nhiệt và hạn chế khả năng tích hợp trên các thiết bị nhúng di động.

Đề tài "Thiết kế và hiện thực mô hình học sâu cho bài toán phân loại hình ảnh trên FPGA" (Khoa Kỹ thuật Máy tính – Trường Đại học Công nghệ Thông tin, ĐHQG-HCM; thực hiện bởi Lê Hoàng Minh và Nguyễn Trần Trí Thức, dưới sự hướng dẫn của ThS. Trương Văn Cương) tập trung giải quyết triệt để rào cản tài nguyên phần cứng và điện năng khi triển khai mạng nơ-ron tích chập (Convolutional Neural Network - CNN) trên nền tảng phần cứng tái cấu trúc FPGA (Field Programmable Gate Array).

+-----------------------------------------------------------------------------+
|                             HỆ THỐNG SO-CHIP TỔNG QUAN                       |
|                                                                             |
|  +-----------------------------+         +-------------------------------+  |
|  |     PROCESSING SYSTEM (PS)  |         |   PROGRAMMABLE LOGIC (PL)     |  |
|  |   - ARM Cortex Core         |         |   - CNN IP Core Accelerator   |  |
|  |   - OS: Ubuntu Embedded     | AXI Bus |   - INT8 PE CONV / LINEAR MAC |  |
|  |   - Control / DMA Driver    |<=======>|   - Dual-MAC DSP48E2 Unit     |  |
|  |   - Weight / Image Feeder   |         |   - PLAN Sigmoid Engine       |  |
|  +-----------------------------+         +-------------------------------+  |
+-----------------------------------------------------------------------------+

Mục tiêu cụ thể của dự án

  1. Thiết kế phần cứng chuyên dụng (RTL IP Core): Xây dựng trọn bộ các khối chức năng CNN có khả năng tái cấu trúc (parameterizable) bằng ngôn ngữ SystemVerilog, bao gồm Tích chập (Convolutional), Giảm mẫu (Pooling), Tuyến tính (Linear/Fully Connected) và Hàm kích hoạt phi tuyến (Sigmoid/ReLU).
  2. Tối ưu hóa mô hình với Lượng tử hóa số nguyên 8-bit (INT8 Static Quantization): Chuyển đổi trọng số và đặc trưng từ số chấm động 32-bit (FP32) sang số nguyên 8-bit, giảm kích thước bộ nhớ trên 70% trong khi vẫn duy trì độ chính xác phân loại $\ge 95%$ trên tập dữ liệu chuẩn MNIST.
  3. Khai thác tối đa tài nguyên DSP48E2: Áp dụng kỹ thuật ghép kênh nhân đôi (Dual-multiplication packing), thực hiện đồng thời 2 phép nhân INT8 trên cùng 1 khối DSP48E2 nguyên bản của Xilinx.
  4. Triển khai thực tế trên Kit FPGA: Hiện thực hoàn chỉnh trên nền tảng phần cứng Xilinx Virtex-7 VC707 và Kria KV260 Vision AI Starter Kit, đạt tần số hoạt động $\ge 200\text{ MHz}$ với mức tiêu thụ công suất dưới $10\text{ W}$.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Triển khai mạng nơ-ron học sâu trên phần cứng thường gặp sự đánh đổi lớn giữa độ linh hoạt, độ trễ và điện năng tiêu thụ:

Tiêu chí so sánh Nền tảng CPU (x86/ARM) Nền tảng GPU (NVIDIA Edge) Nền tảng FPGA truyền thống Giải pháp Đề tài (Custom FPGA IP)
Độ trễ (Latency) Cao (Xử lý tuần tự) Trung bình (Nghẽn truyền dữ liệu) Thấp (Pipeline phần cứng) Rất thấp (Deterministic pipeline)
Năng lượng tiêu thụ Cao ($15\text{W} - 65\text{W}$) Cao ($10\text{W} - 30\text{W}$) Thấp ($5\text{W} - 15\text{W}$) Tối ưu ($5.2\text{W}$, tiết kiệm đến 49%)
Tối ưu tài nguyên DSP Không áp dụng Lãng phí với kiểu INT8 1 DSP / 1 phép nhân 1 DSP / 2 phép nhân INT8 song song
Khả năng cấu hình Chỉ qua phần mềm Cố định kiến trúc SIMD Cố định theo từng file code Tự động sinh Top-level từ file JSON

Ưu tiên yêu cầu theo mô hình MoSCoW:

  • Must-have (Bắt buộc): Các khối IP phần cứng cho Conv, Pool, Linear, Sigmoid; Kỹ thuật lượng tử hóa INT8 Post-Training Static Quantization; Giao thức AXI-4 Memory Map truyền nhận dữ liệu.
  • Should-have (Nên có): Tối ưu 2 phép nhân INT8 trong 1 DSP48E2; Cơ chế tính toán cộng dồn qua thanh ghi dịch (Shift Register Buffer) và Adder Tree pipeline.
  • Could-have (Có thể có): Công cụ tự động sinh file cấu hình mạng phần cứng từ mô tả JSON; Tương thích luồng Vitis Accelerator.
  • Won't-have (Chưa thực hiện): Đơn vị tính toán số thực Floating-Point 64-bit trực tiếp trên phần cứng (loại bỏ để tối ưu tài nguyên logic).

Thiết kế hệ thống

Kiến trúc phần cứng được chia thành hai phân vùng chính theo mô hình Zynq SoC:

  1. Processing System (PS): Vi xử lý ARM Cortex chạy hệ điều hành Ubuntu, chịu trách nhiệm quản lý bộ đệm DRAM, khởi tạo luồng dữ liệu hình ảnh và phân phối trọng số thông qua bus AXI Interconnect.
  2. Programmable Logic (PL): Chứa khối tăng tốc CNN IP Core gồm chuỗi pipeline: FIFO $\rightarrow$ Conv1 $\rightarrow$ FIFO $\rightarrow$ Conv2 $\rightarrow$ FIFO $\rightarrow$ Pooling $\rightarrow$ FIFO $\rightarrow$ Linear1 $\rightarrow$ Linear2.
      +------------------ AXI MEMORY MAPPING ------------------+
      | 0x0000_0000 -> 0x0000_FFFF : Trọng số mô hình (Weights)|
      | 0x0001_0000 -> 0x0001_0FFF : Dữ liệu ảnh vào (data_in) |
      | 0xFFFF_FFEF                : Tín hiệu sẵn sàng (Valid) |
      | 0xFFFF_FFF0 -> 0xFFFF_FFFF : Kết quả đầu ra (data_out) |
      +--------------------------------------------------------+
{
  "name": "mnist_cnn_hardware",
  "data_width": 8,
  "img_width": 28,
  "img_height": 28,
  "img_channel": 1,
  "layers": {
    "conv1": {
      "fifo_depth": 32,
      "in_channels": 1,
      "out_channels": 32,
      "kernel_size": 3,
      "padding": 0,
      "stride": 1,
      "output_parallel": 8,
      "activation": "sigmoid"
    }
  }
}

Phương pháp luận (Methodology)

Dự án áp dụng phương pháp thiết kế đồng bộ Phần cứng - Phần mềm (Hardware/Software Co-design):

  • Giai đoạn 1: Mô hình hóa & Lượng tử hóa: Xây dựng mạng CNN trên PyTorch 2.0, huấn luyện FP32 trên tập dữ liệu MNIST, thực hiện Static Quantization thu được bộ tham số tỉ lệ $S$ (Scale) và $Z$ (Zero-Point).
  • Giai đoạn 2: Thiết kế RTL & Tối ưu vi kiến trúc: Viết mã SystemVerilog (IEEE 1800-2017) cho từng khối PE (Processing Element), tối ưu hóa DSP slice và cây cộng logic.
  • Giai đoạn 3: Kiểm chứng UVM (Universal Verification Methodology): Thiết lập môi trường mô phỏng chu kỳ chính xác (Cycle-accurate testbench), đối chiếu kết quả từng layer với Golden Model trích xuất từ PyTorch.
  • Giai đoạn 4: Tổng hợp & Hiện thực phần cứng: Sử dụng Vivado/Vitis 2022.2 thực hiện Synthesis, Placement & Routing, phân tích công suất và nạp Bitstream xuống kit VC707 / Kria KV260.

Implementation và kết quả

Quá trình phát triển và Thuật toán cốt lõi

1. Thuật toán Lượng tử hóa Tĩnh (Static Quantization)

Ánh xạ giá trị số thực $x \in [\alpha, \beta]$ thành số nguyên 8-bit $x_q \in [-128, 127]$:

$$x = (x_q - Z) \times S \quad \Longleftrightarrow \quad x_q = \text{round}\left(\frac{x}{S}\right) + Z$$

Trong mạng nơ-ron của đề tài, điểm zero-point $Z = 0$. Khi đó, giá trị ngõ ra của phép tích chập được tính hoàn toàn bằng số nguyên:

$$O_{\text{int8}} = \text{Quantize}\left( \text{Dequantize}\left( \sum_{i=0}^{n} f_{m,q}[i] \cdot K_q[i] \right) \cdot S_k S_{fm} + B \right)$$

// Logic định tuyến bộ đệm dữ liệu cnn_controller
assign is_padding = (col_cntr_r <= pPADDING - 1) || 
                    (pINPUT_WIDTH + pPADDING - 1 < col_cntr_r) || 
                    (row_cntr_r <= pPADDING - 1) || 
                    (pINPUT_HEIGHT + pPADDING - 1 < row_cntr_r);

assign buffer_en = is_padding ? (en && (!fifo_empty)) : (en && fifo_valid);
assign rd_en     = (!is_padding) && en && (!fifo_empty);

2. Kỹ thuật ghép 2 phép nhân INT8 vào 1 khối DSP48E2

Khối DSP48E2 hỗ trợ bộ nhân $27 \times 18\text{ bit}$. Với 2 toán hạng 8-bit $a, b$ cần nhân với cùng một trọng số $c$:

  • Đưa $a$ dịch trái 18-bit vào cổng $A$: $A = {a, 18'b0}$.
  • Đưa $b$ mở rộng dấu vào cổng $D$: $D = {{19{b[7]}}, b}$.
  • Đưa $c$ vào cổng $B$: $B = c$.
  • Ngõ ra DSP: $P = (A + D) \times B = a \cdot c \cdot 2^{18} + b \cdot c$.
// Module trích xuất kết quả 2 phép nhân từ 1 khối DSP48E2
module dual_int8_dsp_multiplier (
    input  signed [7:0]  a,
    input  signed [7:0]  b,
    input  signed [7:0]  c,
    output signed [15:0] prod_ac,
    output signed [15:0] prod_bc
);
    wire signed [26:0] dsp_in_a = {a, 18'b0};
    wire signed [26:0] dsp_in_d = {{19{b[7]}}, b};
    wire signed [17:0] dsp_in_b = {{10{c[7]}}, c};
    wire signed [44:0] dsp_out  = (dsp_in_a + dsp_in_d) * dsp_in_b;

    // Do b*c chiếm tối đa 16 bit [-16384, 16384], không tràn sang vùng 18-bit của a*c
    assign prod_bc = dsp_out[15:0];
    assign prod_ac = dsp_out[33:18];
endmodule

               SƠ ĐỒ BỘ NHÂN ĐÔI DSP48E2 INT8
               
   a (8-bit)  --> [ Shift << 18 ] --(27-bit)--> [ Cổng A ]
                                                    |
   b (8-bit)  --> [ Sign-Ext    ] --(27-bit)--> [ Cổng D ] --> (+) 
                                                                |
   c (8-bit)  ----------------------(18-bit)--> [ Cổng B ] ----(*)
                                                                |
                                                           (45-bit P)
                                                          /          \
                       prod_ac = P[33:18] <--------------              -------------> prod_bc = P[15:0]

3. Xấp xỉ hàm Sigmoid bằng phương pháp PLAN (Piecewise Linear Approximation)

Thay vì sử dụng bộ chia và hàm mũ phức tạp, phương pháp PLAN xấp xỉ hàm kích hoạt $\sigma(x) = \frac{1}{1 + e^{-x}}$ bằng các đoạn tuyến tính dạng $f(x) = |x| \cdot 2^{-k} + c$, giảm thiểu tài nguyên logic với sai số cực đại chỉ $0.02$.

Kiểm thử và Đánh giá thực nghiệm

Mô hình học sâu kiểm chứng gồm 2 tầng tích chập $3\times3$ (32 filters), 1 tầng Max Pooling $2\times2$, và 2 tầng Tuyến tính (Linear $128 \rightarrow 10$ nodes):

Chỉ số thực nghiệm Mô hình gốc (PyTorch FP32 trên CPU) Mô hình Lượng tử hóa (INT8 trên FPGA) Tỉ lệ cải thiện / Thay đổi
Độ chính xác (Accuracy) $97.85%$ $97.58%$ Giảm chỉ $0.27%$
Dung lượng Trọng số (Weights) $3.10\text{ MB}$ $802\text{ KB}$ Giảm $74.13%$ dung lượng
Tần số xung nhịp (Fmax) N/A $200\text{ MHz}$ Đạt tiêu chuẩn thời gian thực
Công suất tiêu thụ (Power) $\sim 45\text{ W} - 65\text{ W}$ $5.2\text{ W}$ Tiết kiệm $> 88%$ điện năng
Tập dữ liệu kiểm thử 10,000 ảnh MNIST 10,000 ảnh MNIST Khớp 100% logic mô phỏng

Đổi mới và đóng góp

  1. Kiến trúc Ghép kênh DSP48E2: Tiết kiệm chính xác $50%$ số lượng khối DSP lát cắt cần thiết cho phép tính tích chập và fully-connected layer, cho phép nạp các mạng nơ-ron sâu hơn vào các chip FPGA tầm trung.
  2. Khung tạo IP tự động qua JSON: Cung cấp giải pháp sinh mã SystemVerilog Top-level hoàn toàn tự động, cho phép kỹ sư thay đổi pKERNEL_SIZE, pSTRIDE, pPADDING, pOUTPUT_PARALLEL mà không cần viết lại mã phần cứng.
  3. Cơ chế đệm thanh ghi dịch thông minh (Shift Register Buffer): Giảm thiểu tối đa việc truy xuất lại bộ nhớ ngoài DDR, đọc tuần tự theo dòng pixel và thực hiện tính toán song song tức thì.
  4. Hiện thực trọn vẹn chuỗi Dequantize $\rightarrow$ Bias $\rightarrow$ PLAN Sigmoid $\rightarrow$ Quantize: Tối ưu hóa chuỗi tính toán liên tầng, ngăn chặn tình trạng tràn số và giữ sai số lượng tử hóa dưới $0.3%$.

Ứng dụng thực tế và triển khai

Tình huống ứng dụng thực tế

  • Hệ thống Kiểm định Sản phẩm Công nghiệp (Smart Factory QC): Phân loại lỗi bề mặt linh kiện trên dây chuyền tốc độ cao với độ trễ phản hồi dưới $1\text{ ms}$.
  • Camera Giám sát Thông minh tại Biên (Edge Security AI): Nhận diện biển số, ký tự viết tay và phân loại vật thể mà không cần truyền tải luồng video về máy chủ đám mây, bảo mật tuyệt đối dữ liệu.
       QUY TRÌNH TRIỂN KHAI TRÊN BOARD KRIA KV260
       
 +------------------+      +-------------------+      +-------------------+
 |  Vivado Synthesis|      |  Vitis Packager   |      |  Ubuntu on ARM    |
 |  Generate RTL &  | ---> |  Build Metadata   | ---> |  Load .xclbin     |
 |  Export Bitstream|      |  (.xclbin & .dtbo)|      |  Map AXI & Run AI |
 +------------------+      +-------------------+      +-------------------+

Phân tích Hiệu quả Đầu tư (ROI)

  • Chi phí vận hành: Giảm điện năng tiêu thụ từ $65\text{W}$ (máy tính nhúng x86) xuống còn $5.2\text{W}$ giúp doanh nghiệp giảm chi phí năng lượng và hệ thống tản nhiệt tới $70%$ trong môi trường công nghiệp hoạt động 24/7.
  • Vòng đời phần cứng: FPGA cho phép cập nhật thuật toán mới thông qua nạp lại Bitstream từ xa mà không cần thay thế bo mạch vật lý.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  • Thiết kế hiện tại tối ưu tốt nhất cho các mạng CNN cỡ vừa với bộ nhớ trọng số đặt trọn trong On-chip Block RAM/UltraRAM.
  • Chưa tích hợp cơ chế DMA (Direct Memory Access) tự động phân trang đối với các mạng cực lớn (như ResNet-50 hay YOLOv8).

Hướng phát triển tương lai

  • Tích hợp thuật toán tích chập nhanh Winograd ($F(2\times2, 3\times3)$) để giảm số lượng phép nhân thêm $2.25$ lần.
  • Mở rộng hỗ trợ định dạng lượng tử hóa INT4 và FP8 (Floating Point 8-bit).
  • Xây dựng trình biên dịch tự động chuyển đổi trực tiếp từ ONNX graph sang cấu trúc SystemVerilog RTL.

Đối tượng hưởng lợi

  • Sinh viên & Nghiên cứu sinh: Bộ tài liệu mẫu hoàn chỉnh về thiết kế vi mạch ASIC/FPGA cho trí tuệ nhân tạo, code SystemVerilog chuẩn hóa và quy trình kiểm thử UVM.
  • Kỹ sư Phần cứng (RTL/FPGA Engineers): Nắm vững kỹ thuật ghép toán hạng trên DSP48E2 và thiết kế pipeline streaming qua giao thức AXI.
  • Doanh nghiệp phát triển thiết bị Edge AI: Giải pháp kiến trúc phần cứng khả thi, tiết kiệm chi phí bản quyền IP, giảm tải nhiệt năng cho thiết bị biên.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và công cụ để biên dịch và chạy thiết kế này là gì?

Cần cài đặt bộ công cụ Xilinx Vivado Design Suite và Vitis Core Development Kit phiên bản 2022.1 trở lên. Phần cứng hỗ trợ gồm các dòng FPGA Xilinx 7-Series (như VC707 Virtex-7) hoặc Zynq UltraScale+ MPSoC (như Kria KV260 SOM).

2. Độ chính xác của mô hình có bị giảm nhiều khi chuyển từ FP32 sang INT8 không?

Mức độ suy giảm chỉ là $0.27%$ (từ $97.85%$ xuống $97.58%$). Nhờ phương pháp Post-Training Static Quantization tinh chỉnh hệ số Scale $S$ và hàm xấp xỉ PLAN Sigmoid chính xác cao, chất lượng phân loại hoàn toàn được bảo toàn.

3. Thiết kế có thể mở rộng cho ảnh màu RGB (3 kênh) và kích thước lớn hơn không?

Hoàn toàn được. Người dùng chỉ cần cấu hình lại các tham số trong file JSON: "img_channel": 3, "img_width", "img_height", và tăng kích thước fifo_depth tương ứng mà không cần sửa đổi kiến trúc lõi của các khối PE.

4. Tại sao sử dụng UltraRAM thay vì chỉ dùng Block RAM (BRAM)?

UltraRAM trên dòng Zynq UltraScale+ cung cấp độ rộng bus dữ liệu lên đến 64-bit và dung lượng mỗi block đạt 288 Kbits (gấp 8 lần so với 36 Kbits của BRAM thông thường), giúp đáp ứng băng thông nạp đồng thời nhiều trọng số cho các khối tính toán song song.

5. Làm thế nào để nạp trọng số mới mà không cần tổng hợp (Synthesis) lại phần cứng?

Tầng điều khiển hỗ trợ chân load_weight. Hệ điều hành trên PS chỉ cần gửi dữ liệu trọng số qua thanh ghi AXI tại địa chỉ 0x0000_0000, khối điều khiển sẽ tự động ghi đè trọng số mới vào BRAM/UltraRAM trong thời gian thực.


Kết luận

Đề tài "Thiết kế và hiện thực mô hình học sâu cho bài toán phân loại hình ảnh trên FPGA" đã chứng minh tính khả thi và ưu thế vượt trội của việc tăng tốc phần cứng chuyên dụng cho mạng nơ-ron tích chập. Bằng cách kết hợp linh hoạt giữa phương pháp Lượng tử hóa số nguyên 8-bit (INT8), kỹ thuật khai thác triệt để bộ nhân DSP48E2, và thuật toán xấp xỉ hàm kích hoạt PLAN, hệ thống đạt hiệu năng $200\text{ MHz}$, tiêu thụ năng lượng thấp $5.2\text{ W}$ và bảo toàn độ chính xác $97.58%$. Đây là nền tảng vững chắc để mở rộng cho các hệ thống thị giác nhúng và ứng dụng AI thời gian thực trong tương lai.