tao-finetune-clip

Par nvidia · skills

Modèle vision-langage CLIP pour la recherche image-texte, la classification zero-shot, l'extraction d'embeddings, ONNX

npx skills add https://github.com/nvidia/skills --skill tao-finetune-clip

CLIP

Modèle de pré-entraînement contrastif image-texte pour la classification d'images zero-shot et fine-tuned, la récupération image-texte et l'extraction d'embeddings. Le fine-tuning adapte l'espace d'embeddings image-texte partagé de CLIP à des données image-caption spécifiques au domaine.

Aucun checkpoint pré-entraîné NGC par défaut n'est requis. Quand train.pretrained_model_path, evaluate.checkpoint, inference.checkpoint ou export.checkpoint ne sont pas définis, TAO charge les poids pré-entraînés depuis HuggingFace pour les variantes SigLIP2/OpenCLIP ou depuis torch.hub pour Radio-CLIP, donc le premier usage nécessite un accès réseau ou un miroir local.

Actions supportées : train, evaluate, inference, export, gen_trt_engine.

Train Action Policy

Ce modèle est activé AutoML au niveau du modèle. Avant de traiter toute demande au stade train, lisez references/skill_info.yaml et résolvez l'override d'exécution depuis soit une valeur automl_policy explicite, soit la demande de workflow de l'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 sur auto. Quand automl_policy: auto, automl_enabled: true et à la fois 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 workflow/application pour les datasets, specs, répertoires de sortie, paramètres GPU/platform, checkpoints parents et automl_policy. Utilisez l'entraînement direct du modèle uniquement quand automl_policy: off ou quand le schema/template train packagé est manquant ; dans le cas du schema manquant, rapportez que AutoML est activé mais non exécutable pour ce modèle jusqu'à ce que les schemas soient générés.

Les actions non-train comme evaluate, inference, export et les flux deploy restent dans cette skill modèle. L'override automl_policy par exécution ne change pas les métadonnées du modèle.

Instructions

Utilisez cette skill pour les jobs NVIDIA TAO CLIP : entraînement, évaluation, inference d'embedding, export ONNX et génération de moteur TensorRT. Commencez par identifier l'action demandée, puis chargez uniquement les fichiers référencés nécessaires pour cette action : defaults.json pour les paramètres par défaut, config.json pour le câblage action/source de données, references/spec_template.yaml pour la forme complète de spec, et references/model_info.yaml pour les métadonnées SDK.

Pour les actions soutenues par des datasets, collectez les fichiers image, caption, liste ou prompt requis auprès de l'utilisateur et placez les chemins résolus dans spec_overrides. Pour export et gen_trt_engine, déduisez les artefacts parents du job upstream quand disponible ; sinon, exigez explicitement checkpoint, ONNX ou chemins moteur. Exécutez gen_trt_engine, TensorRT evaluate et TensorRT inference dans l'image TAO Deploy.

Pour les actions TensorRT TAO Deploy (gen_trt_engine, TensorRT evaluate et TensorRT inference), lisez d'abord references/tao-deploy-clip.md. Les templates spec deploy vivent dans le dossier references/ de cette skill avec le préfixe spec_template_deploy_*.yaml.

Training Requirements

  • Dataset type: image_text
  • Formats: dossiers image/caption personnalisés ou shards WebDataset
  • Monitoring metric: val/t2i_mAP

Supported Models

  • SigLIP2: siglip2-so400m-patch16-256 (défaut), siglip2-so400m-patch14-224, siglip2-so400m-patch14-384, siglip2-so400m-patch16-384, siglip2-so400m-patch16-512, siglip2-so400m-patch16-naflex
  • Radio-CLIP: c-radio_v3-b, c-radio_v3-l, c-radio_v3-h, c-radio_v3-g
  • OpenCLIP / NV-CLIP: ViT-L-14-SigLIP-CLIPA-224, ViT-L-14-SigLIP-CLIPA-336, ViT-H-14-SigLIP-CLIPA-224, ViT-H-14-SigLIP-CLIPA-336, ViT-H-14-SigLIP-CLIPA-574

Radio-CLIP nécessite que model.adaptor_name soit défini à siglip ou clip.

Per-Action Dataset Requirements

