Generated banner for Tao Generate Anomalies
Generated logo for Tao Generate Anomalies

Tao Generate Anomalies

NVIDIAOfficialCreated by NVIDIA Corporation

  • Skill
  • Workflow
  • Data and AI
  • Apache-2.0
  • Medium risk

From the author

Full PAIDF AnomalyGen pipeline — fine-tune on a new anomaly dataset, generate synthetic anomaly images (SDG), evaluate quality (nn_score), and search per-sample (guidance, crop_ratio) parameters. Three modes: full (Phase 0→7: finetune then generate), finetune_only (Phase 0→1: train only), inference_only (Phase 0, 2→7: generate from an existing checkpoint). Use when the user asks to "fine-tune AnomalyGen", "generate anomaly images", "run PAIDF SDG", "evaluate SDG output quality", "run per-sample search", or run any part of the AnomalyGen pipeline, even if they only mention one phase.
— the description by NVIDIA Corporation

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The TAO Generate Anomalies skill provides a comprehensive pipeline for training and using PAIDF AnomalyGen models. It supports three operational modes: full (fine-tuning and generation), fine-tune only, and inference only. The pipeline manages the entire lifecycle from checkpoint verification and dataset fine-tuning to synthetic data generation, quality evaluation, and iterative per-sample parameter refinement.

What it does

  • Fine-tunes AnomalyGen models on custom anomaly datasets.
  • Generates synthetic anomaly images using trained checkpoints.
  • Evaluates synthetic image quality using nn_score metrics.
  • Performs per-sample search for optimal guidance and crop_ratio parameters.
  • Filters generated samples based on quality thresholds and performs automated regeneration.
  • Provides guardrail checks to identify and replace unsafe generated content.

When to use it

  • When you need to fine-tune an AnomalyGen model on a new dataset.
  • When you need to generate synthetic anomaly images for training or testing.
  • When you need to evaluate the quality of synthetic anomaly images.
  • When you need to optimize generation parameters for specific anomaly samples.

Advantages

  • Automates the end-to-end workflow from training to final evaluation.
  • Supports iterative refinement of generation parameters per sample.
  • Includes automated filtering and regeneration to meet target sample counts.
  • Provides built-in guardrail checks for generated image content.

Usage examples

“Fine-tune AnomalyGen on my new PCB dataset.”
The agent initiates the fine-tuning phase (Phase 1) using the provided dataset directory and configuration.
“Generate 50 synthetic anomaly images using an existing checkpoint.”
The agent runs the inference-only mode to generate images based on the specified checkpoint and step.
“Evaluate the quality of my generated anomaly images.”
The agent executes the evaluation phase to calculate nn_score metrics and generate an evaluation log.
“Run the full PAIDF AnomalyGen pipeline for my experiment.”
The agent executes the full mode (Phases 0-7), covering checkpoint verification, fine-tuning, generation, search, and final filtering.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/tao-generate-anomalies/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip tao-generate-anomalies.zip -d .agents/skills

Documentation by NVIDIA Corporation

TAO Generate Anomalies

Standalone install? If this session was not initialized by the TAO skill bank plugin, run the tao-setup skill first (host preflight, credentials, cross-skill discovery).

Multi-phase pipeline (0–7); the mode flag selects which phases run.

PhaseWhat runsMode(s)
0Verify / download pretrained checkpointsall
1Fine-tune on dataset_dirfull, finetune_only
2Prepare inference JSONL (AMP routing)full, inference_only
3SDG — generate synthetic anomaly images → original/full, inference_only
4Eval original/ — emit per_sample.csv + eval.log, merge nn_score into SDG_result.csvfull, inference_only
5Per-sample (guidance, crop_ratio) search rounds → rounds/round_NN/ (each round runs SDG + eval)full, inference_only
6Assemble best-of-rounds into searched/ (stitch only), plus rounds/search_summary.csvfull, inference_only
7Filter searched/ by nn_threshold (default 0.4), regen dropped samples, then canonical bucket eval → searched/{per_sample.csv, eval.log}full, inference_only

Run every phase through to completion without mid-run pauses. Collect all required parameters up front, and run every command from the repo root.

Shell setup. All ${ANOMALYGEN_SCRIPTS} references resolve to the packaged helper-script directory. Inside the container this is preset (ENV ANOMALYGEN_SCRIPTS=<dir>/scripts/utilities); on the host, export it once per shell:

