Tìm kiếm mạng nơ-ron nhận biết phần cứng cho tính toán biên

Trong lĩnh vực Internet Vạn Vật (IoT) và tính toán biên (edge computing), bài toán đặt ra là làm thế nào để triển khai các mô hình mạng nơ-ron hiệu quả trên các thiết bị có tài nguyên hạn chế. Phương pháp truyền thống là huấn luyện mô hình lớn trên đám mây, sau đó nén lại bằng các kỹ thuật như cắt tỉa (pruning) hay lượng tử hóa (quantization) để triển khai trên thiết bị biên. Tuy nhiên, phương pháp này bộc lộ hai nhược điểm lớn: khó kiểm soát tổn hao hiệu suất sau khi nén và yêu cầu truyền dữ liệu nhạy cảm lên đám mây, không đáp ứng yêu cầu tuân thủ trong các lĩnh vực như y tế hay công nghiệp.

Tại một dự án thiết kế giải pháp AI biên cho công ty thiết bị y tế, chúng tôi đã gặp vấn đề này. Họ cần chạy mô hình cảnh báo động kinh trên vi điều khiển STM32, nhưng các giải pháp hiện có hoặc tiêu tốn quá nhiều bộ nhớ (hơn 200KB) hoặc không đạt độ chính xác yêu cầu (dưới 70%). Sau nhiều vòng đánh giá, chúng tôi đã áp dụng phương pháp Tìm kiếm Kiến trúc Mạng Nơ-ron Nhận biết Phần cứng (HW-NAS). Phương pháp này đã giúp chúng tôi tìm ra mô hình phù hợp cho STM32L4 ngay trên cổng kết nối Raspberry Pi, đạt độ chính xác 78.3% và giữ mức sử dụng RAM dưới 31kiB.

Các điểm cải tiến cốt lõi của HW-NAS

So với NAS thông thường, phiên bản nhận biết phần cứng có ba cải tiến chính:

  1. Cắt tỉa không gian tìm kiếm động: Dựa trên giới hạn RAM/Flash của phần cứng đích (ví dụ: STM32), các kiến trúc ứng viên không đáp ứng ràng buộc tài nguyên sẽ tự động bị loại bỏ. Ví dụ, với thiết bị chỉ có 32kiB RAM, các biến thể mô hình có giá trị kích hoạt trung gian vượt quá giới hạn này sẽ bị loại trừ.
  2. Chiến lược tìm kiếm tự thích ứng với tài nguyên: Sử dụng thuật toán tiến hóa nhạy cảm với ngân sách, cường độ tìm kiếm được điều chỉnh động trong giới hạn năng lượng/thời gian cho trước (ví dụ: 16.5Wh/9 giờ 51 phút). Chúng tôi nhận thấy khi giảm ngân sách xuống 1/3 (5.5Wh/3 giờ 17 phút), độ bao phủ không gian tìm kiếm giảm từ 100% xuống 15%, nhưng mô hình cuối cùng vẫn duy trì được 66% độ chính xác cơ bản.
  3. Thiết kế tương thích đa nền tảng: Bản thân quá trình tìm kiếm được điều chỉnh cho các cổng kết nối biên có hiệu năng khác nhau. Việc hoàn thành tác vụ tìm kiếm tương tự trên Raspberry Pi 4 chỉ mất 3 giờ 25 phút, tiêu thụ 14.2Wh, tiết kiệm 83% thời gian so với Pi Zero 2.

Mẹo quan trọng: Trước khi bắt đầu tìm kiếm, hãy khởi tạo thuật toán bằng dữ liệu kiểm tra hiệu năng cơ bản của chip đích. Bằng cách đo độ trễ suy luận của từng lớp trên STM32L4 (ví dụ: Conv2D 3x3 khoảng 0.8ms), chúng tôi đã cải thiện đáng kể độ chính xác dự đoán.

Kiến trúc hệ thống và chi tiết triển khai

Cấu hình phần cứng tham khảo

Hệ thống triển khai của chúng tôi bao gồm hai loại thiết bị:

  • Lớp cổng kết nối (Gateway): Raspberry Pi Zero 2 (4 nhân Cortex-A53 @1GHz / 512MB RAM)
  • Lớp thiết bị đầu cuối (Terminal): STM32L412KBU3 (Cortex-M4 @80MHz / 128KB Flash / 40KB RAM)

