Tao Mine Nearest Neighbors
NVIDIAOfficialCreated by NVIDIA Corporation
- Skill
- Workflow
- Data and AI
- Apache-2.0
- Medium risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides an interface to execute the TAO Data Services TMM nearest-neighbor mining task. It processes source and target embedding parquet files to identify and retrieve the closest samples based on specified metrics. The skill includes utilities for generating and verifying experiment configuration files, ensuring that input paths and parameters are correctly formatted for the containerized execution environment.
What it does
- Generates experiment configuration files for nearest-neighbor mining.
- Validates configuration specs before execution.
- Executes the TMM nearest-neighbor mining task using Docker.
- Supports configurable distance metrics including cosine, euclidean, and manhattan.
- Allows optional filtering of neighbors by label.
- Produces a mined parquet file and a summary report of the mining process.
When to use it
- When you need to identify source samples that are closest to specific target samples.
- When working with embedding data stored in parquet format.
- When you need to perform similarity searches within a dataset using TAO Data Services.
- When you need to filter neighbor search results based on labels or distance thresholds.
Advantages
- Automates the creation and validation of experiment specifications.
- Provides a structured approach to managing input and output paths for containerized tasks.
- Includes built-in verification steps to ensure environment and configuration readiness.
- Offers flexible configuration for distance metrics and neighbor retrieval counts.
Usage examples
- “Generate a nearest-neighbor mining spec for my source and target embeddings.”
- The agent will run the preparation script to create a YAML configuration file with your specified source, target, and output paths.
- “Run the nearest-neighbor mining task using my existing spec file.”
- The agent will validate the spec and execute the TAO Data Services container to perform the mining and generate the results.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/nvidia/tao-mine-nearest-neighbors/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip tao-mine-nearest-neighbors.zip -d .agents/skills
Documentation by NVIDIA Corporation
TAO Mine Nearest Neighbors
Use this skill to run TAO Data Services TMM nearest-neighbor mining. The skill consumes embedding parquets and writes a mined source-sample parquet plus a mining summary. It does not compute embeddings; upstream steps must produce the source and target embedding parquets first.
The container entrypoint is:
tmm nearest_neighbors -e /absolute/path/to/nearest_neighbors.yamlTAO Data Services requires -e/--experiment_spec_file. The tmm console script converts that YAML into Hydra --config-path and --config-name arguments internally.
Inputs
The user can provide either an existing nearest-neighbors YAML spec or the fields needed to generate one.
Required spec fields:
| Field | Meaning |
|---|---|
source_parquet | Absolute path to the candidate/source embeddings parquet. |
target_parquet | Absolute path to the target/query embeddings parquet. |
output_parquet | Absolute path where TAO Data Services should write mined source filepaths. |
Common optional fields:
| Field | Default | Meaning |
|---|---|---|
topn | 5 | Number of nearest source samples to retrieve per target sample. |
knn_metric | cosine | One of cosine, euclidean, or manhattan. |
source_embed_column_name | embedding | Embedding column in source_parquet. |
target_embed_column_name | embedding | Embedding column in target_parquet. |
filter_by_label | "false" | String flag. When "true", TAO DS filters neighbors by matching label columns when both parquets provide labels. |
distance_threshold | -1.0 | Maximum distance to keep. Negative disables thresholding. |
Both input parquets must contain a filepath column and a list-like embedding column. If filter_by_label is "true", both parquets should also contain label.
The default template is assets/default_nearest_neighbors.yaml.
Quick Start
Run from the tao-skill-bank repo root. Resolve the pinned TAO Data Services image from versions.yaml, verify the spec, mount the run root with identical host/container paths, and stream the Docker logs.
SPEC=/absolute/path/to/nearest_neighbors.yaml
RUN_ROOT=/absolute/path/that/contains/specs/data/and/results
GPU_COUNT=1
python3 skills/data/tao-mine-nearest-neighbors/scripts/verify_nearest_neighbors_spec.py \
--spec "$SPEC"
DS_IMAGE="$(scripts/resolve_versions_key.py images.tao_toolkit.data_services)"
docker run --rm --gpus "$GPU_COUNT" --shm-size=8g --network=host \
-v "$RUN_ROOT:$RUN_ROOT" \
-w "$RUN_ROOT" \
"$DS_IMAGE" \
tmm nearest_neighbors -e "$SPEC"Use at least one GPU. Choose GPU_COUNT from the hardware available to the host or platform that will run the container. If the user does not know the right value, inspect the host with nvidia-smi -L or ask which GPU allocation the run should use.
Do not pass --user $(id -u):$(id -g) to the TAO data-services container unless you have verified the image supports that UID. Some TAO DS images import Python packages that call getpass.getuser() at startup and fail when the UID is not present in /etc/passwd.
Generate A Spec
If the user provides source/target/output parquet paths instead of a ready spec, generate a spec from the default template:
python3 skills/data/tao-mine-nearest-neighbors/scripts/prepare_nearest_neighbors_spec.py \
--source-parquet /absolute/path/source_embeddings.parquet \
--target-parquet /absolute/path/target_embeddings.parquet \
--output-parquet /absolute/path/results/mined.parquet \
--output-spec /absolute/path/specs/nearest_neighbors.yaml \
--topn 5 \
--knn-metric cosine \
--filter-by-label false \
--distance-threshold -1.0The generated YAML uses absolute paths. Keep the spec, input parquets, and output directory under RUN_ROOT so the same paths resolve inside the container.
Preflight
Before launching Docker:
Verify Docker and GPU access:
docker info > /dev/null
nvidia-smi -LResolve and pull the data-services image if needed:
DS_IMAGE="$(scripts/resolve_versions_key.py images.tao_toolkit.data_services)"
docker image inspect "$DS_IMAGE" > /dev/null || docker pull "$DS_IMAGE"Validate the spec:
python3 skills/data/tao-mine-nearest-neighbors/scripts/verify_nearest_neighbors_spec.py \
--spec "$SPEC"Confirm
RUN_ROOTcontains the spec, both input parquets, and the output directory. MountRUN_ROOTto the same absolute path inside Docker.
Outputs
The skill promises the artifacts named by the spec:
| Artifact | Location |
|---|---|
| mined parquet | output_parquet |
| mining summary | mining_summary.txt next to output_parquet |
The current TAO Data Services nearest_neighbors task writes a mined parquet with unique source filepath rows. The summary file reports mining counts such as queries processed, neighbors considered, duplicates removed, and any label/distance filtering.
Troubleshooting
The subtask nearest_neighbors requires -e/--experiment_spec_file: rerun with tmm nearest_neighbors -e "$SPEC". Hydra overrides alone are not enough.
Input parquet not found inside Docker: the YAML path must be visible inside the container. Use a RUN_ROOT mount where the host and container paths are identical.
Output directory is not writable after Docker exits: the TAO DS container may have written files as root. Inform the user, report which artifacts were produced, and ask whether to repair permissions on the output directory before continuing.
No GPU or cuDF/cuML errors: nearest-neighbor mining requires at least one CUDA GPU. Check nvidia-smi -L, the Docker --gpus flag, and the NVIDIA container toolkit installation.
Files
- ATTRIBUTION.mdAdded by AutoGineer948 B
- BENCHMARK.md7.0 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md6.1 KiB
- assets/default_nearest_neighbors.yaml212 B
- config/skillspector-baseline.yaml1.7 KiB
- evals/evals.json902 B
- references/skill_info.yaml561 B
- scripts/prepare_nearest_neighbors_spec.pyScript8.0 KiB
- scripts/verify_nearest_neighbors_spec.pyScript1.3 KiB
- skill-card.md4.4 KiB
- skill.oms.sig5.7 KiB
scripts/prepare_nearest_neighbors_spec.py
#!/usr/bin/env python3
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""Create and validate a TAO Data Services TMM nearest-neighbor spec.
The generated YAML is intentionally close to the upstream TAO Data Services
`nearest_neighbors.yaml` schema. It fills the required parquet paths and leaves
the mining knobs explicit for reproducibility.
"""
from __future__ import annotations
import argparse
import math
import sys
from pathlib import Path
from typing import Any
try:
import yaml
except ImportError: # pragma: no cover - exercised only on hosts without PyYAML.
yaml = None
VALID_METRICS = {"euclidean", "cosine", "manhattan"}
def load_yaml(path: Path) -> dict[str, Any]:
"""Read a YAML mapping from `path`."""
if yaml is None:
raise RuntimeError("PyYAML is required: install with `python3 -m pip install pyyaml`.")
with path.open("r", encoding="utf-8") as handle:
data = yaml.safe_load(handle) or {}
if not isinstance(data, dict):
raise ValueError(f"{path} must contain a YAML mapping.")
return data
def write_yaml(path: Path, data: dict[str, Any]) -> None:
"""Write `data` as a stable block-style YAML mapping."""
if yaml is None:
raise RuntimeError("PyYAML is required: install with `python3 -m pip install pyyaml`.")
path.parent.mkdir(parents=True, exist_ok=True)
with path.open("w", encoding="utf-8") as handle:
yaml.safe_dump(data, handle, sort_keys=False)
def absolute_path(raw_path: str, *, must_exist: bool, kind: str) -> str:
"""Expand a path and return an absolute string, optionally requiring it exists."""
path = Path(raw_path).expanduser().resolve()
if must_exist and not path.exists():
raise FileNotFoundError(f"{kind} does not exist: {path}")
return str(path)
def validate_config(config: dict[str, Any]) -> None:
"""Validate the fields this skill depends on before Docker is launched."""
required = ("source_parquet", "target_parquet", "output_parquet")
missing = [
key
for key in required
if not isinstance(config.get(key), str) or not config[key].strip()
]
if missing:
raise ValueError(f"Missing required field(s): {', '.join(missing)}")
for key in ("source_parquet", "target_parquet"):
path = Path(str(config[key])).expanduser()
if not path.is_absolute():
raise ValueError(f"{key} must be absolute: {path}")
if not path.is_file():
raise FileNotFoundError(f"{key} does not exist or is not a file: {path}")
output_path = Path(str(config["output_parquet"])).expanduser()
if not output_path.is_absolute():
raise ValueError(f"output_parquet must be absolute: {output_path}")
output_path.parent.mkdir(parents=True, exist_ok=True)
if not output_path.parent.is_dir():
raise NotADirectoryError(f"output_parquet parent is not a directory: {output_path.parent}")
try:
probe = output_path.parent / ".tao_mine_nearest_neighbors_write_test"
probe.write_text("ok\n", encoding="utf-8")
probe.unlink()
except OSError as exc:
raise PermissionError(f"output_parquet parent is not writable: {output_path.parent}") from exc
topn = config.get("topn", 5)
if isinstance(topn, bool) or not isinstance(topn, int) or topn < 1:
raise ValueError("topn must be an integer of at least 1.")
config["topn"] = topn
metric = config.get("knn_metric", "cosine")
if not isinstance(metric, str) or metric not in VALID_METRICS:
raise ValueError(f"knn_metric must be one of {sorted(VALID_METRICS)}.")
config["knn_metric"] = metric
filter_by_label = config.get("filter_by_label", "false")
if not isinstance(filter_by_label, str):
raise ValueError('filter_by_label must be the string "true" or "false".')
filter_by_label = filter_by_label.lower()
if filter_by_label not in {"true", "false"}:
raise ValueError('filter_by_label must be the string "true" or "false".')
config["filter_by_label"] = filter_by_label
for key in ("source_embed_column_name", "target_embed_column_name"):
value = config.get(key, "embedding")
if not isinstance(value, str) or not value.strip():
raise ValueError(f"{key} must be a non-empty string.")
config[key] = value
distance_threshold = config.get("distance_threshold", -1.0)
if (
isinstance(distance_threshold, bool)
or not isinstance(distance_threshold, (int, float))
or not math.isfinite(distance_threshold)
):
raise ValueError("distance_threshold must be a finite number.")
config["distance_threshold"] = float(distance_threshold)
def build_config(args: argparse.Namespace) -> dict[str, Any]:
"""Merge a template with command-line values and validate the result."""
skill_dir = Path(__file__).resolve().parents[1]
default_template = skill_dir / "assets" / "default_nearest_neighbors.yaml"
template = Path(args.template).expanduser().resolve() if args.template else default_template
config = load_yaml(template)
config.update(
{
"source_parquet": absolute_path(args.source_parquet, must_exist=True, kind="source_parquet"),
"target_parquet": absolute_path(args.target_parquet, must_exist=True, kind="target_parquet"),
"output_parquet": absolute_path(args.output_parquet, must_exist=False, kind="output_parquet"),
"topn": args.topn,
"knn_metric": args.knn_metric,
"source_embed_column_name": args.source_embed_column_name,
"target_embed_column_name": args.target_embed_column_name,
"filter_by_label": args.filter_by_label,
"distance_threshold": args.distance_threshold,
}
)
validate_config(config)
return config
def parse_args() -> argparse.Namespace:
"""Parse command-line arguments."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--source-parquet", required=True, help="Absolute or expandable path to source embeddings parquet.")
parser.add_argument("--target-parquet", required=True, help="Absolute or expandable path to target embeddings parquet.")
parser.add_argument("--output-parquet", required=True, help="Absolute or expandable path for mined output parquet.")
parser.add_argument("--output-spec", required=True, help="Path where the generated nearest-neighbors YAML should be written.")
parser.add_argument("--template", help="Optional YAML template. Defaults to assets/default_nearest_neighbors.yaml.")
parser.add_argument("--topn", type=int, default=5, help="Number of neighbors to mine per target.")
parser.add_argument("--knn-metric", default="cosine", choices=sorted(VALID_METRICS), help="cuML nearest-neighbor metric.")
parser.add_argument("--source-embed-column-name", default="embedding", help="Embedding column in source parquet.")
parser.add_argument("--target-embed-column-name", default="embedding", help="Embedding column in target parquet.")
parser.add_argument("--filter-by-label", default="false", choices=["true", "false"], help="String flag consumed by TAO DS.")
parser.add_argument("--distance-threshold", type=float, default=-1.0, help="Maximum distance; negative disables thresholding.")
return parser.parse_args()
def main() -> int:
"""CLI entrypoint."""
try:
args = parse_args()
config = build_config(args)
output_spec = Path(args.output_spec).expanduser().resolve()
write_yaml(output_spec, config)
summary_path = Path(str(config["output_parquet"])).with_name("mining_summary.txt")
print(f"Wrote nearest-neighbors spec: {output_spec}")
print(f"Expected output parquet: {config['output_parquet']}")
print(f"Expected summary: {summary_path}")
return 0
except Exception as exc: # noqa: BLE001 - CLI should print concise failure.
print(f"ERROR: {exc}", file=sys.stderr)
return 1
if __name__ == "__main__":
raise SystemExit(main())
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, one or more CUDA GPUs, and the TAO data-services container pinned in versions.yaml.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
- References to credential files
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
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-mine-nearest-neighbors · 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-mine-nearest-neighbors.zip