Action Spec Key Source Files List?
train dataset.train.datasets train_datasets image_dir: images.tar.gz, image_list_file: image_list.txt, caption_dir: captions.tar.gz Yes
train dataset.train.wds.root_dir train_wds_dataset répertoire root contenant des shards .tar No
train dataset.train.wds.shard_list_file train_wds_dataset shards.txt listant les chemins des shards No
train dataset.val.datasets eval_dataset image_dir: images.tar.gz, image_list_file: image_list.txt, caption_dir: captions.tar.gz Yes
evaluate dataset.val.datasets eval_dataset image_dir: images.tar.gz, image_list_file: image_list.txt, caption_dir: captions.tar.gz Yes
inference inference.datasets inference_dataset image_dir: images.tar.gz Yes
inference inference.text_file inference_dataset prompts.txt No
export export.checkpoint parent train job ou checkpoint explicite checkpoint .pth, optionnel pour l'export pré-entraîné No
gen_trt_engine gen_trt_engine.onnx_file parent export job ou ONNX explicite clip_model.onnx No

Pour l'entraînement personnalisé, définissez dataset.train.type: custom et fournissez les entrées dataset.train.datasets. Les fichiers image et caption doivent partager le même nom de base. caption_file_suffix par défaut à .txt, et image_list_file est optionnel.

Pour l'entraînement WDS, définissez dataset.train.type: wds et fournissez au moins l'un de dataset.train.wds.root_dir ou dataset.train.wds.shard_list_file. root_dir est scanné récursivement pour les shards .tar. shard_list_file est un fichier texte avec un chemin de shard par ligne ; les lignes relatives se résolvent sous le répertoire du fichier liste à moins que root_dir soit aussi fourni, auquel cas elles se résolvent sous root_dir. Les données validation/evaluation restent au format personnalisé via dataset.val.datasets.

Typical Spec Overrides

Les overrides de source de données sont obligatoires pour les actions soutenues par dataset. Construisez les chemins à partir de la table Per-Action Dataset Requirements et incluez-les dans spec_overrides. Pour l'inference, fournissez au moins l'un de inference.datasets ou inference.text_file.

S3_TRAIN = "s3://bucket/data/train"
S3_WDS = "s3://bucket/data/wds"
S3_EVAL = "s3://bucket/data/eval"
S3_INFER = "s3://bucket/data/infer"

train, custom dataset:

{
    "train.num_epochs": 10,
    "dataset.train.type": "custom",
    "dataset.train.datasets": [{"image_dir": f"{S3_TRAIN}/images.tar.gz", "image_list_file": f"{S3_TRAIN}/image_list.txt", "caption_dir": f"{S3_TRAIN}/captions.tar.gz"}],
    "dataset.val.datasets": [{"image_dir": f"{S3_EVAL}/images.tar.gz", "image_list_file": f"{S3_EVAL}/image_list.txt", "caption_dir": f"{S3_EVAL}/captions.tar.gz"}],
}

train, WDS dataset:

{
    "train.num_epochs": 10,
    "dataset.train.type": "wds",
    "dataset.train.wds.root_dir": f"{S3_WDS}",
    "dataset.train.wds.shard_list_file": f"{S3_WDS}/shards.txt",
    "dataset.train.wds.samples_per_shard": 10000,
    "dataset.val.datasets": [{"image_dir": f"{S3_EVAL}/images.tar.gz", "image_list_file": f"{S3_EVAL}/image_list.txt", "caption_dir": f"{S3_EVAL}/captions.tar.gz"}],
}

evaluate:

{
    "dataset.val.datasets": [{"image_dir": f"{S3_EVAL}/images.tar.gz", "image_list_file": f"{S3_EVAL}/image_list.txt", "caption_dir": f"{S3_EVAL}/captions.tar.gz"}],
}

Laissez evaluate.checkpoint non défini pour l'évaluation zero-shot avec des poids pré-entraînés. Définissez plutôt evaluate.trt_engine au lieu de evaluate.checkpoint pour l'évaluation TensorRT.

inference:

{
    "inference.datasets": [{"image_dir": f"{S3_INFER}/images.tar.gz"}],
    "inference.text_file": f"{S3_INFER}/prompts.txt",
}

L'inference écrit image_embeddings.h5 et/ou text_embeddings.h5 sous results_dir. Les embeddings sauvegardés sont L2-normalisés.

