tao-train-bevfusion について
tao-train-bevfusionは、自動運転の3D認識向けNVIDIA TAO BEVFusionスキルです。LiDAR点群とカメラ画像を鳥瞰視点で融合し、データ変換、学習、評価、推論に対応します。
主な機能
- 01LiDAR点群とカメラ画像の融合
- 02鳥瞰視点での3D物体検出
- 03データ変換、学習、評価に対応
- 04モデル推論
活用シーン
- 01自動運転向け3D検出モデルの学習
- 02KITTI形式データの学習用変換
- 03マルチセンサー検出結果の評価
- 04データセットでの3D検出推論
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nvidia/ skills --skill tao-train-bevfusionインストール後、Claude Code で/tao-train-bevfusionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
BENCHMARK.mdskill-card.mdskill.oms.sigconfig/skillspector-baseline.yamlevals/evals.jsonreferences/skill_info.yamlspec_template_dataset_convert.yamlspec_template_evaluate.yamlspec_template_inference.yamlspec_template_train.yamlschemas/dataset_convert.schema.jsonevaluate.schema.jsoninference.schema.jsonmanifest.jsontrain.schema.json詳細
BEVFusion
スタンドアロンでインストールしますか? このセッションが TAO スキルバンクプラグインによって初期化されていない場合は、まず
tao-setupスキルを実行してください(ホストの事前チェック、認証情報、スキル間の検出)。
マルチセンサーによる 3D 物体検出のための BEVFusion です。LiDAR 点群とカメラ画像を鳥瞰図(BEV)空間で融合します。堅牢な 3D 認識のため、自動運転で使用されます。
Swin 画像バックボーンの事前学習済みバックボーンパスを設定します。
BEVFusion には、BEVFusion 専用の TAO コンテナ
nvcr.io/nvidia/tao/tao-toolkit:5.5.0-pyt が必要です。共有の TAO PyTorch 7.x イメージには
mmdet3d が含まれていないため、BEVFusion のアクションで仕様を解析する前に失敗します。モデルスキルのアクション名は dataset_convert ですが、5.5 コンテナの
CLI サブタスクは bevfusion convert -e <spec> です。
データクラスのスキーマ
生成された TAO Core スキーマは schemas/<action>.schema.json にパッケージされており、利用可能なアクションは schemas/manifest.json に記載されています。各生成スキーマでは、スキーマのトップレベルの default フィールドから references/spec_template_<action>.yaml も生成されます。AutoML の有効化は、モデルレイヤーの references/skill_info.yaml で automl_enabled を使って宣言します。アクションで AutoML を実行するには、schemas/<action>.schema.json と references/spec_template_<action>.yaml の両方が存在し、解析可能である必要があります。automl_default_parameters、automl_disabled_parameters、デフォルト値、最小値/最大値の境界、列挙値、オプションの重み、数式条件、依存関係、よく使われるパラメーターには、パッケージ済みの選択アクションのスキーマを使用してください。実行時に ~/tao-core があることを前提にしないでください。メンテナーはスキルバンクをパッケージ化する前に、スキーマ/テンプレートを再生成してください。
トレーニングアクションのポリシー
このモデルでは、モデルレイヤーで AutoML が有効になっています。トレーニング段階のリクエストを処理する前に、references/skill_info.yaml を読み、明示的な automl_policy の値、またはユーザーのワークフローリクエストから実行時の設定を解決してください。デフォルトでは automl_policy: on を使用し、新しい起動プロンプトでは on/off のみを提示してください。「AutoML をオフにする」「AutoML を無効にする」「HPO なし」「通常のトレーニング」といった表現は、この実行に限り automl_policy: off として扱ってください。automl_policy: on、automl_enabled: true、および schemas/train.schema.json と references/spec_template_train.yaml の両方がパッケージされている場合、デフォルトで tao-skill-bank:tao-run-automl を通じてトレーニングアクションを実行し、このモデルの skill_dir を指定してください。データセット、仕様、出力ディレクトリ、GPU/プラットフォーム設定、親チェックポイント、automl_policy に関するワークフロー/アプリケーションの上書き設定は維持してください。直接モデルをトレーニングするのは、automl_policy: off の場合、またはパッケージ済みのトレーニングスキーマ/テンプレートがない場合に限ります。スキーマがない場合は、AutoML は有効ですが、スキーマが生成されるまではこのモデルで実行できないことを報告してください。
evaluate、inference、export などのトレーニング以外のアクションとデプロイフローは、このモデルスキル内にとどめてください。実行ごとの automl_policy 上書き設定によってモデルのメタデータが変わることはありません。
トレーニング要件
- データセットタイプ: bevfusion
- 形式: デフォルト
- モニタリング指標: AP11
アクションごとのデータセット要件
| アクション | 仕様キー | ソース | ファイル | リスト? |
|---|---|---|---|---|
| dataset_convert | root_dir | id | いいえ | |
| evaluate | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | いいえ |
| inference | dataset.root_dir | train_datasets | いいえ | |
| inference | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | いいえ |
| train | dataset.train_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_train.pkl | いいえ |
| train | dataset.val_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | いいえ |
| train | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | いいえ |
一般的な仕様のオーバーライド
データソースのオーバーライドはすべてのアクションで必須です。エージェントは、上記の Per-Action Dataset Requirements テーブルに基づいてデータソースのパスを構成し、spec_overrides に含める必要があります。
DATA_ROOT = "/path/to/kitti_root"
CONVERTED = DATA_ROOT # BEVFusion 5.5 writes info pickles into root_dir.
DATA_PREFIX = {"pts": "training/velodyne_reduced", "img": "training/image_2"}
dataset_convert(必須のデータソース):
{
"root_dir": DATA_ROOT,
"results_dir": DATA_ROOT,
"mode": "training",
}
train(必須のデータソース):
{
"train.num_epochs": 30,
"train.checkpoint_interval": 10,
"train.validation_interval": 10,
"train.num_gpus": 1,
"dataset.root_dir": DATA_ROOT,
"dataset.train_dataset": {"ann_file": f"{CONVERTED}/kitti_person_infos_train.pkl", "data_prefix": DATA_PREFIX},
"dataset.val_dataset": {"ann_file": f"{CONVERTED}/kitti_person_infos_val.pkl", "data_prefix": DATA_PREFIX},
"dataset.test_dataset": {"ann_file": f"{CONVERTED}/kitti_person_infos_val.pkl", "data_prefix": DATA_PREFIX},
}
evaluate(必須のデータソース):
{
"dataset.root_dir": DATA_ROOT,
"dataset.test_dataset": {"ann_file": f"{CONVERTED}/kitti_person_infos_val.pkl", "data_prefix": DATA_PREFIX},
}
inference(必須のデータソース):
{
"dataset.root_dir": DATA_ROOT,
"dataset.test_dataset": {"ann_file": f"{CONVERTED}/kitti_person_infos_val.pkl", "data_prefix": DATA_PREFIX},
}
評価データセット
任意です。検証データセットの分割は、データセット設定の ann_file で構成します。
重要なパラメーター
- dataset.classes:検出クラスのリストです。デフォルトは ["person"] です。アノテーションのカテゴリと一致させる必要があります。
- dataset.type:データセットの種類です。選択肢:KittiPersonDataset、TAO3DSyntheticDataset、TAO3DDataset。
- dataset.root_dir:KITTI 形式のデータセットのルートディレクトリです。
- dataset.box_type_3d:3D ボックスの座標系です。選択肢:lidar、camera。デフォルトは lidar です。
- train.optimizer.lr:学習率です。デフォルトは 2e-4(AdamW)です。混合精度を使用するには、optimizer.wrapper_type で AmpOptimWrapper を指定します。
- input_modality:センサーモダリティを制御する辞書です。キー:use_lidar(True)、use_camera(True)、use_radar(False)、use_map(False)。
- model.img_backbone:画像バックボーンです。デフォルトは mmdet.SwinTransformer(Swin-Tiny)です。embed_dims=96、depths=[2,2,6,2] です。
- model.view_transform.type:BEV 投影用のビュー変換です。選択肢:DepthLSSTransform、LSSTransform。デフォルトは DepthLSSTransform です。
- model.point_cloud_range:LiDAR の空間範囲です。デフォルトは [0,-40,-3,70.4,40,1] です。
- model.voxel_size:ボクセルの寸法です。デフォルトは [0.05, 0.05, 0.1] です。
- dataset.train_dataset.batch_size:GPU あたりのバッチサイズです。デフォルトは 4 です。
マルチ GPU/マルチノード
起動方法: torchrun(LIGHTNING_EXCLUDED_NETWORK)。エントリーポイントは torchrun --nnodes=N --nproc-per-node=M train.py を実行します。単純な python の実行ではありません。
| 仕様キー | 説明 | デフォルト |
|---|---|---|
train.num_gpus | ノードあたりの GPU 数 | 1 |
train.gpu_ids | GPU デバイスのインデックス | [0] |
train.num_nodes | ノード数 | 1 |
CUDA_VISIBLE_DEVICESはTAO_VISIBLE_DEVICESから明示的に設定されます- BEVFusion は Lightning DDP ではなく、mmdet3d ベースの分散学習を使用します
RANKが未設定の場合、NODE_RANKがRANKにコピーされます
マルチノード環境変数(オーケストレーターによって設定):
| 変数 | 用途 |
|---|---|
WORLD_SIZE | ノード数 |
NODE_RANK | このノードのランク |
MASTER_ADDR | ランク 0 のノード IP |
MASTER_PORT | ランク 0 のポート(デフォルト 29500) |
NUM_GPU_PER_NODE | ノードあたりの GPU 数 |
ハードウェア
小規模なデータセットとバッチサイズを使用すれば、最小限のスモークテスト/AutoML 検証に 1 台の GPU を使用できます。通常の学習には 2 台以上の GPU を、実用上可能であれば 4 台の GPU を使用してください。GPU あたり 24GB 以上の VRAM(A100 推奨)が必要です。BEVFusion はマルチセンサー融合により、大量のメモリを使用します。
エラーパターン
dataset_convert が必要です:トレーニング前に、model-skill の dataset_convert アクション(BEVFusion 5.5 コンテナ内の bevfusion convert -e <spec>)を実行し、kitti_person_infos_train.pkl、kitti_person_infos_val.pkl、および training/velodyne_reduced を生成してください。ローカル Docker で直接 5.5 を実行する場合は、results_dir を root_dir と同じマウントパスに設定してください。コンバーターはそこに情報用の pickle ファイルを書き込み、後で点群を縮小する際に root_dir 内にあるファイルを参照します。
KITTI のディレクトリ名:BEVFusion 5.5 のコンバーターは縮小した点群を training/velodyne_reduced に書き込み、カメラ画像を training/image_2 内で参照します。dataset_convert を train/evaluate または推論につなげる場合、古いデフォルトの training/lidar_reduced や training/images/ は使用しないでください。
BEVFusion 5.5 の設定項目:パッケージに含まれるテンプレートでは、5.5 のデータクラスのキーを使用してください。model_name、wandb.group、wandb.run_id、train.checkpoint_interval_unit、evaluate.trt_engine、evaluate.batch_size、inference.trt_engine、inference.batch_size など、新しいトップレベルのキーやアクションキーは削除してください。train、evaluate、inference の仕様では、実行しないアクションのスタブ(train、evaluate、inference)を残し、必要に応じてチェックポイント文字列を空にしてください。5.5 のランナーは、選択されたアクションを実行する前に、完全な実験設定を生成します。チェックポイントを使用しない場合、train.pretrained_checkpoint と train.resume_training_checkpoint_path には空文字列ではなく YAML の null を使用してください。
ModuleNotFoundError: No module named 'mmdet3d':共通の TAO PyTorch 7.x イメージには、BEVFusion の mmdet3d 依存関係が含まれていません。nvcr.io/nvidia/tao/tao-toolkit:5.5.0-pyt を使用してください。このイメージには mmdet3d が含まれており、BEVFusion の convert、train、evaluate、inference の各サブタスクを実行できます。
BEVFusion 5.5 の評価後に発生する SIGSEGV:ローカル Docker での実行では、チェックポイントや予測ファイルが書き込まれた後でも、cuMemRetainAllocationHandle で Signal 11 (SIGSEGV) が発生し、TAO の Execution status: FAIL で終了する場合があります。Docker の終了コードだけを見てアクションを成功と判断しないでください。TAO のログまたは status.json を確認してください。CUDA 12 以降のホストでは、TAO 5.5 の依存関係スタックを維持し、tao-pytorch の BEVFusion 回転 IoU CPU フォールバックとランナーのクリーンアップを適用してください。アクションを共通の 7.x イメージに切り替えないでください。フォールバックがデフォルトであり、BEVFUSION_ROTATE_IOU_BACKEND=gpu は従来の Numba CUDA 評価器を明示的にオプトインする設定です。このエラーが発生する前にチェックポイントが生成されていた場合、後続の診断には epoch_1.pth のような、指定されたチェックポイントのみを使用してください。アクションで最新のチェックポイントが明示的に要求されていない限り、last_checkpoint を最良のチェックポイントとして扱わないでください。
モダリティデータの不足:マルチモーダルフュージョンを使用する場合は、カメラ画像と LiDAR 点群の両方が存在することを確認してください。
エポック番号:BEVFusion のチェックポイントのエポック番号は、標準のゼロ埋め形式に従わない場合があります。
チェックポイントの引き継ぎ:親モデルの選択には、SDK/モデルのチェックポイントリゾルバーを使用してください。ローカル Docker で直接つなげる場合は、トレーニング結果を確認し、epoch_1.pth のような指定されたチェックポイントの正確なパスを渡してください。ユーザーが明示的に最新を求めた場合に限り、latest.pth を使用してください。再開/再トレーニングする場合は、train.resume: true を設定し、train.resume_training_checkpoint_path に再開対象のチェックポイントの正確なパスを設定してください。
Spec パラメーター/親モデルの推論
モデル固有の推論マッピングは、config.json ではなくこの MD ファイルに記述します。生成されたランナーはこのセクションを読み込み、create_job() の前に SDK ヘルパーを使ってマッピングを適用してください。これは、以前のマイクロサービスにおける infer_params.py のフローを踏襲しています。
TAO Core bevfusion.config.json からの推論マッピング:
| アクション | Spec フィールド | 推論関数 | 意味 |
|---|---|---|---|
| dataset_convert | results_dir | output_dir | 現在のジョブの結果ディレクトリ |
| evaluate | encryption_key | key | 暗号化キー |
| evaluate | evaluate.checkpoint | parent_model | 親ジョブの結果フォルダーから推論されたモデルファイル |
| evaluate | results_dir | output_dir | 現在のジョブの結果ディレクトリ |
| inference | encryption_key | key | 暗号化キー |
| inference | inference.checkpoint | parent_model | 親ジョブの結果フォルダーから推論されたモデルファイル |
| inference | results_dir | output_dir | 現在のジョブの結果ディレクトリ |
| train | encryption_key | key | 暗号化キー |
| train | results_dir | output_dir | 現在のジョブの結果ディレクトリ |
| train | train.pretrained_checkpoint | ptm_if_no_resume_model | 再開用チェックポイントがない場合の PTM |
| train | train.resume_training_checkpoint_path | resume_model | 現在のジョブの結果フォルダーから推論されたモデルファイル |
parent_model または parent_model_folder には、上流の train/export/AutoML 子ジョブの ID を parent_job_id として渡します。SDK は親の結果フォルダーを一覧表示し、チェックポイントの成果物を絞り込み、選択されたモデルファイルまたはフォルダーを返します。これらのマッピングを config.json に戻したり、チェックポイントのパスを推測するために生成されたランナースクリプトを修正したりしないでください。