tao-mine-aoi-images
NVIDIA/skills
Bindet Ziel- und Quellbild-Parquet-Dateien ein und ermittelt anschließend die nächstgelegenen Quellbilder zur Erweiterung in VCN-AOI-Workflows.
...Alle erweiternDEFT-Fähigkeit „Mining and Embedding“
Sie sind der Betreiber des DEFT-Workflows „Embed-then-Mine“ für VCN-AOI. Ihre Aufgabe besteht darin, ein Parquet aus schwachen Zielbildern (die Ausgabe der Lückenanalyse oder des Routings) und einen Quellpool zu nehmen und daraus ein dedupliziertes Parquet aus extrahierten Quellbildern zu erstellen, die den Zielbildern ähneln – bereit für die nächste Trainingsrunde.
Der Workflow ist fest vorgegeben und deterministisch: Einbetten der Zielbilder, Einbetten des Quellpools, anschließend Mining der nächsten Nachbarn. Das Parquet-Ergebnis jedes Schritts dient als Eingabe für den nächsten Schritt. Es gibt keine iterative Suche, keinen Clustering-Durchlauf und keine „Human-in-the-Loop“-Auswahl – die Tiefe entsteht durch die Wahl des richtigen Encoders und des richtigen „topn“, nicht durch eine mehrphasige Untersuchung.
Die gesamte Funktion ist eine schlanke Hülle um drei direkte „docker run“-Aufrufe für das in „versions.yaml“ deklarierte Image „tao_toolkit.data_services“ (wird zur Laufzeit aufgelöst – siehe „Setup“). Der Einstiegspunkt des Containers akzeptiert „ “ – wobei „image_embeddings -e für die Einbettung und „tmm nearest_neighbors -e für das Mining übergeben werden. Das Flag -e verweist auf eine YAML-Datei, die Standardwerte für das Schema der Teilaufgabe bereitstellt; alles, was danach folgt, ist eine reine Hydra-Überschreibung (Schlüssel=Wert), die bestimmte Felder der Spezifikation pro Lauf selektiv überschreibt. (Innerhalb des Containers gibt es kein „dataset“-Schlüsselwort – dies ist das „pillar“-Präfix des TAO-Launchers und wird hier weggelassen.) Laden Sie das Image einmal herunter, falls es nicht zwischengespeichert ist: docker pull "$DS_IMAGE" (nach Auflösung von $DS_IMAGE gemäß der Einrichtung).
Schema-Schlüssel können zwischen den Releases von Data-Services umbenannt werden (beim RCA-Skill lautete „inference_csv“ → „inference_results_dir“ und „output_dir“ → „results_dir“). Im Zweifelsfall sollten Sie das tatsächliche Schema einmal pro Image überprüfen: docker run --rm "$DS_IMAGE" embedding image_embeddings --cfg=job und ... tmm nearest_neighbors --cfg=job.
Eingaben
- Ziel-Parquet-Datei – die Ausgabe der Lückenanalyse, typischerweise
`mining_gaps.parquet` aus `tao-route-visual-changenet-samples` (oder`gaps.parquet` aus `tao-analyze-gaps-visual-changenet`, falls das Routing übersprungen wurde). Erforderliche Spalte:filepath. Ist auchdie Spalte „label“vorhanden, ist eine labelbasierte Filterung während des Mining-Vorgangs möglich; andernfalls ignoriert die Mining-Aufgabe den Filter stillschweigend. - Quellpool – ein Parquet-Datensatz mit Kandidatenbildern, die ausgewertet werden sollen, mit einer Spalte
„filepath“. Falls der Benutzer nur über eine CSV-Datei verfügt, muss diese vor Schritt 2 in ein Parquet mit denselben Spalten konvertiert werden. Für die label-bewusste Filterung muss der Pool außerdem eine Spalte„label“enthalten. - Einbettungsspezifikationsdatei – eine YAML-Datei, die
„model“,„model_path“,„batch_size“und (nur wenn„model_path“ein TAO-„.pth“/.„.ckpt“ist)„model_config_path“enthält. Wird in den Schritten 1 und 2 wiederverwendet;„input_parquet“ und „output_parquet“werden pro Durchlauf als Hydra-Überschreibungen bereitgestellt. Für beide Einbettungsschritte MUSS dieselbe Spezifikation verwendet werden – Einbettungen aus unterschiedlichen Encodern sind nicht vergleichbar, und nicht aufeinander abgestimmte Encoder sind die häufigste Ursache für Meldungen wie „Die extrahierten Bilder scheinen nichts miteinander zu tun zu haben“. - Mining-Spezifikationsdatei – eine YAML-Datei, die
topn,knn_metric,filter_by_labelsowie (selten geänderte)source_embed_column_name/target_embed_column_nameenthält.source_parquet/target_parquet/output_parquetsind Hydra-Überschreibungen zur Laufzeit. SigLIP- und CLIP-Einbettungen sollten„knn_metric: cosine“verwenden. Wenn„filter_by_label: true“ist, aber in einer der beiden Einbettungs-Parquet-Dateien eineLabel-Spalte fehlt, protokolliert der Container eine Warnung und fährt ohne Filterung fort.
Einrichtung
Lösen Sie die konkrete URI „tao_toolkit.data_services“ aus der Datei „versions.yaml“ einmalig zu Beginn des Laufs auf und stellen Sie anschließend sicher, dass Docker, das NVIDIA-Container-Toolkit und eine GPU vorhanden sind, bevor Sie weitere Schritte unternehmen. Eine GPU ist sowohl für den Vorwärtsdurchlauf des Encoders als auch für die cuML/cuDF-k-NN-Suche erforderlich; beide Schritte schlagen ohne CUDA fehl.
# „tao_toolkit.data_services“ → konkrete „nvcr.io/...“-URI aus „versions.yaml“ auflösen
DS_IMAGE=$(python3 -c "import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'/versions.yaml'))['images']['tao_toolkit']['data_services'])")
echo "DS_IMAGE=$DS_IMAGE"
docker info > /dev/null && echo "OK: Docker"
nvidia-smi > /dev/null && echo "OK: GPU"
docker image inspect "$DS_IMAGE" > /dev/null \
|| docker pull "$DS_IMAGE"
Jeder Host-Pfad, den der Container liest oder in den er schreibt, muss per Bind-Mount eingebunden werden. Der am besten vorhersehbare Ansatz besteht darin, das Stammverzeichnis des Arbeitsbereichs so einzubinden, dass die Pfade innerhalb und außerhalb des Containers identisch sind, und dann einen $DOCKER- Alias für die drei Aufrufe wiederzuverwenden:
WORKSPACE=
DOCKER="docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE"
Übergeben Sie nicht --user $(id -u):$(id -g) – dies löst während des Imports der Transformatoren einen getpwuid() -KeyError aus, noch bevor die eigentliche Arbeit beginnt. Der Container läuft als Root; chown setzt die UID anschließend wieder auf die des Hosts zurück.
Erstellen Sie die beiden Spec-Dateien einmal pro Iteration und legen Sie sie unter $WORKSPACE ab, damit das Argument -e auf beiden Seiten der Einbindung aufgelöst wird; lauffspezifische Werte bleiben aus der Spec heraus und werden als Hydra-Überschreibungen übergeben. Wenn es sich bei dem Quellpool um eine CSV-Datei handelt, konvertieren Sie diese vorab in das Parquet-Format (unter Beibehaltung des Dateipfads und gegebenenfalls des Labels ). Die Standarddatei `embedding_spec.yaml ` verwendet `model: SigLIP`, `model_path: google/siglip-base-patch16-224`, `batch_size: 64`; die Standarddatei „mining_spec.yaml“ verwendet „topn: 5“, „knn_metric: cosine“, „filter_by_label: ‚false‘“ (in Anführungszeichen – das Schema liest dies als Zeichenkette).
Siehe „references/setup.md“ für die vollständigen Hinweise zur Umgebung, den Umgang mit TAO_SKILL_BANK_PATH, die Gründe für das Einbinden von Pfaden, den Workaround für „getpwuid chown“, den Ausschnitt zur Konvertierung von CSV in Parquet sowie die wörtlichen Abschnitte zur Erstellung der Spezifikationsdateien.
Vorgehensweise
Drei Befehle in der angegebenen Reihenfolge. Die Parquet-Ausgabe jedes Befehls dient als Eingabe für den nächsten Befehl. Führen Sie sie als einfache Bash-Befehle aus; der Alias $DOCKER aus dem Setup kümmert sich um den Container, die GPU und die Einbindungen. Jeder Aufruf folgt dem gleichen Schema: -e für die fest integrierten Standardwerte, gefolgt von einer Handvoll Hydra-Überschreibungen für die lauffallspezifischen Pfade.
Schritt 1 – Einbetten der Ziel-Images
$DOCKER embedding image_embeddings \
-e \
input_parquet= \
output_parquet=
Liest die Ausgabe der Lückenanalyse/des Routings und schreibt eine Parquet-Datei mit dem Dateipfad, der Einbettung und allen zusätzlichen Metadatenspalten (z. B. „label“, „siamese_score“, „weakness“), die wortwörtlich aus der Eingabe übernommen werden. Gibt das Ausgabeschema (pd.read_parquet(...).columns) auf die Standardausgabe aus, damit der „script-check“-Hook überprüfen kann, ob die Einbettungsspalte vorhanden ist.
Wenn Sie „model“, „model_path“ oder „batch_size“ für einen Durchlauf überschreiben müssen, ohne die Spezifikation zu bearbeiten, fügen Sie diese als Hydra-Überschreibungen an (z. B. „model_path=...“).
Schritt 2 – Einbetten des Quellpools
$DOCKER embedding image_embeddings \
-e \
input_parquet= \
output_parquet=
Gleiche Befehlsstruktur wie in Schritt 1, angewendet auf den Quellpool. Verwenden Sie dieselbe `embedding_spec.yaml ` wie in Schritt 1 und überschreiben Sie hier die Parameter `model`, `model_path` und `batch_size` nicht anders – nicht übereinstimmende Encoder-Konfigurationen in den beiden Schritten führen zu nicht vergleichbaren Einbettungen.
Schritt 3 – Nächstgelegene Nachbarn ermitteln
$DOCKER tmm nearest_neighbors \
-e \
source_parquet= \
target_parquet= \
output_parquet=
Für jede Ziel-Einbettung werden die topn nächstgelegenen Quell-Einbettungen gemäß der gewählten Metrik ermittelt, über alle Ziele hinweg dedupliziert und in einer einspaltigen (Dateipfad-)Parquet-Datei mit eindeutigen, extrahierten Quellpfaden gespeichert. Der Container legt außerdem neben der Parquet-Ausgabedatei eine Datei „mining_summary.txt“ ab, die folgende Angaben enthält: Anzahl der Abfragen, Anzahl der Nachbarn, Anzahl der entfernten Duplikate sowie (bei aktivierter Label-Filterung) die Anzahl der beibehaltenen und verworfenen Paare. Passen Sie „topn“, „knn_metric“ oder „filter_by_label“ beim Durchlaufen über eine Inline-Hydra-Überschreibung an (z. B. „topn=10“) – eine Neufassung der Spezifikation ist nicht erforderlich.
Wenn „filter_by_label=true“ ist, aber in einem der Embedding-Parquet-Dateien die Label -Spalte fehlt, protokolliert der Container eine Warnung und fährt ohne Filterung fort. Wenn die extrahierte Ausgabe umfangreicher als erwartet erscheint oder labelübergreifende Paare enthält, überprüfen Sie das Docker-Protokoll auf diese Warnung, bevor Sie davon ausgehen, dass die Aufgabe korrekt ausgeführt wurde.
Siehe „references/reference-invocation.md“ für das minimale „Einfügen-und-Bearbeiten“-End-to-End-Rezept (löst $DS_IMAGE auf, schreibt beide Spezifikationen, führt alle drei Schritte aus, ändert die Eigentümerrechte der Ausgaben und gibt die Zeilenanzahlen aus), das als einzelner gestreamter Bash-Block ausgeführt werden kann.
Ausgaben und Bericht
Schreiben Sie alles in einen Ordner mit Zeitstempel im Verzeichnis des Experiments bzw. der Iteration. Ermitteln Sie den tatsächlichen Zeitstempel, indem Sie in Bash den Befehl `date +%Y-%m-%d_%H%M%S ` ausführen – verwenden Sie KEINE festen Werte und raten Sie nicht. Wenn der Benutzer einen benutzerdefinierten Ausgabepfad angibt, verwenden Sie diesen direkt, behalten Sie jedoch das gleiche interne Layout bei. Der Packaging-Hook fügt „mining_config/“ und „claude_session.jsonl“ automatisch hinzu, sobald „Mining_Report.md“ geschrieben wird.
Das extrahierte Parquet-Datei ist das Artefakt, das vom nachgelagerten Training verwendet wird. Die beiden Embedding-Parquet-Dateien sind Zwischenprodukte, sollten aber aufbewahrt werden – sie sind über mehrere Mining-Läufe mit demselben Quellenpool hinweg wiederverwendbar und die einzige Stelle, an der nachgeschaut werden muss, wenn ein Bericht, der „unzusammenhängend erscheint“, eine Fehlerbehebung auf Encoder-Ebene erfordert.
Siehe references/outputs-and-reporting.md für die vollständige Struktur des Ausgabeverzeichnisses und die wörtliche Vorlage für „Mining_Report.md“ (Verdict, Inputs, Encoder Consistency, Mining Run, Per-Label Breakdown, Output Sanity, Recommended Actions; Umfang: 600–1200 Wörter).
Häufige Fallstricke
Der häufigste Fehler ist eine Nichtübereinstimmung der Encoder zwischen den beiden Einbettungsschritten – die mit Abstand häufigste Ursache für fehlerhafte Mining-Ergebnisse; beide Schritte müssen dieselbe „embedding_spec.yaml“-Datei verwenden. Weitere häufig auftretende Fallstricke: die Übergabe von --user (der „getpwuid“-KeyError), das Überspringen eines Einbettungsschritts, eine fehlende Label- Spalte, die filter_by_label=true stillschweigend außer Kraft setzt, Spec-Dateien außerhalb von $WORKSPACE, ungelöste ??? Sentinel, TAO-Checkpoints ohne `model_config_path`, direkt eingelesene CSV-Quellpools, Nichtübereinstimmungen zwischen Host- und Containerpfad, keine GPU, ein nicht heruntergeladenes oder `:latest` -Image-Tag sowie `topn × N_targets ≫` Quellgröße (erwartet – geben Sie die tatsächlich extrahierte Anzahl an).
Die vollständige Liste der Fallstricke mit den genauen Fehlern, Ursachen und Lösungen findest du unter references/troubleshooting.md.
Ausführungsreihenfolge
- Lösen Sie
DS_IMAGEaus„versions.yaml“(images.tao_toolkit.data_services) auf, führen Sie dann„docker info“,„nvidia-smi“und„docker image inspect "$DS_IMAGE"“(mit Pull, falls fehlend) einmal aus, um die Umgebung zu überprüfen. Brechen Sie den Vorgang mit einer eindeutigen Meldung ab, falls einer der Schritte fehlschlägt. - Führen Sie
„date +%Y-%m-%d_%H%M%S“aus, um den Zeitstempel zu erhalten; erstellen Sie„“./mining_results/“ und „ / - Schreiben Sie
„embedding_spec.yaml“und„mining_spec.yaml“in das Verzeichnis mit dem Zeitstempel und geben Sie dabei die Wahl des Encoders sowie die Mining-Parameter an. Speichern Sie diese Dateien unter$WORKSPACE, damit der Pfad„-e“innerhalb des Containers aufgelöst wird. - Wenn der Quellpool eine CSV-Datei ist, konvertieren Sie diese zunächst in Parquet (
DateipfadundLabelbeibehalten). - Führen Sie Schritt 1 (Ziele einbetten) über `
docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…`aus.Geben Sie die Anzahl der Zeilen und Spalten der Parquet-Ausgabe auf die Standardausgabe aus. - Führen Sie Schritt 2 (Einbetten des Quellpools) mit derselben `
embedding_spec.yaml` wie in Schritt 1 aus. Geben Sie die Anzahl der Zeilen und Spalten der Ausgabedatei aus. - Führen Sie Schritt 3 (Nächste Nachbarn ermitteln) über `
docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…`aus.Vergewissern Sie sich, dassdie Datei `mining_summary.txt`neben `mined.parquet` geschrieben wurde. - Berechnen Sie die Aufschlüsselung pro Label (Abschnitt 5), indem Sie die Ziel-Embeddings-Parquet-Datei mit der „mined“-Ausgabe anhand des Dateipfads verknüpfen, sofern beide
ein Labelenthalten. - Schreiben Sie
„Mining_Report.md“zuletzt – das Schreiben löst den Packaging-Hook aus, der gleichzeitig die Sitzungsprotokolle und die Skill-Konfiguration kopiert.
---
name: tao-mine-aoi-images
description: Embeds target and source image parquets, then mines nearest-neighbour source images for augmentation in VCN AOI workflows.
license: Apache-2.0
---
# DEFT Mining and Embedding Skill
You are the operator of the DEFT embed-then-mine workflow for VCN AOI. Your job is to take a parquet of weak target images (the gap-analysis or routing output) and a source pool, then produce a deduplicated parquet of mined source images that look similar to the targets — ready to feed into the next training round.
The workflow is fixed and deterministic: **embed the targets, embed the source pool, then mine nearest neighbours.** Each step's output parquet is the next step's input. There is no iterative search, no clustering pass, no human-in-the-loop selection — depth comes from picking the right encoder and the right `topn`, not from a multi-phase investigation.
The whole skill is a thin wrapper around three direct `docker run` invocations against the `tao_toolkit.data_services` image declared in `versions.yaml` (resolved at runtime — see Setup). The container's entrypoint takes `<category> <action> -e <spec.yaml> [hydra overrides...]` — pass `embedding image_embeddings -e <embedding_spec.yaml> …` for embedding and `tmm nearest_neighbors -e <mining_spec.yaml> …` for mining. The `-e` flag points at a YAML that supplies default values for the subtask's schema; anything afterward is a bare Hydra override (`key=value`) that selectively overrides spec fields per run. (There is no `dataset` keyword inside the container — that's the TAO launcher's pillar prefix and is dropped here.) Pull the image once if it isn't cached: `docker pull "$DS_IMAGE"` (after resolving `$DS_IMAGE` per Setup).
Schema keys can rename between data-services releases (the RCA skill saw `inference_csv` → `inference_results_dir`, `output_dir` → `results_dir`). When in doubt, introspect the actual schema once per image: `docker run --rm "$DS_IMAGE" embedding image_embeddings --cfg=job` and `... tmm nearest_neighbors --cfg=job`.
---
## Inputs
1. **Target parquet** — the gap-analysis output, typically `mining_gaps.parquet` from `tao-route-visual-changenet-samples` (or `gaps.parquet` from `tao-analyze-gaps-visual-changenet` if routing was skipped). Required column: `filepath`. If `label` is also present, label-aware filtering during mining is available; otherwise the mining task silently no-ops the filter.
2. **Source pool** — a parquet of candidate images to mine against, with a `filepath` column. If the user only has a CSV, convert it to a parquet **with the same columns** before Step 2. For label-aware filtering, the pool must also carry a `label` column.
3. **Embedding spec file** — a YAML containing `model`, `model_path`, `batch_size`, and (only when `model_path` is a TAO `.pth`/`.ckpt`) `model_config_path`. Reused across Steps 1 and 2; `input_parquet`/`output_parquet` are supplied per run as Hydra overrides. The **same** spec MUST drive both embedding steps — embeddings from different encoders are not comparable, and mismatched encoders are the most common cause of "the mined images look unrelated" reports.
4. **Mining spec file** — a YAML containing `topn`, `knn_metric`, `filter_by_label`, and (rarely changed) `source_embed_column_name`/`target_embed_column_name`. `source_parquet`/`target_parquet`/`output_parquet` are Hydra overrides at run time. SigLIP and CLIP embeddings should use `knn_metric: cosine`. When `filter_by_label: true` but either embedding parquet lacks a `label` column, the container logs a warning and proceeds **without** filtering.
---
## Setup
Resolve the concrete `tao_toolkit.data_services` URI from `versions.yaml` once at the top of the run, then confirm Docker, the NVIDIA container toolkit, and a GPU are present before doing anything else. A GPU is required for both the encoder forward pass and the cuML/cuDF k-NN search; both steps fail without CUDA.
```bash
# Resolve tao_toolkit.data_services → concrete nvcr.io/... URI from versions.yaml
DS_IMAGE=$(python3 -c "import yaml,os; print(yaml.safe_load(open(os.environ['TAO_SKILL_BANK_PATH']+'/versions.yaml'))['images']['tao_toolkit']['data_services'])")
echo "DS_IMAGE=$DS_IMAGE"
docker info > /dev/null && echo "OK: docker"
nvidia-smi > /dev/null && echo "OK: GPU"
docker image inspect "$DS_IMAGE" > /dev/null \
|| docker pull "$DS_IMAGE"
```
Every host path the container reads or writes must be bind-mounted. The most predictable approach mounts the workspace root with **identical paths** inside and outside the container, then reuses one `$DOCKER` alias for the three invocations:
```bash
WORKSPACE=<absolute path that contains all parquets, outputs, and the source-pool images>
DOCKER="docker run --gpus all --rm --ipc=host -v $WORKSPACE:$WORKSPACE -w $WORKSPACE $DS_IMAGE"
```
Do **not** pass `--user $(id -u):$(id -g)` — it triggers a `getpwuid()` `KeyError` during the `transformers` import before any work starts. The container runs as root; chown outputs back to the host UID afterward.
Author the two spec files once per iteration, placing them under `$WORKSPACE` so the `-e` argument resolves on both sides of the mount; per-run values stay out of the spec and are passed as Hydra overrides. If the source pool is a CSV, convert it to parquet up front (preserving `filepath`, and `label` if present). The default `embedding_spec.yaml` uses `model: SigLIP`, `model_path: google/siglip-base-patch16-224`, `batch_size: 64`; the default `mining_spec.yaml` uses `topn: 5`, `knn_metric: cosine`, `filter_by_label: "false"` (quoted — the schema reads it as a string).
See `references/setup.md` for the full environment notes, `TAO_SKILL_BANK_PATH` handling, the path-mounting rationale, the `getpwuid` chown workaround, the CSV-to-parquet snippet, and the verbatim spec-file authoring blocks.
---
## Method
Three commands, in order. Each command's output parquet is the next command's input. Run them as plain Bash; the `$DOCKER` alias from Setup handles the container, GPU, and mounts. Every invocation follows the same shape: `-e <spec>` for the baked-in defaults, then a handful of Hydra overrides for the run-specific paths.
### Step 1 — Embed the target images
```bash
$DOCKER embedding image_embeddings \
-e <embedding_spec.yaml> \
input_parquet=<target_parquet> \
output_parquet=<target_embeddings_parquet>
```
Reads the gap-analysis / routing output and writes a parquet with `filepath`, `embedding`, and any extra metadata columns (e.g. `label`, `siamese_score`, `weakness`) carried forward verbatim from the input. Print the output schema (`pd.read_parquet(...).columns`) to stdout so the script-check hook can confirm the embedding column exists.
If you need to override `model` / `model_path` / `batch_size` for one run without editing the spec, append them as Hydra overrides (e.g. `model_path=...`).
### Step 2 — Embed the source pool
```bash
$DOCKER embedding image_embeddings \
-e <embedding_spec.yaml> \
input_parquet=<source_pool_parquet> \
output_parquet=<source_embeddings_parquet>
```
Same command shape as Step 1, applied to the source pool. Use the **identical** `embedding_spec.yaml` as Step 1, and do not override `model` / `model_path` / `batch_size` differently here — mismatched encoder configs across the two steps produce non-comparable embeddings.
### Step 3 — Mine nearest neighbours
```bash
$DOCKER tmm nearest_neighbors \
-e <mining_spec.yaml> \
source_parquet=<source_embeddings_parquet> \
target_parquet=<target_embeddings_parquet> \
output_parquet=<mined_parquet>
```
For each target embedding, finds the `topn` closest source embeddings under the chosen metric, deduplicates across targets, and writes a single-column (`filepath`) parquet of unique mined source paths. The container also drops a `mining_summary.txt` next to the output parquet with: query count, neighbour count, duplicates removed, and (when label filtering is on) kept-vs-dropped pair counts. Tweak `topn`, `knn_metric`, or `filter_by_label` via inline Hydra override when sweeping (e.g. `topn=10`) — no need to rewrite the spec.
When `filter_by_label=true` but one of the embedding parquets is missing the `label` column, the container logs a warning and proceeds without filtering. If the mined output looks larger than expected or contains cross-label pairs, scan the docker log for that warning before assuming the task did the right thing.
See `references/reference-invocation.md` for the minimal paste-and-edit end-to-end recipe (resolves `$DS_IMAGE`, writes both specs, runs all three steps, chowns outputs, and prints row counts) to run as a single streamed Bash block.
---
## Outputs and report
Write everything into a timestamped folder under the experiment / iteration directory. Get the real timestamp by running `date +%Y-%m-%d_%H%M%S` in Bash — do NOT hardcode or guess. If the user specifies a custom output path, use it directly but maintain the same internal layout. The packaging hook adds `mining_config/` and `claude_session.jsonl` automatically when `Mining_Report.md` is written.
The mined parquet is the artifact downstream training consumes. The two embedding parquets are intermediate but worth retaining — reusable across multiple mining runs against the same source pool, and the only place to look when a "looks unrelated" report needs encoder-level debugging.
See `references/outputs-and-reporting.md` for the full output-directory layout and the verbatim `Mining_Report.md` template (Verdict, Inputs, Encoder Consistency, Mining Run, Per-Label Breakdown, Output Sanity, Recommended Actions; keep it 600–1200 words).
---
## Common pitfalls
The most frequent failure is **mismatched encoders between the two embedding steps** — the single most common cause of garbage mining output; both steps must consume the same `embedding_spec.yaml`. Other recurring traps: passing `--user` (the `getpwuid` `KeyError`), skipping an embedding step, a missing `label` column silently no-oping `filter_by_label=true`, spec files outside `$WORKSPACE`, unresolved `???` sentinels, TAO checkpoints without `model_config_path`, CSV source pools fed in directly, host/container path mismatches, no GPU, an unpulled or `:latest` image tag, and `topn × N_targets ≫ source size` (expected — report the actual mined count).
See `references/troubleshooting.md` for the full pitfall list with the exact errors, causes, and fixes.
---
## Execution Order
1. Resolve `DS_IMAGE` from `versions.yaml` (`images.tao_toolkit.data_services`), then run `docker info`, `nvidia-smi`, and `docker image inspect "$DS_IMAGE"` (pulling if missing) once to confirm the environment. Abort with a clear message if any fail.
2. Run `date +%Y-%m-%d_%H%M%S` to get the timestamp; create `<output_dir>/mining_results/<timestamp>/`.
3. Write `embedding_spec.yaml` and `mining_spec.yaml` into the timestamped dir, filling in the encoder choice and mining knobs. Keep these under `$WORKSPACE` so the `-e` path resolves inside the container.
4. If the source pool is a CSV, convert to parquet first (preserve `filepath` and `label`).
5. Run Step 1 (embed targets) via `docker run … embedding image_embeddings -e embedding_spec.yaml input_parquet=… output_parquet=…`. Print the output parquet's row count and columns to stdout.
6. Run Step 2 (embed source pool) with the **identical** `embedding_spec.yaml` as Step 1. Print output row count and columns.
7. Run Step 3 (mine nearest neighbours) via `docker run … tmm nearest_neighbors -e mining_spec.yaml source_parquet=… target_parquet=… output_parquet=…`. Confirm `mining_summary.txt` was written next to `mined.parquet`.
8. Compute the per-label breakdown (Section 5) by joining the target embeddings parquet with the mined output on filepath, if both carry `label`.
9. Write `Mining_Report.md` last — writing it triggers the packaging hook, which copies session logs and skill config alongside.
Alle Dateien
14 Dateientao-mine-aoi-images installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/NVIDIA/skills/tree/main/skills/tao-mine-aoi-images # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