export ANOMALYGEN_SCRIPTS="$(git rev-parse --show-toplevel)/scripts/utilities"

python3 -m scripts.utilities.<name> invocations work from any CWD inside the container (PYTHONPATH is preset) and from the repo root on the host. When inside a product container (ANOMALYGEN_PRODUCT_MODE=1), invoke anomalygen-guard before any GPU work; if it reports BLOCKED, fix the listed issues before continuing.

Quick Start

The pipeline runs inside the metropolis_sdg.paidf_anomalygen container (declared in versions.yaml) or any host with the cosmos-predict2 conda env active. All phase commands assume that environment, at the repo root, with ANOMALYGEN_SCRIPTS exported.

Minimal end-to-end run (mode=full):

# 1. Set the shared variables (see "Shared variables" for the full set).
export ANOMALYGEN_SCRIPTS="$(git rev-parse --show-toplevel)/scripts/utilities"
MODE=full
NAME=my_exp
DATASET_DIR=/data/uc1
DEFECT_DESC=assets/defect_spec_template.jsonl
NUM_SDG=20
MODEL_SIZE=2b

# 2. Phase 0 — verify / download checkpoints (~40 GB for the 2B default; needs HF_TOKEN).
${ANOMALYGEN_SCRIPTS}/check.sh --model-sizes ${MODEL_SIZE^^} \
    || ${ANOMALYGEN_SCRIPTS}/download_checkpoints.sh --model-sizes ${MODEL_SIZE^^}

# 3. Walk Phases 1→7 in order (see each Phase section).

For mode=inference_only (reuse a checkpoint) also set CKPT/STEP and skip Phase 1. For mode=finetune_only run only Phases 0–1.

Running in Docker — container launch, mounts & permissions

The paidf-anomalygen image runs as a non-root baked-in user (USER anomalygen, uid=10000), independent of your host uid. Docker does not remap uids on bind mounts, so a host directory owned by your uid is not writable by uid 10000 and the container fails the instant it tries to create a file there. Run with the full host identity: --user "$(id -u):$(id -g)", matching USER/LOGNAME, HOME=/tmp, and read-only /etc/passwd+/etc/group mounts, plus the cache redirects. Run the fail-fast write preflight before Phase 0. See references/docker.md for the full docker run command, the load-bearing-flag table, the preflight snippet, and the uid-10000 chown/chmod fallback.

Reference files — read before executing phases

Read references/finetune.md before Phase 0/1 and references/inference.md before any of Phases 2–7; for mode=full read both before starting. The remaining references below are on-demand — read when troubleshooting or needing full detail for a specific phase.

FileRead when
references/finetune.mdBefore Phase 0/1: env check, checkpoint download, dataset validation, config generation, training commands, best-checkpoint selection
references/finetune-commands.mdExact Phase 1 Step 1–4 commands and CKPT/STEP derivation
references/inference-commands.mdExact Phase 5 run_round.sh and Phase 7 filter_with_regen commands
references/inference.mdBefore Phases 2–7: AMP routing, JSONL validation, SDG flags, eval interpretation, search loop, filtering
references/setup.mdCheckpoint download fails; first-time setup; HF_TOKEN / disk issues
references/datasets.mdUser needs to prepare or obtain a UC1 / UC2 / UC3 dataset; dataset_dir doesn't exist yet
references/prep-testcase.mdAMP fails; need full param table, helper script descriptions, allocation invariant
references/sdg-inference.mdNCCL hang; checkpoint validation error; multi-GPU VRAM question; full step list
references/eval.mdUnexpected scores; FID column order confusion; eval output format reference
references/sdg-refine.mddraws.json alignment; re-AMP heuristics; search output layout
references/guard-and-custom-counts.mdFull guard preflight command; --per-defect-counts example
references/docker.mdContainer launch command, mount-permission flags, write preflight, uid-10000 fallback
references/output-layout.mdFull results/<name>/ directory tree with per-file annotations; post-run Verification checklist
references/error-handling.mdPipeline-level failure modes: missing mask dirs, short/empty AMP, mid-round resume, off-boundary step

Required parameters

