| 名称 | tao-train-bevfusion |
| 描述 | “BEVFusion用于多传感器3D目标检测。在鸟瞰图(BEV)空间中融合LiDAR点云和相机图像,用于自动驾驶中稳健的3D感知。在训练、评估或对TAO BEVFusion模型进行推理时使用。触发短语包括“train BEVFusion”、“LiDAR + camera fusion”、“BEV 3D detection”、“multi-sensor 3D perception”。” |
| 开源协议 | Apache-2.0 compatibility: 需要docker + nvidia-container-toolkit。 metadata: |
| 版本 | “0.1.0” |
| 作者 | NVIDIA Corporation allowed-tools: 读取Bash tags: - multi - sensor - 3d - detection |
BEVFusion
独立安装? 如果此会话不是由TAO技能库插件初始化的,请先运行
tao-setup技能(主机预检、凭据、跨技能发现)。
BEVFusion用于多传感器3D目标检测。在鸟瞰图(BEV)空间中融合LiDAR点云和相机图像。用于自动驾驶中的稳健3D感知。
为Swin图像骨干设置预训练骨干路径。
BEVFusion需要BEVFusion专用的TAO容器nvcr.io/nvidia/tao/tao-toolkit:5.5.0-pyt。共享的TAO PyTorch 7.0 RC镜像没有打包mmdet3d,在任何BEVFusion操作解析其spec之前就会失败。模型技能操作命名为dataset_convert,但5.5容器CLI子任务是bevfusion convert -e <spec>。
Dataclass Schemas
生成的TAO Core schemas打包在schemas/<action>.schema.json中,schemas/manifest.json列出可用的动作。每个生成的schema还从schema顶层的default字段发出references/spec_template_<action>.yaml。AutoML支持在模型层的references/skill_info.yaml中通过automl_enabled声明。某个动作的可运行AutoML需要存在schemas/<action>.schema.json和references/spec_template_<action>.yaml并能解析。请使用打包的选定动作schema来获取automl_default_parameters、automl_disabled_parameters、默认值、最小/最大边界、枚举、选项权重、数学条件、依赖关系和常用参数。不要期望在运行时存在~/tao-core;维护人员在打包技能库之前重新生成schemas/templates。
Train Action Policy
该模型在模型层启用了AutoML。在处理任何train阶段请求之前,请阅读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时,默认情况下使用此模型的skill_dir通过tao-skill-bank:tao-run-automl路由train动作。保留用于数据集、specs、输出目录、GPU/平台设置、父检查点和automl_policy的工作流/应用程序覆盖。仅在automl_policy: off或打包的train schema/template缺失时使用直接模型训练;在schema缺失的情况下,报告AutoML已启用但在此模型上无法运行,直到生成schemas。
非训练动作如evaluate、inference、export和部署流程保留在此模型技能中。每次运行的automl_policy覆盖不会更改模型元数据。
Training Requirements
- 数据集类型: bevfusion
- 格式: default
- 监控指标: AP11
Per-Action Dataset Requirements
表格:
| 动作 | Spec键 | 来源 | 文件 | 列表? |
|---|---|---|---|---|
| dataset_convert | root_dir | id | No | |
| evaluate | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | No |
| inference | dataset.root_dir | train_datasets | No | |
| inference | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | No |
| train | dataset.train_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_train.pkl | No |
| train | dataset.val_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | No |
| train | dataset.test_dataset | train_datasets | ann_file: results/{dataset_convert_job_id}/kitti_person_infos_val.pkl | No |
Typical Spec Overrides
数据源覆盖对每个动作都是强制性的 —— 代理必须根据上述“每动作数据集要求”表构造数据源路径,并在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},
}
Eval Dataset
可选。验证数据集分割通过dataset config中的ann_file配置。
Important Parameters
- 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。
Multi-GPU / Multi-Node
启动方法: torchrun (LIGHTNING_EXCLUDED_NETWORK)。入口点运行torchrun --nnodes=N --nproc-per-node=M train.py,而不是普通的python。
| Spec键 | 描述 | 默认 |
|---|---|---|
train.num_gpus |
每个节点的GPU数 | 1 |
train.gpu_ids |
GPU设备索引 | [0] |
train.num_nodes |
节点数 | 1 |
CUDA_VISIBLE_DEVICES从TAO_VISIBLE_DEVICES显式设置- BEVFusion使用基于mmdet3d的分布式训练,不是Lightning DDP
- 如果未设置
RANK,NODE_RANK被复制到RANK
多节点环境变量(由编排器设置):
| 变量 | 用途 |
|---|---|
WORLD_SIZE |
节点数 |
NODE_RANK |
当前节点排名 |
MASTER_ADDR |
Rank-0节点IP |
MASTER_PORT |
Rank-0端口(默认29500) |
NUM_GPU_PER_NODE |
每节点GPU数 |
Hardware
最少2个GPU,推荐4个GPU。每个GPU需要24GB+(推荐A100)显存。由于多传感器融合,BEVFusion非常消耗内存。强烈推荐A100 GPU。期望多GPU训练。
Error Patterns
dataset_convert必需:在训练之前运行模型技能的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相同的挂载路径;转换器会将这些info pickle写入那里,稍后在其减少点云时预期它们位于root_dir下。
KITTI目录名称:BEVFusion 5.5转换器将缩减后的点云写入training/velodyne_reduced,并期望相机图像位于training/image_2。在将dataset_convert链接到train/evaluate或inference时,不要使用过时的training/lidar_reduced或training/images/默认值。
BEVFusion 5.5配置表面:使用打包模板中的5.5 dataclass键。移除较新的顶层/动作键,例如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 spec,保留非运行的action存根(train、evaluate和inference),在需要的地方使用空检查点字符串;5.5运行器在运行所选动作之前会具体化完整的实验配置。当不打算使用检查点时,对train.pretrained_checkpoint和train.resume_training_checkpoint_path使用YAML null,不要使用空字符串。
ModuleNotFoundError: No module named 'mmdet3d':共享的TAO PyTorch 7.0 RC镜像不包含BEVFusion的mmdet3d依赖。请使用nvcr.io/nvidia/tao/tao-toolkit:5.5.0-pyt;它包含mmdet3d并暴露BEVFusion的convert、train、evaluate和inference子任务。
评估后SIGSEGV in BEVFusion 5.5:一些本地docker运行可以写出检查点或预测文件,但在cuMemRetainAllocationHandle中以Signal 11 (SIGSEGV)结束并返回TAO Execution status: FAIL。不要仅根据Docker退出码就标记动作成功;检查TAO日志或status.json。如果在此失败前生成了检查点,对于下游诊断,只使用确切的目标检查点(如epoch_1.pth),除非动作明确请求最新的检查点,否则不要将last_checkpoint视为最佳检查点。
缺失模态数据:如果使用多模态融合,请确保相机图像和LiDAR点云都存在。
Epoch编号:BEVFusion检查点epoch编号可能不遵循标准的零填充格式。
检查点交接:对于父模型选择,请使用SDK/模型检查点解析器。对于直接的本地docker链式操作,请检查train结果并传递确切的目标检查点路径(如epoch_1.pth);仅当用户明确要求最新时才使用latest.pth。Resume/retrain必须设置train.resume: true和train.resume_training_checkpoint_path为要恢复的确切检查点。
Spec Param / Parent Model Inference
模型特定的推理映射属于这个MD文件,而不是config.json。生成的运行器应在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,也不要修补生成的运行器脚本来猜测检查点路径。