3 คะแนน โดย GN⁺ 2024-06-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้ คำสั่ง 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 และ FFT
    • esp-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 เข้ากับการเปรียบเทียบแบบ signed

  • ต้องย้ายค่าพิกเซลจาก [0, 255] ไปเป็น [-128, 127] เพื่อให้การเปรียบเทียบและ arithmetic มีความหมายถูกต้อง
  • ดูเหมือนว่าแค่ลบ 128 ก็พอ แต่ operation arithmetic แบบ SIMD ของ ESP32-S3 ทั้งหมดเป็น saturating arithmetic จึงเกิดปัญหา
    • ค่าพิกเซลที่เกิน 127 จะไม่ underflow อย่างถูกต้อง แต่จะถูก clamp เป็น -128
  • ทางแก้คือวิธีลบ 128 แบบขนานโดยไม่ใช้คำสั่งลบ
    • ใน signed 8-bit ค่าประจำหลักของบิตสูงสุดคือ -128
    • x - 128 จึงเทียบเท่ากับการกลับบิตสูงสุด
    • ดังนั้นจึงใช้ความสัมพันธ์ x - 128 == x ^ 0x80
  • ทุกครั้งที่โหลดค่า 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 ความคิดเห็น

 
GN⁺ 2024-06-26
ความคิดเห็นบน Hacker News
  • ถ้าเป็นซิลิคอนที่ถูกกว่าค่ากาแฟเฉลี่ยก็นับว่าเจ๋งทีเดียว แต่บางทีอาจไม่ใช่ว่าชิปถูกเกินไป แต่เป็นเพราะ กาแฟแพงเกินไป ก็ได้
    • ตั้งแต่ดู Minority Report มา ก็รอ แก้วกาแฟใช้แล้วทิ้งที่มีโฆษณาวิดีโอ OLED อยู่ แต่เทคโนโลยีพัฒนาช้าเกินไป
    • จริง ๆ แล้วกาแฟอาจควรแพงกว่าตอนนี้ด้วยซ้ำ
      เพราะบริษัทยักษ์ใหญ่เอาเปรียบไร่ในท้องถิ่นและแทบจะผูกขาดพื้นที่ ทำให้ไร่เหล่านั้นจำเป็นต้องขายให้บริษัทเหล่านั้นในราคาที่ต่ำกว่ามูลค่าจริงมาก
    • พูดให้ตรงกว่านั้น มันใกล้เคียงกับ ค่าแรงของคนที่ชงให้ มากกว่าตัวกาแฟเอง
    • มีเหตุผลที่ชวนอึดอัดอยู่เบื้องหลังการที่ฮาร์ดแวร์ราคาถูกมากสามารถทำคอมพิวเตอร์วิทัศน์ได้
      ประเทศต่าง ๆ ทั่วโลกกำลัง ซื้อของพวกนี้ทีละหลายพันล้านชิ้น เพื่อสอดส่องประชาชนของตนเอง และ Big Brother ก็เหมือนเป็นผู้สร้าง economies of scale ขนาดมหึมาให้
  • มีบอร์ดที่คล้ายกันชื่อ ESP32-CAM และโปรเจกต์คอมพิวเตอร์วิทัศน์ที่ใช้งานได้จริงนี้รองรับ: https://github.com/jomjol/AI-on-the-edge-device?tab=readme-o...
    • ช่วงหลังผมสั่งบอร์ดราคาถูกสำหรับงานคอมพิวเตอร์วิทัศน์ที่มี FPGA + ARM Cortex-M3 + 64Mbit SRAM + 32Mbit flash อยู่ในตัว และรองรับอินพุตกล้องกับเอาต์พุต HDMI
      ให้ความรู้สึกเหมือน Zynq รุ่นประหยัดสำหรับคอมพิวเตอร์วิทัศน์
      https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-4K/Nano-4...
      https://www.aliexpress.us/item/3256806880637138.html
    • บอร์ด breakout สำหรับกล้องตัวนี้ก็มี เวอร์ชัน ESP32-S3 ด้วย และผู้เขียนต้นฉบับน่าจะใช้กับต้นแบบ
      รุ่น S3 คุ้มกับค่าใช้จ่ายที่เพิ่มขึ้นเล็กน้อย เพราะมี SIMD และ FPU ทำให้เร็วขึ้นได้ง่าย ๆ หลายเท่าตัวในระดับเลขหลักเดียว
      https://github.com/espressif/esp-dl/tree/master/examples/fac...
    • เพิ่งรู้ตอนนี้ว่า TensorFlow Lite รันบน ESP32 ได้
      น่าทึ่งที่ตรวจจับคนได้ใน 54ms: https://github.com/espressif/esp-tflite-micro?tab=readme-ov-...
    • โปรเจกต์นั้นทำได้ถึง กี่เฟรมต่อวินาที?
  • บทความสั้น ๆ เกี่ยวกับ SIMD ของ ESP32-S3 ก็น่าอ่าน เคยมีการคุยกันมาก่อน: https://bitbanksoftware.blogspot.com/2024/01/surprise-esp32-...
  • ถ้าสนใจหัวข้อแบบนี้และอยากลองทำเอง แนะนำให้ดูผลิตภัณฑ์ของเรา Edge Impulse: https://edgeimpulse.com/ai-practitioners
    เราทำงานโดยตรงกับผู้ขายหลายราย เพื่อปรับแต่งงาน 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 และการใช้หน่วยความจำของอุปกรณ์เป้าหมาย
    • หมายเหตุว่าเพราะ ข้อจำกัดของแผน Community ดูเหมือนว่าเอาต์พุตที่ได้จากที่นี่จะใช้งานในโปรเจกต์โอเพนซอร์สใด ๆ ได้ยาก
    • ทำไมต้องเป็น C++? อยากรู้ว่าโค้ด C++ ที่สร้างออกมาใช้ฟีเจอร์ C++ ที่ซับซ้อนหรือเปล่า หรือใกล้เคียงกับ C ที่มีคลาส มากกว่า
  • สงสัยว่า FAST ใช้ทำอะไร
    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

  • ตัวตรวจจับจุดเด่น FAST เป็นอัลกอริทึมที่ค้นหาบริเวณที่โดดเด่นทางสายตาในภาพ และสามารถใช้เป็นขั้นตอนแรกของการติดตามการเคลื่อนไหวและ SLAM ซึ่งพบได้ทั่วไปใน XR, หุ่นยนต์ ฯลฯ
    คำสั่ง SIMD ของ ESP32-S3 ดูเหมือนจะถูกออกแบบมาเพื่อเร่งการอนุมานโมเดล AI แบบ quantized (https://github.com/espressif/esp-dl) และยังรวมถึงการประมวลผลสัญญาณอย่าง FFT ด้วย
    ในแง่ที่ว่ามีคำสั่งเฉพาะที่ช่วยงานอนุมาน ML ก็อาจเรียกได้ว่าคล้าย TPU เช่น EE.VRELU.Sx ทำการคำนวณ ReLU
    แต่เมื่อใช้คำสั่งเหล่านี้ก็ยังคงกินเวลา CPU อยู่ และโดยปกติ TPU จะเป็นคอร์ประมวลผลแยกที่ทำงานแบบอะซิงโครนัส จึงใกล้เคียงกับ ARM NEON มากกว่า
  • สำหรับฟีเจอร์ที่คล้าย TPU ในชิปราคาระดับนี้ Kendryte K210 รองรับคอนโวลูชัน 1x1 และ 3x3 บน "TPU"
    ซอฟต์แวร์และเอกสารทำไว้ค่อนข้างดี แต่น่าเสียดายที่ไม่ได้แพร่หลายมากนัก
    ทุกวันนี้หา dev board ราคาถูกที่ใช้ RV1103 ("LuckFox"), BL808 ("Ox64/Pine64"), CV1800B/SG20002 ("MilkV") ได้ง่าย และทั้งหมดมีสิ่งพื้นฐานที่คล้าย TPU
    แต่เนื่องจากออกแบบมาเป็นบอร์ด Linux รายละเอียดเกี่ยวกับ TPU จึงถูกทำให้เป็น abstraction สูงมาก และแทบไม่มีเอกสารภายในเลย ทำให้ไม่ชัดเจนเลยว่ามันเป็น TPU จริง ๆ หรือเป็นการเลียนแบบด้วยการปรับแต่งโค้ดอย่างชาญฉลาด
  • TinyML น่าสนใจเพราะหลักการของมันสามารถนำไปใช้กับแอปพลิเคชันบนเว็บได้โดยตรง
    จากความประทับใจแรก MicroPython ดูค่อนข้างเข้าถึงง่าย เลยสงสัยว่าจะพอร์ตโค้ดนั้นไปเป็น WebAssembly ได้ง่ายแค่ไหน
    • พอร์ต WASM/JS ของ MicroPython มีอยู่แล้ว
      กรณีใช้งานบนอุปกรณ์สามารถทดลองได้ที่ https://micropython.org/unicorn/
      สำหรับการพัฒนาฝั่งไคลเอนต์ สามารถใช้ใน PyScript ได้ และมีบริดจ์ JavaScript/DOM ด้วย
      https://pyscript.net/tech-preview/micropython/about.html
  • ถ้ายอมเสียสละหน้าต่างตรวจจับไปบ้าง ผมสงสัยว่าจะยากแค่ไหนในการใช้บอร์ดแบบนี้หลายตัว ทำงานแบบขนาน เพื่อประมวลผลความละเอียดและเฟรมเรตที่สูงขึ้น
  • ถ้ามีใครเคยใช้ Rust บนคอนโทรลเลอร์ ESP32 ก็สงสัยว่าสิ่งนี้ทำด้วย Rust ได้ไหม
    • เมื่อเทียบกับ ESP8266 แล้ว การรองรับ Rust บน ESP32 โดยรวมค่อนข้างดี แต่ถ้าต้องการใช้ไลบรารีมาตรฐานก็มีโอกาสสูงที่จะต้องดึง toolchain ของ C++ เข้ามาด้วย
      no-std ของ Rust บน ESP32 จากประสบการณ์ก็ไม่ได้แย่ แต่ส่วนที่เชื่อมกับคอมโพเนนต์อย่าง Wi-Fi, networking หรือกล้อง ยังไม่ค่อยขัดเกลานัก
      อย่างที่คอมเมนต์อื่นบอก การรองรับ SIMD และ assembly ใน Rust ก็เพียงพอ
      ก่อนจะลงลึกจริงจัง ควรถามในห้องแชต Rust embedded หรือ Rust ESP32 ก่อนน่าจะดี
    • ทำได้ โดยหลัก ๆ ขึ้นอยู่กับการรองรับของ LLVM/clang และ assembly ของ Rust ก็จัดการได้ง่ายมาก
  • ถ้าผมไม่ได้อ่านผิด ส่วนก่อนสุดท้ายนั่นก็แค่ two's complement พื้นฐานไม่ใช่หรือ?
  • ในการประมวลผลประเภทนี้ ดูเหมือนว่า SIMD จะนำหน้า SMT
    • ผมไม่คิดว่า SIMD กับ SMT เป็นตัวเลือกที่ต้องเลือกอย่างใดอย่างหนึ่ง
      ถ้าใส่ SIMD เข้าไปเยอะ ๆ แล้วใช้ SMT-4 หรือ SMT-8 ร่วมด้วย เธรดอาจช่วยซ่อน latency ทำให้ ประสิทธิภาพต่อพื้นที่ ดีขึ้นได้