tao-finetune-cosmos-embed

Par nvidia · skills

Cosmos-Embed1 est un modèle d'embedding vidéo-texte destiné à la recherche texte-vers-vidéo, la recherche vidéo-vers-vidéo, la déduplication sémantique et le fine-tuning. À utiliser quand l'utilisateur demande à « fine-tuner Cosmos-Embed1 », « exécuter une inférence cosmos-embed », « exporter Cosmos-Embed1 », « embedder des vidéos » ou « rechercher des vidéos avec du texte ».

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

Cosmos-Embed

Cosmos-Embed1 est un embedder vidéo-texte joint pour la récupération texte-vers-vidéo, la recherche vidéo-vers-vidéo, la classification zero-shot/kNN et la déduplication sémantique. Le CLI packagé est cosmos-embed1 et supporte train, evaluate, inference et export.

L'image conteneur et les commandes par action sont dans references/skill_info.yaml. Les specs de démarrage compact sont dans references/spec_template_*.yaml.

Train Action Policy

Ce modèle est AutoML-enabled au niveau du modèle. Avant de traiter toute demande au stade train, lisez references/skill_info.yaml et résolvez l'override de run 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 run 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/platform, checkpoints parents et automl_policy. Utilisez l'entraînement direct du modèle uniquement quand automl_policy: off ou que le schema/template train packagé manque ; en cas de schema manquant, signalez 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 flows de déploiement restent dans cette skill de modèle. L'override automl_policy par run ne change pas les métadonnées du modèle.

Quick Start

Utilisez le conteneur Cosmos-Embed publié déclaré par references/skill_info.yaml et résolu via versions.yaml. Ne faites pas de build à partir de l'arborescence source privée de Cosmos-Embed1 pour un usage normal de skill ; faites un build à partir de la source uniquement lors du développement du conteneur lui-même.

TAO_SKILL_BANK_PATH="${TAO_SKILL_BANK_PATH:-$PWD}"
COSMOS_EMBED_IMAGE="${COSMOS_EMBED_IMAGE:-$(
  python "$TAO_SKILL_BANK_PATH/scripts/resolve_tao_image.py" \
    --skill-bank "$TAO_SKILL_BANK_PATH" \
    --model cosmos-embed \
    --action train \
    --format json |
  python -c 'import json,sys; print(json.load(sys.stdin)["image"])'
)}"
docker pull "$COSMOS_EMBED_IMAGE"

Layout du workspace local attendu :

workspace/
├── data/
│   ├── msrvtt_test_1k.json
│   └── video/
│       ├── video7020.mp4
│       └── ...
├── model/
│   └── Cosmos-Embed1-224p/        # optionnel si on utilise l'id repo HF
├── specs/
│   ├── train.yaml
│   ├── evaluate.yaml
│   ├── inference.yaml
│   ├── export_onnx.yaml
│   └── export_hf.yaml
└── results/

Utilisez ces options Docker pour toutes les actions sauf si la skill Docker/platform locale donne une commande plus stricte spécifique à l'environnement :

TAO_SKILL_BANK_PATH="${TAO_SKILL_BANK_PATH:-$PWD}"
COSMOS_EMBED_IMAGE="${COSMOS_EMBED_IMAGE:-$(
  python "$TAO_SKILL_BANK_PATH/scripts/resolve_tao_image.py" \
    --skill-bank "$TAO_SKILL_BANK_PATH" \
    --model cosmos-embed \
    --action train \
    --format json |
  python -c 'import json,sys; print(json.load(sys.stdin)["image"])'
)}"
RUN_ROOT="${RUN_ROOT:-$PWD}"
DOCKER_COMMON=(
  --rm --gpus all --ipc=host --network=host
  --shm-size=64g
  --ulimit memlock=-1
  --ulimit stack=67108864
  -e HF_TOKEN
  -v "$RUN_ROOT/data:/data:ro"
  -v "$RUN_ROOT/model:/model"
  -v "$RUN_ROOT/specs:/specs:ro"
  -v "$RUN_ROOT/results:/results"
)

Train :

docker run "${DOCKER_COMMON[@]}" "$COSMOS_EMBED_IMAGE" \
  cosmos-embed1 train -e /specs/train.yaml results_dir=/results

Evaluate :

