3 điểm bởi GN⁺ 2024-06-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Tăng tốc FAST feature detector bằng lệnh SIMD 128-bit trên ESP32-S3 giá rẻ, xử lý khung hình QVGA (320×240) trong khoảng 6ms
  • Con chip này là một vi điều khiển có CPU lõi kép tối đa 240MHz, WiFi, Bluetooth Low Energy, và có hỗ trợ SIMD ở mức hạn chế trong tài liệu tham chiếu kỹ thuật
  • Trọng tâm của phần triển khai là xử lý đồng thời 16 pixel 8-bit trong FAST corner pre-test, nhưng phải lách các ràng buộc về đọc dữ liệu không thẳng hàng và phép so sánh signed
  • Để khớp pixel 8-bit unsigned với phép so sánh signed, bài viết dùng tính chất x - 128 == x ^ 0x80 để biến đổi giá trị bằng XOR 0x80
  • Thông lượng thử nghiệm tăng từ 5.1MP/s lên 11.2MP/s, đạt mức đủ để xử lý cả luồng VGA 30fps trên ESP32-S3

Tăng tốc FAST feature detector trên ESP32-S3

  • Đã triển khai FAST feature detector tăng tốc bằng SIMD cho ESP32-S3, đạt hiệu năng xấp xỉ gấp đôi so với bản triển khai chuẩn
  • Mất khoảng 6ms để xử lý một khung hình QVGA (320×240)
  • ESP32-S3 là một vi điều khiển giá rẻ nhưng có CPU lõi kép tối đa 240MHz cùng WiFi và Bluetooth Low Energy
  • Có thể xác nhận hỗ trợ tập lệnh SIMD ở mức hạn chế trong ESP32-S3 technical reference manual

Các lệnh SIMD ít được biết đến và chuẩn bị triển khai

  • Các lệnh SIMD của ESP32-S3 không phải là tính năng bí mật, nhưng tương đối ít người biết đến hơn
  • Có thể tham khảo ba nguồn ví dụ
    • Larry Bank’s blog: khám phá tính năng và cung cấp minimal example
    • esp-dsp: thư viện của Espressif dùng cho các chức năng mang tính DSP như convolution, FFT
    • esp-dl: thư viện của Espressif dùng cho tăng tốc AI on-chip
  • Trong quá trình triển khai, tác giả đã làm quen với cấu trúc cơ bản của assembly trên ESP32-S3 và cũng viết bộ cấp phát thanh ghi cơ bản riêng là basm

Cách xử lý FAST corner pre-test bằng SIMD

  • Corner pre-test của FAST feature detector lấy mẫu các pixel theo bốn hướng đông, tây, nam, bắc để kiểm tra xem có ít nhất 3 pixel “cực trị” hay không
  • Ở đây, pixel cực trị là pixel có độ chênh tuyệt đối với pixel trung tâm vượt quá một ngưỡng nhất định
  • Mỗi thanh ghi vector có thể lưu 16 giá trị 8-bit, nên cách triển khai được tổ chức để tính extrema count cho 16 pixel cùng lúc
  • Bốn khối pixel được lấy mẫu theo các hướng đông, tây, nam, bắc và so sánh với các pixel trung tâm tương ứng

Các ràng buộc của SIMD trên ESP32-S3 và cách lách

  • Ràng buộc thứ nhất là ISA không cho phép đọc misaligned trực tiếp
    • Nếu giả sử pixel trung tâm được căn hàng, thì các khối phía đông và phía tây sẽ không thẳng hàng
    • Khối phía đông và phía tây được lấy ra bằng lệnh nối hai thanh ghi liền kề rồi trích một lát dữ liệu
  • Ràng buộc thứ hai là ESP32-S3 chỉ triển khai so sánh signed 8-bit
    • Dữ liệu pixel được lưu dưới dạng unsigned 8-bit, nên nếu diễn giải trực tiếp thành signed thì dải [128, 255] sẽ bị ánh xạ phi tuyến thành [-128, -1]
    • Trong trạng thái đó, phép so sánh sẽ không hoạt động đúng

Điều chỉnh pixel unsigned cho phù hợp với so sánh signed

  • Cần đưa giá trị pixel từ [0, 255] sang [-128, 127] để phép so sánh và số học hoạt động có ý nghĩa
  • Có vẻ chỉ cần trừ 128, nhưng các phép toán số học SIMD trên ESP32-S3 đều là saturating arithmetic, nên phát sinh vấn đề
    • Các giá trị pixel vượt quá 127 sẽ không underflow đúng mà bị chặn về -128
  • Giải pháp là trừ 128 theo cách song song mà không dùng lệnh trừ
    • Trong signed 8-bit, bit cao nhất có trọng số -128
    • x - 128 tương đương với việc lật bit cao nhất
    • Vì vậy có thể dùng quan hệ x - 128 == x ^ 0x80
  • Mỗi khi nạp giá trị unsigned 8-bit, ta XOR với 0x80 để chuyển sang một dải tuyến tính có thể dùng cho số học và so sánh

