เร่งความเร็วคอมพิวเตอร์วิทัศน์ด้วย SIMD บน ESP32-S3 ราคา 2 ดอลลาร์
(shraiwi.github.io)- ใช้ คำสั่ง SIMD 128 บิต ของ ESP32-S3 ราคาถูกเพื่อเร่ง FAST feature detector ทำให้ประมวลผลเฟรม QVGA (320×240) ได้ในเวลาประมาณ 6ms
- ชิปนี้เป็นไมโครคอนโทรลเลอร์ที่มี CPU ดูอัลคอร์สูงสุด 240MHz, WiFi และ Bluetooth Low Energy โดยในคู่มืออ้างอิงทางเทคนิคมีการรองรับ SIMD แบบจำกัดรวมอยู่ด้วย
- หัวใจของการติดตั้งใช้งานคือการประมวลผล พิกเซล 8 บิต 16 ค่า พร้อมกันใน FAST corner pre-test แต่ต้องหลบเลี่ยงข้อจำกัดเรื่องการอ่านแบบไม่ตรงแนวและการเปรียบเทียบแบบ signed
- เพื่อให้พิกเซล unsigned 8-bit เข้ากับการเปรียบเทียบแบบ signed จึงใช้คุณสมบัติ
x - 128 == x ^ 0x80แปลงค่าด้วยการ XOR กับ 0x80 - throughput ในการทดสอบเพิ่มจาก 5.1MP/s เป็น 11.2MP/s และไปถึงระดับที่สามารถประมวลผลสตรีม VGA 30fps บน ESP32-S3 ได้
การเร่ง FAST feature detector บน ESP32-S3
- มีการติดตั้งใช้งาน FAST feature detector ที่เร่งด้วย SIMD สำหรับ ESP32-S3 และให้ประสิทธิภาพราว 2 เท่าเมื่อเทียบกับ implementation อ้างอิง
- ใช้เวลาประมาณ 6ms ในการประมวลผลเฟรม QVGA (320×240) หนึ่งเฟรม
- ESP32-S3 เป็นไมโครคอนโทรลเลอร์ราคาถูก แต่มี CPU ดูอัลคอร์สูงสุด 240MHz พร้อม WiFi และ Bluetooth Low Energy
- สามารถตรวจสอบการรองรับคำสั่ง SIMD แบบจำกัดได้จาก ESP32-S3 technical reference manual
คำสั่ง SIMD ที่ไม่ค่อยเป็นที่รู้จักและการเตรียม implementation
- คำสั่ง SIMD ของ ESP32-S3 ไม่ใช่ฟีเจอร์ลับ แต่ค่อนข้างไม่เป็นที่รู้จักมากนัก
- ตัวอย่างที่ใช้อ้างอิงได้สรุปเป็น 3 แหล่ง
- บล็อกของ Larry Bank: สำรวจฟีเจอร์และให้ minimal example
esp-dsp: ไลบรารีของ Espressif ที่ใช้กับฟังก์ชันลักษณะ DSP เช่น convolution และ FFTesp-dl: ไลบรารีของ Espressif ที่ใช้สำหรับการเร่ง AI บนชิป
- ระหว่างการติดตั้งใช้งาน ได้เรียนรู้โครงสร้างพื้นฐานของ assembly บน ESP32-S3 และยังเขียน register allocator พื้นฐานของตัวเองชื่อ
basm
วิธีประมวลผล SIMD ของ FAST corner pre-test
- corner pre-test ของ FAST feature detector จะสุ่มตัวอย่างพิกเซลในทิศตะวันออก ตะวันตก ใต้ และเหนือ เพื่อตรวจว่ามีพิกเซลที่ “สุดขั้ว” อย่างน้อย 3 จุดหรือไม่
- ในที่นี้ พิกเซลสุดขั้ว คือพิกเซลที่มีค่าส่วนต่างสัมบูรณ์จากพิกเซลตรงกลางเกินค่า threshold ที่กำหนด
- เนื่องจากแต่ละ vector register เก็บค่า 8 บิตได้ 16 ค่า จึงจัดให้คำนวณ extrema count ของ 16 พิกเซล ได้พร้อมกัน
- ในแต่ละทิศตะวันออก ตะวันตก ใต้ และเหนือ จะสุ่มตัวอย่าง chunk พิกเซล 4 ชุด แล้วเปรียบเทียบกับพิกเซลตรงกลางที่สอดคล้องกัน
ข้อจำกัดของ SIMD บน ESP32-S3 และวิธีหลบเลี่ยง
- ข้อจำกัดแรกคือ ISA ไม่อนุญาตให้ทำ misaligned read โดยตรง
- หากสมมติว่าพิกเซลตรงกลางถูกจัดแนวไว้แล้ว บล็อกทางตะวันออกและตะวันตกจะไม่ตรงแนว
- จึงได้บล็อกตะวันออกและตะวันตกโดยนำ register ที่อยู่ติดกัน 2 ตัวมาต่อกัน แล้วใช้คำสั่งที่ดึง slice บางส่วนออกมา
- ข้อจำกัดที่สองคือ ESP32-S3 ติดตั้งใช้งานเฉพาะ การเปรียบเทียบ signed 8-bit เท่านั้น
- ข้อมูลพิกเซลถูกเก็บเป็น unsigned 8-bit ดังนั้นหากตีความเป็น signed ตามเดิม ช่วง
[128, 255]จะถูกแมปแบบไม่เชิงเส้นเป็น[-128, -1] - ในสภาวะนี้ operation เปรียบเทียบจะทำงานไม่ถูกต้อง
- ข้อมูลพิกเซลถูกเก็บเป็น unsigned 8-bit ดังนั้นหากตีความเป็น signed ตามเดิม ช่วง
ทำให้พิกเซล unsigned เข้ากับการเปรียบเทียบแบบ signed
- ต้องย้ายค่าพิกเซลจาก
[0, 255]ไปเป็น[-128, 127]เพื่อให้การเปรียบเทียบและ arithmetic มีความหมายถูกต้อง - ดูเหมือนว่าแค่ลบ 128 ก็พอ แต่ operation arithmetic แบบ SIMD ของ ESP32-S3 ทั้งหมดเป็น saturating arithmetic จึงเกิดปัญหา
- ค่าพิกเซลที่เกิน 127 จะไม่ underflow อย่างถูกต้อง แต่จะถูก clamp เป็น
-128
- ค่าพิกเซลที่เกิน 127 จะไม่ underflow อย่างถูกต้อง แต่จะถูก clamp เป็น
- ทางแก้คือวิธีลบ 128 แบบขนานโดยไม่ใช้คำสั่งลบ
- ใน signed 8-bit ค่าประจำหลักของบิตสูงสุดคือ
-128 x - 128จึงเทียบเท่ากับการกลับบิตสูงสุด- ดังนั้นจึงใช้ความสัมพันธ์
x - 128 == x ^ 0x80
- ใน signed 8-bit ค่าประจำหลักของบิตสูงสุดคือ
- ทุกครั้งที่โหลดค่า unsigned 8-bit จะนำไป XOR กับ
0x80เพื่อแปลงเป็นช่วงเชิงเส้นที่ทำ arithmetic และเปรียบเทียบได้
ผลลัพธ์ด้านประสิทธิภาพและความเป็นไปได้ในการประมวลผลแบบเรียลไทม์
- ใช้เทคนิคหลบเลี่ยง 2 วิธีเพื่อติดตั้งใช้งาน FAST corner pre-test ที่เร่งด้วย SIMD
- ยังมีการเขียน scoring function ที่เร่งด้วย SIMD ด้วยชุด operation ที่คล้ายกัน แต่ไม่ได้ลงรายละเอียด
- ในการทดสอบ throughput ของ FAST feature detector เพิ่มจาก 5.1MP/s เป็น 11.2MP/s
- throughput เพิ่มขึ้นเป็นประมาณ 220% เมื่อเทียบกับเดิม
- ประสิทธิภาพนี้อยู่ในช่วงที่ยอมรับได้สำหรับงานคอมพิวเตอร์วิทัศน์แบบเรียลไทม์ และทำให้ ESP32-S3 สามารถประมวลผล สตรีม VGA 30fps ได้อย่างสบาย
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
เพราะบริษัทยักษ์ใหญ่เอาเปรียบไร่ในท้องถิ่นและแทบจะผูกขาดพื้นที่ ทำให้ไร่เหล่านั้นจำเป็นต้องขายให้บริษัทเหล่านั้นในราคาที่ต่ำกว่ามูลค่าจริงมาก
ประเทศต่าง ๆ ทั่วโลกกำลัง ซื้อของพวกนี้ทีละหลายพันล้านชิ้น เพื่อสอดส่องประชาชนของตนเอง และ Big Brother ก็เหมือนเป็นผู้สร้าง economies of scale ขนาดมหึมาให้
ให้ความรู้สึกเหมือน Zynq รุ่นประหยัดสำหรับคอมพิวเตอร์วิทัศน์
https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
https://www.aliexpress.us/item/3256806880637138.html
รุ่น S3 คุ้มกับค่าใช้จ่ายที่เพิ่มขึ้นเล็กน้อย เพราะมี SIMD และ FPU ทำให้เร็วขึ้นได้ง่าย ๆ หลายเท่าตัวในระดับเลขหลักเดียว
https://github.com/espressif/esp-dl/tree/master/examples/fac...
น่าทึ่งที่ตรวจจับคนได้ใน 54ms: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
เราทำงานโดยตรงกับผู้ขายหลายราย เพื่อปรับแต่งงาน deep learning, คอมพิวเตอร์วิทัศน์ และการประมวลผลสัญญาณดิจิทัลในระดับต่ำ ให้เหมาะกับไมโครคอนโทรลเลอร์และสถาปัตยกรรม CPU หลายสิบแบบ, accelerator เฉพาะทาง (รวมถึง neuromorphic computing) และ edge GPU
รวมถึง ESP32 ด้วย: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
ถ้าอัปโหลดโมเดล TensorFlow, PyTorch, JAX ก็สามารถรับไลบรารี C++ ที่ปรับแต่งแล้วได้ทันทีจาก Python ไม่กี่บรรทัดบนโน้ตบุ๊ก ซึ่งค่อนข้างน่าทึ่ง
นอกจากนี้ยังมี Studio สำหรับฝึกโมเดล และมี การปรับแต่งไฮเปอร์พารามิเตอร์แบบรับรู้ฮาร์ดแวร์ ที่ออกแบบมาให้ทำงานได้ดีบนฮาร์ดแวร์ฝังตัวหลายแบบ พร้อมค้นหาโมเดลที่ดีที่สุดให้ตรงกับ latency และการใช้หน่วยความจำของอุปกรณ์เป้าหมาย
Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
สงสัยว่าชิปในระดับราคานี้มีฟังก์ชันคล้าย TPU ด้วยหรือไม่
Neon เป็นส่วนขยายคำสั่ง SIMD แบบเลือกได้ของ ARMv7 และ ARMv8 ดังนั้นตั้งแต่ Pi Zero ขึ้นไปจึงมีส่วนขยาย SIMD
เข้าใจว่า Orrin Nano มี 40 TOPS ซึ่งเพียงพอสำหรับ Copilot+ แล้ว "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... มีการแปลงความยาวคลื่นอินฟราเรด 1550nm ขึ้นเป็นแสงที่มองเห็นได้ 622nm และคลื่นแสงเอาต์พุตสามารถตรวจจับได้ด้วยกล้องที่ใช้ซิลิคอนแบบเดิม
กระบวนการนี้คงความเป็น coherent ไว้ ดังนั้นหากฝังแพตเทิร์นเฉพาะลงในความถี่อินฟราเรดขาเข้า ก็จะถูกส่งต่อไปยังความถี่เอาต์พุตใหม่โดยอัตโนมัติ
"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
คำสั่ง SIMD ของ ESP32-S3 ดูเหมือนจะถูกออกแบบมาเพื่อเร่งการอนุมานโมเดล AI แบบ quantized (https://github.com/espressif/esp-dl) และยังรวมถึงการประมวลผลสัญญาณอย่าง FFT ด้วย
ในแง่ที่ว่ามีคำสั่งเฉพาะที่ช่วยงานอนุมาน ML ก็อาจเรียกได้ว่าคล้าย TPU เช่น EE.VRELU.Sx ทำการคำนวณ ReLU
แต่เมื่อใช้คำสั่งเหล่านี้ก็ยังคงกินเวลา CPU อยู่ และโดยปกติ TPU จะเป็นคอร์ประมวลผลแยกที่ทำงานแบบอะซิงโครนัส จึงใกล้เคียงกับ ARM NEON มากกว่า
ซอฟต์แวร์และเอกสารทำไว้ค่อนข้างดี แต่น่าเสียดายที่ไม่ได้แพร่หลายมากนัก
ทุกวันนี้หา dev board ราคาถูกที่ใช้ RV1103 ("LuckFox"), BL808 ("Ox64/Pine64"), CV1800B/SG20002 ("MilkV") ได้ง่าย และทั้งหมดมีสิ่งพื้นฐานที่คล้าย TPU
แต่เนื่องจากออกแบบมาเป็นบอร์ด Linux รายละเอียดเกี่ยวกับ TPU จึงถูกทำให้เป็น abstraction สูงมาก และแทบไม่มีเอกสารภายในเลย ทำให้ไม่ชัดเจนเลยว่ามันเป็น TPU จริง ๆ หรือเป็นการเลียนแบบด้วยการปรับแต่งโค้ดอย่างชาญฉลาด
จากความประทับใจแรก MicroPython ดูค่อนข้างเข้าถึงง่าย เลยสงสัยว่าจะพอร์ตโค้ดนั้นไปเป็น WebAssembly ได้ง่ายแค่ไหน
กรณีใช้งานบนอุปกรณ์สามารถทดลองได้ที่ https://micropython.org/unicorn/
สำหรับการพัฒนาฝั่งไคลเอนต์ สามารถใช้ใน PyScript ได้ และมีบริดจ์ JavaScript/DOM ด้วย
https://pyscript.net/tech-preview/micropython/about.html
no-std ของ Rust บน ESP32 จากประสบการณ์ก็ไม่ได้แย่ แต่ส่วนที่เชื่อมกับคอมโพเนนต์อย่าง Wi-Fi, networking หรือกล้อง ยังไม่ค่อยขัดเกลานัก
อย่างที่คอมเมนต์อื่นบอก การรองรับ SIMD และ assembly ใน Rust ก็เพียงพอ
ก่อนจะลงลึกจริงจัง ควรถามในห้องแชต Rust embedded หรือ Rust ESP32 ก่อนน่าจะดี
ถ้าใส่ SIMD เข้าไปเยอะ ๆ แล้วใช้ SMT-4 หรือ SMT-8 ร่วมด้วย เธรดอาจช่วยซ่อน latency ทำให้ ประสิทธิภาพต่อพื้นที่ ดีขึ้นได้