Sự kết hợp này có chi phí dưới 30 USD nhưng đủ sức xử lý hầu hết các kịch bản AI biên. Trong thử nghiệm, cổng kết nối tiêu thụ trung bình 1.7W khi tìm kiếm ở tải tối đa, trong khi thiết bị đầu cuối chỉ tiêu thụ 12mW khi suy luận, rất phù hợp cho các ứng dụng dùng pin.

Thiết kế không gian tìm kiếm

Đối với tác vụ nhận diện từ khóa bằng hình ảnh (Visual Wake Words - VWW), chúng tôi xây dựng không gian tìm kiếm với 5 chiều:

Chiều Các tham số tùy chọn Ảnh hưởng tài nguyên
Mạng chính (Backbone) Khối MobileNetV2 / Khối ShuffleNet Quyết định số lượng phép tính MAC
Hệ số chiều sâu (Depth multiplier) [0.5, 1.0, 1.5] Ảnh hưởng tuyến tính đến bộ nhớ RAM
Hệ số bề rộng (Width multiplier) [0.25, 0.5, 0.75] Ảnh hưởng theo bình phương đến bộ nhớ Flash
Module chú ý (Attention module) Không có / SE / CBAM Tăng 5-10% độ trễ suy luận
Thiết kế đầu ra (Output head) Global Average Pooling / 1x1 Conv + Flatten Ảnh hưởng 10KB Flash cuối cùng

Với thiết kế này, không gian tìm kiếm ban đầu bao gồm 3x3x3x2x2 = 108 biến thể cơ bản. Kết hợp với sự thay đổi về số lớp, số lượng kiến trúc ứng viên thực tế vượt quá 2000.

Mô hình dự đoán tài nguyên

Ước tính tài nguyên chính xác là chìa khóa thành công của HW-NAS. Chúng tôi phát triển mô hình dự đoán nhẹ, chỉ cần mã hóa kiến trúc để ước tính:


def estimate_ram(model_config):
    # Chi phí cơ bản: bộ đệm đầu vào/đầu ra
    base = 8 * model_config['input_size']**2
    # Bộ nhớ đỉnh mỗi lớp: max(input, output) + weights
    for layer in model_config['layers']:
        if layer['type'] == 'conv':
            base += 4 * layer['out_channels'] * layer['kernel_size']**2
            base += max(layer['in_channels'], layer['out_channels']) * 8
    return base / 1024 # Chuyển sang kiB

Thử nghiệm cho thấy, bộ dự đoán này có sai số ước tính RAM trên STM32 dưới 5%, vượt trội so với phương pháp ước tính FLOPs truyền thống của NAS (sai số thường lên tới 30%).

Thực chiến: Trường hợp nhận diện từ khóa bằng hình ảnh

Chuẩn bị dữ liệu

Chúng tôi sử dụng bộ dữ liệu Visual Wake Words (VWW), bao gồm:

  • Tập huấn luyện: 80.000 ảnh có nhãn "người"
  • Tập kiểm tra: 20.000 ảnh
  • Kích thước đầu vào: 96x96 RGB

Chúng tôi đã thực hiện tiền xử lý thân thiện với thiết bị biên:


# Quy trình tiền xử lý chạy trên Raspberry Pi
import cv2
import numpy as np

def preprocess(image):
    image = cv2.resize(image, (96, 96))
    image = image.astype(np.float32)
    # Chuẩn hóa trên thiết bị (tránh tính toán trực tuyến)
    image[..., 0] = (image[..., 0] - 92.820747) / 67.847736
    image[..., 1] = (image[..., 1] - 97.575905) / 66.668053
    image[..., 2] = (image[..., 2] - 94.877335) / 68.440090
    return image

Ghi nhận quá trình tìm kiếm

Nhật ký điển hình của quá trình tìm kiếm đầy đủ trên RPi Zero 2:

[Budget] Energy: 16.5Wh Time: 9:51:00
[Phase 1] Initializing search space: 2003 architectures
[Phase 2] Remaining after hardware filtering: 417 (RAM < 40kiB)
[Phase 3] Evolutionary search, generation 1: Evaluating 50 architectures
  Current best: Acc=76.2% RAM=35.4kiB MAC=2.1MM
[Phase 3] Evolutionary search, generation 5: Evaluating 250 architectures
  Current best: Acc=77.8% RAM=28.5kiB MAC=1.6MM
[Result] Duration 8h 42m Power 15.8Wh
Final architecture: MBV2(d=0.75,w=0.5)+SE

So sánh hiệu năng

So sánh thực nghiệm với các giải pháp nhẹ khác (STM32L4 @80MHz):

