3P by GN⁺ | ★ favorite | 댓글 1개
  • 저가 ESP32-S3의 128비트 SIMD 명령어로 FAST feature detector를 가속해, QVGA(320×240) 프레임을 약 6ms에 처리함
  • 이 칩은 최대 240MHz 듀얼코어 CPU, WiFi, Bluetooth Low Energy를 갖춘 마이크로컨트롤러이며, 기술 참조 매뉴얼에 제한적인 SIMD 지원이 포함돼 있음
  • 구현의 핵심은 FAST corner pre-test에서 16개의 8비트 픽셀을 한 번에 처리하는 것이지만, 정렬되지 않은 읽기와 signed 비교 제약을 우회해야 했음
  • unsigned 8-bit 픽셀을 signed 비교에 맞추기 위해 x - 128 == x ^ 0x80 성질을 이용해 값을 0x80 XOR로 변환함
  • 테스트 처리량은 5.1MP/s에서 11.2MP/s로 늘었고, ESP32-S3에서 30fps VGA 스트림 처리도 가능한 수준에 도달함

ESP32-S3에서 FAST feature detector 가속

  • ESP32-S3용 SIMD 가속 FAST feature detector가 구현됐고, 기준 구현 대비 대략 2배 성능을 냄
  • QVGA(320×240) 프레임 하나를 처리하는 데 약 6ms가 걸림
  • ESP32-S3는 저렴한 마이크로컨트롤러지만 최대 240MHz 듀얼코어 CPU와 WiFi, Bluetooth Low Energy를 포함함
  • ESP32-S3 technical reference manual에서 제한적인 SIMD 명령어 지원을 확인할 수 있음

덜 알려진 SIMD 명령어와 구현 준비

  • ESP32-S3의 SIMD 명령어는 비밀 기능은 아니지만 상대적으로 덜 알려져 있었음
  • 참고 가능한 예제는 세 가지로 정리됨
    • Larry Bank’s blog: 기능 탐색과 minimal example 제공
    • esp-dsp: convolution, FFT 같은 DSP 성격 기능에 사용되는 Espressif 라이브러리
    • esp-dl: 온칩 AI 가속에 사용되는 Espressif 라이브러리
  • 구현 과정에서 ESP32-S3 어셈블리 기본 구조를 익혔고, 자체 기본 레지스터 할당기 basm도 작성함

FAST corner pre-test의 SIMD 처리 방식

  • FAST feature detector의 corner pre-test는 동서남북 방향 픽셀을 샘플링해 “극단적인” 픽셀이 최소 3개인지 검사함
  • 여기서 극단적인 픽셀은 중심 픽셀과의 절대 차이가 특정 임계값을 넘는 픽셀임
  • 각 벡터 레지스터가 16개의 8비트 값을 저장할 수 있어, 한 번에 16개 픽셀의 extrema count를 계산하도록 구성함
  • 동서남북 각 방향에서 네 개의 픽셀 청크를 샘플링하고, 대응하는 중심 픽셀과 비교함

ESP32-S3 SIMD의 제약과 우회

  • 첫 번째 제약은 ISA가 직접적인 misaligned read를 허용하지 않는다는 점임
    • 중심 픽셀이 정렬돼 있다고 가정하면 동쪽과 서쪽 블록은 정렬되지 않음
    • 두 개의 인접 레지스터를 이어 붙인 뒤 일부 슬라이스를 추출하는 명령어로 동쪽·서쪽 블록을 얻음
  • 두 번째 제약은 ESP32-S3가 signed 8-bit 비교만 구현한다는 점임
    • 픽셀 데이터는 unsigned 8-bit로 저장되므로 그대로 signed로 해석하면 [128, 255] 범위가 [-128, -1]로 비선형 매핑됨
    • 이 상태에서는 비교 연산이 올바르게 동작하지 않음

