NVIDIAの自動運転シミュレータ「AlpaSim」を試してみた

NVIDIAの自動運転シミュレータ「AlpaSim」を試してみた

NVIDIAのclosed-loop自動運転シミュレータ「AlpaSim」でAIドライバーを実際に走らせてみました。L40S 1枚での実行環境から、VaVAMが衝突でリタイアしたのに対し、Alpamayo 1.5が無事故で完走した結果まで、シミュレーション評価の全体像を紹介します。
2026.07.17

はじめに

今回は、NVIDIAのオープンソース自動運転シミュレータ「AlpaSim」の中でモデルを実際に走らせてみます。シミュレータの中では、モデルの操作に応じて世界が動き、その結果がまた次の入力になります。

先に結論を書くと、

  • AlpaSimがAWSのL40S 1枚で動きました。実写を再構成したシーンの中を、AIドライバーが物理シミュレーション込みで走ります。
  • チュートリアル既定の軽量ドライバー(VaVAM)はルートの途中で他の車に衝突してリタイアしました。
  • 同じシーンをAlpamayo 1.5に運転させたら、障害物と約1mの間隔を保って無事故で完走しました。
  • 詰まりどころは2つ(ディスク容量と起動タイムアウト)。どちらもAWS/L40S環境ならではの話なので後述します。

なお、Alpamayoのモデル重みは非商用ライセンス(研究・実験・評価目的)で提供されています。本記事はその範囲での技術評価です。

AlpaSimとは

  • リポジトリ: NVlabs/alpasim(Apache-2.0)
  • 実走行データをニューラル再構成(NuRec)した3Dシーンの中で、AIドライバーをclosed-loopで走らせて評価するシミュレータです。

closed-loopが今回のキーワードです。以前のAlpamayo検証記事での評価(minADE)は、録画のある時点でモデルに「この先どう動く?」と聞いて、答えを実際の走行と見比べるだけのopen-loopでした。モデルの答えが世界に反映されることはなく、映像は録画のまま進みます。

closed-loopでは、

  1. カメラがシーンを撮る(NuRecがレンダリング)
  2. ドライバーAIが操作を決める
  3. 操作に応じて車両の動きや周囲の交通の状態がそれぞれ更新される(車両ダイナミクス・物理・交通は別々のサービスが担当しています)
  4. 動いた結果の世界を、またカメラが撮る(1に戻る)

というループを回します。自分の操作の結果が自分に返ってくるので、小さなミスの積み重ねやリカバリの下手さが露呈します。実際に今回、open-loopでは見えなかった差が出ました。

環境

項目 内容
インスタンス g6e.2xlarge(NVIDIA L40S 48GB×1、8vCPU、RAM 64GB)
AMI Deep Learning Base OSS Nvidia Driver GPU AMI(Ubuntu 24.04)
ディスク EBS gp3 300GB(150GBで始めて足りず拡張。詰まりどころ①)
実行形態 Docker Compose(6コンテナ構成)

セットアップ(TUTORIALどおり)

手順はリポジトリのdocs/TUTORIAL.mdどおりです。

git clone https://github.com/NVlabs/alpasim.git
cd alpasim

# 環境セットアップ(protobufコンパイル、依存導入、alpasim_wizard CLI導入)
source setup_local_env.sh

# HFトークン(シーンデータの取得に使用)
export HF_TOKEN="<your_hf_token>"

# チュートリアル用ドライバー(VaVAM-B)のダウンロード
bash data/download_vavam_assets.sh --model vavam-b

# シミュレーション実行
uv run alpasim_wizard deploy=local topology=1gpu driver=vavam wizard.log_dir=$PWD/tutorial

alpasim_wizardが全部やってくれます。シーンデータ(NuRecのUSDZ、1シーン約1.7GB)をHugging Faceから自動ダウンロードし、Docker Composeの構成を生成して、runtime/renderer(NuRec)/driver(AIドライバー)/controller/physics/prometheus(監視)の6コンテナを立ち上げ、シミュレーションから評価・動画生成まで一気通貫で回します。

事前にHugging FaceでNuRecデータセットの同意ボタンを押しておく必要があります。

詰まりどころ①: ディスクが足りない(NREイメージが巨大)

初回実行で、レンダラーのコンテナイメージ(nvcr.io/nvidia/nre/nre-ga:26.04、ダウンロードだけで14.3GB)の展開中にこれで止まりました。

failed to extract layer ... : write /var/lib/containerd/...: no space left on device

150GBのルートボリュームでは、モデルの重み(前回のAlpamayo検証のキャッシュ22GB×2)+Dockerイメージ群で埋まりました。TUTORIALにディスク要件の記載はありませんが、素の環境でも100GB以上、既存キャッシュがあるなら300GBが安心です。EBSはオンラインで拡張できます(stop不要)。

# Mac側
aws ec2 modify-volume --volume-id <vol-id> --size 300
# インスタンス側
sudo growpart /dev/nvme0n1 1
sudo resize2fs /dev/nvme0n1p1

なお、ログにalpasim-base:0.111.0 pull access deniedという警告が出ますが、これは無害です(composeがbuild:指定でローカルビルドするため、pull試行の警告が出るだけ)。

VaVAMの結果: 衝突でリタイア

Session COMPLETED: ... simulated 19.54 sim seconds in 76.97 wall clock seconds

