VLA 推論の高速化

細かい話題を束ねた概念ページ。各節は元は独立ページだった。

Real-time Chunking (RTC)

フローマッチングベースの行動チャンク方策を、推論レイテンシ下でも滑らかに継続実行するための非同期アルゴリズム。Kevin Black, Sergey Levine ら(Physical Intelligence)による “Real-time Execution of Action Chunking Flow Policies” / “Training-time action conditioning for efficient real-time chunking”(arXiv:2512.05964)。

背景:チャンク方策の継ぎ目問題

ACTpi0 等は H ステップ分の行動チャンクをまとめて生成する。推論に数百 ms かかると、新しいチャンクが届くまで古いチャンクを消費し続ける必要があり、チャンク境界で軌道が不連続になりジッタを生む。チャンク全体を生成し終えてからでないと使えない(10 denoise step 完了待ち)点も即応性を損なう。

核となる考え方:prefix-matching と receding horizon

  • 直前チャンクの未実行部分を固定 prefixとして保持し、新チャンクの denoise を prefix に整合させて生成する。これによりチャンク境界で軌道が連続する。
  • チャンクの先頭は推論・通信遅延に「埋もれる (receding horizon)」。中間が usable な区間で、後半はモデル予測が不確実になる。高速化で usable chunk が縮むと、control bounded(vla-inference-optimization の上限解析)に達する。

Full Streaming への展開

vla-inference-optimization では、RTC の「逐次生成」発想を AE に持ち込み、flow matching を自己回帰的に書き換えて各 denoise step が行動列の一部を出力するようにする。これにより 480 Hz の力ループで未 commit ノードのみを継続更新する設計が可能になる。V2 の軌道後処理(Temporal/Spatial Optimization)は RTC の prefix-matching と独立に動くよう設計され、RTC を壊さない。

関連: generative-models / vla-inference-optimization / pi0

Full Streaming Inference(VLA の多階層制御ループ)

realtime-vla V1 論文が提案する、VLA の内部構造をそのまま多階層のリアルタイム制御アルゴリズムに対応づける枠組み。従来「VLA は mid-level 制御を担い、力/トルク制御は別アルゴリズム」とされてきたが、VLA 自体が異なる周波数の入出力階層を内包している、という観察に基づく。

核となる観察:カーネルのオーバーラップ

VLM 部は演算律速、Action Expert (AE) 部は IO 律速。2つの CUDA ストリームで同時実行すると両資源が有効活用され、スループットが上がる。

条件時間
Sequential VLM + 10 AE27.3 ms
Concurrent VLM + 10 AE26.3 ms
Concurrent VLM + 16 AE32.7 ms(1/30 s に到達)

→ 1秒間に 30 VLM + 480 AE を回せる。AE を時間軸上に等間隔配置すれば 480 Hz の制御ループが作れる。

3つのフィードバックループ

  1. 力ループ(480 Hz): 力センサ(3D/6D、2 kHz 超サンプル可能・µs レイテンシ)や、力センサがなければモータ電流・抵抗式触覚を AE の追加入力トークンとして注入。新サンプル到着のたびに別ストリームで GPU グローバルメモリを memcpy 更新。AE は緊急停止など即応アクションを生成。最速 2 ms 応答。
  2. 視覚ループ(30 Hz): 画像フレームを VLM が KV キャッシュに変換。画像駆動の反応は最速 1/30 s。
  3. テキストループ(<1 Hz): VLM の重みロードに text 推論をピギーバックさせ、30 token/s の自己回帰テキスト流を追加。ユーザ対話や CoT 推論 に使う(人間の発話は約 3.3 token/s)。

AE の再考:480 Hz への鍵

