Edge deployment

SLAMはクラウドでは動かない — ロボット、ドローン、ヘッドセット、あるいはスマートフォンの上で、厳しいレイテンシと電力の予算のもとで動く。**エッジデプロイメント(Edge deployment)**とは、知覚パイプライン(今日ではニューラルネットワークを含むことが増えている)を、NVIDIA Jetson、スマートフォンのSoC、XRヘッドセットなどの組み込み計算資源上でリアルタイムに動かすための技術である。

学習済みフロントエンドのエクスポート

現代のSLAMシステムは、手作りのコンポーネントをネットワークで置き換える。キーポイントにはSuperPoint、マッチングにはLightGlue/SuperGlue、密な事前情報には単眼深度ネットワークを用いる。これらはPyTorchで学習されるが、PyTorchは組み込みターゲット向けのランタイムとしては不向きである。標準的な経路は次の通り。

  1. ONNXへのエクスポート — フレームワーク中立なグラフ形式。このステップで問題が早期に表面化する。動的な形状(キーポイント数が可変!)、未サポートの演算、制御フローはすべて注意が必要である。

    torch.onnx.export(
        model, dummy_image, "superpoint.onnx",
        input_names=["image"],
        output_names=["scores", "descriptors"],
        dynamic_axes={"image": {2: "height", 3: "width"}},
    )
  2. TensorRTでコンパイル — NVIDIAの推論最適化器はレイヤーを融合し、高速なカーネルを選択し、FP16またはINT8に量子化することで、Jetson/RTX GPUで大幅な高速化を実現する。

    trtexec --onnx=superpoint.onnx --fp16 --saveEngine=superpoint.engine

    プラットフォームごとに代替手段が存在する。ポータブルなベースラインとしてのONNX Runtime、Apple製ハードウェア向けのCore ML、Androidスマートフォン向けのTFLite/NNAPIなどである。

  3. C++パイプラインへの統合 — コンパイルされたエンジンはSLAMフロントエンドから呼び出され、元の検出器/マッチャーを置き換える。理想的には、Jetsonのような統合メモリデバイス(CPUとGPUが物理メモリを共有するため、うまく配線されたパイプラインはフレームを一切コピーしない)上でゼロコピーの画像入力を行う。

実践における量子化。 FP16はGPU級のエッジハードウェアではほぼ無償で得られる高速化である。INT8は代表的な画像に対するキャリブレーションパスが必要である。SLAMフロントエンドにおける「代表的」とは自分のデプロイシーンを意味し、重要なチェック項目は分類的な精度スコアではなく、下流の品質(マッチングの内点率、トラッキングの安定性)である。Jetson級のモジュールにはさらに、対応するネットワークをGPUからオフロードできるDLAアクセラレータコアが搭載されている。

Jetsonでのベンチマーク

デスクトップGPUでの数値はエッジについてはほとんど何も語らない。Jetson級のデバイスでは、エンドツーエンドでベンチマークを行う。

正直な指標は、対象デバイス上で対象の電力モードにおける、熱くなった状態で測定したフルパイプラインのフレームレートである。

よくある落とし穴

SLAMにおける意義

「論文では30 FPSで動く」と「自分のロボットで動く」の間のギャップこそが、まさにこのトピックである。学習済みフロントエンドは、トラッキングとマッピングのスレッドと並んでエッジの予算に収まってこそ、実システムでの地位を得る。デプロイの制約(FP16/INT8、固定された入力サイズ、限られたメモリ帯域幅)は、しばしばSuperPointと、より軽量な検出器(例えばXFeat)のどちらを選ぶかを左右する。デバイス上でプロファイルし最適化できるエンジニアこそが、SLAMを実際に出荷できる人材である。

関連ノート