NV-Segment-CT Finetune
Objectif
- Utilisé pour l'ajustement fin (finetune) ou le smoke test du dataset NV-Segment-CT VISTA3D sur les labels CT NIfTI. Non destiné à la validation clinique.
- Encapsule le point d'entrée du bundle MONAI en amont ; ne le remplacez pas par du code d'entraînement ou d'inférence écrit à la main.
- Les entrées du manifest sont
dataset_dir,datalist,target_anatomy,label_mapping,smoke,sanity,auto_segetskip_formal_eval. - Les sorties du manifest sont
finetuned_ckptetresult_jsonvérifié par schéma.
Instructions
- Exécutez
scripts/run_finetune.py; ne modifiez pas les fichiers sousbundle/ou les checkouts en amont lors d'une utilisation normale du skill. - Pour un Bash autonome, incluez la ligne de configuration d'environnement frais avant le wrapper ; les venv de benchmark commencent vides.
- Exécutez le script commité en place depuis la racine du repo. Ne copiez pas ce skill dans un répertoire runtime, et n'utilisez pas de commandes
rmou de nettoyage dans les invocations générées. - Si un hôte expose
run_script, utilisezrun_script("scripts/run_finetune.py", args=[...]); sinon exécutez depuis la racine du repo. - Pour la vérification de flux de travail la plus courte, utilisez
--smoke; pour la reproduction de la Tâche 06 Lung Tumor du MSD, utilisez--sanity. - Consultez
references/task06-and-results.mduniquement quand vous avez besoin des détails de référence Task06, des définitions de champs de sortie ou des notes de configuration du bundle manuel.
Scripts disponibles
| Script | Objectif | Arguments |
|---|---|---|
scripts/run_finetune.py |
Point d'entrée principal déclaré par skill_manifest.yaml ; prépare les configs, exécute MONAI et écrit output.json. |
[FIXTURE_OR_DATASET] --output-dir OUT_DIR [--smoke] [--sanity] [--auto-seg] [--dataset-dir DIR] [--datalist JSON] [--target-anatomy TEXT] [--label-mapping JSON] [--patch-size JSON] |
Prérequis
- Python 3.10+ avec Torch compatible CUDA pour les exécutions GPU.
- Packages runtime depuis
skill_manifest.yaml, notammentmonai==1.4.0,numpy<2,nibabel,scipy,typer,PyYAML,fire,pytorch-ignite,einopsethuggingface_hub. - Variables d'environnement optionnelles :
CUDA_VISIBLE_DEVICESrestreint les GPU visibles ;NPROC_PER_NODEremplace le nombre de GPU et les valeurs>=2sélectionnent le mode multi-GPU pour les exécutions non-sanity. - Effets secondaires : écrit les configs du bundle générés sous
skills/nv-segment-ct-finetune/bundle/configs/, notammentskills/nv-segment-ct-finetune/bundle/configs/auto_override.json,skills/nv-segment-ct-finetune/bundle/configs/train_continual_task06_lung.jsonetskills/nv-segment-ct-finetune/bundle/configs/dfw_no_logging.json; écrit les checkpoints/preuves sous--output-dir, peut mettre en cache les assets du modèle sous~/.cache/huggingface/et peut contacterhttps://huggingface.coouhttps://raw.githubusercontent.com.
Configuration d'environnement frais :
python -m pip install "monai==1.4.0" "numpy<2" pytorch-ignite einops nibabel scipy typer PyYAML fire huggingface_hub
Contraintes de compatibilité amont connues :
- Référence DFW Task06 : Python
3.10.16, MONAI1.4.0, Torch2.7.0+cu126. - Utilisez
monai==1.4.0exact pour les smoke, sanity et evidence runs ; MONAI 1.5.x peut planter la perte d'ajustement fin en amont sur les labels booléens. - Ne flottez pas la dépendance comme
monai>=1.4,<1.6dans les commandes générées.
Utilisation
Vérification de flux de travail à l'échelle smoke :
python -m pip install "monai==1.4.0" "numpy<2" pytorch-ignite einops nibabel scipy typer PyYAML fire huggingface_hub && \
python skills/nv-segment-ct-finetune/scripts/run_finetune.py \
PATH_TO_DATASET \
--smoke \
--patch-size '[64,64,64]' \
--output-dir runs/nvseg_smoke
Utilisez le dataset préparé comme PATH_TO_DATASET. Pour la micro fixture, utilisez skills/nv-segment-ct-finetune/fixtures/spleen_micro. Le mode smoke prouve le câblage, la génération de config, le chargement de checkpoint et la compatibilité runtime ; ce n'est pas un critère de qualité.
Reproduction de sanity Lung Tumor MSD Task06 :
python skills/nv-segment-ct-finetune/scripts/run_finetune.py \
/path/to/Task06 \
--sanity \
--output-dir runs/nvseg_task06_sanity
Le preset sanity suit la recette DFW mono-GPU : validation fold-0, mapping label [[1, 23]] pour lung tumor, segmentation par classe-prompt automatique, patch [128,128,128], 5 epochs et scoring à espacement original dans configs/evaluate.json avant et après l'entraînement. La plage de référence attendue est Dice pré-entraîné environ 0.6697, Dice meilleur entraînement environ 0.6905 et Dice formel ajusté fin environ 0.6836.
Ajustement fin sur données utilisateur :
python skills/nv-segment-ct-finetune/scripts/run_finetune.py \
--dataset-dir /path/to/dataset \
--datalist /path/to/datalist.json \
--target-anatomy "lung tumor" \
--auto-seg \
--epochs 5 \
--patch-size '[128,128,128]' \
--output-dir runs/nvseg_user_finetune
Utilisez --label-mapping '[[1, 23]]' quand les valeurs de label locales sont personnalisées ou que le nom d'anatomie est ambigu.
Exemples
Smoke run sur un tiny dataset préparé :
python skills/nv-segment-ct-finetune/scripts/run_finetune.py \
runs/with_vs_without_nv/_inputs/nv_segment_ct_finetune/input_dataset \
--smoke \
--patch-size '[64,64,64]' \
--output-dir runs/nvseg_smoke
Task06 sanity run sur un cache MSD local :
python skills/nv-segment-ct-finetune/scripts/run_finetune.py \
.workbench_data/datasets/Task06_Lung \
--sanity \
--output-dir runs/nvseg_task06_sanity
Contrat de données
- Layout préféré :
dataset/imagesTr/*.nii.gzetdataset/labelsTr/*.nii.gz. - Les labels doivent s'aligner un-à-un avec les images par basename.
- La valeur du label cible doit être présente dans les labels d'entraînement.
- Utilisez un datalist quand la division au niveau patient importe. Le
foldpar défaut du bundle est0, donc les entréesfold: 0sont pour la validation et tous les autres folds pour l'entraînement. - Chaque label foreground entraîné doit mapper vers un ID de classe global VISTA3D existant depuis
bundle/label_dict.json; ce skill ne peut pas inventer une nouvelle classe.
Résultats
Vérifiez d'abord output.json dans le répertoire d'exécution :
formal_pretrained_val_diceetformal_finetuned_val_dice: scores pré/post à espacement original quand l'évaluation formelle est activée.training_start_val_dice,val_dice_per_epochettraining_best_val_dice: trace de validation au moment de l'entraînement.finetuned_ckpt_matches_pretrained_weights: détecte le piège epoch-0 quandval_at_start=true.recommended_ckpt: checkpoint à conserver. N'utilisez pas aveuglément le dernier epoch oumodel_finetune.pt.runtime.oom,runtime.peak_gpu_mbet logs de phase : distinguent OOM, validation lente et échec de processus.
Règle de décision : préférez les scores formels pré/post à espacement original quand présents ; rejetez les checkpoints "ajustés fins" tenseur-identiques pour la récupération sanity ; traitez improved: false comme une preuve valide plutôt qu'un échec du wrapper.
Limitations
- Wrapper fin. L'entraînement, la validation, les transformations et le checkpointing sont délégués au bundle en amont dans
bundle/. - Le plan auto-dérivé est heuristique ; les
--patch-size,--cache-rate,--epochset--learning-ratefournis par l'appelant gagnent. - La recette sanity Task06 force intentionnellement l'exécution mono-GPU pour correspondre à la référence DFW. Le mode multi-GPU pour d'autres datasets nécessite le support
torchrunde l'hôte. - Le vérificateur jumelé est CPU-only et audite le pack de preuve ; il ne relance pas la segmentation GPU.
- Non destiné au déploiement clinique, à l'interprétation clinique, au diagnostic autonome ou à la soumission réglementaire.
Dépannage
| Erreur | Cause | Correction |
|---|---|---|
| Dépendance manquante ou erreur d'import | Dérive runtime depuis skill_manifest.yaml. |
Installez les packages ci-dessus ou utilisez l'environnement documenté. |
| Dice Task06 pré-entraîné bas | Mauvaise config, mauvais checkpoint, dérive de split de données ou dérive de dépendance. | Comparez les champs d'environnement et les configs préparés avant de changer la logique d'entraînement. |
model_finetune.pt correspond au pré-entraîné |
val_at_start=true a sélectionné epoch 0 comme meilleur. |
Utilisez recommended_ckpt ; traitez la récupération sanity comme échouée sauf si un checkpoint modifié améliore le Dice formel. |
| Champs Dice formel manquants | L'évaluation formelle a échoué ou a été ignorée. | Inspectez eval_pretrained.log, eval_finetuned.log et metrics.csv. |
| GPU manque de mémoire | Paramètres patch/cache trop grands. | Réduisez --patch-size, baissez --cache-rate ou réduisez les workers. |
| Pas de cas de validation | Datalist manque fold: 0. |
Fournissez au moins une entrée de validation. |
Vérification
Exécutez le vérificateur implémenté quand les quality gates importent :
python -m eval_engine.run_trusted skills/nv-segment-ct-finetune \
--fixture skills/nv-segment-ct-finetune/fixtures/spleen_micro \
--out runs/nvseg_trusted