Tao Generate Anomalies
NVIDIAOfficialCreated by NVIDIA Corporation
- Skill
- Workflow
- 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 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
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/tao-generate-anomalies/downloadUnzip 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-setupskill first (host preflight, credentials, cross-skill discovery).
Multi-phase pipeline (0–7); the mode flag selects which phases run.
| Phase | What runs | Mode(s) |
|---|---|---|
| 0 | Verify / download pretrained checkpoints | all |
| 1 | Fine-tune on dataset_dir | full, finetune_only |
| 2 | Prepare inference JSONL (AMP routing) | full, inference_only |
| 3 | SDG — generate synthetic anomaly images → original/ | full, inference_only |
| 4 | Eval original/ — emit per_sample.csv + eval.log, merge nn_score into SDG_result.csv | full, inference_only |
| 5 | Per-sample (guidance, crop_ratio) search rounds → rounds/round_NN/ (each round runs SDG + eval) | full, inference_only |
| 6 | Assemble best-of-rounds into searched/ (stitch only), plus rounds/search_summary.csv | full, inference_only |
| 7 | Filter 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.
| File | Read when |
|---|---|
references/finetune.md | Before Phase 0/1: env check, checkpoint download, dataset validation, config generation, training commands, best-checkpoint selection |
references/finetune-commands.md | Exact Phase 1 Step 1–4 commands and CKPT/STEP derivation |
references/inference-commands.md | Exact Phase 5 run_round.sh and Phase 7 filter_with_regen commands |
references/inference.md | Before Phases 2–7: AMP routing, JSONL validation, SDG flags, eval interpretation, search loop, filtering |
references/setup.md | Checkpoint download fails; first-time setup; HF_TOKEN / disk issues |
references/datasets.md | User needs to prepare or obtain a UC1 / UC2 / UC3 dataset; dataset_dir doesn't exist yet |
references/prep-testcase.md | AMP fails; need full param table, helper script descriptions, allocation invariant |
references/sdg-inference.md | NCCL hang; checkpoint validation error; multi-GPU VRAM question; full step list |
references/eval.md | Unexpected scores; FID column order confusion; eval output format reference |
references/sdg-refine.md | draws.json alignment; re-AMP heuristics; search output layout |
references/guard-and-custom-counts.md | Full guard preflight command; --per-defect-counts example |
references/docker.md | Container launch command, mount-permission flags, write preflight, uid-10000 fallback |
references/output-layout.md | Full results/<name>/ directory tree with per-file annotations; post-run Verification checklist |
references/error-handling.md | Pipeline-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.
| Parameter | Description |
|---|---|
mode | full (Phase 0→7), inference_only (skip Phase 1), or finetune_only (Phase 0→1 only). |
name | Experiment label. |
dataset_dir | Training/reference dataset root. Drives mask-count allocation, AMP submask templates, and holds semantic_segmentation_labels.json for cad defects. |
defect_spec | JSONL tagging each defect spatial_dependency as free/text/cad. text entries need roi_prompt_defect_location. Template: assets/defect_spec_template.jsonl. |
num_SDG | Total output samples per bucket. (Ignored when mode=finetune_only.) |
Conditionally required
| Parameter | Required when | Description |
|---|---|---|
checkpoint_dir / step | mode=inference_only | Pre-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
| Parameter | Default | Description |
|---|---|---|
clean_dir | dataset_dir | Clean images. Set only when they live outside the training dataset. Forwarded as --clean-dir to prep-testcase and --clean-image-path to finetune. |
validation_jsonl | auto-generated | Pre-built validation JSONL for Phase 1. When supplied, preflight verifies every defect_spec type appears and paths exist. |
num_search_run | 3 | Per-sample search budget for Phase 5. 0 skips search (only original/). (Ignored when mode=finetune_only.) |
nn_threshold | 0.4 | nn_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_iter | 75000 | Phase 1 only. Total fine-tune iterations. |
save_iter | 5000 | Phase 1 only. Checkpoint save interval. |
validation_iter | 5000 | Phase 1 only. Validation (nn_score) logging interval. |
num_gpus | 1 | Forwarded to Phase 1 (finetune) and Phase 3 (SDG). Eval and search rounds stay single-GPU. |
model_size | 2b | 2b or 14b. Used by finetune and SDG. On-disk checkpoint path encodes in upper-case (2b→2B, 14b→14B). |
lr | 0.02 | Phase 1 only. Learning rate. |
batch_size | 2 | Phase 1 only. Per-GPU batch size. |
image_size | 512 | Phase 1 only. Training resolution (square). |
guidance_range | 1.5 10.0 | Phase 5 search draw range for guidance. |
crop_ratio_range | 1.5 10.0 | Phase 5 search draw range for crop_ratio. |
Mode validation (fail fast before any phase)
modeunset → halt: "modeis required (full|inference_only|finetune_only)."mode=inference_onlymissing eithercheckpoint_dirorstep→ halt: "inference_only requires bothcheckpoint_dirandstep."mode=fullwithcheckpoint_dirorstepsupplied → halt: "full mode runs finetune; usemode=inference_onlyto 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}/regensGuard 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:
Read prior round's
per_sample.csv(or${ORIGINAL}/per_sample.csvforr=1).Write
${ROUNDS}/round_${r}/draws.jsonwith selected(guidance, crop_ratio)per sample.Run round via
${ANOMALYGEN_SCRIPTS}/run_round.sh(SDG + eval; the round dir gets its ownsdg/{SDG_result.csv, per_sample.csv, eval.log}). Seereferences/inference-commands.md §Phase 5for 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
- ATTRIBUTION.mdAdded by AutoGineer936 B
- BENCHMARK.md7.8 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md19.1 KiB
- assets/ag_config.yaml1.4 KiB
- assets/defect_spec_template.jsonl462 B
- config/skillspector-baseline.yaml1.7 KiB
- evals/evals.json789 B
- references/datasets.md4.8 KiB
- references/docker.md3.5 KiB
- references/error-handling.md1.9 KiB
- references/eval.md7.4 KiB
- references/finetune-commands.md2.3 KiB
- references/finetune.md8.2 KiB
- references/guard-and-custom-counts.md2.0 KiB
- references/inference-commands.md1.4 KiB
- references/inference.md14.9 KiB
- references/output-layout.md3.8 KiB
- references/prep-testcase.md7.6 KiB
- references/sdg-inference.md4.8 KiB
- references/sdg-refine.md4.9 KiB
- references/setup.md4.0 KiB
- skill-card.md5.5 KiB
- skill.oms.sig8.5 KiB
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>tocheck.sh/download_checkpoints.shmatching this run'smodel_size— the 2B-only default otherwise skips a 14B downloadHF_TOKENmust 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.shrefuses to start if unsetcheck.shexits 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 verifycontext_parallel_size: 1in 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: 0If 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-specdrives 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:
| Flag | Default | Note |
|---|---|---|
--model-size | 2b | 2b or 14b; sets the DiT backbone size |
--aug-type | random_ratio_crop | Pass --aug-type null to disable crop augmentation |
--ratio-range | 1.5 8.0 | MIN MAX floats; only used when aug_type is set |
--early-stop | off | Enables early stopping on validation nn_score |
--es-patience | 5 | Validations 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=1024stays compatible with the DiT backbone.anomaly_typesmust match betweendataloader_train.dataset.anomaly_typesandmodel.config.ag_config.anomaly_embedding.anomaly_types—generate_config.pypopulates both from--defect-specautomatically.
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
| Symptom | Action |
|---|---|
| No anomaly types detected | Dataset structure wrong — check anomaly_image/ and mask/ subdirs exist |
Missing clean_image_path and auto-discovery fails | Stop; ask the user for the clean images path |
| Missing ROI/submask for PD defects in validation JSONL | Warn and treat as free, or ask for the missing inputs |
| Multi-GPU port conflict | Increment master_port in launch_training.sh (default 12341) |
| OOM during training | Reduce batch_size or switch to smaller model |
| Training loss diverges | Reduce lr (try 0.01 or 0.005) |
| NCCL errors | Check 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