Mô hình Độ chính xác RAM Flash MAC Độ trễ
MCUNet 87.4% 168.5 530.5 6.0 120ms
HW-NAS của chúng tôi 77.8% 28.5 16.1 1.6 87ms
NanoNAS 77.0% 28.5 23.7 1.3 79ms

Mặc dù độ chính xác thấp hơn một chút, giải pháp của chúng tôi giảm 32% dung lượng Flash, phù hợp hơn cho các MCU dung lượng nhỏ. Khi triển khai thực tế, hiệu năng có thể được cải thiện thêm bằng các kỹ thuật sau:

  1. Tối ưu hóa hợp nhất lớp (Layer fusion): Kết hợp Conv2D + BN + ReLU thành một toán tử duy nhất, giảm 30% thời gian suy luận.
  2. Lượng tử hóa 8 bit: Sử dụng lượng tử hóa int8 của TensorFlow Lite, giảm thêm một nửa kích thước mô hình.
  3. Tái sử dụng bộ nhớ: Quản lý vòng đời của tensor thủ công, giảm 15% bộ nhớ đỉnh.

Mở rộng cho ứng dụng chẩn đoán lỗi công nghiệp

Áp dụng cùng công nghệ này cho bài toán chẩn đoán lỗi vòng bi (bộ dữ liệu CWRU), chúng tôi thu được những lợi thế rõ rệt hơn:

  • Hiệu quả tinh gọn mô hình:
    • So với giải pháp trong tài liệu [54]: RAM giảm từ 66.5kiB xuống 13.5kiB (giảm 79.7%).
    • Flash giảm từ 163.4kiB xuống 12.9kiB (giảm 92.1%).
    • Độ chính xác thậm chí tăng từ 99.3% lên 99.5%.
  • Cải thiện tính thời gian thực:
    • Độ trễ suy luận giảm từ 38.2ms xuống 34ms.
    • Tốc độ lấy mẫu cho giám sát liên tục tăng từ 26Hz lên 29Hz.
  • Kỹ thuật triển khai:
    
    // Triển khai hiệu quả trên STM32
    void inference() {
        // Phân bổ trước toàn bộ bộ nhớ (tránh cấp phát động)
        static float buf1[32*32], buf2[32*32];
        // Kích hoạt tăng tốc phần cứng FPU
        __set_FPSCR(__get_FPSCR() | 0x00000001);
        // Thực thi pipeline từng lớp
        conv1d(input, buf1, weights1);
        relu(buf1);
        conv1d(buf1, buf2, weights2);
        // ...
    }
            

Hướng dẫn tránh lỗi và tổng kết kinh nghiệm

Trong quá trình triển khai thực tế, chúng tôi đã tích lũy được một số kinh nghiệm quan trọng:

  • Cạm bẫy quản lý bộ nhớ:
    • RAM của STM32 bao gồm SRAM1 (32KB) + SRAM2 (8KB). Cần đảm bảo các bộ đệm lớn được đặt trong SRAM1 bằng cách sử dụng tệp liên kết (linker script).
    • Khi bật bộ nhớ đệm dữ liệu (DCache), có thể xảy ra vấn đề nhất quán dữ liệu, yêu cầu gọi thủ công hàm SCB_CleanDCache().
  • Kiểm soát ngân sách năng lượng:
    • Nguồn điện cổng USB của Raspberry Pi không ổn định, nên đo dòng điện trực tiếp từ chân GPIO.
    • Tắt HDMI và WiFi trong quá trình tìm kiếm có thể tiết kiệm 23% năng lượng tiêu thụ.
  • Kỹ thuật triển khai mô hình:
    • Khi tạo dự án bằng STM32CubeMX, hãy đảm bảo tùy chọn "Use float with printf" được bật.
    • Đặt trọng số mô hình vào một phân vùng Flash cụ thể (ví dụ: Sector 7) để có tuổi thọ ghi xóa cao hơn.

Sau khi được xác nhận qua nhiều dự án, ưu điểm của HW-NAS trên thiết bị biên ngày càng rõ rệt. Gần đây, trong một dự án thiết bị y tế đeo trên người, chúng tôi đã sử dụng cùng kỹ thuật này để giảm mức tiêu thụ năng lượng của mô hình phát hiện EEG xuống còn 1.2mW, kéo dài thời gian sử dụng pin từ 8 giờ lên 72 giờ. Hướng tiếp cận tối ưu hóa tự động nhận biết phần cứng đang định hình lại phương thức phát triển AI biên.

Thẻ: tính toán biên mạng nơ-ron tìm kiếm kiến trúc nhận biết phần cứng STM32

Đăng vào ngày 22 tháng 7 lúc 06:52