Kết quả hiệu năng và khả năng xử lý thời gian thực

  • Với hai kỹ thuật lách này, tác giả đã triển khai FAST corner pre-test tăng tốc bằng SIMD
  • Một scoring function tăng tốc bằng SIMD với tổ hợp phép toán tương tự cũng đã được viết, nhưng không đi vào chi tiết
  • Trong thử nghiệm, thông lượng của FAST feature detector tăng từ 5.1MP/s lên 11.2MP/s
  • Thông lượng tăng lên khoảng 220% so với trước đó
  • Mức hiệu năng này nằm trong phạm vi chấp nhận được cho các tác vụ thị giác máy tính thời gian thực và cho phép ESP32-S3 dễ dàng xử lý luồng VGA 30fps

1 bình luận

 
GN⁺ 2024-06-26
Ý kiến trên Hacker News
  • Nếu là silicon rẻ hơn giá trung bình một ly cà phê thì khá tuyệt, nhưng có lẽ không phải con chip quá rẻ mà là cà phê quá đắt
    • Từ sau khi xem Minority Report, tôi đã chờ cốc cà phê dùng một lần có quảng cáo video OLED, nhưng công nghệ tiến triển quá chậm
    • Thực ra cà phê có khả năng nên đắt hơn hiện nay
      Vì các tập đoàn lớn bóc lột nông trại địa phương và trên thực tế duy trì độc quyền khu vực, khiến các nông trại buộc phải bán cho họ với giá thấp hơn rất nhiều so với giá trị thực
    • Chính xác hơn thì nó gần với tiền công của người pha cho bạn hơn là bản thân cà phê
    • Việc thị giác máy tính có thể chạy trên phần cứng siêu rẻ có một lý do không mấy dễ chịu
      Các quốc gia trên toàn thế giới đang mua những thứ này theo đơn vị hàng tỷ để giám sát công dân, và Big Brother đang tạo ra lợi thế kinh tế theo quy mô khổng lồ
  • Có một bo mạch tương tự là ESP32-CAM, và dự án thị giác máy tính thực dụng này hỗ trợ nó: https://github.com/jomjol/AI-on-the-edge-device?tab=readme-o...
  • Một bài viết ngắn về SIMD của ESP32-S3 cũng đáng xem. Trước đây từng được thảo luận: https://bitbanksoftware.blogspot.com/2024/01/surprise-esp32-...
  • Nếu bạn quan tâm đến chủ đề này và muốn tự thử, nên xem sản phẩm Edge Impulse của chúng tôi: https://edgeimpulse.com/ai-practitioners
    Chúng tôi trực tiếp hợp tác với nhiều nhà cung cấp để tối ưu hóa cấp thấp các tác vụ deep learning, thị giác máy tính và xử lý tín hiệu số trên hàng chục vi điều khiển, kiến trúc CPU, bộ tăng tốc chuyên dụng (bao gồm cả điện toán neuromorphic) và GPU biên
    ESP32 cũng được bao gồm: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
    Bạn có thể upload mô hình TensorFlow, PyTorch, JAX và nhận ngay một thư viện C++ đã tối ưu chỉ với vài dòng Python trên laptop, khá đáng kinh ngạc
    Ngoài ra còn có Studio để huấn luyện mô hình, cùng tối ưu hóa siêu tham số có nhận biết phần cứng nhằm tìm mô hình tối ưu phù hợp với các kiến trúc được thiết kế để chạy tốt trên nhiều phần cứng nhúng và với độ trễ, mức dùng bộ nhớ của thiết bị đích
    • Nhân tiện, do giới hạn của gói cộng đồng, có vẻ các đầu ra từ đây sẽ khó dùng trong bất kỳ dự án mã nguồn mở nào
    • Tại sao lại là C++? Tôi tò mò liệu mã C++ được sinh ra có dùng các tính năng C++ phức tạp không, hay gần với C có class hơn
  • Tôi tò mò FAST dùng để làm gì
    Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
    Tôi tự hỏi liệu chip ở tầm giá này có chức năng tương tự TPU hay không
    Neon là phần mở rộng lệnh SIMD tùy chọn của ARMv7 và ARMv8, nên từ Pi Zero trở lên đều có phần mở rộng SIMD
    Theo tôi hiểu, Orrin Nano đạt 40 TOPS, đủ mức cho Copilot+. "A PCIe Coral TPU Finally Works on Raspberry Pi 5" https://news.ycombinator.com/item?id=38310063
    Theo https://phys.org/news/2024-06-infrared-visible-device-2d-mat..., họ đã chuyển đổi bước sóng hồng ngoại 1550nm lên ánh sáng khả kiến 622nm, và sóng ánh sáng đầu ra có thể được phát hiện bằng camera nền silicon hiện có
    Quá trình này duy trì tính kết hợp (coherent), nên nếu khắc một mẫu cụ thể lên tần số hồng ngoại đầu vào thì nó được cho là sẽ tự động chuyển sang tần số đầu ra mới

