3 poin oleh GN⁺ 2024-06-26 | 1 komentar | Bagikan ke WhatsApp
  • 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 FFT
    • esp-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 basm juga 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

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
  • Solusinya adalah mengurangi 128 secara paralel tanpa instruksi pengurangan
    • Pada signed 8-bit, nilai tempat bit paling signifikan adalah -128
    • x - 128 sama dengan membalik bit paling signifikan
    • Karena itu, digunakan relasi x - 128 == x ^ 0x80
  • Setiap kali nilai unsigned 8-bit dimuat, nilainya di-XOR dengan 0x80 untuk 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

 
GN⁺ 2024-06-26
Komentar Hacker News
  • Kalau ini silikon yang lebih murah daripada harga rata-rata kopi, itu cukup keren, tetapi mungkin bukan chip-nya yang terlalu murah, melainkan kopinya yang terlalu mahal
    • Sejak menonton Minority Report, saya sudah menunggu gelas kopi sekali pakai dengan iklan video OLED, tetapi perkembangan teknologinya terlalu lambat
    • Kopi sebenarnya mungkin memang seharusnya lebih mahal daripada sekarang
      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
    • Lebih tepatnya, ini lebih dekat ke biaya tenaga kerja seseorang yang membuatkannya daripada kopi itu sendiri
    • Ada alasan yang tidak nyaman mengapa computer vision bisa dilakukan dengan hardware supermurah
      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
  • Ada board serupa bernama ESP32-CAM, dan proyek computer vision praktis ini mendukungnya: https://github.com/jomjol/AI-on-the-edge-device?tab=readme-o...
  • Tulisan singkat tentang SIMD di ESP32-S3 juga layak dibaca. Pernah dibahas sebelumnya: https://bitbanksoftware.blogspot.com/2024/01/surprise-esp32-...
  • Kalau tertarik dengan topik seperti ini dan ingin mencobanya sendiri, ada baiknya melihat produk kami Edge Impulse: https://edgeimpulse.com/ai-practitioners
    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
    • Sebagai catatan, karena batasan paket komunitas, output dari sini sepertinya sulit dipakai di proyek open source mana pun
    • Kenapa C++? Saya penasaran apakah kode C++ yang dihasilkan memakai fitur C++ yang sulit, atau lebih dekat ke C dengan class
  • Saya penasaran FAST dipakai untuk apa
    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

  • Detektor fitur FAST adalah algoritma untuk menemukan area yang menonjol secara visual dalam gambar, dan bisa digunakan sebagai tahap awal pelacakan gerakan serta SLAM yang umum di XR, robotika, dan lain-lain
    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
  • Untuk fitur mirip TPU pada chip di kisaran harga ini, Kendryte K210 mendukung konvolusi 1x1 dan 3x3 di "TPU"-nya
    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
  • TinyML menarik karena prinsipnya bisa diterapkan langsung juga pada aplikasi berbasis web
    MicroPython pada kesan pertama tampak cukup mudah didekati, dan saya penasaran apakah kodenya mudah di-port ke WebAssembly
  • Dengan asumsi sedikit mengorbankan jendela deteksi, saya penasaran seberapa sulit memproses resolusi dan frame rate yang lebih tinggi dengan menggunakan beberapa board seperti ini secara paralel
  • Kalau ada yang pernah memakai Rust di kontroler ESP32, saya penasaran apakah ini juga bisa dilakukan dengan Rust
    • Dibandingkan ESP8266, dukungan Rust untuk ESP32 secara umum cukup baik, tetapi untuk memakai standard library kemungkinan besar perlu menarik toolchain C++
      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
    • Bisa. Ini terutama bergantung pada dukungan LLVM/clang, dan assembly di Rust sangat mudah ditangani
  • Kalau saya tidak salah baca, bagian kedua dari akhir itu bukankah hanya komplemen dua dasar?
  • Untuk jenis pemrosesan seperti ini, tampaknya SIMD lebih unggul daripada SMT
    • Saya tidak melihat SIMD dan SMT sebagai pilihan yang saling meniadakan
      Jika memasukkan banyak SIMD dan menggabungkannya dengan SMT-4 atau SMT-8, thread bisa menyembunyikan latensi sehingga kemungkinan area per performa menjadi lebih baik