unsigned 픽셀을 signed 비교에 맞추기

  • 픽셀 값을 [0, 255]에서 [-128, 127]로 옮겨야 비교와 산술이 의미 있게 동작함
  • 단순히 128을 빼면 될 것 같지만, ESP32-S3의 SIMD 산술 연산은 모두 saturating arithmetic이라 문제가 생김
    • 127을 넘는 픽셀 값은 올바르게 underflow하지 않고 -128로 clamp됨
  • 해결책은 뺄셈 명령어 없이 병렬로 128을 빼는 방식임
    • signed 8-bit에서 최상위 비트의 자리값은 -128
    • x - 128은 최상위 비트를 뒤집는 것과 같음
    • 따라서 x - 128 == x ^ 0x80 관계를 이용함
  • unsigned 8-bit 값을 로드할 때마다 0x80과 XOR해 산술과 비교가 가능한 선형 범위로 변환함

성능 결과와 실시간 처리 가능성

  • 두 가지 우회 기법으로 SIMD 가속 FAST corner pre-test를 구현함
  • 유사한 연산 조합으로 SIMD 가속 scoring function도 작성됐지만, 세부 내용은 다루지 않음
  • 테스트에서 FAST feature detector 처리량은 5.1MP/s에서 11.2MP/s로 증가함
  • 처리량은 기존 대비 약 220% 수준으로 늘어남
  • 이 성능은 실시간 컴퓨터 비전 작업에 허용 가능한 범위이며, ESP32-S3가 30fps VGA 스트림을 쉽게 처리할 수 있게 함

댓글과 토론