軌道の出力周波数(ノード密度・補間で自明に上げられる)と制御周波数(刺激→反応の有界時間)は別概念。後者には全パイプラインの高周波処理が要る。鍵は AE の使い方の転換:従来の generative-models は10 denoise step 完了まで出力が使えないが、各ステップが行動列の一部を逐次生成する自己回帰的な書き換えにする。これは vla-inference-optimization (RTC) が既に用いている技法。480 ノード/秒の軌道バッファを AE が継続更新し、GPU から取り出された時点で「commit」、AE は未 commit の未来ノードのみ flow 則で更新する。

実装には Persistent Megakernel が適すると示唆。詳細は後続研究に委ねられている。

関連: vla-inference-optimization / vla-inference-optimization / vla

Faster-than-Demonstration 実行(VLA の高速・滑らか・正確な実行)

Realtime-VLA V2 が扱う問題。模倣学習のデモは人間のテレオペで収集されるため速度が大きく落ちる。学習済みポリシーをデモより速く動かすと train-inference のダイナミクスにギャップが生じる。これを Fast / Smooth / Accurate を同時達成して解く。滑らかさが高速実行の前提(ジッタは視覚入力と関節ハードを不安定化させる)、正確さがタスク成功の前提。

V1(GPU 計算の高速化)と異なり、V2 は実ロボット上のシステム全体を扱う。

1. 系のキャリブレーションと遅延同定

理想は「画像を見た瞬間に次の行動を出す」だが、実機には複数の時間遅延がある:

  • t_camera(露光が timestamp より前)
  • t_readout(受信遅延)
  • t_proprio(関節読み取り遅延)
  • t_motion(アームの追従遅延。軽量 QDD アームは PD/P 制御で剛性が低く、ゲインに反比例した遅れ)

DOS W1 系(RealSense D435 + Airbot Play)での実測例: t_readout 33 ms / t_camera 55 ms / t_proprio 50 ms / t_motion 150 ms。

計測法: システムクロック駆動の LED 列、ロボットを正弦波で振らせ高 fps カメラ(携帯の120fps)で位相推定しサブフレーム精度(5 ms 精度)。補償は、画像受信時刻から履歴バッファの関節位置を引いて入出力を整合。t_motion は定数遅延ではなく制御ループの結果なので、軌道後処理でプリアンプリファイ(目標位置を過剰に振り、コントローラ通過後に望む軌道に戻す)。

2. 軌道後処理(モデルに透過的)

RTC を壊さず再学習も不要にするため、モデルから見て「行動が完璧に実行された」ように軌道を後処理する。client-server 分離(GPU サーバ + ロボットクライアント):

  • Speed Adaptation Model: ステップごとの速度スケール係数を決める。
  • Temporal Optimization: 逆ステップ時間 Δt⁻¹ に対する二次計画 (QP) を osqp で解き、急加速ピークを平均速度を変えずチャンク全体へ分散。経路形状(waypoint 位置)は変えない。
  • Spatial Optimization: クライアント側で位置を局所修正。ラグ動力学 q_{k+1}=a q_k+(1-a)y_k(a=exp(-h/τ))でモデル化し、acados MPC(SQP-RTI)で低遅延な内側ループ再計画。速度・曲率ペナルティでジッタ抑制。

3. 速度適応の学習:いつ・どれだけ速くするか

ほとんどの区間は 3x–4x まで高速化できるが、特定の精密区間(シャツ折りの袖折りなど)で減速が要る。失敗は速度を上げると激増するが特定ステージに集中する。

  • Failure-rate Prediction Model: 速度係数候補ごとの失敗確率を Q 関数的に学習。rollout のみで学習できるが、データ希少で過学習しやすく閾値調整が難しい。
  • Human-in-the-loop 速度変調(採用): オペレータの「スロットル」入力を回帰モデルに蒸留。二値の密度推定でなく回帰なので安定・累積学習可能。安全のため絶対速度上限(3x/4x)を設定。RL 代替は将来課題(人間ほどのサンプル効率がない)。

4. 上限解析(upperbound)

