2ドルのESP32-S3でSIMDによりコンピュータビジョンを高速化
(shraiwi.github.io)- 低価格な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 8-bitで保存されるため、そのままsignedとして解釈すると
unsignedピクセルをsigned比較に合わせる
- ピクセル値を
[0, 255]から[-128, 127]に移す必要があり、そうすることで比較と算術が意味を持って動作する - 単純に128を引けばよさそうだが、ESP32-S3のSIMD算術演算はすべてsaturating arithmeticなので問題が生じる
- 127を超えるピクセル値は正しくunderflowせず、
-128にclampされる
- 127を超えるピクセル値は正しくunderflowせず、
- 解決策は、減算命令を使わずに並列で128を引く方法
- signed 8-bitでは最上位ビットの桁値は
-128 x - 128は最上位ビットを反転するのと同じ- したがって
x - 128 == x ^ 0x80の関係を利用する
- signed 8-bitでは最上位ビットの桁値は
- 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件のコメント
Hacker News のコメント
大企業が現地の農園を搾取し、事実上の地域独占を維持しているため、農園側は本来の価値を大きく下回る価格でその企業に売らざるを得ないから
世界中の国家が市民を監視するためにこうしたものを数十億個単位で購入しており、ビッグブラザーが巨大な規模の経済を生み出しているようなもの
コンピュータビジョン向けの低価格版 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-...
複数のベンダーと直接協業し、数十種類のマイクロコントローラ・CPUアーキテクチャ、特殊アクセラレータ(ニューロモーフィックコンピューティングを含む)、エッジ GPU 上で、ディープラーニング・コンピュータビジョン・デジタル信号処理の処理を低レベルで最適化している
ESP32 も含まれる: https://docs.edgeimpulse.com/docs/edge-ai-hardware/mcu/espre...
TensorFlow、PyTorch、JAX のモデルをアップロードすると、ノートPC上で数行の Python だけで最適化済みの C++ ライブラリをすぐ受け取れるので、かなり驚く
モデル学習用の Studio もあり、複数の組み込みハードウェアでうまく動くよう設計したアーキテクチャと、対象デバイスのレイテンシ・メモリ使用量に合わせて最適なモデルを見つけるハードウェア認識型ハイパーパラメータ最適化も提供している
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
ESP32-S3のSIMD命令は、量子化されたAIモデルの推論を高速化するよう設計されているように見え(https://github.com/espressif/esp-dl)、FFTのような信号処理も含まれる
ML推論を支援する特定の命令があるという意味では、TPUに似ていると呼ぶこともできる。たとえばEE.VRELU.SxはReLU演算を行う
ただし、こうした命令を使ってもCPU時間は依然として消費されるし、通常TPUは別個の処理コアとして非同期に動作するため、ARM NEONにより近い
ソフトウェアとドキュメントはかなりよく整備されていたが、残念ながら広く普及するには至らなかった
最近はRV1103("LuckFox")、BL808("Ox64/Pine64")、CV1800B/SG20002("MilkV")ベースの低価格開発ボードを簡単に見つけられ、いずれも基本的なTPU風のものを備えている
ただしLinuxボードとして設計されているため、TPU関連の内容は極度に抽象化されており、内部ドキュメントもほとんど存在しないので、実際のTPUなのか、巧妙なコード最適化でそれらしく見せているのかはまったく不明
MicroPythonは第一印象ではかなり取っつきやすそうに見えるが、そのコードをWebAssemblyへ移植しやすいのか気になる
デバイス用途は https://micropython.org/unicorn/ で試せる
クライアントサイド開発ではPyScriptで使え、JavaScript/DOMブリッジもある
https://pyscript.net/tech-preview/micropython/about.html
ESP32でのRustのno-stdも経験上悪くはないが、特にWi-Fi・ネットワーキングやカメラのようなコンポーネントとつなぐ部分は、まだ洗練されていない
別のコメントにもあるように、RustでもSIMDとアセンブリのサポートは十分ある
本格的に取り組む前に、Rust EmbeddedやRust ESP32のチャットルームで聞いてみるとよさそう
SIMDを多めに入れ、SMT-4やSMT-8を併用すれば、スレッドがレイテンシを隠して性能対面積比がさらに良くなる可能性がある