Tao Finetune Video Clip
NVIDIAOfficialCreated by NVIDIA Corporation
- Skill
- Tool integration
- Data and AI
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The tao-finetune-video-clip skill provides a structured interface for working with the InternVideo2-CLIP L14 model within the NVIDIA TAO ecosystem. It supports the full lifecycle of video-text retrieval tasks, including LoRA fine-tuning, model evaluation, inference, and ONNX export. The skill also facilitates high-throughput deployment by enabling the conversion of exported models into TensorRT engines for optimized execution.
What it does
- Performs LoRA fine-tuning on InternVideo2-CLIP L14 models.
- Executes zero-shot classification and video-text retrieval tasks.
- Extracts video and text embeddings for downstream analysis.
- Exports models to ONNX format for cross-platform compatibility.
- Generates TensorRT engines for accelerated model deployment.
- Supports evaluation of retrieval metrics using vadr1_chunks metadata.
When to use it
- When you need to fine-tune InternVideo2-CLIP on custom video datasets.
- When you require video-text retrieval or zero-shot classification capabilities.
- When you need to extract embeddings from video clips or text prompts.
- When you are preparing a model for production deployment using TensorRT.
Advantages
- Provides a unified workflow for training, evaluation, and deployment.
- Includes support for LoRA to enable efficient model adaptation.
- Enables TensorRT engine generation for optimized inference.
- Maintains consistency between PyTorch training and deployment environments.
Usage examples
- “Fine-tune the InternVideo2-CLIP model using my custom training data.”
- The agent initiates the training process using the specified train.yaml configuration and vadr1_chunks metadata.
- “Export my trained Video-CLIP model to ONNX.”
- The agent runs the export command to generate the combined image-and-text ONNX file along with necessary tokenizer and configuration sidecars.
- “Build a TensorRT engine for my exported Video-CLIP model.”
- The agent uses the TAO Deploy container to convert the ONNX model into a TensorRT engine optimized for inference.
- “Run inference on a set of video clips using the Video-CLIP model.”
- The agent processes the input videos and text prompts to generate retrieval results or embeddings based on the provided inference configuration.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/nvidia/tao-finetune-video-clip/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip tao-finetune-video-clip.zip -d .agents/skills
Documentation by NVIDIA Corporation
InternVideo2-CLIP (TAO video_clip)
Standalone install? If this session was not initialized by the TAO skill bank plugin, run the
tao-setupskill first (host preflight, credentials, cross-skill discovery).
TAO task video_clip wraps OpenGVLab InternVideo2-CLIP L14. The PyTorch image provides train, evaluate, inference, export, and default_specs. TAO Deploy provides gen_trt_engine, TensorRT evaluate, and TensorRT inference.
Container images and per-action commands are in references/skill_info.yaml and references/tao-deploy-video-clip.skill_info.yaml. Starting specs are in references/spec_template_*.yaml.
Release note: The pinned PyTorch image is the TAO 7.2 release-candidate build validated for Video-CLIP. It includes PyAV 17.1.0 as the primary decoder and ONNXScript 0.7.1 for export, with decord absent. The TAO Deploy image is pinned independently because
gen_trt_engineand TensorRT-backed actions do not run in the PyTorch image.Known-broken images: interim builds cut before tao-pytorch commit
0cc31de4ship avideo_clippackage with nomodel.backbonessubmodule, sotrain/evaluate/inferencedie at import whilevideo_clip --helpstill exits 0. Images without PyAV also fail at data loading. Run both import checks in the preflight below before pulling data or launching a run.
Train Action Policy
AutoML is not packaged for this model skill. Always use direct video_clip actions even when a higher-level request mentions AutoML. Non-train actions stay in this skill.
Quick Start (local Docker)
Use the pinned TAO container declared in references/skill_info.yaml. Pull with NGC_KEY when the image is not cached locally.
VIDEO_CLIP_IMAGE_DEFAULT="nvcr.io/nvidia/tao/tao-toolkit:7.3.0-pyt" # versions-key: images.tao_toolkit.pyt
VIDEO_CLIP_IMAGE="${VIDEO_CLIP_IMAGE:-$VIDEO_CLIP_IMAGE_DEFAULT}"
docker pull "$VIDEO_CLIP_IMAGE"Expected workspace layout (host paths bind-mounted into the container):
workspace/
├── data/
│ ├── train.json # vadr1_chunks metadata; video_path = /data/videos/<name>.mp4
│ ├── val.json
│ ├── prompts.txt # one text prompt per line (inference)
│ └── videos/ # mp4 clips referenced by train.json / val.json
├── model/
│ ├── mobileclip_blt.pt # MobileCLIP weights for model.text_encoder
│ └── hf/ # offline InternVideo2_distillation_models snapshot (HF_HUB_OFFLINE=1)
├── specs/
│ ├── train.yaml
│ ├── evaluate.yaml
│ ├── inference.yaml
│ └── export.yaml
├── deploy_specs/
│ ├── gen_trt_engine.yaml
│ ├── evaluate.yaml
│ └── inference.yaml
└── results/Docker options for all actions (skill-eval CI uses the same $WORKSPACE_DIR bind-mount pattern):
VIDEO_CLIP_IMAGE_DEFAULT="nvcr.io/nvidia/tao/tao-toolkit:7.3.0-pyt" # versions-key: images.tao_toolkit.pyt
VIDEO_CLIP_IMAGE="${VIDEO_CLIP_IMAGE:-$VIDEO_CLIP_IMAGE_DEFAULT}"
RUN_ROOT="${RUN_ROOT:-$PWD}"
DOCKER_COMMON=(
--rm --gpus all --shm-size=8g --network=host
--shm-size=64g
--ulimit memlock=-1
--ulimit stack=67108864
-e WANDB_DISABLED=true
-e WANDB_MODE=disabled
-e HF_HUB_OFFLINE=1
-e HUGGINGFACE_HUB_CACHE=/model/hf
-e TRANSFORMERS_OFFLINE=1
-e TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD=1
-v "$RUN_ROOT/data:/data:ro"
-v "$RUN_ROOT/model:/model:ro"
-v "$RUN_ROOT/specs:/specs:ro"
-v "$RUN_ROOT/results:/results"
)Preflight (host):
[ -f "$RUN_ROOT/model/mobileclip_blt.pt" ] || echo "MISSING: MobileCLIP weights"
[ -f "$RUN_ROOT/data/train.json" ] || echo "MISSING: train metadata"
[ -d "$RUN_ROOT/model/hf" ] || echo "MISSING: offline HF snapshot under model/hf"
docker run --rm "$VIDEO_CLIP_IMAGE" video_clip --help >/dev/null || echo "MISSING: video_clip in container"
docker run --rm "$VIDEO_CLIP_IMAGE" \
python -c "import nvidia_tao_pytorch.multimodal.video_clip.model.adapters.internvideo2clip" \
>/dev/null 2>&1 || echo "BROKEN IMAGE: video_clip package is incomplete (missing model.backbones) — stop, see Release note"
docker run --rm "$VIDEO_CLIP_IMAGE" python -c "import av; print(av.__version__)" \
>/dev/null 2>&1 || echo "BROKEN IMAGE: PyAV is missing — use the pinned FC image; do not install decord"
nvidia-smi >/dev/null 2>&1 || echo "note: no GPU visible"Train:
docker run "${DOCKER_COMMON[@]}" "$VIDEO_CLIP_IMAGE" \
video_clip train -e /specs/train.yaml results_dir=/resultsEvaluate:
docker run "${DOCKER_COMMON[@]}" "$VIDEO_CLIP_IMAGE" \
video_clip evaluate -e /specs/evaluate.yaml results_dir=/resultsInference:
docker run "${DOCKER_COMMON[@]}" "$VIDEO_CLIP_IMAGE" \
video_clip inference -e /specs/inference.yaml results_dir=/resultsExport:
docker run "${DOCKER_COMMON[@]}" "$VIDEO_CLIP_IMAGE" \
video_clip export -e /specs/export.yaml results_dir=/resultsTensorRT Deploy
Use the independently pinned TAO Deploy image after PyTorch export. Read references/tao-deploy-video-clip.md before running the deploy actions; its templates cover the engine build, retrieval evaluation, and embedding inference contracts.
VIDEO_CLIP_DEPLOY_IMAGE_DEFAULT="nvcr.io/nvidia/tao/tao-toolkit:7.3.0-deploy" # versions-key: images.tao_toolkit.deploy
VIDEO_CLIP_DEPLOY_IMAGE="${VIDEO_CLIP_DEPLOY_IMAGE:-$VIDEO_CLIP_DEPLOY_IMAGE_DEFAULT}"
# Verify the independently pinned image before staging artifacts or using a GPU.
docker run --rm "$VIDEO_CLIP_DEPLOY_IMAGE" video_clip gen_trt_engine --help >/dev/null || \
{ echo "BROKEN IMAGE: Video-CLIP deploy entrypoint is unavailable" >&2; exit 1; }
docker run --gpus all --rm --shm-size=16g \
-v "$RUN_ROOT/deploy_specs:/specs:ro" \
-v "$RUN_ROOT/results/export:/models:ro" \
-v "$RUN_ROOT/data:/data:ro" \
-v "$RUN_ROOT/results/deploy:/results" \
"$VIDEO_CLIP_DEPLOY_IMAGE" \
video_clip gen_trt_engine -e /specs/gen_trt_engine.yamlKeep the exported ONNX file, its matching *_config.yaml, and its matching *_tokenizer/ directory together. gen_trt_engine copies the sidecars beside the engine so TensorRT evaluate and inference can reconstruct preprocessing and tokenization.
Quick Start (virtualenv — local dev hosts)
On hosts with a tao-pytorch checkout and tao-cli venv (for example rtdetr-pytorch), run through tao-run-on-virtualenv instead of Docker:
export VENV="${VENV:?set to your tao-cli virtualenv (must contain bin/video_clip)}"
export TAO_PYTORCH_ROOT="${TAO_PYTORCH_ROOT:?set to your tao-pytorch checkout with multimodal/video_clip}"
export PATH="$VENV/bin:$PATH"
export PYTHONPATH="$TAO_PYTORCH_ROOT:$TAO_PYTORCH_ROOT/tao-core:$PYTHONPATH"
export HF_HOME="${HF_HOME:-$PWD/hf_cache}"
export HF_HUB_OFFLINE="${HF_HUB_OFFLINE:-1}"
export WANDB_DISABLED=true
export WANDB_MODE=disabledCopy a template spec from references/spec_template_*.yaml, fill checkpoint paths and metadata, then run:
video_clip train -e /path/to/train.yaml
video_clip evaluate -e /path/to/evaluate.yaml
video_clip inference -e /path/to/inference.yaml
video_clip export -e /path/to/export.yamlCredentials
NGC_KEY — pull the pinned TAO container from
nvcr.iowhen it is not cached locally.HF_TOKEN (online Hugging Face download only): Hugging Face read token used when
model.vision_encoderandmodel.clip_headarenulland the resolver downloads the InternVideo2 snapshot named bymodel.internvideo2clip_hf_id. For offline CI/eval, stage the complete S3/local snapshot and point both fields at the local files; no Hugging Face token is then required.
Treat tokens as secrets. Export them into the environment or pass them through an
--env-file of bare KEY=value lines, rather than inlining values into generated
spec YAML, command lines, or anything written under results_dir.
Data format (vadr1_chunks)
Metadata is a top-level JSON list of video records. Each record has video_path, split, and nested chunks[] with caption fields (queries, action_queries, anomaly_queries, dense_caption, scene_caption).
Point dataset.*.video_text.metadata at the user's JSON files (for example /data/train.json and /data/val.json in the templates). Each video_path must be an absolute path resolvable inside the runtime — for Docker, remap host clips to container paths like /data/videos/<name>.mp4 and set data_root: null unless using path_prefix_mapping.
Smoke overrides
For a short functional check (for example 2 epochs, 1 GPU, small batch):
train.num_epochs: 2
train.num_gpus: 1
train.gpu_ids: [0]
train.optim.warmup_steps: 10
dataset.train.batch_size: 2
dataset.val.batch_size: 2
dataset.train.num_workers: 4
dataset.val.num_workers: 4
dataset.train.video_text.caption_fields: [queries, action_queries, anomaly_queries]
dataset.train.video_text.caption_mode: first
dataset.metrics.mode: classificationUse dataset.metrics.mode: retrieval only when dataset.val.video_text.relevance_file is provided.
Inference
inference.mode: embeddingswritesvideo_embeddings.h5andtext_embeddings.h5underresults_dir.Provide
inference.query.text_file(one prompt per line) and/orinference.query.input_texts.Gallery videos come from
dataset.inference.video_text.metadata.
Export
export.encoder_type: combined produces the image-and-text ONNX consumed by the Video-CLIP deploy workflow. Keep export.batch_size: -1 for symbolic/dynamic batch dimensions; a positive value produces a fixed-batch ONNX. Export also writes matching *_config.yaml and *_tokenizer/ sidecars; preserve all three artifacts. Default opset is 23 on the vendor branch. Export requires a trained .pth at export.checkpoint.
LoRA
For vision-LoRA runs, start from tao-pytorch experiment_spec_lora.yaml or add a top-level peft: block (see shipped spec comments). Merge LoRA before export when checkpoints contain lora_* keys.
Common pitfalls
PATHmust prefer$VENV/binon virtualenv hosts so child processes resolve the venv Python.evaluateusesdataset.val, not a separate test split — Lightning stage"test"still loads val metadata.Eval precision: match
train.precision(typicallybf16) or flash-attn paths may fail under fp32 eval.Empty
action_querieson normal chunks become literal"Normal"positives during training; excludeNormal/Abnormalindataset.metrics.exclude_categoriesfor classification eval.No hard-negative / explicit-neg training on the vendor branch unless the spec and branch explicitly enable it.
video_clip --helpis not a health check. It exits 0 on an image whosevideo_clippackage is missingmodel.backbones; only the import smoke check in the preflight catches it.PyAV is the primary Video-CLIP decoder in TAO 7.2. The loader can fall back to the image's FFmpeg CLI and OpenCV support. A missing
avimport is an image defect: use the pinned FC image. Do not add or force-install decord, because it is not part of the supported TAO 7.2 decode contract.TensorRT actions use TAO Deploy.
gen_trt_engine, TensorRTevaluate, and TensorRTinferencemust use the independently pinned deploy image and deploy templates, not the PyTorch image/specs.Deploy sidecars are required. TensorRT evaluation and text inference need the exported
*_config.yamland*_tokenizer/beside the engine. Keep them with the ONNX input so engine generation can copy them automatically.PyTorch ≥ 2.6 defaults to
torch.load(weights_only=True)and rejects the TAO checkpoint’s numpy dtype objects with_pickle.UnpicklingError.TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD=1is set inDOCKER_COMMONabove; keep it forevaluate,inference, andexport.model/hf/is a snapshot, not an HF hub cache. Offline packs stage InternVideo2 weights at repo-relative paths (stage1/L14/L14_dist_1B_stage2/pytorch_model.bin,clip/L14/pytorch_model.bin), whileHUGGINGFACE_HUB_CACHEexpects amodels--<org>--<repo>/snapshots/<sha>/tree. Leavingmodel.vision_encoder/model.clip_headatnullsends asset resolution tohf_hub_downloadand fails underHF_HUB_OFFLINE=1— point both at the files directly.CI / skill-eval: stage weights + remapped JSON under
$WORKSPACE_DIRfrom S3; do not rely on HuggingFace LFS downloads at eval time.
References
Shipped defaults:
tao-pytorchnvidia_tao_pytorch/multimodal/video_clip/experiment_specs/(when developing from source)TAO Deploy workflow:
references/tao-deploy-video-clip.md
Files
- ATTRIBUTION.mdAdded by AutoGineer939 B
- BENCHMARK.md7.5 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md13.6 KiB
- config/skillspector-baseline.yaml1.5 KiB
- eval.config9.8 KiB
- evals/evals.json4.8 KiB
- references/skill_info.yaml2.6 KiB
- references/spec_template_deploy_evaluate.yaml378 B
- references/spec_template_deploy_inference.yaml379 B
- references/spec_template_evaluate.yaml1.2 KiB
- references/spec_template_export.yaml792 B
- references/spec_template_gen_trt_engine.yaml395 B
- references/spec_template_inference.yaml1.2 KiB
- references/spec_template_train.yaml1.8 KiB
- references/tao-deploy-video-clip.md4.0 KiB
- references/tao-deploy-video-clip.skill_info.yaml2.7 KiB
- skill-card.md4.2 KiB
- skill.oms.sig7.5 KiB
eval.config
{
"evals": [
{
"id": "iv2clip-full-pipeline-local-docker",
"prompt": "Run the full InternVideo2-CLIP (**video_clip**) pipeline (train → evaluate → inference) on a mini vadr1_chunks dataset, using **local Docker** on the host machine for GPU execution.\n\n## Plugin Installation\n\nThis eval depends on the `tao-skills` plugin (bundled in the `tao-skill-bank` repo). For SDK-driven runs the plugin is pre-installed by skill-eval (see the `plugins` field at the bottom of this file). For interactive TUI runs install it manually:\n\n```bash\nPLUGIN_ROOT=\"${CI_PROJECT_DIR:-$HOME/tao-skill-bank}\"\nrm -rf ~/.claude/plugins/cache/tao-skill-bank/tao-skills\n```\n\n```\n/plugin marketplace add $PLUGIN_ROOT\n/plugin install tao-skills@tao-skill-bank\n/plugin marketplace update tao-skill-bank\n```\n\n## Skill under test\n\n`tao-finetune-video-clip` (InternVideo2-CLIP L14 / TAO `video_clip` task).\n\n## Execution platform\n\n**Local Docker** — host's Docker daemon, NVIDIA runtime.\n\nThe TAO SDK is optional for this platform; plain `docker run` is sufficient.\n\n## Data — pull from the NVIDIA internal S3 (pdx.s8k.io) using s5cmd\n\nThe AWS profile `seanlin` and endpoint `https://pdx.s8k.io` are pre-configured from the env file (see skill-eval's entrypoint, which writes ~/.aws/credentials and ~/.aws/config from S3_* env vars). Use `s5cmd` to mirror the smoke pack to a local staging directory before any docker run.\n\nStaging layout:\n\n```\n$WORKSPACE_DIR/iv2clip/ # WORKSPACE_DIR is bind-mounted at the same absolute path on host + container,\n # so nested `docker run -v $WORKSPACE_DIR/...` resolves correctly through the host daemon\n├── data/\n│ ├── train.json # video_path entries point at /data/videos/<name>.mp4\n│ ├── val.json\n│ ├── prompts.txt\n│ └── videos/ # 32 clips (24 .mp4 + 8 .avi)\n├── model/\n│ ├── mobileclip_blt.pt\n│ └── hf/ # offline InternVideo2_distillation_models snapshot\n├── specs/ # generated from skill templates + smoke overrides\n└── results/\n```\n\n**Run all `s5cmd` calls in the foreground with `timeout` + `--retry-count`** so a stalled connection can't keep the eval session alive indefinitely. If a download fails, stop and report — do not retry in a background task.\n\nCommands:\n\n```bash\nmkdir -p $WORKSPACE_DIR/iv2clip\ncd $WORKSPACE_DIR/iv2clip\ntimeout 900 s5cmd --retry-count 3 --profile seanlin --endpoint-url https://pdx.s8k.io cp 's3://computex/skill-eval-ci/iv2clip/*' ./\nfind $WORKSPACE_DIR/iv2clip -maxdepth 3\n```\n\nThe pull is complete only when **all** of these exist. A partial or empty pull is a FAIL — do not proceed to the docker runs:\n\n```bash\ncd $WORKSPACE_DIR/iv2clip\nfor f in data/train.json data/val.json data/prompts.txt model/mobileclip_blt.pt; do\n [ -s \"$f\" ] || echo \"MISSING $f\"\ndone\n[ -d model/hf ] || echo \"MISSING model/hf (offline InternVideo2 snapshot)\"\necho \"clip count: $(ls data/videos/ 2>/dev/null | wc -l) (expected 32: 24 .mp4 + 8 .avi)\"\n```\n\nResolve these paths after download:\n\n- `DATA_DIR` — `$WORKSPACE_DIR/iv2clip/data`\n- `MODEL_DIR` — `$WORKSPACE_DIR/iv2clip/model`\n- `RESULTS_DIR` — `$WORKSPACE_DIR/iv2clip/results`\n- `SPECS_DIR` — `$WORKSPACE_DIR/iv2clip/specs`\n\nIf `s5cmd cp` fails (credentials / network / empty prefix), **stop and report** — do not synthesize stub data.\n\n## Container image\n\nUse the pinned image from `references/skill_info.yaml`:\n\n```bash\nVIDEO_CLIP_IMAGE=\"<container_image from references/skill_info.yaml>\"\n```\n\nAuthenticate with `NGC_KEY` if the image is not cached locally:\n\n```bash\necho \"$NGC_KEY\" | docker login nvcr.io -u '$oauthtoken' --password-stdin\n```\n\nPreflight — run all three, and record each exit code in `{artifacts_dir}/preflight.json`:\n\n```bash\ndocker run --rm \"$VIDEO_CLIP_IMAGE\" video_clip --help\ndocker run --rm \"$VIDEO_CLIP_IMAGE\" \\\n python -c \"import nvidia_tao_pytorch.multimodal.video_clip.model.adapters.internvideo2clip\"\ndocker run --rm \"$VIDEO_CLIP_IMAGE\" \\\n python -c \"import av; print(av.__version__)\"\n```\n\nThe second command is a **data-free model import smoke check** and the third verifies the TAO 7.2 PyAV decode dependency. `video_clip --help` exits 0 even on an image whose `video_clip` package is incomplete (e.g. missing `model.backbones`), so only the imports tell you whether the actions can run at all. If either import fails, report the image as broken and stop — do not install decord or build a derived image. The failure is in the container, not in the skill or the specs, and is independent of whether the S3 data arrived.\n\n## Spec generation\n\nCopy the skill's `references/spec_template_*.yaml` into `$SPECS_DIR` and apply smoke overrides:\n\n- `results_dir: /results`\n- `model.text_encoder: /model/mobileclip_blt.pt`\n- `model.vision_encoder: /model/hf/stage1/L14/L14_dist_1B_stage2/pytorch_model.bin`\n- `model.clip_head: /model/hf/clip/L14/pytorch_model.bin`\n- `dataset.train.video_text.metadata: /data/train.json`\n- `dataset.val.video_text.metadata: /data/val.json`\n- `train.num_epochs: 2`, `train.num_gpus: 1`, `train.gpu_ids: [0]`\n- `dataset.train.batch_size: 2`, `dataset.val.batch_size: 2`\n- `dataset.metrics.mode: classification`\n- `inference.query.text_file: /data/prompts.txt` (inference spec)\n\nThe `model.vision_encoder` / `model.clip_head` overrides are required, not optional. The smoke pack stages `model/hf/` as a plain repo-style snapshot, not a HuggingFace hub cache, so `HUGGINGFACE_HUB_CACHE=/model/hf` alone does NOT resolve it. Leaving them at the template default of `null` sends the resolver into `hf_hub_download`, which fails under `HF_HUB_OFFLINE=1`. Naming the files directly takes the local-path branch instead.\n\n## Docker mount pattern\n\n```bash\nRUN_ROOT=\"$WORKSPACE_DIR/iv2clip\"\nDOCKER_COMMON=(\n --rm --gpus all --shm-size=8g --network=host\n --shm-size=64g\n --ulimit memlock=-1\n --ulimit stack=67108864\n -e WANDB_DISABLED=true\n -e WANDB_MODE=disabled\n -e HF_HUB_OFFLINE=1\n -e HUGGINGFACE_HUB_CACHE=/model/hf\n -e TRANSFORMERS_OFFLINE=1\n -v \"$RUN_ROOT/data:/data:ro\"\n -v \"$RUN_ROOT/model:/model:ro\"\n -v \"$RUN_ROOT/specs:/specs:ro\"\n -v \"$RUN_ROOT/results:/results\"\n)\n```\n\n## Pipeline (single run, three actions)\n\n1. **Train** — `docker run ... video_clip train -e /specs/train.yaml results_dir=/results`; verify `Execution status: PASS` in logs.\n2. **Evaluate** — checkpoint at `/results/train/video_clip_latest.pth`.\n3. **Inference** — same checkpoint; verify embeddings under `/results/inference/`.\n\nRun docker commands in the **foreground** with a generous timeout (~1 hour). After each docker run, retrieve logs via `docker logs <name>` before removing the container.\n\n## Artifacts to upload (save under {artifacts_dir})\n\n- `{artifacts_dir}/preflight.json` — `video_clip --help` and import-smoke exit codes\n- `{artifacts_dir}/train_log.txt`\n- `{artifacts_dir}/evaluate_log.txt`\n- `{artifacts_dir}/inference_log.txt`\n- `{artifacts_dir}/docker_runs.json` — per-action: image used, container name, exit code, start/end timestamps\n- `{artifacts_dir}/metrics.json` — parsed classification metrics from evaluate logs\n- `{artifacts_dir}/s5cmd_download.log` — stdout/stderr of the s5cmd cp\n\n## Cleanup (run at the very end, before reporting success)\n\nAfter all three actions complete AND artifacts are saved, free the disk:\n\n```bash\nrm -rf $WORKSPACE_DIR/iv2clip\ndocker container prune -f >/dev/null 2>&1 || true\n```\n\nLog the cleanup result (success / failure) to `{artifacts_dir}/cleanup.log` but do NOT fail the eval if cleanup fails.\n\n## Expected outcome\n\nAll three actions (train, evaluate, inference) complete with `Execution status: PASS`. Logs + parsed metrics saved under `{artifacts_dir}`. `s5cmd_download.log` shows a successful pull from S3. Local staging dir removed.",
"expected_outcome": "Preflight: `video_clip --help`, the data-free model import smoke (`python -c \"import nvidia_tao_pytorch.multimodal.video_clip.model.adapters.internvideo2clip\"`), and the PyAV import smoke (`python -c \"import av; print(av.__version__)\"`) all exit 0; all three exit codes are recorded in `preflight.json`. A non-zero import smoke means the pinned container is broken and must be reported rather than worked around; do not install decord or build a derived image. `s5cmd_download.log` shows a successful pull from `s3://computex/skill-eval-ci/iv2clip/` that produced every required object: `data/train.json`, `data/val.json`, `data/prompts.txt`, 32 clips under `data/videos/` (24 `.mp4` + 8 `.avi`), `model/mobileclip_blt.pt`, and the `model/hf/` snapshot directory — a partial pull is a failure. `video_clip --help` advertises train/evaluate/inference/export/default_specs (action names valid), and, separately, all three local-docker actions (train, evaluate, inference) reach `Execution status: PASS`. `metrics.json` contains numeric classification metrics from the evaluate step and `docker_runs.json` records per-action container metadata. Local staging dir cleaned up at the end. No Lepton-side activity; pipeline is host-local. Distinguish container/image defects from skill defects when grading: missing PyAV and a PyTorch `weights_only` checkpoint-load error are properties of the pinned image. The supported TAO 7.2 decoder contract uses PyAV with FFmpeg CLI and OpenCV fallbacks."
}
],
"credentials": [
"ACCESS_KEY",
"SECRET_KEY",
"NGC_KEY"
],
"plugins": {
"claude": [
{
"marketplace": "${CI_PROJECT_DIR}",
"plugin": "tao-skills@tao-skill-bank"
}
],
"codex": [
{
"marketplace": "${CI_PROJECT_DIR}",
"plugin": "tao-skill-bank@tao-skill-bank"
}
]
}
}
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Declares allowed tools, Needs a command-line tool, Needs Python
The author says: Requires docker + nvidia-container-toolkit and the pinned TAO video_clip PyTorch and Deploy containers (see references/skill_info.yaml and references/tao-deploy-video-clip.skill_info.yaml), or a local tao-pytorch checkout + tao-cli venv for PyTorch virtualenv runs. MobileCLIP + InternVideo2 weights must be on disk for offline eval (HF LFS may be blocked in CI). Metadata JSON uses vadr1_chunks with absolute video_path entries.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- References to credential files
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA Corporation
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/tao-finetune-video-clip · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA Corporation or NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download tao-finetune-video-clip.zip