roofline に倣い、軌道を motion bounded(加速度・速度・ジャークがハード限界=最適)と control bounded(制御遅延で usable chunk が縮み成功率維持不能)の区間に分解。throughput をさらに上げるにはハード改善か、長い制御遅延に耐えるモデル改善のいずれか。shirt-folding 等3タスクで人間操作と同等速度を達成。

関連: vla-inference-optimization / realtime-vla-v2 / control-theory-laplace

VLA 推論の計算グラフ最適化(CUDA Graph・カーネル融合)

pi0 級の VLA を単一コンシューマ GPU(RTX 4090)で 30 FPS(27.3 ms / 2 view) で走らせるための、推論パイプラインのエンジニアリング手法群。realtime-vla の中核技術で、naive PyTorch 実装 (105 ms) → CUDA Graph → グラフ簡略化 → カーネル最適化と段階的に縮める。

1. CPU オーバーヘッドの除去(CUDA Graph)

pi0 の1推論ステップで起動されるカーネルは1000以上。Python → CUDA ドライバのディスパッチが律速になる。Transformer ブロックには動的分岐がなくバッファポインタも固定できるため、CUDA Graph で1度ストリームを記録し以後 replay() するだけにする。GPU とドライバだけでカーネルが連鎖起動され、Python 実行コストが消える。これだけで約2倍高速化。

LeRobot 実装(HuggingFace Transformers ベース)では、AE 1層あたり約21カーネル × 18層 × 10 denoise step = 約3,780回の起動 + copy.deepcopy(past_key_values) の毎ステップ複製が支配的だった。Realtime-VLA は融合で ~5 kernels/層 = ~900回まで削減。

2. 計算グラフの等価変換(簡略化)

コンパイラの定数畳み込みに相当する書き換えで MAC とカーネル数を削減(7–8 ms 改善):

  • RMSNorm affine 吸収: RMSNorm の学習スケール γ を後続線形層の重みに事前乗算。両者とも線形なので結合則で融合でき、RMSNorm は正規化のみに簡略化。
  • Action-Time Encoder 折り畳み: denoise の時間ステップは {1.0, 0.9, …, 0.1} の10通りのみ。time embedding + style projection を __init__ で全計算しテーブル化、SiLU 直前の bias まで融合。
  • QKV 融合: Q/K/V の3射影行列を1つの大行列に結合し、結果をスライスで取り出す。RoPE の cos/sin も重みに事前融合。

3. カーネル内部の最適化

24 個の GEMM に分解し、各々を専用 Triton カーネルで実装:

  • GEMM タイルチューニング (§4.1): cuBLAS のデフォルトタイルが最適でない場合、BLOCK_SIZE_M/N/K を手動探索(約1.5 ms 改善)。
  • 17層実行: Encoder 最終層は KV キャッシュのみ AE に渡すので attention/FFN を省略(0.7 ms)。
  • Gated Linear 融合 (§4.2): gate_projup_proj は同一入力への独立 matmul。入力タイル1ロードで2重みタイルを処理し GELU(gate)*up のみ書き戻す(1.7 ms)。
  • Partial Split-k (§4.3): 512×1152×1152 は 64×64 タイルで144ブロックとなり 128 SM に不均等。512×1152×1024(均等)+ 512×1152×128(split-2)に分割し1カーネル化。
  • スカラー演算統合 (§4.4): bias・残差・活性化を GEMM のエピローグに融合。RMSNorm はトークン統計を別バッファに先計算し、次の GEMM 累積後に正規化(約4 ms)。

4. システム全体の作法

  • 画像リサイズ: カメラ ISP 出力を 224×224 に近い 240×320 等にし、手書きカーネルで 60 µs 以下に。
  • ピンドメモリ / ゼロコピーで CPU↔GPU 転送を最小化。全中間テンソルを __init__ で静的確保し、forward 中に動的割り当てを起こさない(CUDA Graph 互換のため必須)。

理論下限との差は parallel-computing で約30%と見積もられた。次の発展形が vla-inference-optimization

関連: triton-language / realtime-vla-v2 / generative-models