Mengakselerasi Computer Vision dengan SIMD pada ESP32-S3 Seharga 2 Dolar
(shraiwi.github.io)- Mengakselerasi FAST feature detector dengan instruksi SIMD 128-bit pada ESP32-S3 murah, memproses frame QVGA (320×240) dalam sekitar 6 ms
- Chip ini adalah mikrokontroler dengan CPU dual-core hingga 240 MHz, WiFi, dan Bluetooth Low Energy, serta dukungan SIMD terbatas yang tercantum dalam technical reference manual
- Inti implementasinya adalah memproses 16 piksel 8-bit sekaligus pada FAST corner pre-test, tetapi harus mengakali pembacaan yang tidak selaras dan batasan perbandingan signed
- Untuk menyesuaikan piksel unsigned 8-bit dengan perbandingan signed, nilai dikonversi dengan XOR 0x80 menggunakan sifat
x - 128 == x ^ 0x80 - Throughput pengujian meningkat dari 5,1 MP/s menjadi 11,2 MP/s, mencapai level yang juga memungkinkan pemrosesan stream VGA 30 fps pada ESP32-S3
Mengakselerasi FAST feature detector pada ESP32-S3
- FAST feature detector berakselerasi SIMD untuk ESP32-S3 telah diimplementasikan dan menghasilkan performa kira-kira 2 kali dibanding implementasi acuan
- Diperlukan sekitar 6 ms untuk memproses satu frame QVGA (320×240)
- ESP32-S3 adalah mikrokontroler murah, tetapi mencakup CPU dual-core hingga 240 MHz serta WiFi dan Bluetooth Low Energy
- Dukungan instruksi SIMD terbatas dapat ditemukan di ESP32-S3 technical reference manual
Instruksi SIMD yang kurang dikenal dan persiapan implementasi
- Instruksi SIMD pada ESP32-S3 bukan fitur rahasia, tetapi relatif kurang dikenal
- Contoh yang dapat dijadikan referensi dirangkum menjadi tiga
- Larry Bank’s blog: menyediakan eksplorasi fitur dan minimal example
esp-dsp: library Espressif yang digunakan untuk fungsi bernuansa DSP seperti convolution dan FFTesp-dl: library Espressif yang digunakan untuk akselerasi AI on-chip
- Selama proses implementasi, struktur dasar assembly ESP32-S3 dipelajari, dan allocator register dasar mandiri bernama
basmjuga ditulis
Cara pemrosesan SIMD pada FAST corner pre-test
- Corner pre-test dari FAST feature detector mengambil sampel piksel arah timur, barat, selatan, dan utara untuk memeriksa apakah ada setidaknya 3 piksel “ekstrem”
- Di sini, piksel ekstrem adalah piksel yang selisih absolutnya terhadap piksel pusat melampaui ambang tertentu
- Karena setiap register vektor dapat menyimpan 16 nilai 8-bit, implementasi disusun untuk menghitung extrema count dari 16 piksel sekaligus
- Pada masing-masing arah timur, barat, selatan, dan utara, empat chunk piksel diambil sebagai sampel lalu dibandingkan dengan piksel pusat yang sesuai
Batasan SIMD ESP32-S3 dan cara mengakalinya
- Batasan pertama adalah ISA tidak mengizinkan misaligned read langsung
- Jika piksel pusat diasumsikan selaras, blok timur dan barat menjadi tidak selaras
- Blok timur dan barat diperoleh dengan menyambungkan dua register bersebelahan lalu mengekstrak sebagian slice melalui instruksi
- Batasan kedua adalah ESP32-S3 hanya mengimplementasikan perbandingan signed 8-bit
- Data piksel disimpan sebagai unsigned 8-bit, sehingga jika diinterpretasikan apa adanya sebagai signed, rentang
[128, 255]dipetakan secara nonlinier menjadi[-128, -1] - Dalam kondisi ini, operasi perbandingan tidak bekerja dengan benar
- Data piksel disimpan sebagai unsigned 8-bit, sehingga jika diinterpretasikan apa adanya sebagai signed, rentang
Menyesuaikan piksel unsigned dengan perbandingan signed
- Nilai piksel perlu dipindahkan dari
[0, 255]ke[-128, 127]agar perbandingan dan aritmetika bekerja secara bermakna - Sekilas cukup dengan mengurangi 128, tetapi operasi aritmetika SIMD ESP32-S3 semuanya merupakan saturating arithmetic, sehingga menimbulkan masalah
- Nilai piksel yang melebihi 127 tidak mengalami underflow dengan benar, melainkan di-clamp ke
-128
- Nilai piksel yang melebihi 127 tidak mengalami underflow dengan benar, melainkan di-clamp ke
- Solusinya adalah mengurangi 128 secara paralel tanpa instruksi pengurangan
- Pada signed 8-bit, nilai tempat bit paling signifikan adalah
-128 x - 128sama dengan membalik bit paling signifikan- Karena itu, digunakan relasi
x - 128 == x ^ 0x80
- Pada signed 8-bit, nilai tempat bit paling signifikan adalah
- Setiap kali nilai unsigned 8-bit dimuat, nilainya di-XOR dengan
0x80untuk dikonversi ke rentang linear yang memungkinkan aritmetika dan perbandingan
Hasil performa dan kemungkinan pemrosesan real-time
- FAST corner pre-test berakselerasi SIMD diimplementasikan dengan dua teknik pengakalan tersebut
- Scoring function berakselerasi SIMD juga ditulis dengan kombinasi operasi serupa, tetapi detailnya tidak dibahas
- Dalam pengujian, throughput FAST feature detector meningkat dari 5,1 MP/s menjadi 11,2 MP/s
- Throughput meningkat menjadi sekitar 220% dibanding sebelumnya
- Performa ini berada dalam kisaran yang dapat diterima untuk tugas computer vision real-time, dan memungkinkan ESP32-S3 menangani stream VGA 30 fps dengan mudah
1 komentar
Komentar Hacker News
Karena perusahaan-perusahaan besar mengeksploitasi perkebunan lokal dan pada dasarnya mempertahankan monopoli regional, sehingga perkebunan terpaksa menjual kepada mereka dengan harga jauh di bawah nilai sebenarnya
Negara-negara di seluruh dunia membeli barang seperti ini dalam skala miliaran unit untuk mengawasi warganya, dan Big Brother pada dasarnya menciptakan skala ekonomi yang luar biasa besar
Rasanya seperti Zynq versi murah untuk computer vision
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
https://www.aliexpress.us/item/3256806880637138.html
Varian S3 sangat layak dengan sedikit biaya tambahan, karena memiliki SIMD dan FPU sehingga mudah beberapa kali lipat lebih cepat, bahkan sampai satu digit kali lipat
https://github.com/espressif/esp-dl/tree/master/examples/fac...
Deteksi manusia 54 ms itu mengejutkan: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
Kami bekerja langsung dengan berbagai vendor untuk mengoptimalkan pada level rendah workload deep learning, computer vision, dan pemrosesan sinyal digital di puluhan mikrokontroler dan arsitektur CPU, akselerator khusus (termasuk komputasi neuromorfik), serta GPU edge
ESP32 juga termasuk: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
Cukup mengejutkan karena jika mengunggah model TensorFlow, PyTorch, atau JAX, Anda bisa langsung mendapatkan library C++ yang sudah dioptimalkan dari beberapa baris Python di laptop
Ada juga Studio untuk pelatihan model, serta optimasi hiperparameter sadar-hardware yang mencari model terbaik sesuai arsitektur yang dirancang agar berjalan baik di berbagai hardware embedded dan sesuai latensi serta penggunaan memori perangkat target
Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
Saya penasaran apakah chip di kisaran harga ini juga punya fitur mirip TPU
Neon adalah ekstensi instruksi SIMD opsional di ARMv7 dan ARMv8, jadi Pi Zero ke atas punya ekstensi SIMD
Saya memahami Orrin Nano memiliki 40 TOPS, sehingga sudah cukup untuk Copilot+. "A PCIe Coral TPU Finally Works on Raspberry Pi 5" https://news.ycombinator.com/item?id=38310063
Menurut https://phys.org/news/2024-06-infrared-visible-device-2d-mat..., panjang gelombang inframerah 1550 nm dikonversi naik menjadi cahaya tampak 622 nm, dan gelombang cahaya keluarannya dapat dideteksi oleh kamera berbasis silikon yang ada
Proses ini mempertahankan koherensi (coherent), sehingga jika pola tertentu disematkan pada frekuensi inframerah masukan, pola itu dikatakan otomatis ditransfer ke frekuensi keluaran yang baru
"Show HN: PicoVGA Library – VGA/TV Display on Raspberry Pi Pico" https://news.ycombinator.com/item?id=35117847#35120403
https://news.ycombinator.com/item?id=40275530
"Designing a SIMD Algorithm from Scratch" https://news.ycombinator.com/item?id=38450374
Instruksi SIMD pada ESP32-S3 tampaknya dirancang untuk mempercepat inferensi model AI terkuantisasi (https://github.com/espressif/esp-dl), dan juga mencakup pemrosesan sinyal seperti FFT
Dalam arti memiliki instruksi khusus yang membantu inferensi ML, ini bisa juga disebut mirip TPU. Misalnya, EE.VRELU.Sx menjalankan operasi ReLU
Namun, memakai instruksi seperti ini tetap mengonsumsi waktu CPU, sementara TPU biasanya berjalan secara asinkron sebagai inti pemrosesan terpisah, jadi ini lebih dekat ke ARM NEON
Perangkat lunak dan dokumentasinya cukup baik, tetapi sayangnya tidak menyebar luas
Saat ini mudah menemukan board pengembangan murah berbasis RV1103("LuckFox"), BL808("Ox64/Pine64"), dan CV1800B/SG20002("MilkV"), yang semuanya memiliki semacam fitur dasar mirip TPU
Namun, karena dirancang sebagai board Linux, hal-hal terkait TPU sangat diabstraksikan dan hampir tidak ada dokumentasi internal, sehingga sama sekali tidak jelas apakah itu benar-benar TPU atau sekadar tiruan melalui optimasi kode yang cerdik
MicroPython pada kesan pertama tampak cukup mudah didekati, dan saya penasaran apakah kodenya mudah di-port ke WebAssembly
Kasus penggunaan perangkat bisa dicoba di https://micropython.org/unicorn/
Untuk pengembangan sisi klien, ini bisa dipakai di PyScript, dan ada juga bridge JavaScript/DOM
https://pyscript.net/tech-preview/micropython/about.html
Rust no-std di ESP32 menurut pengalaman juga tidak buruk, tetapi bagian yang menghubungkannya dengan komponen seperti Wi-Fi, networking, atau kamera masih kurang matang
Seperti komentar lain, dukungan SIMD dan assembly di Rust juga memadai
Sebaiknya tanyakan di ruang chat Rust embedded atau Rust ESP32 sebelum masuk lebih dalam
Jika memasukkan banyak SIMD dan menggabungkannya dengan SMT-4 atau SMT-8, thread bisa menyembunyikan latensi sehingga kemungkinan area per performa menjadi lebih baik