num_SDG allocation depends on prep_testcase.sh --mode: inference (default, Phase 2) is uniform across defect types, override per-defect via --per-defect-counts; validation (Phase 1's validation JSONL) is proportional to training mask counts (largest-remainder rounding) and enforces ≥1 per defect. See references/prep-testcase.md for the full mode table.

ParameterDescription
modefull (Phase 0→7), inference_only (skip Phase 1), or finetune_only (Phase 0→1 only).
nameExperiment label.
dataset_dirTraining/reference dataset root. Drives mask-count allocation, AMP submask templates, and holds semantic_segmentation_labels.json for cad defects.
defect_specJSONL tagging each defect spatial_dependency as free/text/cad. text entries need roi_prompt_defect_location. Template: assets/defect_spec_template.jsonl.
num_SDGTotal output samples per bucket. (Ignored when mode=finetune_only.)

Conditionally required

ParameterRequired whenDescription
checkpoint_dir / stepmode=inference_onlyPre-existing fine-tuned model. In mode=full these are auto-derived after Phase 1; passing them is an error. In mode=finetune_only silently ignored — Phase 1 always trains from scratch (no resume-from-checkpoint support). Both must be present together — supplying only one is an error.

Optional parameters

ParameterDefaultDescription
clean_dirdataset_dirClean images. Set only when they live outside the training dataset. Forwarded as --clean-dir to prep-testcase and --clean-image-path to finetune.
validation_jsonlauto-generatedPre-built validation JSONL for Phase 1. When supplied, preflight verifies every defect_spec type appears and paths exist.
num_search_run3Per-sample search budget for Phase 5. 0 skips search (only original/). (Ignored when mode=finetune_only.)
nn_threshold0.4nn_score cutoff for Phase 7 (DINOv2 correspondence to real defects — key KPI). Samples below are regenerated; final searched/ always has num_SDG. 0 disables filtering.
max_iter75000Phase 1 only. Total fine-tune iterations.
save_iter5000Phase 1 only. Checkpoint save interval.
validation_iter5000Phase 1 only. Validation (nn_score) logging interval.
num_gpus1Forwarded to Phase 1 (finetune) and Phase 3 (SDG). Eval and search rounds stay single-GPU.
model_size2b2b or 14b. Used by finetune and SDG. On-disk checkpoint path encodes in upper-case (2b→2B, 14b→14B).
lr0.02Phase 1 only. Learning rate.
batch_size2Phase 1 only. Per-GPU batch size.
image_size512Phase 1 only. Training resolution (square).
guidance_range1.5 10.0Phase 5 search draw range for guidance.
crop_ratio_range1.5 10.0Phase 5 search draw range for crop_ratio.

Mode validation (fail fast before any phase)

  • mode unset → halt: "mode is required (full | inference_only | finetune_only)."

  • mode=inference_only missing either checkpoint_dir or step → halt: "inference_only requires both checkpoint_dir and step."

  • mode=full with checkpoint_dir or step supplied → halt: "full mode runs finetune; use mode=inference_only to reuse an existing checkpoint."

Shared variables

Set once before Phase 0:

MODE=<full|inference_only|finetune_only>
NAME=<exp>
DATASET_DIR=<dataset_dir>
CLEAN_DIR=${clean_dir:-${DATASET_DIR}}
CKPT=<checkpoint_dir>      # required iff MODE=inference_only; auto-derived after Phase 1 when MODE=full
STEP=<iter>                # required iff MODE=inference_only; auto-derived after Phase 1 when MODE=full
NUM_SDG=<N>
DEFECT_DESC=<defect_spec.jsonl>
DEFECTS=(T+A T+B)          # TEXTURE+TYPE names. For mode=inference_only, derive from ${CKPT}/ag_config.yaml → dataloader_train.dataset.anomaly_types (also printed by validate_checkpoint.py in Phase 0). For mode=full, take from DEFECT_DESC entries. See references/inference.md §Phase 0.
NUM_SEARCH_RUN=${num_search_run:-3}
NN_THRESHOLD=${nn_threshold:-0.4}
MODEL_SIZE=<2b|14b>
NUM_GPUS=${num_gpus:-1}
MAX_ITER=${max_iter:-75000}
SAVE_ITER=${save_iter:-5000}
VALIDATION_ITER=${validation_iter:-5000}
LR=${lr:-0.02}
BATCH_SIZE=${batch_size:-2}
IMAGE_SIZE=${image_size:-512}
VALIDATION_JSONL=${validation_jsonl:-}  # optional; set by Phase 1 Step 2 if not user-supplied

BASE=results/${NAME}
JSONL=ag_inference/${NAME}/testcase.jsonl
ORIGINAL=${BASE}/original
SEARCHED=${BASE}/searched
ROUNDS=${BASE}/rounds
REGENS=${BASE}/regens

Guard preflight (product mode only)

When ANOMALYGEN_PRODUCT_MODE=1, run .agents/skills/anomalygen-guard/scripts/preflight.py before any GPU work and fix any BLOCKED issues. --validation-jsonl is forwarded only when the user supplied one; for MODE=finetune_only omit --num-sdg if not supplied. See references/guard-and-custom-counts.md for the full preflight command with all forwarded flags and the validation-JSONL / allocate_samples.py 0-entry checks.


Phase 0 — checkpoints

Read references/finetune.md §Phase 0 for HF_TOKEN requirements and what gets downloaded. Both scripts default to the 2B base + t5-large (~40 GB); pass --model-sizes ${MODEL_SIZE^^} so the chain checks and fetches the base size this run actually uses (2b→2B, 14b→14B) — otherwise a 14b run silently passes the 2B-only check and never downloads its checkpoint. Verify first; download only what is missing.

${ANOMALYGEN_SCRIPTS}/check.sh --model-sizes ${MODEL_SIZE^^} \
    || ${ANOMALYGEN_SCRIPTS}/download_checkpoints.sh --model-sizes ${MODEL_SIZE^^}

Phase 1 — fine-tune (skip when MODE=inference_only)

Read references/finetune.md §Phase 1 for dataset structure, config template details, and best-checkpoint selection. Four steps: (1) validate dataset / derive anomaly types, (2) generate the validation JSONL (skip if user supplied VALIDATION_JSONL), (3) generate the training config — show it to the user and confirm before writing — (4) launch training in the background. Then derive CKPT (path encodes upper-case MODEL_SIZE) and STEP (highest nn_score step from validation logs). If MODE=finetune_only, stop after training. See references/finetune-commands.md for the exact Step 1–4 commands and the CKPT/STEP derivation snippet.


Phase 2 — prep-testcase (skip when MODE=finetune_only)

Read references/inference.md §Phase 2 for AMP routing detail and n_seeds sizing. Do NOT pass --seeds — it is auto-computed and is not a recognized flag. prep_testcase.sh defaults to --mode inference (uniform allocation across defect types, no KPI floor), which Phase 2 always uses.

${ANOMALYGEN_SCRIPTS}/prep_testcase.sh \
    --name ${NAME} --num-sdg ${NUM_SDG} \
    --dataset-dir ${DATASET_DIR} \
    --clean-dir ${CLEAN_DIR} \
    --defect-spec ${DEFECT_DESC} \
    --amp-output-dir ag_inference/${NAME}/amp \
    --output-jsonl ${JSONL}

Custom per-defect counts: when the user specifies counts per defect type, translate to --num-sdg plus a --per-defect-counts JSON dict (types absent from the dict get 0; sum should equal --num-sdg, else the script warns on stderr and uses the override sum). Confirm the allocation when intent is ambiguous. See references/guard-and-custom-counts.md for the full --per-defect-counts command example and the ambiguity-handling detail.


Phase 3 — SDG → original/

Read references/inference.md §Phase 3 for JSONL validation against the checkpoint, multi-GPU caveats, and output verification.

python3 -m scripts.utilities.validate_checkpoint ${CKPT} --step ${STEP}
python3 -m scripts.utilities.validate_jsonl ${CKPT} ${JSONL}

${ANOMALYGEN_SCRIPTS}/run_sdg.sh \
    --checkpoint_dir ${CKPT} --step ${STEP} \
    --input_jsonl ${JSONL} --output_dir ${ORIGINAL} \
    --model_size ${MODEL_SIZE} --num_gpus ${NUM_GPUS}

${ANOMALYGEN_SCRIPTS}/verify_output.sh ${JSONL} ${ORIGINAL}

Phase 4 — eval original/

Read references/inference.md §Eval for score interpretation and feature-count explanation. run_eval.sh writes per_sample.csv and eval.log inside original/ and merges nn_score into SDG_result.csv.

${ANOMALYGEN_SCRIPTS}/run_eval.sh \
    --real-path ${DATASET_DIR} --generated-path ${ORIGINAL} \
    --anomaly-types ${DEFECTS[@]}

Phase 5 — per-sample search rounds

Read references/inference.md §Phase 5 for draw strategy, ranges, and re-AMP guidance. For r in 1..NUM_SEARCH_RUN:

  1. Read prior round's per_sample.csv (or ${ORIGINAL}/per_sample.csv for r=1).

  2. Write ${ROUNDS}/round_${r}/draws.json with selected (guidance, crop_ratio) per sample.

  3. Run round via ${ANOMALYGEN_SCRIPTS}/run_round.sh (SDG + eval; the round dir gets its own sdg/{SDG_result.csv, per_sample.csv, eval.log}). See references/inference-commands.md §Phase 5 for the full command and flags.

NUM_SEARCH_RUN=0 is valid — skip this phase entirely and let Phase 6 clone original/ into searched/.


Phase 6 — assemble searched/ (stitch only)

Always run assemble (works with 0 rounds — searched/ clones original/, so downstream always reads searched/ regardless of num_search_run). Stitch-only: copies winning images per sample-index into searched/ and carries over per-sample nn_score / mnn_score from each pick's source-round per_sample.csv. No eval — Phase 7 emits the canonical searched/eval.log.

mkdir -p ${ROUNDS}
python3 -m scripts.utilities.assemble_searched \
    --original-dir ${ORIGINAL} --original-csv ${ORIGINAL}/per_sample.csv \
    --rounds-dir ${ROUNDS} --searched-dir ${SEARCHED}

Phase 7 — filter + regen + eval (default nn_threshold=0.4)

Phase 7 runs by default (nn_threshold=0.4) on every mode=full and mode=inference_only invocation; pass nn_threshold=0 to skip it. It filters searched/ by nn_threshold, regenerates dropped samples via re-AMP (fresh (clean, submask) pairing in the same defect type) for up to 5 attempts, then falls back to best-scoring non-passing regens and finally to dropped originals, so the final bucket always equals num_SDG.

Run python3 -m scripts.utilities.filter_with_regen. Pass --allocation ag_inference/${NAME}/allocation.json so regen targets the intended per-defect counts — without it a bucket left short (e.g. by an interrupted SDG) cannot be topped back up to num_SDG. It runs the final run_eval.sh internally — the only eval against searched/. Read references/inference.md §Phase 7 for regen mechanics, source-column tracing, and the regens/regen_summary.csv schema; see references/inference-commands.md §Phase 7 for the full command and flags.


Output layout

Every bucket that gets eval'd carries the same triad of files: SDG_result.csv (generation params + nn_score + guardrail_pass), per_sample.csv (per-sample nn + mnn), and eval.log (aggregate FID / per-defect avg). Buckets live under results/<name>/ as original/ (Phase 3+4), searched/ (Phase 6 stitch + Phase 7 filter+regen+eval), rounds/round_NN/ (Phase 5, plus search_summary.csv), and regens/regen_NN/ (Phase 7, plus regen_summary.csv).

Image content guardrail. A SigLIP content-safety check runs on every generated image and records its verdict in SDG_result.csv.guardrail_pass (1 safe / 0 blocked). A blocked image is replaced with an all-black image that still occupies its slot on disk, so counting files cannot detect it — never hand a guardrail_pass=0 sample downstream. Blacked-out samples score near-zero nn_score, so Phase 7 regenerates them like any other sub-threshold sample. Disable with ANOMALYGEN_IMAGE_GUARDRAIL=0.

See references/output-layout.md for the full directory tree with per-file annotations, the guardrail semantics, and the post-run Verification checklist (image counts per bucket, search_summary.csv / regen_summary.csv row checks, the per-type nn_score / mnn_score / fid fields in each eval.log, and the guardrail_pass sweep).

Error handling

Common pipeline failure modes (missing mask dirs, short/empty AMP output and the 0 entries written halt, mid-round SDG failure resume, off-boundary step, validate_dataset.py's non-zero exit on any pairing issue, the 2B-only check.sh default, and guardrail-blocked black images) are covered in references/error-handling.md; see also references/finetune.md and references/inference.md for phase-specific error handling.

Files

references/finetune.md

Finetune Reference — Phase 0 and Phase 1

Use this reference only when the parent SKILL.md points here for the current task. If this file conflicts with current SKILL.md, skill_info.yaml, schemas, or platform/model skills, the current authoritative source wins.

Contents

  • Phase 0: Environment and Checkpoint Pre-flight

    • Environment check

  • Phase 1: Fine-Tuning

    • Expected dataset structure

    • Step 1: Dataset validation output

    • Step 2: Validation JSONL sizing

    • Step 3: Config template and critical flags

    • Step 4: Training launch details

    • Best checkpoint selection

    • Phase 1 error handling

Detail for anomalygen Phases 0 and 1. Read before executing either phase.


Phase 0: Environment and Checkpoint Pre-flight

Read references/setup.md for the full checkpoint table, script behavior detail (idempotent skip logic, HF_TOKEN handling, SAM2/Qwen3-VL skip), and error handling. Summary:

  • Defaults fetch the 2B base + T5-large + guardrail/encoders (~40 GB). The 14B base (--model-sizes 14B) and T5-11B (--with-t5-11b) are opt-in; the full set is ~150 GB. Artifacts: 2B/14B model, T5-large/T5-11B, Cosmos-Guardrail1, RADIO, NVDINOV2, DINOv2, SAM2, Qwen3-VL-4B.

  • Pass --model-sizes <2B|14B> to check.sh/download_checkpoints.sh matching this run's model_size — the 2B-only default otherwise skips a 14B download

  • HF_TOKEN must be present in the environment — exported in your shell or sourced from a user-approved env file (set -a; source /path/to/.env; set +a); download_checkpoints.sh refuses to start if unset

  • check.sh exits 0 if all present, 1 with a remediation list if not — run it first

Environment check
nvidia-smi --query-gpu=name,memory.total --format=csv,noheader
python -c "import torch; print(f'torch={torch.__version__}, CUDA={torch.cuda.is_available()}, devices={torch.cuda.device_count()}')"
  • If num_gpus > detected GPU count → stop and inform the user.

  • If CUDA unavailable → stop: conda activate cosmos-predict2.

  • If num_gpus > 1 → remind user to verify context_parallel_size: 1 in the generated config (set by default in Step 3).


Phase 1: Fine-Tuning

Expected dataset structure
<dataset_dir>/
├── <TEXTURE>/
│   ├── anomaly_image/
│   │   ├── <ANOMALY_TYPE_A>/   # image_001.png, image_002.png, ...
│   │   └── <ANOMALY_TYPE_B>/
│   ├── mask/
│   │   ├── <ANOMALY_TYPE_A>/   # image_001_mask.png, ...
│   │   └── <ANOMALY_TYPE_B>/
│   └── clean_image/            # optional — omit clean_dir when present here
└── <TEXTURE_2>/
    └── ...

Each anomaly image must have a corresponding mask with the _mask suffix in the filename stem. validate_dataset.py checks this and exits non-zero on any mismatch (training would crash mid-iteration on it).

Step 1: Dataset validation output

validate_dataset.py prints a summary:

=== Dataset Validation Summary ===
  [TEXTURE_1, TYPE_A]: 50 images, 50 masks
  [TEXTURE_1, TYPE_B]: 30 images, 30 masks
Issues: 0
  • If no anomaly types detected → exit 1; the dataset structure is wrong.

  • Image/mask mismatch or missing-directory issues → listed as WARNINGs, then exit 1. Fix the pairs (or remove the offending files) and re-run — the training dataloader asserts on exactly these and would crash mid-iteration.

  • The anomaly types list from this output is used in generate_config.py (--defect-spec drives it, but validate first to catch structural issues).

Step 2: Validation JSONL sizing

num_SDG for the validation JSONL = total training mask count (sum of all mask counts printed by validate_dataset.py). Combined with --mode validation (required — prep_testcase.sh defaults to inference), the proportional allocation gives n_seeds=1 with every training submask appearing exactly once.

The script emits every defect type from defect_spec — any type with zero allocation under --mode validation causes allocate_samples.py to raise (the per-defect KPI floor described below). Fix the offending defect spec or adjust num_SDG before continuing.

KPI floor (validation only): every defect type must receive ≥ 1 JSONL entry, and ≥ 3 is needed for nn_score to be statistically meaningful. With proportional allocation, ≥ 1 is satisfied automatically when num_SDG ≥ ceil(3 × N_total / N_min), where N_total is total mask count and N_min is the smallest per-type mask count. If any type has very few masks (e.g. 1–2), raise num_SDG accordingly.

Inference mode skips the floor. prep_testcase.sh --mode inference (default) does NOT enforce the per-defect floor — defects can have 0 allocation when --per-defect-counts excludes them. This is intentional for SDG inference where the user may want only a subset of defect types.

Skip this step if the user supplies VALIDATION_JSONL directly. In that case, verify every row's anomaly_type exists in defect_spec — a mismatch causes training validation to drift from the trained defect set silently.

Step 3: Config template and critical flags

generate_config.py uses the FSDP template from .agents/skills/anomalygen/assets/ag_config.yaml. Key flags:

FlagDefaultNote
--model-size2b2b or 14b; sets the DiT backbone size
--aug-typerandom_ratio_cropPass --aug-type null to disable crop augmentation
--ratio-range1.5 8.0MIN MAX floats; only used when aug_type is set
--early-stopoffEnables early stopping on validation nn_score
--es-patience5Validations without improvement before stopping

Critical: ad_precision: float32 is injected by the script and must not be removed — it overrides bfloat16 for the mask encoder, adapter, and anomaly embedding, producing better quality.

Config template notes (assets/ag_config.yaml):

  • t5_model_name: checkpoints/google-t5/t5-large — saves ~20 GB VRAM vs the T5-11B default; d_model=1024 stays compatible with the DiT backbone.

  • anomaly_types must match between dataloader_train.dataset.anomaly_types and model.config.ag_config.anomaly_embedding.anomaly_types — generate_config.py populates both from --defect-spec automatically.

Show the generated config to the user and ask for confirmation before writing to ag_configs/<name>.yaml.

Step 4: Training launch details

launch_training.sh wraps:

export IMAGINAIRE_OUTPUT_ROOT=./results
EXP=predict2_anomaly_gen_ddp_<model_size>  # e.g. predict2_anomaly_gen_ddp_2b
torchrun --nproc_per_node=<num_gpus> --master_port=12341 \
    -m scripts.anomaly_gen.ag_train \
    --config=cosmos_predict2/configs/base/ag_config.py \
    --ag_config=ag_configs/<name>.yaml \
    -- experiment=${EXP}

IMAGINAIRE_OUTPUT_ROOT must be set (defaults to checkpoints/ otherwise). The bare -- before experiment= is required (separates argparse from Hydra).

Checkpoints are saved to:

results/anomaly_gen/<name>/<name>_training_FP32_lr<lr>_bs=<bs>_<MODEL_SIZE_UPPER>_<H>x<W>/
Best checkpoint selection

After training, review the validation nn_score log (emitted every validation_iter steps). Select the step with the highest average nn_score across all defect types — not the final checkpoint. Small datasets overfit early.

If the user enabled --early-stop, the training script selects the best step automatically. Otherwise, scan results/anomaly_gen/<name>/*/validation_*.log or Tensorboard for the step with peak average nn_score.

Report the best step and its nn_score to the user before proceeding to inference phases.

Phase 1 error handling
SymptomAction
No anomaly types detectedDataset structure wrong — check anomaly_image/ and mask/ subdirs exist
Missing clean_image_path and auto-discovery failsStop; ask the user for the clean images path
Missing ROI/submask for PD defects in validation JSONLWarn and treat as free, or ask for the missing inputs
Multi-GPU port conflictIncrement master_port in launch_training.sh (default 12341)
OOM during trainingReduce batch_size or switch to smaller model
Training loss divergesReduce lr (try 0.01 or 0.005)
NCCL errorsCheck CUDA_VISIBLE_DEVICES and driver compatibility

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 Python

The author says: Requires docker + nvidia-container-toolkit and a CUDA GPU. Pulls the `metropolis_sdg.paidf_anomalygen` image declared in `versions.yaml` at the skill bank root.

Security

What our scanner noticed· Medium risk

  • Large base64-encoded blobs
  • References to credential files
  • Instructions that use the network

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-generate-anomalies · 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-generate-anomalies.zip