docker run "${DOCKER_COMMON[@]}" "$COSMOS_EMBED_IMAGE" \
  cosmos-embed1 evaluate -e /specs/evaluate.yaml results_dir=/results

Inference :

docker run "${DOCKER_COMMON[@]}" "$COSMOS_EMBED_IMAGE" \
  cosmos-embed1 inference -e /specs/inference.yaml \
  'inference.query.input_texts=["a man is singing on stage"]' \
  inference.k=5 \
  results_dir=/results

Export ONNX :

docker run "${DOCKER_COMMON[@]}" "$COSMOS_EMBED_IMAGE" \
  cosmos-embed1 export -e /specs/export_onnx.yaml \
  export.checkpoint=/results/train/cosmos_embed1_model_latest.pth \
  export.onnx_file=/results/export/cosmos_embed1_combined.onnx \
  results_dir=/results

Export format HuggingFace :

docker run "${DOCKER_COMMON[@]}" "$COSMOS_EMBED_IMAGE" \
  cosmos-embed1 export -e /specs/export_hf.yaml \
  export.checkpoint=/results/train/cosmos_embed1_model_latest.pth \
  export.hf_output_dir=/results/export_hf/cosmos_embed1_hf \
  results_dir=/results

Smoke Overrides

Pour un petit contrôle fonctionnel, gardez les mêmes specs et overridez les paramètres coûteux :

train.max_iter=1
train.validation_iter=2
train.checkpoint_iter=1
train.optim.optim=adamw
dataset.train_dataset.batch_size=1
dataset.val_dataset.batch_size=1
dataset.train_dataset.workers=0
dataset.val_dataset.workers=0

Si aucun checkpoint pré-entraîné local Cosmos-Embed1 ou token HuggingFace n'est disponible, définissez model.pretrained_model_path=null pour un smoke train de plomberie uniquement. La qualité du modèle est insignifiante dans ce mode, mais les chemins d'action train/evaluate/inference/export peuvent toujours être exercés.

Pour les smoke tests d'evaluate et inference sur un petit sous-ensemble :

evaluate.callbacks.embedding_visualization=false
evaluate.callbacks.max_eval_samples=8
dataset.test_dataset.batch_size=1
dataset.test_dataset.workers=0
inference.k=2
dataset.inference_dataset.batch_size=1
dataset.inference_dataset.workers=0

Data Format

Le chemin MSR-VTT attend un glob vidéo local et un fichier de métadonnées JSON :

