Sparse4D
Sparse4D pour la détection et le suivi d'objets 3D temporels multi-caméra. Utilise des requêtes éparses avec attention déformable à travers les vues de caméra et le temps pour la perception 3D de bout en bout. Inclut une banque d'instances pour le suivi temporel.
Nécessite un backbone ResNet-101 préentraîné. Définissez train.pretrained_model_path.
Schémas Dataclass
Les schémas TAO Core générés sont packagés dans schemas/<action>.schema.json, avec schemas/manifest.json listant les actions disponibles. Chaque schéma généré émet également references/spec_template_<action>.yaml depuis le champ default du niveau supérieur du schéma. L'activation d'AutoML est déclarée au niveau du modèle dans references/skill_info.yaml via automl_enabled. AutoML exécutable nécessite toujours que schemas/train.schema.json et references/spec_template_train.yaml existent et se parsent. Utilisez le schéma train packagé pour automl_default_parameters, automl_disabled_parameters, les valeurs par défaut, les limites min/max, les énumérations, les poids d'options, les conditions mathématiques, les dépendances et les paramètres populaires. Ne supposez pas que ~/tao-core est disponible à l'exécution ; les mainteneurs régénèrent les schémas et templates avant de packager la skill bank.
Politique d'action Train
Ce modèle est activé pour AutoML au niveau du modèle. Avant de gérer toute demande au stade train, lisez references/skill_info.yaml et résolvez l'override d'exécution à partir d'une valeur automl_policy explicite ou d'une demande de workflow utilisateur. Traitez les phrases comme « turn off AutoML », « disable AutoML », « no HPO » ou « plain training » comme automl_policy: off pour cette exécution uniquement ; sinon, par défaut à auto. Quand automl_policy: auto, automl_enabled: true, et que schemas/train.schema.json et references/spec_template_train.yaml sont packagés, routez l'action train via tao-skill-bank:tao-run-automl par défaut avec le skill_dir de ce modèle. Préservez les overrides de workflow/application pour les datasets, specs, répertoires de sortie, paramètres GPU/plateforme, checkpoints parents et automl_policy. Utilisez l'entraînement direct du modèle uniquement quand automl_policy: off ou quand le schéma train/template packagé est manquant ; dans le cas du schéma manquant, signalez qu'AutoML est activé mais non exécutable pour ce modèle jusqu'à la génération des schémas.
Les actions non-train comme evaluate, inference, export et les flux de déploiement restent dans cette skill de modèle. L'override automl_policy par exécution ne change pas les métadonnées du modèle.
Exigences d'entraînement
- Type de dataset : sparse4d
- Formats : ovpkl
- Métrique de suivi : val_mAP
Exigences de dataset par action
| Action | Clé Spec | Source | Fichiers | Liste ? |
|---|---|---|---|---|
| dataset_convert | aicity.root | id | Non | |
| evaluate | dataset.data_root | eval_dataset | (depuis job convert, spec : aicity.split) | Non |
| evaluate | model.head.instance_bank.anchor | train_datasets | /results/{dataset_convert_job_id}/anchor_init.npy | Non |
| evaluate | dataset.train_dataset.ann_file | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| evaluate | dataset.val_dataset.ann_file | eval_dataset | (depuis job convert, spec : aicity.split) | Non |
| evaluate | dataset.test_dataset.ann_file | inference_dataset | (depuis job convert, spec : aicity.split) | Non |
| export | model.head.instance_bank.anchor | train_datasets | /results/{dataset_convert_job_id}/anchor_init.npy | Non |
| inference | dataset.data_root | inference_dataset | (depuis job convert, spec : aicity.split) | Non |
| inference | model.head.instance_bank.anchor | train_datasets | /results/{dataset_convert_job_id}/anchor_init.npy | Non |
| inference | dataset.train_dataset.ann_file | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| inference | dataset.val_dataset.ann_file | eval_dataset | (depuis job convert, spec : aicity.split) | Non |
| inference | dataset.test_dataset.ann_file | inference_dataset | (depuis job convert, spec : aicity.split) | Non |
| quantize | dataset.data_root | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| quantize | model.head.instance_bank.anchor | train_datasets | /results/{dataset_convert_job_id}/anchor_init.npy | Non |
| quantize | dataset.train_dataset.ann_file | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| quantize | dataset.val_dataset.ann_file | eval_dataset | (depuis job convert, spec : aicity.split) | Non |
| quantize | dataset.test_dataset.ann_file | inference_dataset | (depuis job convert, spec : aicity.split) | Non |
| quantize | dataset.quant_calibration_dataset.images_dir | train_datasets | Non | |
| train | dataset.data_root | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| train | model.head.instance_bank.anchor | train_datasets | /results/{dataset_convert_job_id}/anchor_init.npy | Non |
| train | dataset.train_dataset.ann_file | train_datasets | (depuis job convert, spec : aicity.split) | Non |
| train | dataset.val_dataset.ann_file | eval_dataset | (depuis job convert, spec : aicity.split) | Non |
| train | dataset.test_dataset.ann_file | inference_dataset | (depuis job convert, spec : aicity.split) | Non |
Overrides Spec typiques
Les overrides de source de données sont obligatoires pour chaque action — l'agent DOIT construire les chemins de source de données depuis le tableau Exigences de dataset par action et les inclure dans spec_overrides.
S3_TRAIN = "s3://bucket/data/train"
S3_EVAL = "s3://bucket/data/eval"
train (sources de données obligatoires) :
{
"train.num_epochs": 30,
"train.checkpoint_interval": 10,
"train.validation_interval": 10,
"train.num_gpus": 1,
"dataset.sequences.split_num": 90,
"train_dataset.sequences_split_num": 90,
"dataset.data_root": {"spec": f"{S3_TRAIN}/aicity.split)"},
"model.head.instance_bank.anchor": f"{S3_TRAIN}//results/{dataset_convert_job_id}/anchor_init.npy",
"dataset.train_dataset.ann_file": {"spec": f"{S3_TRAIN}/aicity.split)"},
"dataset.val_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
"dataset.test_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
}
evaluate (sources de données obligatoires) :
{
"dataset.data_root": {"spec": f"{S3_EVAL}/aicity.split)"},
"model.head.instance_bank.anchor": f"{S3_TRAIN}//results/{dataset_convert_job_id}/anchor_init.npy",
"dataset.train_dataset.ann_file": {"spec": f"{S3_TRAIN}/aicity.split)"},
"dataset.val_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
"dataset.test_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
}
export (sources de données obligatoires) :
{
"model.head.instance_bank.anchor": f"{S3_TRAIN}//results/{dataset_convert_job_id}/anchor_init.npy",
}
inference (sources de données obligatoires) :
{
"dataset.data_root": {"spec": f"{S3_EVAL}/aicity.split)"},
"model.head.instance_bank.anchor": f"{S3_TRAIN}//results/{dataset_convert_job_id}/anchor_init.npy",
"dataset.train_dataset.ann_file": {"spec": f"{S3_TRAIN}/aicity.split)"},
"dataset.val_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
"dataset.test_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
}
quantize (sources de données obligatoires) :
{
"dataset.data_root": {"spec": f"{S3_TRAIN}/aicity.split)"},
"model.head.instance_bank.anchor": f"{S3_TRAIN}//results/{dataset_convert_job_id}/anchor_init.npy",
"dataset.train_dataset.ann_file": {"spec": f"{S3_TRAIN}/aicity.split)"},
"dataset.val_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
"dataset.test_dataset.ann_file": {"spec": f"{S3_EVAL}/aicity.split)"},
"dataset.quant_calibration_dataset.images_dir": f"{S3_TRAIN}",
}
Dataset d'évaluation
Optionnel. Splits val/test configurés via les chemins des fichiers d'annotation de dataset.
Paramètres importants
- model.backbone : Backbone. Défaut resnet_101.
- model.neck.out_channels : Canaux de sortie FPN. Défaut 256. num_outs=4.
- model.input_shape : Forme d'image d'entrée [W, H]. Défaut [1408, 512].
- model.head.num_output : Nombre de requêtes de sortie de détection. Défaut 300.
- model.head.num_decoder : Nombre de couches de décodeur. Défaut 6.
- model.head.temporal : Activer le raisonnement temporel. Défaut True.
- model.head.instance_bank.num_anchor : Anchors de la banque d'instances. Défaut 900.
- model.head.instance_bank.num_temp_instances : Compte d'instances temporelles. Défaut 600.
- model.depth_branch.loss_weight : Poids de perte de supervision de profondeur. Défaut 0,2.
- dataset.batch_size : Taille de batch par GPU. Défaut 2.
- dataset.num_frames : Longueur de séquence. Défaut 200.
- dataset.classes : Classes de détection. Défaut [person, gr1_t2, agility_digit, nova_carter]. num_ids=70 pour le suivi.
- train.optim.lr : Taux d'apprentissage. Défaut 5e-5. img_backbone lr_mult=0,2.
- train.lr_scheduler : Planificateur cosinus avec warmup linéaire (500 iters, ratio 0,333).
- train.grad_clip.max_norm : Gradient clipping. Défaut 25.
- train.precision : Options : bf16, fp16, fp32. Défaut bf16.
- evaluate.metrics : Métriques d'évaluation. Défaut ["detection"]. Évaluation de suivi optionnelle.
- evaluate.tracking.enabled : Activer l'évaluation de suivi. tracking_threshold=0,2.
Multi-GPU / Multi-Node
Méthode de lancement : Gérée par Lightning (processus Python unique, Lightning crée les workers).
| Clé Spec | Description | Défaut |
|---|---|---|
train.num_gpus |
Nombre de GPUs | 1 |
train.gpu_ids |
Indices de dispositifs GPU | [0] |
train.num_nodes |
Nombre de nœuds | 1 |
- Stratégie multi-GPU :
ddp_find_unused_parameters_true(pas de support fsdp) sync_batchnormest toujours activé (True)- Itérations par époque calculées comme :
num_frames * num_bev_groups / (num_nodes * num_gpus * batch_size) - Mise à l'échelle : Lors de l'augmentation des GPUs, la taille effective du batch augmente et les itérations par époque diminuent proportionnellement
Variables d'environnement multi-node (définies par l'orchestrateur) : WORLD_SIZE, NODE_RANK, MASTER_ADDR, MASTER_PORT, NUM_GPU_PER_NODE.
Matériel
Minimum 2 GPU(s), recommandé 8 GPU(s). 40 GB+ (A100 recommandé) VRAM par GPU. Le modèle temporel multi-caméra consomme beaucoup de mémoire. bf16 requis pour l'entraînement pratique. Multi-GPU fortement recommandé. La banque d'instances nécessite une mémoire substantielle pour le raisonnement temporel.
Motifs d'erreurs
dataset_convert obligatoire : Doit exécuter dataset_convert d'abord pour produire les pickles d'annotation et anchor_init.npy.
Fichier anchor manquant : Définissez model.head.instance_bank.anchor sur le chemin anchor_init.npy des résultats de dataset_convert.
Temporal OOM : Réduisez dataset.num_frames ou dataset.batch_size si vous manquez de mémoire lors de l'entraînement temporel.
Inférence de paramètre Spec / Modèle parent
Les mappages d'inférence spécifiques au modèle appartiennent à ce fichier MD, pas à config.json. Les runners générés doivent lire cette section et appliquer les mappages avec les helpers SDK avant create_job(). Cela reflète l'ancien flux infer_params.py des microservices.
Mappages d'inférence depuis TAO Core sparse4d.config.json :
| Action | Champ Spec | Fonction d'inférence | Signification |
|---|---|---|---|
| dataset_convert | results_dir |
output_dir |
répertoire des résultats du job actuel |
| evaluate | encryption_key |
key |
clé de chiffrement |
| evaluate | evaluate.checkpoint |
parent_model |
fichier de modèle déduit du dossier des résultats du job parent |
| evaluate | results_dir |
output_dir |
répertoire des résultats du job actuel |
| export | encryption_key |
key |
clé de chiffrement |
| export | export.checkpoint |
parent_model |
fichier de modèle déduit du dossier des résultats du job parent |
| export | export.onnx_file |
create_onnx_file |
chemin de sortie ONNX |
| export | results_dir |
output_dir |
répertoire des résultats du job actuel |
| inference | encryption_key |
key |
clé de chiffrement |
| inference | inference.checkpoint |
parent_model |
fichier de modèle déduit du dossier des résultats du job parent |
| inference | results_dir |
output_dir |
répertoire des résultats du job actuel |
| quantize | encryption_key |
key |
clé de chiffrement |
| quantize | quantize.model_path |
parent_model |
fichier de modèle déduit du dossier des résultats du job parent |
| quantize | results_dir |
output_dir |
répertoire des résultats du job actuel |
| train | encryption_key |
key |
clé de chiffrement |
| train | results_dir |
output_dir |
répertoire des résultats du job actuel |
| train | train.pretrained_model_path |
ptm_if_no_resume_model |
PTM quand aucun checkpoint de reprise n'existe |
| train | train.resume_training_checkpoint_path |
resume_model |
fichier de modèle déduit du dossier des résultats du job actuel |
Pour parent_model ou parent_model_folder, passez l'identifiant du job enfant train/export/AutoML en amont comme parent_job_id. Le SDK liste le dossier de résultat parent, filtre les artefacts de checkpoint et retourne le fichier ou dossier de modèle sélectionné. N'ajoutez pas ces mappages à config.json et ne patchez pas les scripts de runners générés pour deviner les chemins de checkpoint.