2 dolarlık ESP32-S3’te SIMD ile bilgisayarlı görü hızlandırma
(shraiwi.github.io)- Düşük maliyetli ESP32-S3’ün 128 bit SIMD komutları ile FAST feature detector hızlandırılarak QVGA (320×240) kareler yaklaşık 6 ms içinde işleniyor
- Bu çip, 240 MHz’e kadar çift çekirdekli CPU, WiFi ve Bluetooth Low Energy’ye sahip bir mikrodenetleyici; teknik başvuru kılavuzunda sınırlı SIMD desteği de yer alıyor
- Uygulamanın özü, FAST corner pre-test aşamasında 16 adet 8 bit pikseli tek seferde işlemek; ancak hizalanmamış okumalar ve signed karşılaştırma kısıtları aşılmak zorunda kalmış
- unsigned 8-bit pikselleri signed karşılaştırmaya uygun hale getirmek için
x - 128 == x ^ 0x80özelliğinden yararlanılarak değerler 0x80 XOR ile dönüştürülüyor - Testlerde işlem hacmi 5,1 MP/s’den 11,2 MP/s’ye çıktı ve ESP32-S3 üzerinde 30 fps VGA akışını işleyebilecek seviyeye ulaştı
ESP32-S3 üzerinde FAST feature detector hızlandırma
- ESP32-S3 için SIMD hızlandırmalı FAST feature detector uygulandı ve referans uygulamaya kıyasla yaklaşık 2 kat performans sağladı
- Bir QVGA (320×240) kareyi işlemek yaklaşık 6 ms sürüyor
- ESP32-S3 ucuz bir mikrodenetleyici olsa da 240 MHz’e kadar çift çekirdekli CPU ile WiFi ve Bluetooth Low Energy içeriyor
- ESP32-S3 technical reference manual içinde sınırlı SIMD komut desteği görülebiliyor
Daha az bilinen SIMD komutları ve uygulama hazırlığı
- ESP32-S3’ün SIMD komutları gizli bir özellik değil, ancak görece daha az biliniyordu
- Başvurulabilecek örnekler üç başlıkta toplanıyor
- Larry Bank’s blog: özellik keşfi ve minimal example sunuyor
esp-dsp: convolution, FFT gibi DSP nitelikli işlevlerde kullanılan Espressif kütüphanesiesp-dl: çip üzeri yapay zeka hızlandırmasında kullanılan Espressif kütüphanesi
- Uygulama sürecinde ESP32-S3 assembly’nin temel yapısı öğrenildi ve özel bir temel register allocator olan
basmde yazıldı
FAST corner pre-test’in SIMD ile işlenme biçimi
- FAST feature detector içindeki corner pre-test, doğu-batı-kuzey-güney yönlerindeki pikselleri örnekleyerek en az 3 “uç” piksel olup olmadığını kontrol eder
- Burada uç piksel, merkez piksele göre mutlak farkı belirli bir eşiği aşan pikseldir
- Her vektör register’ı 16 adet 8 bit değer saklayabildiğinden, tek seferde 16 pikselin extrema count değerini hesaplayacak şekilde yapılandırılmıştır
- Doğu-batı-kuzey-güney yönlerinin her birinde dört piksel parçası örneklenir ve karşılık gelen merkez pikselle karşılaştırılır
ESP32-S3 SIMD kısıtları ve etrafından dolaşma yöntemleri
- İlk kısıt, ISA’nın doğrudan misaligned read kullanımına izin vermemesidir
- Merkez piksellerin hizalı olduğu varsayılırsa doğu ve batı blokları hizalı olmaz
- Doğu ve batı blokları, bitişik iki register birleştirildikten sonra belirli bir dilimi çıkaran komutla elde edilir
- İkinci kısıt, ESP32-S3’ün yalnızca signed 8-bit karşılaştırma uygulamasıdır
- Piksel verisi unsigned 8-bit olarak saklandığından, doğrudan signed olarak yorumlanırsa
[128, 255]aralığı doğrusal olmayan biçimde[-128, -1]aralığına eşlenir - Bu durumda karşılaştırma işlemleri doğru çalışmaz
- Piksel verisi unsigned 8-bit olarak saklandığından, doğrudan signed olarak yorumlanırsa
unsigned pikselleri signed karşılaştırmaya uydurmak
- Karşılaştırma ve aritmetiğin anlamlı çalışması için piksel değerlerini
[0, 255]aralığından[-128, 127]aralığına taşımak gerekir - Basitçe 128 çıkarmak yeterli gibi görünse de ESP32-S3’ün SIMD aritmetik işlemlerinin tamamı saturating arithmetic olduğu için sorun çıkar
- 127’yi aşan piksel değerleri doğru şekilde underflow yapmaz,
-128değerine clamp edilir
- 127’yi aşan piksel değerleri doğru şekilde underflow yapmaz,
- Çözüm, çıkarma komutu kullanmadan paralel biçimde 128 çıkarmaktır
- signed 8-bit’te en yüksek bitin basamak değeri
-128’dir x - 128, en yüksek biti ters çevirmekle aynıdır- Bu nedenle
x - 128 == x ^ 0x80ilişkisinden yararlanılır
- signed 8-bit’te en yüksek bitin basamak değeri
- unsigned 8-bit değerler her yüklendiğinde
0x80ile XOR uygulanarak aritmetik ve karşılaştırmaya uygun doğrusal aralığa dönüştürülür
Performans sonuçları ve gerçek zamanlı işleme olanağı
- İki etrafından dolaşma tekniğiyle SIMD hızlandırmalı FAST corner pre-test uygulandı
- Benzer bir işlem kombinasyonuyla SIMD hızlandırmalı scoring function da yazıldı, ancak ayrıntıları ele alınmıyor
- Testlerde FAST feature detector işlem hacmi 5,1 MP/s’den 11,2 MP/s’ye yükseldi
- İşlem hacmi önceye kıyasla yaklaşık %220 seviyesine çıktı
- Bu performans, gerçek zamanlı bilgisayarlı görü işleri için kabul edilebilir aralıktadır ve ESP32-S3’ün 30 fps VGA akışını kolayca işleyebilmesini sağlar
1 yorum
Hacker News yorumları
Çünkü büyük şirketler yerel çiftlikleri sömürüyor ve fiilen bölgesel tekellerini koruyarak çiftlikleri gerçek değerlerinin çok altında fiyatlarla bu şirketlere satmaya mecbur bırakıyor
Dünyadaki ülkeler vatandaşlarını gözetlemek için bu tür şeyleri milyarlarca adet satın alıyor; Big Brother muazzam bir ölçek ekonomisi yaratıyor
Bilgisayarlı görü için düşük maliyetli bir Zynq gibi hissettiriyor
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
https://www.aliexpress.us/item/3256806880637138.html
S3 varyantı küçük ek maliyeti fazlasıyla haklı çıkarıyor; SIMD ve FPU olduğu için kolayca tek haneli katlar düzeyinde daha hızlı
https://github.com/espressif/esp-dl/tree/master/examples/fac...
İnsan tespitinin 54ms sürmesi şaşırtıcı: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
Birçok tedarikçiyle doğrudan çalışarak onlarca mikrodenetleyici ve CPU mimarisinde, özel hızlandırıcılarda (nöromorfik bilişim dahil) ve edge GPU'larda derin öğrenme, bilgisayarlı görü ve dijital sinyal işleme işlerini düşük seviyede optimize ediyoruz
ESP32 de dahil: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
TensorFlow, PyTorch, JAX modellerini yükleyince dizüstü bilgisayarda birkaç satır Python ile optimize edilmiş bir C++ kütüphanesini hemen alabilmek oldukça şaşırtıcı
Model eğitimi için Studio da var; ayrıca çeşitli gömülü donanımlarda iyi çalışacak şekilde tasarlanmış mimariler ve hedef cihazın gecikme ile bellek kullanımına göre en iyi modeli bulan donanım farkındalıklı hiperparametre optimizasyonu da sunuyor
Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
Bu fiyat aralığındaki çiplerde TPU benzeri bir işlev olup olmadığını merak ediyorum
Neon, ARMv7 ve ARMv8'in isteğe bağlı SIMD komut kümesi uzantısı olduğundan Pi Zero ve üzeri modellerde SIMD uzantısı var
Orrin Nano 40 TOPS olduğu için Copilot+ için yeterli seviyede diye anlıyorum. "A PCIe Coral TPU Finally Works on Raspberry Pi 5" https://news.ycombinator.com/item?id=38310063
https://phys.org/news/2024-06-infrared-visible-device-2d-mat... adresine göre kızılötesi 1550nm dalga boyu 622nm görünür ışığa yukarı dönüştürülmüş ve çıkan ışık dalgası mevcut silikon tabanlı kameralarla algılanabiliyor
Bu süreç eşevreliği (coherent) koruduğu için, giriş kızılötesi frekansına belirli bir desen işlenirse bunun yeni çıkış frekansına otomatik olarak aktarıldığı söyleniyor
"Show HN: PicoVGA Library – Raspberry Pi Pico’da VGA/TV Görüntü" 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
ESP32-S3’ün SIMD komutları, kuantize edilmiş yapay zeka model çıkarımını hızlandırmak için tasarlanmış görünüyor (https://github.com/espressif/esp-dl); FFT gibi sinyal işleme işleri de buna dahil
ML çıkarımına yardımcı olan belirli komutların bulunması anlamında TPU’ya benzer denebilir. Örneğin EE.VRELU.Sx, ReLU işlemini gerçekleştiriyor
Ancak bu komutları kullanmak hâlâ CPU zamanı tüketiyor ve TPU’lar genellikle ayrı bir işlem çekirdeği olarak asenkron çalıştığından ARM NEON’a daha yakın
Yazılımı ve dokümantasyonu oldukça iyiydi ama ne yazık ki geniş yayılım gösteremedi
Günümüzde RV1103 ("LuckFox"), BL808 ("Ox64/Pine64"), CV1800B/SG20002 ("MilkV") tabanlı ucuz geliştirme kartlarını kolayca bulmak mümkün; hepsinde temel düzeyde TPU benzeri bir şey var
Ancak Linux kartı olarak tasarlandıkları için TPU ile ilgili kısımlar aşırı derecede soyutlanmış durumda ve iç dokümantasyon neredeyse hiç yok; bu yüzden gerçekten TPU mu, yoksa akıllıca kod optimizasyonlarıyla taklit edilen bir şey mi olduğu hiç belli değil
MicroPython ilk bakışta oldukça erişilebilir görünüyor; bu kodu WebAssembly’ye taşımanın kolay olup olmayacağını merak ediyorum
Cihaz kullanım senaryosunu https://micropython.org/unicorn/ üzerinden deneyebilirsiniz
İstemci tarafı geliştirmede PyScript içinde kullanılabiliyor ve JavaScript/DOM köprüsü de var
https://pyscript.net/tech-preview/micropython/about.html
ESP32’de Rust no-std deneyimi de fena değil; fakat özellikle Wi-Fi/ağ, kamera gibi bileşenlere bağlanma tarafı hâlâ pek cilalanmış değil
Diğer yorumda söylendiği gibi Rust’ta da SIMD ve assembly desteği yeterli
Ciddi biçimde dalmadan önce Rust embedded veya Rust ESP32 sohbet odalarında sormak iyi olur
Bolca SIMD ekleyip SMT-4 veya SMT-8’i birlikte kullanırsanız, iş parçacıkları gecikmeyi gizleyerek performansa göre alan oranını daha iyi hâle getirebilir