19.5秒ぶんの運転がシミュレーションされ、評価が出ました。結果、VaVAMはルートの52%地点で他の車に衝突。スコア表から抜粋すると、

指標 VaVAM
collision_front(前方衝突) 1.00
progress(ルート進捗) 0.52
走行距離 38.1m(正解走行は73.8m)
min_distance_to_obstacle_m(障害物との最小距離) 0.00

衝突が起きるとそれ以降のタイムステップは採点から自動除外されます(ぶつかった後の走りは評価しても意味がないので)。生成された評価動画もviolations/collision_at_fault/(過失衝突)フォルダに自動分類されていました。

本命: Alpamayo 1.5に同じシーンを走らせる

ドライバーをAlpamayo 1.5に差し替えます。重みを取得して、driver=alpamayo1_5を指定するだけです。

uv run huggingface-cli login
uv run huggingface-cli download nvidia/Alpamayo-1.5-10B
uv run huggingface-cli download nvidia/Cosmos-Reason2-8B

uv run alpasim_wizard deploy=local topology=1gpu driver=alpamayo1_5 wizard.log_dir=$PWD/tutorial_alpamayo

詰まりどころ②: 起動タイムアウト(10Bモデルのロードが間に合わない)

そのまま実行すると、モデルのロード中にこれで落ちました。

grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
      status = StatusCode.DEADLINE_EXCEEDED

runtimeが各コンテナの起動を確認する制限時間が既定2分alpasim_runtime/config.pystartup_timeout_s: int = 2 * 60)で、L40Sで10Bモデルを積み込むには足りませんでした。

対処はタイムアウトの上書き1個です(Hydraの追加キーなので+を付けるのがポイント)。

uv run alpasim_wizard deploy=local topology=1gpu driver=alpamayo1_5 \
  wizard.log_dir=$PWD/tutorial_alpamayo \
  +runtime.endpoints.startup_timeout_s=600

結果: 無事故で完走

同じシーン・同じルートで、結果は対照的でした。

指標 VaVAM Alpamayo 1.5
collision_any(衝突) 1.00(前方衝突) 0.00
progress(ルート進捗) 0.52 1.00(完走)
走行距離 38.1m 78.0m
min_distance_to_obstacle_m 0.00(接触) 0.95
plan_deviation(計画のブレ) 1.75 0.19
avg_dist_between_incidents 0.04 inf
  • 評価動画を見ると、舞台は交通量のある直線の幹線道路でした。VaVAMは走行中に隣の車線側へ寄っていき、そこにいた車に衝突。一方のAlpamayo 1.5は、前方の車列と車間を保ちながらレーン内を淡々と走って完走しました。派手な回避機動があったわけではなく、「事故らない普通の運転」を最後までやり切った、という結果です。
  • avg_dist_between_incidentsは「平均して何m走るごとに事故や違反が1回起きるか」という指標です。Alpamayo 1.5はインシデントが1件も無かったので、inf(無限大)と表示されています。
  • Alpamayo 1.5は元の走行記録と完全に同じ走りをしたわけではなく、元のドライバーよりやや遅れて(慎重に)走る場面がありました。
  • 再現性の確認のためAlpamayo 1.5は2回走らせましたが、結論は同一(無事故・完走)で、数値は微妙に変動しました(走行距離78.0m→78.1m等)。

数字まわり

項目 実測値
VRAMピーク(Alpamayo 1.5ドライバー実行中の全体) 32,575MiB(約32.6GB)
シミュレーション実行時間 VaVAM: 19.5秒分を77秒/Alpamayo 1.5: 19.9秒分を396秒
ロールアウト全体(セットアップ込み) VaVAM: 85秒/Alpamayo 1.5: 412秒
シーンデータ 1シーン約1.7GB(USDZ、自動DL)
  • VRAM約32.6GBは、レンダラー(NuRec)+10Bドライバー+物理まで全部1枚のL40Sに同居しての値です。TUTORIALの目安(約40GB)より軽く収まりました。48GBのL40Sで余裕、ただし24GBクラスでは無理です。
  • 実行時間はドライバーの重さがそのまま出ます。毎ステップ10B VLAの推論が入るAlpamayo 1.5は、VaVAMの約5倍の時間がかかりました。closed-loopは「1回の推論」ではなく「数十回の推論の積み重ね」なので、モデルの重さが効いてきます。

シミュレーション映像を載せていない理由

本記事にレンダリング映像のスクリーンショットや動画が無いのは意図的です。シーンの元になっているNuRecデータセットのライセンスが、データセット(およびその出力)の配布・埋め込みを制限しているためです。どんな見た目かは、AlpaSimリポジトリのREADME冒頭のデモGIF(Apache-2.0で公開されており、今回の評価動画と同種のもの)や、NVIDIA公式ブログのclosed-loop post-training記事の動画で確認できます。

おわりに

次回は、このシミュレータを学習側に組み込みます。AlpaGym(AlpaSim+Cosmos-RLによるclosed-loop強化学習フレームワーク)で、報酬progress_safetyを使ってAlpamayoを鍛える予定です。


Alpamayo-1.5-10Bのモデル重みは非商用ライセンス(研究・実験・評価目的)で提供されています。本記事はその範囲での技術評価です。AlpaSim(NVlabs/alpasim)はApache-2.0です。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事