export:

{
    "export.onnx_file": "${results_dir}/export/clip_model.onnx",
    "export.encoder_type": "combined",
    "export.batch_size": -1,
}

Définissez export.encoder_type: separate quand le déploiement doit utiliser des encodeurs vision et texte indépendants. L'export séparé écrit les variantes _vision.onnx et _text.onnx dérivées du export.onnx_file de base.

gen_trt_engine:

{
    "gen_trt_engine.onnx_file": "${results_dir}/export/clip_model.onnx",
    "gen_trt_engine.trt_engine": "${results_dir}/deploy/clip_model.engine",
    "gen_trt_engine.batch_size": -1,
    "gen_trt_engine.tensorrt.data_type": "fp16",
    "gen_trt_engine.tensorrt.min_batch_size": 1,
    "gen_trt_engine.tensorrt.opt_batch_size": 1,
    "gen_trt_engine.tensorrt.max_batch_size": 16,
}

Eval Dataset

Optionnel pour l'entraînement. S'il est fourni, les métriques de validation sont calculées aux intervalles de validation. Requis pour evaluate.

Deploy Workflow

La skill expose gen_trt_engine comme l'action deploy. Dans les runners SDK générés, utilisez model_info["actions"]["gen_trt_engine"] et exécutez-le dans l'image TAO Deploy, non l'image PyTorch d'entraînement. La commande in-container est clip gen_trt_engine -e {config_path} ; l'usage direct de TAO Launcher épelle la même action comme tao deploy clip gen_trt_engine -e /path/to/spec.yaml.

TAO Deploy supporte les formats combiné et encodeurs séparés. Pour les encodeurs séparés, passez le chemin de base sans _vision ou _text à gen_trt_engine.onnx_file et gen_trt_engine.trt_engine ; TAO détecte ou écrit les fichiers vision/texte suffixés.

Utilisez evaluate.trt_engine pour l'évaluation TensorRT et inference.trt_engine pour l'extraction d'embeddings TensorRT. Ces chemins TensorRT s'exécutent aussi dans l'image TAO Deploy. L'usage direct de TAO Launcher épelle ceux-ci comme tao deploy clip evaluate et tao deploy clip inference.

Référence TAO Deploy complète : tao-deploy-clip.

Important Parameters

  • model.type: Famille de backbone et résolution. Utilisez les variantes SigLIP2/OpenCLIP à résolution fixe pour le déploiement.
  • model.adaptor_name: Requis pour Radio-CLIP. Définissez à siglip ou clip.
  • model.image_size: Résolution d'image du transform d'entraînement. Gardez-la alignée avec le backbone à résolution fixe sélectionné.
  • train.num_epochs: Le fine-tuning CLIP converge souvent rapidement. Commencez avec 10-20 epochs pour l'adaptation de domaine, puis augmentez seulement si la perte de validation s'améliore encore.
  • train.optim.vision_lr / train.optim.text_lr: Taux d'apprentissage des deux encodeurs. CLIP est sensible aux taux d'apprentissage élevés ; réduisez les deux si la perte est instable.
  • model.freeze_vision_encoder / model.freeze_text_encoder: Les défauts sont false. Geler un encodeur peut aider quand le dataset est petit ou quand seule une modalité a besoin d'adaptation.
  • train.loss_type: siglip est recommandé pour SigLIP2 et Radio-CLIP. Utilisez clip pour la perte softmax de style CLIP.
  • export.encoder_type: combined exporte un graphe ONNX unique. separate exporte les graphes vision et texte indépendants.
  • gen_trt_engine.tensorrt.data_type: Le déploiement TensorRT supporte fp16 et fp32.

Hardware

L'entraînement mono-GPU fonctionne pour les petits datasets. Utilisez 4+ GPUs pour les datasets de plus de 100 000 images ou les grands backbones. Utilisez 16 GB+ VRAM par GPU pour les exécutions petit/résolution fixe et des GPUs plus grands pour Radio-CLIP ou les variantes OpenCLIP haute résolution.

Error Patterns

CUDA out of memory: Réduisez dataset.train.batch_size, dataset.val.batch_size ou les tailles de batch TensorRT opt/max. Pour l'export/deploy, vérifiez export.input_height et export.input_width contre le backbone à résolution fixe sélectionné.