dataset:
  train_dataset:
    dataset_type: msrvtt
    mp4_urls: /data/video/*.mp4
    metadata: /data/msrvtt_test_1k.json

Les lignes de métadonnées au format liste doivent inclure au minimum video et caption :

{"video_id": "video7020", "video": "video7020.mp4", "caption": "a woman creating a fondant baby and flower"}

Le dataset loader déduit l'id vidéo du nom de fichier .mp4 local et filtre les vidéos présentes dans les métadonnées. Si une run trouve zéro vidéo, vérifiez que mp4_urls pointe vers un glob local au conteneur et que les noms video des métadonnées correspondent aux noms de fichiers.

Model Weights

  • Répertoire HF local : montez-le sous /model et définissez model.pretrained_model_path=/model/Cosmos-Embed1-224p.
  • Repo HuggingFace : définissez model.pretrained_model_path=nvidia/Cosmos-Embed1-224p et passez HF_TOKEN si l'accès est gardienné.
  • Checkpoint fine-tuné : les actions en aval par défaut à /results/train/cosmos_embed1_model_latest.pth.

Variantes :

Variante Résolution Frames Embedding dim
Cosmos-Embed1-224p 224 x 224 8 256
Cosmos-Embed1-336p 336 x 336 8 768
Cosmos-Embed1-448p 448 x 448 8 768

Gardez model.network.embed_dim, model.input_hw et model.network.spatial_resolution alignés avec la variante sélectionnée.

Important Parameters

Paramètre Notes
train.num_gpus 1 pour une seule GPU, >1 lance automatiquement torchrun, -1 auto-détecte les GPUs visibles.
train.max_iter Longueur principale de l'entraînement. Utilisez 1 uniquement pour les smoke tests.
train.optim.optim fused_adamw est plus rapide quand disponible ; adamw est plus sûr pour smoke et portabilité.
model.lora.enabled Active LoRA. Définissez model.network.visual_encoder.transformer_engine=false quand LoRA est activé.
model.lora.lora_rank LoRA rank. Commencez par 8 ; essayez 4, 8, ou 16 pour des sweeps manuels ou de style AutoML.
model.lora.lora_alpha Facteur de scaling LoRA. Commencez par 16 ; gardez près de 2 * lora_rank sauf si des expériences montrent le contraire.
model.lora.lora_dropout LoRA dropout. Commencez par 0.1 ; sweepez 0.0, 0.05 et 0.1 pour les petits datasets.
model.lora.bias Politique de bias : none, all, ou lora_only. Gardez none sauf si vous entraînez intentionnellement les biases.
model.lora.use_rslora / use_dora Variantes LoRA optionnelles. Activez-en une à la fois et enregistrez le paramètre avec le checkpoint.
model.lora.target_modules Patterns de noms de modules optionnels pour l'injection LoRA. Laissez vide pour les cibles par défaut ViT + Q-Former attention/MLP.
model.lora.modules_to_save Modules optionnels à garder entièrement entraînables aux côtés de LoRA. Laissez vide sauf si vous préservez une tête spécifique à la tâche.
evaluate.load_dataset_pkl / save_dataset_pkl Cache les embeddings d'évaluation.
inference.load_dataset_pkl / save_dataset_pkl Cache la base de données de recherche pour la récupération répétée.
export.mode video, text, combined, ou huggingface.
export.on_cpu Recommandé pour l'export afin d'éviter les problèmes d'incompatibilité de device.

LoRA and AutoML Notes

Pour le fine-tuning parameter-efficient, définissez model.lora.enabled=true et gardez model.network.visual_encoder.transformer_engine=false ; la config TAO Core de Cosmos-Embed1 note que PEFT ne peut pas injecter d'adaptateurs dans les couches Transformer Engine. Traitez les champs LoRA ci-dessus comme les premiers paramètres candidats pour le tuning manuel ou la recherche de style AutoML avant de dégeler des blocs de modèle plus larges. Évitez de changer target_modules ou modules_to_save sauf si l'utilisateur a explicitement besoin d'un placement d'adaptateur personnalisé.

S3 Staging

Le CLI Cosmos-Embed1 consomme des chemins locaux et des globs Python, pas des URIs bruts s3://.../*.mp4. Pour les runs avec S3, staging d'abord un sous-ensemble ou le dataset complet sur le filesystem hôte/conteneur d'exécution, puis utilisez des chemins locaux comme /data/video/*.mp4 dans la spec.

Layout S3 recommandé pour les données MSR-VTT stagées :

s3://bucket/path/cosmos-embed/msrvtt-subset/
├── msrvtt_test_1k.json
└── video/
    ├── video7020.mp4
    └── ...

Après téléchargement/sync de ce préfixe dans le répertoire data/ monté, utilisez les mêmes commandes Docker ci-dessus.

Outputs

results/
├── train/
│   ├── cosmos_embed1_model_latest.pth
│   ├── cosmos_embed1_model_<iter>.pth
│   └── experiment.yaml
├── evaluate/
│   ├── metrics.json
│   └── experiment.yaml
├── inference/
│   ├── results.json
│   └── experiment.yaml
├── export/
│   ├── cosmos_embed1_combined.onnx
│   └── export_config.yaml
└── export_hf/
    └── cosmos_embed1_hf/

Known Pitfalls

Symptôme Cause Fix
MSRVTTDataset: 0 videos found mp4_urls n'est pas un glob local ou les noms de fichiers de métadonnées ne correspondent pas aux vidéos. Montez les données dans le conteneur et définissez mp4_urls=/data/video/*.mp4.
Échec HF download/auth HF_TOKEN manquant ou invalide, ou accord de modèle non accepté. Acceptez les conditions du modèle et passez -e HF_TOKEN.
Échec d'injection LoRA L'encodeur visuel Transformer Engine est activé. Définissez model.network.visual_encoder.transformer_engine=false.
L'export ONNX/HF se plaint de composants manquants Le checkpoint d'export est partiel ou adapter-only. Utilisez un checkpoint complet ou configurez les sources visuelles/texte pré-entraînées avant l'export.
CUDA OOM Batch/résolution trop élevé pour la GPU. Réduisez la taille du batch, utilisez 224p, activez LoRA, ou utilisez plus de GPUs.

Skills similaires