"Show HN: Thư viện PicoVGA – Hiển thị VGA/TV trên Raspberry Pi Pico" https://news.ycombinator.com/item?id=35117847#35120403
https://news.ycombinator.com/item?id=40275530
"Thiết kế một thuật toán SIMD từ con số không" https://news.ycombinator.com/item?id=38450374

  • Bộ phát hiện điểm đặc trưng FAST là thuật toán tìm các vùng nổi bật về mặt thị giác trong ảnh, và có thể dùng làm bước đầu tiên cho theo dõi chuyển động và SLAM, vốn phổ biến trong XR, robotics, v.v.
    Các lệnh SIMD của ESP32-S3 có vẻ được thiết kế để tăng tốc suy luận các mô hình AI đã lượng tử hóa (https://github.com/espressif/esp-dl), đồng thời cũng bao gồm xử lý tín hiệu như FFT
    Theo nghĩa là có các lệnh chuyên biệt hỗ trợ suy luận ML, cũng có thể gọi nó là giống TPU. Ví dụ EE.VRELU.Sx thực hiện phép toán ReLU
    Tuy nhiên, dùng các lệnh như vậy vẫn tiêu tốn thời gian CPU, còn TPU thường là lõi xử lý riêng hoạt động bất đồng bộ, nên nó gần với ARM NEON hơn
  • Về tính năng kiểu TPU trên chip ở tầm giá này, Kendryte K210 hỗ trợ tích chập 1x1 và 3x3 trong "TPU"
    Phần mềm và tài liệu khá tốt, nhưng đáng tiếc là nó không được phổ biến rộng rãi
    Ngày nay có thể dễ dàng tìm thấy các bo mạch phát triển giá rẻ dựa trên RV1103 ("LuckFox"), BL808 ("Ox64/Pine64"), CV1800B/SG20002 ("MilkV"), và tất cả đều có thứ gì đó cơ bản kiểu TPU
    Tuy nhiên, vì chúng được thiết kế như bo mạch Linux nên các nội dung liên quan đến TPU bị trừu tượng hóa cực mạnh, gần như không có tài liệu nội bộ, vì vậy hoàn toàn không rõ đó là TPU thật hay chỉ là mô phỏng bằng tối ưu hóa mã thông minh
  • TinyML thú vị vì nguyên lý của nó có thể áp dụng trực tiếp cả cho các ứng dụng nền web
    Ấn tượng đầu tiên là MicroPython trông khá dễ tiếp cận, nhưng không biết việc port mã đó sang WebAssembly có dễ không
  • Nếu chấp nhận hy sinh phần nào cửa sổ phát hiện, tôi tò mò không biết việc dùng song song vài bo mạch như thế này để xử lý độ phân giải và tốc độ khung hình cao hơn sẽ khó đến mức nào
  • Nếu có ai từng dùng Rust trên bộ điều khiển ESP32, tôi cũng tò mò liệu việc này có làm được bằng Rust không
    • So với ESP8266, hỗ trợ Rust trên ESP32 nhìn chung khá tốt, nhưng nếu muốn dùng thư viện chuẩn thì nhiều khả năng phải kéo theo toolchain C++
      Theo kinh nghiệm, no-std của Rust trên ESP32 cũng không tệ, nhưng các phần kết nối với những thành phần như Wi‑Fi, networking hay camera vẫn chưa thật sự trau chuốt
      Như bình luận khác đã nói, hỗ trợ SIMD và assembly trong Rust cũng đủ tốt
      Trước khi đi sâu nghiêm túc, tốt nhất nên hỏi trong phòng chat Rust embedded hoặc Rust ESP32
    • Làm được. Chủ yếu phụ thuộc vào hỗ trợ LLVM/clang, và assembly của Rust rất dễ xử lý
  • Nếu tôi không đọc nhầm thì phần áp chót chẳng phải chỉ là bù 2 cơ bản sao?
  • Với kiểu xử lý này, có vẻ SIMD vượt trội hơn SMT
    • Tôi không nghĩ SIMD và SMT là hai lựa chọn loại trừ lẫn nhau
      Nếu đưa vào nhiều SIMD và dùng kèm SMT-4 hoặc SMT-8, các luồng có thể che giấu độ trễ, nhờ đó hiệu năng trên diện tích có khả năng tốt hơn