Tăng tốc thị giác máy tính bằng SIMD trên ESP32-S3 giá 2 USD
(shraiwi.github.io)- 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, FFTesp-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
- 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
Đ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
- Các giá trị pixel vượt quá 127 sẽ không underflow đúng mà bị chặn về
- 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 - 128tươ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
- Trong signed 8-bit, bit cao nhất có trọng số
- 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
Ý kiến trên Hacker News
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
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 giác như một Zynq giá rẻ dành cho thị giác máy tính
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
https://www.aliexpress.us/item/3256806880637138.html
Biến thể S3 hoàn toàn đáng với chút chi phí tăng thêm, vì có SIMD và FPU nên dễ nhanh hơn nhiều lần, ở mức một chữ số
https://github.com/espressif/esp-dl/tree/master/examples/fac...
Phát hiện người trong 54ms thật đáng kinh ngạc: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
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
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
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
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
Ấ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
Có thể thử nghiệm use case thiết bị tại https://micropython.org/unicorn/
Với phát triển phía client, có thể dùng trong PyScript, và cũng có bridge JavaScript/DOM
https://pyscript.net/tech-preview/micropython/about.html
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
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