3 ポイント 投稿者 GN⁺ 2024-06-26 | 1件のコメント | WhatsAppで共有
  • 低価格な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)フレーム1枚の処理に約6msかかる
  • ESP32-S3は安価なマイクロコントローラだが、最大240MHzのデュアルコアCPUとWiFi、Bluetooth Low Energyを含む
  • ESP32-S3 technical reference manual で限定的なSIMD命令サポートを確認できる

あまり知られていないSIMD命令と実装準備

  • ESP32-S3のSIMD命令は隠し機能ではないが、比較的あまり知られていなかった
  • 参考にできる例は3つに整理される
    • 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を計算する構成になっている
  • 東西南北それぞれの方向から4つのピクセルチャンクをサンプリングし、対応する中心ピクセルと比較する

ESP32-S3 SIMDの制約と回避策

  • 1つ目の制約は、ISAが直接的なmisaligned readを許可していない点
    • 中心ピクセルがアラインされていると仮定すると、東側と西側のブロックはアラインされない
    • 2つの隣接レジスタを連結してから一部スライスを抽出する命令で、東側・西側ブロックを得る
  • 2つ目の制約は、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し、算術と比較が可能な線形範囲へ変換する

性能結果とリアルタイム処理の可能性

  • 2つの回避手法によりSIMD高速化FAST corner pre-testを実装
  • 類似した演算の組み合わせでSIMD高速化scoring functionも作成されたが、詳細は扱わない
  • テストではFAST feature detectorの処理量が5.1MP/sから11.2MP/sへ増加
  • 処理量は従来比で約**220%**に増加
  • この性能はリアルタイムのコンピュータビジョン作業に十分許容できる範囲であり、ESP32-S3が30fpsのVGAストリームを容易に処理できるようにする

1件のコメント

 
GN⁺ 2024-06-26
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 のモデルをアップロードすると、ノートPC上で数行の 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は、その原理をWebベースのアプリケーションにも直接適用できるので興味深い
    MicroPythonは第一印象ではかなり取っつきやすそうに見えるが、そのコードをWebAssemblyへ移植しやすいのか気になる
  • 検出ウィンドウをある程度犠牲にする前提で、こうしたボードをいくつか並列に使って、より高い解像度とフレームレートを処理するのはどれほど難しいのか気になる
  • ESP32コントローラでRustを使ったことがある人がいれば、これもRustで可能なのか気になる
    • ESP8266に比べるとESP32のRustサポートは全体的にかなり良いが、標準ライブラリを使うにはC++ツールチェインを引っ張ってくる必要がある可能性が高い
      ESP32でのRustのno-stdも経験上悪くはないが、特にWi-Fi・ネットワーキングやカメラのようなコンポーネントとつなぐ部分は、まだ洗練されていない
      別のコメントにもあるように、RustでもSIMDとアセンブリのサポートは十分ある
      本格的に取り組む前に、Rust EmbeddedやRust ESP32のチャットルームで聞いてみるとよさそう
    • 可能。主にLLVM/clangサポートに依存しており、Rustのアセンブリは非常に扱いやすい
  • 読み違えていなければ、最後から2番目の部分は単なる基本的な2の補数ではないのか?
  • この種の処理では、SIMDはSMTより優位に見える
    • SIMDとSMTが二者択一だとは思わない
      SIMDを多めに入れ、SMT-4やSMT-8を併用すれば、スレッドがレイテンシを隠して性能対面積比がさらに良くなる可能性がある