NaN loss: Le taux d'apprentissage est trop élevé pour le fine-tuning. Réduisez train.optim.vision_lr et train.optim.text_lr, augmentez train.optim.warmup_steps et vérifiez que les captions sont du texte valide non vide.

Zero retrieval ou classification quality: Vérifiez que les captions et prompts correspondent au vocabulaire d'étiquettes cible. CLIP compare les embeddings image et texte, donc le libellé du prompt importe.

Dataset size smaller than total batch size: La taille totale du batch est batch_size * num_gpus. Si le dataset, particulièrement la validation, a moins d'échantillons que cela, réduisez dataset.val.batch_size ou dataset.train.batch_size.

Radio-CLIP config validation error: Définissez model.adaptor_name explicitement à siglip ou clip.

Naflex export failure: siglip2-so400m-patch16-naflex est entraînement-only dans la documentation TAO actuelle et ne peut pas être exporté vers ONNX ou TensorRT. Utilisez une variante à résolution fixe comme siglip2-so400m-patch16-384.

ONNX external data missing: Les modèles plus grands que 2 GB exportent un fichier ONNX plus un fichier de données externes. Gardez les deux fichiers dans le même répertoire et ne renommez pas le fichier de données externes avant gen_trt_engine.

TensorRT shape mismatch: Quand vous utilisez l'export de batch dynamique, fournissez les profils de forme min/opt/max pour chaque entrée. La longueur de séquence texte doit correspondre à la longueur du tokenizer, communément 77 pour les tokenizers CLIP et 64 pour les tokenizers SigLIP2.

attention_mask warning: attention_mask est actuellement accepté par les graphes exportés pour la compatibilité, mais TAO ignore ses valeurs et peut le supprimer dans une version future. Ne construisez pas de nouveau code d'inference direct-ONNX qui dépend des valeurs de masque.

Error merging spec.yaml with schema: Une erreur de validation de config Hydra/OmegaConf. Les causes courantes sont mettant num_epochs ou num_gpus à la racine de spec au lieu de sous train.*, ou mélangeant la taille d'image d'entraînement (model.image_size) avec les dimensions d'export (export.input_height et export.input_width).

Spec Param / Parent Model Inference

Les mappages d'inference spécifiques au modèle appartiennent à ce fichier MD, non à 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 le flux infer_params.py ancien des microservices.

Mappages d'inference depuis TAO Core clip.config.json:

Action Spec Field Inference Function Meaning
evaluate encryption_key key clé de chiffrement
evaluate evaluate.checkpoint parent_model fichier modèle déduit du dossier résultats du job parent
evaluate evaluate.trt_engine parent_model fichier modèle déduit du dossier résultats du job parent
evaluate results_dir output_dir répertoire résultats du job courant
export encryption_key key clé de chiffrement
export export.checkpoint parent_model fichier modèle déduit du dossier résultats du job parent
export export.onnx_file create_onnx_file chemin ONNX de sortie
export results_dir output_dir répertoire résultats du job courant
gen_trt_engine encryption_key key clé de chiffrement
gen_trt_engine gen_trt_engine.onnx_file parent_model fichier modèle déduit du dossier résultats du job parent
gen_trt_engine gen_trt_engine.trt_engine create_engine_file chemin moteur TensorRT de sortie
gen_trt_engine results_dir output_dir répertoire résultats du job courant
inference encryption_key key clé de chiffrement
inference inference.checkpoint parent_model fichier modèle déduit du dossier résultats du job parent
inference inference.trt_engine parent_model fichier modèle déduit du dossier résultats du job parent
inference results_dir output_dir répertoire résultats du job courant
train encryption_key key clé de chiffrement
train results_dir output_dir répertoire résultats du job courant
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 modèle déduit du dossier résultats du job courant

Pour parent_model ou parent_model_folder, passez l'id du job enfant train/export/AutoML upstream comme parent_job_id. Le SDK liste le dossier résultats parent, filtre les artefacts checkpoint et retourne le fichier ou dossier modèle sélectionné. N'ajoutez pas ces mappages de retour à config.json et ne patchez pas les scripts runner générés pour deviner les chemins checkpoint.

Skills similaires