Hacker News 의견들
  • 평균 커피값보다 싼 실리콘이라면 꽤 멋지지만, 칩이 너무 싼 게 아니라 커피가 너무 비싼 걸지도 모름
    • Minority Report를 본 뒤로 OLED 동영상 광고가 나오는 일회용 커피컵을 기다려 왔는데, 기술 발전이 너무 느림
    • 커피도 사실은 지금보다 비싸야 할 가능성이 큼
      대기업들이 현지 농장을 착취하고 사실상 지역 독점을 유지해서, 농장들이 실제 가치보다 훨씬 낮은 가격에 그 기업들에 팔 수밖에 없게 만들기 때문임
    • 정확히는 커피 자체보다 누군가 만들어 주는 노동값에 가까움
    • 초저가 하드웨어로 컴퓨터 비전이 가능한 데에는 불편한 이유가 있음
      전 세계 국가들이 시민을 감시하려고 이런 물건을 수십억 개 단위로 구매하고 있고, 빅브라더가 엄청난 규모의 경제를 만들어 주는 셈임
  • 비슷한 보드로 ESP32-CAM이 있고, 이 실용적인 컴퓨터 비전 프로젝트가 지원함: https://github.com/jomjol/AI-on-the-edge-device?tab=readme-o...
  • ESP32-S3의 SIMD에 관한 짧은 글도 볼 만함. 예전에 논의된 적 있음: https://bitbanksoftware.blogspot.com/2024/01/surprise-esp32-...
  • 이런 주제에 관심 있고 직접 해보고 싶다면 우리 제품 Edge Impulse를 확인해보면 좋음: https://edgeimpulse.com/ai-practitioners
    여러 벤더와 직접 협업해서 수십 가지 마이크로컨트롤러·CPU 아키텍처, 특수 가속기(뉴로모픽 컴퓨팅 포함), 엣지 GPU에서 딥러닝·컴퓨터 비전·디지털 신호 처리 작업을 저수준 최적화함
    ESP32도 포함됨: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
    TensorFlow, PyTorch, JAX 모델을 업로드하면 노트북에서 몇 줄의 Python으로 최적화된 C++ 라이브러리를 바로 받을 수 있어서 꽤 놀라움
    모델 학습용 Studio도 있고, 여러 임베디드 하드웨어에서 잘 돌도록 설계한 아키텍처와 대상 장치의 지연시간·메모리 사용량에 맞춰 최적 모델을 찾는 하드웨어 인식 초매개변수 최적화도 제공함
    • 참고로 커뮤니티 플랜 제한 때문에 여기서 나온 출력물은 어떤 오픈소스 프로젝트에서도 쓰기 어려울 것 같음
    • 왜 C++임? 생성되는 C++ 코드가 어려운 C++ 기능을 쓰는지, 아니면 클래스가 있는 C에 가까운지 궁금함
  • FAST의 용도가 궁금함
    Features from accelerated segment test: https://en.wikipedia.org/wiki/Features_from_accelerated_segm...
    이 가격대 칩에도 TPU 비슷한 기능이 있는지 궁금함
    Neon은 ARMv7·ARMv8의 선택적 SIMD 명령어 확장이라 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 특징점 검출기는 이미지에서 시각적으로 두드러진 영역을 찾는 알고리즘이고, XR·로보틱스 등에서 흔한 움직임 추적과 SLAM의 첫 단계로 쓸 수 있음
      ESP32-S3의 SIMD 명령어는 양자화된 AI 모델 추론을 가속하도록 설계된 것으로 보이고(https://github.com/espressif/esp-dl), FFT 같은 신호 처리도 포함됨
      ML 추론을 돕는 특정 명령어가 있다는 의미에서는 TPU 비슷하다고 부를 수도 있음. 예를 들어 EE.VRELU.Sx가 ReLU 연산을 수행함
      다만 이런 명령어를 쓰면 여전히 CPU 시간이 소모되고, 보통 TPU는 별도 처리 코어로 비동기 동작하므로 ARM NEON에 더 가까움
    • 이 가격대 칩의 TPU 비슷한 기능으로는 Kendryte K210이 "TPU"에서 1x1·3x3 합성곱을 지원함
      소프트웨어와 문서화는 꽤 잘 되어 있었지만 아쉽게도 널리 퍼지지는 못함
      요즘은 RV1103("LuckFox"), BL808("Ox64/Pine64"), CV1800B/SG20002("MilkV") 기반 저가 개발 보드를 쉽게 찾을 수 있고, 모두 기본적인 TPU 비슷한 것을 갖고 있음
      다만 Linux 보드로 설계되어 TPU 관련 내용이 극도로 추상화되어 있고 내부 문서가 전혀 없다시피 해서, 실제 TPU인지 영리한 코드 최적화로 흉내 낸 것인지 전혀 불명확함
  • TinyML은 원리가 웹 기반 애플리케이션에도 직접 적용될 수 있어서 흥미로움
    MicroPython은 첫인상으로는 꽤 접근하기 쉬워 보이는데, 그 코드를 WebAssembly로 포팅하기 쉬울지 궁금함
  • 검출 창을 어느 정도 희생한다는 가정하에, 이런 보드 몇 개를 병렬로 사용해서 더 높은 해상도와 프레임률을 처리하는 게 얼마나 어려울지 궁금함
  • ESP32 컨트롤러에서 Rust를 써본 사람이 있다면, 이것도 Rust로 가능한지 궁금함
    • ESP8266에 비하면 ESP32의 Rust 지원은 전반적으로 꽤 좋지만, 표준 라이브러리를 쓰려면 C++ 도구체인을 끌어와야 할 가능성이 큼
      ESP32에서 Rust의 no-std도 경험상 나쁘지는 않지만, 특히 Wi-Fi·네트워킹이나 카메라 같은 구성 요소와 연결하는 부분은 아직 덜 다듬어져 있음
      다른 댓글처럼 Rust에서도 SIMD와 어셈블리 지원은 충분함
      본격적으로 들어가기 전에 Rust 임베디드나 Rust ESP32 채팅방에서 물어보는 게 좋겠음
    • 가능함. 주로 LLVM/clang 지원에 달려 있고, Rust의 어셈블리는 다루기 매우 쉬움
  • 잘못 읽은 게 아니라면 끝에서 두 번째 부분은 그냥 기본적인 2의 보수 아닌가?
  • 이런 유형의 처리에서는 SIMD가 SMT보다 앞서는 것 같음
    • SIMD와 SMT가 양자택일이라고 보지는 않음
      SIMD를 많이 넣고 SMT-4나 SMT-8을 함께 쓰면 스레드가 지연시간을 숨겨서 성능 대비 면적이 더 좋아질 가능성이 있음