tao-finetune-kumo-anomaly

Par nvidia · skills

Kumo-Anomaly — détection d'anomalies et fine-tuning par diffusion pour séries temporelles multivariées. À utiliser lorsque l'utilisateur demande de « fine-tuner Kumo-Anomaly », « exécuter une inférence Kumo-Anomaly », « détecter des anomalies avec la diffusion », « détection d'anomalies sur des séries temporelles », « finetuner Kumo-Anomaly », « utiliser perform_anomaly_analysis_with_diffusion », « automl Kumo-Anomaly », « recherche d'hyperparamètres Kumo-Anomaly », « optimisation des hyperparamètres » ou mentionne `curriculum_medium.yaml`, `final_model.pth`, `kumo-anomaly`, `sdk/anomaly_analysis` ou `TSDiffuser_Generic`.

npx skills add https://github.com/nvidia/skills --skill tao-finetune-kumo-anomaly

Kumo-Anomaly

Détection d'anomalies basée sur la diffusion et fine-tuning pour séries temporelles multivariées. Le modèle reconstruit les segments masqués aléatoirement et score chaque pas de temps par MAE entre la reconstruction et le signal original ; le seuillage adaptatif (SCS ou MACS) convertit les scores en étiquettes binaires.

Code source : https://github.com/NVIDIA/Kumo-TS Poids pré-entraînés : https://huggingface.co/nvidia/Kumo-Anomaly

Pour les informations d'utilisation les plus à jour, consultez les fichiers README dans le dépôt Kumo-TS :

Dépendances externes

Dépendance Objectif Installation
Python 3.12+ Runtime https://www.python.org/downloads/
uv Gestionnaire de paquets et environnement pip install uv
CUDA toolkit (optionnel) Accélération GPU https://developer.nvidia.com/cuda-downloads
huggingface_hub Téléchargement des poids depuis HF Inclus via uv sync

Identifiants

nvidia/Kumo-Anomaly est un dépôt public — aucun token requis pour télécharger les poids. Si vous rencontrez un 401/403 (accès restreint ou fork privé) ou un 504 au premier téléchargement, consultez la section Pièges connus.

Démarrage rapide

git clone --branch main --single-branch https://github.com/NVIDIA/Kumo-TS Kumo-TS
cd Kumo-TS/Kumo-Anomaly
uv sync                              # installer les dépendances (une seule fois)

# Inférence — données synthétiques, télécharge automatiquement les poids depuis HF au premier lancement
uv run python examples/quick_example.py

# Inférence — votre propre CSV
uv run python examples/quick_example.py \
  --model-path final_model.pth \
  --config-path curriculum_medium.yaml \
  --dataset-path /path/to/data.csv

# Pré-télécharger uniquement les poids (réchauffer le cache avant d'être hors ligne)
uv run python examples/quick_example.py --download-weights

# Fine-tuner sur vos propres données de comportement normal
uv run python examples/finetune_example.py \
  --csv /path/to/normal_training_data.csv \
  --timestamp-col timestamp \
  --label-col is_anomaly \
  --epochs 20 \
  --output-dir artifacts/finetune_my_data

Inférence

Utilisez perform_anomaly_analysis_with_diffusion dans sdk/anomaly_analysis.py. Elle valide l'entrée, auto-distribue sur tous les GPU visibles, applique le seuillage adaptatif (SCS ou MACS) et retourne le DataFrame original avec les colonnes Anomaly (0/1) et MAE ajoutées.

import sys, pandas as pd
sys.path.append("/path/to/Kumo-TS/Kumo-Anomaly")  # cloner Kumo-TS avec --branch main
from sdk.anomaly_analysis import perform_anomaly_analysis_with_diffusion

df = pd.read_csv("your_data.csv")

# L'API lève ValueError sur les colonnes non-numériques — supprimez d'abord le timestamp, les IDs et les étiquettes.
df = df.select_dtypes(include="number")

results = perform_anomaly_analysis_with_diffusion(
    df=df,
    threshold_strategy="scs",       # "scs" (rapide) ou "macs" (adaptatif)
    model_path=None,                 # None → télécharge auto final_model.pth depuis HF
    model_config_path=None,          # None → télécharge auto curriculum_medium.yaml depuis HF
    nsample=15,                      # échantillons de diffusion par fenêtre ; ↑ précision, ↑ latence
    preprocess_model_dir=None,       # répertoire optionnel du modèle de pré-traitement
)
# colonnes de results : Anomaly (0/1), MAE (float), plus toutes les colonnes originales
print(results[["Anomaly", "MAE"]].describe())

Rapport (sdk_config)

perform_anomaly_analysis_with_diffusion accepte un mot-clé optionnel sdk_config — un ADDiffusionConfig, un chemin vers un fichier YAML, ou None pour les défauts. Il limite les paramètres de génération de rapport uniquement ; les args de comportement d'inférence (threshold_strategy, nsample, model_path, model_config_path) restent des arguments directs de la fonction.

from sdk.anomaly_analysis import ADDiffusionConfig, perform_anomaly_analysis_with_diffusion

results = perform_anomaly_analysis_with_diffusion(
    df=df,
    threshold_strategy="scs",
    sdk_config=ADDiffusionConfig(
        report_path="artifacts/anomaly_report.pdf",
        report_title="Anomaly Detection Report",
    ),
)

Ou passez un chemin YAML au lieu de la dataclass — load_sdk_config accepte un mappage plat ou imbriqué sous une clé de haut niveau sdk: (pour que le fichier puisse porter d'autres sections à côté), et rejette les clés inconnues :

sdk:
  report_path: artifacts/anomaly_report.pdf
  report_title: Anomaly Detection Report
results = perform_anomaly_analysis_with_diffusion(
    df=df,
    threshold_strategy="scs",
    sdk_config="sdk_config.yaml",
)

Champs ADDiffusionConfig : report_path (str/Path, défaut None — mettre pour activer le rapport PDF), timestamp_column (str, None), ground_truth_column (str, None), report_title (str, "Kumo-Anomaly Report"), report_max_pages (int, 10).

Référence CLI d'inférence

Argument Défaut Description
--dataset-path synthétique CSV avec colonnes de features numériques
--model-path auto-télécharge Chemin du checkpoint .pth
--config-path auto-télécharge Chemin de curriculum_medium.yaml
--download-weights — Récupère les poids depuis HF et quitte
--skip-download false Exige les poids locaux ; ignore le fetch HF

Fine-tuning

Fine-tuner sur vos propres données. Le CSV d'entraînement devrait contenir principalement du comportement normal. Validez le modèle pré-entraîné sur votre domaine avant le fine-tuning.

uv run python examples/finetune_example.py \
  --csv /path/to/normal_data.csv \
  --val-csv /path/to/val_data.csv \   # optionnel ; sinon --val-ratio divise --csv
  --pretrained-model final_model.pth \
  --epochs 20 --batch-size 16 --lr 1e-5 \
  --output-dir artifacts/finetune_my_data

Arguments de fine-tuning

Argument Défaut Description
--run-config — Fichier config JSON/YAML généré par AutoMLRunner ({config_path}). Tous les champs ci-dessous peuvent être définis ici ; les flags CLI explicites remplacent le fichier.
--csv requis CSV d'entraînement (idéalement contenant du comportement normal). Requis s'il n'est pas fourni via --run-config.
--val-csv — CSV de validation séparé
--val-ratio 0.3 Fraction de validation quand --val-csv n'est pas utilisé (division temporelle)
--timestamp-col timestamp Colonne à supprimer des features
--label-col — Colonne d'étiquette à supprimer
--drop-cols — Colonnes supplémentaires séparées par des virgules à supprimer
--pretrained-model final_model.pth Checkpoint de démarrage à chaud (auto-téléchargé s'il manque)
--config curriculum_medium.yaml YAML config du modèle
--repo-id nvidia/Kumo-Anomaly Dépôt HuggingFace pour auto-téléchargement
--no-download false Échoue si les poids pré-entraînés ne sont pas locaux
--epochs 10 Époques d'entraînement
--batch-size 16 Batch size par GPU
--lr 1e-5 Taux d'apprentissage AdamW
--weight-decay 1e-6 Décroissance de poids AdamW
--grad-clip 1.0 Clip de norme de gradient
--num-workers 0 Workers DataLoader
--seed 42 Graine aléatoire
--output-dir artifacts/finetune Répertoire de sortie
--window-length config (100) Longueur de la fenêtre glissante en pas de temps
--window-stride 1 Pas entre fenêtres consécutives
--split config (10) Segments de masque alternés par fenêtre
--mask-ratio 0.7 Fraction de chaque fenêtre masquée pendant l'entraînement
--scale-factor config (1) Multiplicateur d'échelle après normalisation min-max
--num-gpus tous disponibles Nombre de GPU pour fine-tuning DDP ; mettre 1 pour forcer single-GPU

Exécuter l'inférence avec un checkpoint fine-tuné

results = perform_anomaly_analysis_with_diffusion(
    df=df,
    threshold_strategy="scs",
    model_path="artifacts/finetune_my_data/best_finetuned_model.pth",
    model_config_path="artifacts/finetune_my_data/finetune_config.yaml",
    nsample=15,
)

AutoML (HPO : optimisation d'hyperparamètres)

Cette skill supporte AutoML pour fine-tuning HPO et labeled inference HPO via tao-skill-bank:tao-run-automl avec le skill_dir de ce modèle.

Lisez references/automl.md quand l'utilisateur demande la configuration AutoML/HPO, les paramètres ajustables, la configuration VirtualEnvSDK, le flux config, les contraintes de window-length, les scripts d'inférence trial, ou les détails de remise des résultats AutoML.

Exigences des données

Propriété Exigence
Lignes ≥ window_length (défaut 100) ; ≥ target_dim (défaut 18) pour PCA
Colonnes Doivent être numériques — l'API lève ValueError sur les colonnes non-numériques ; supprimez timestamp, IDs et étiquettes avant d'appeler
Valeurs Pas de NaN / ±Inf — remplissez avant de passer à l'API
Nombre de features > target_dim Réduction PCA à target_dim ; nécessite ≥ target_dim lignes
Nombre de features < target_dim Remplissage à zéro jusqu'à target_dim

target_dim 18 est le défaut du fichier config, non une constante dure — lors du fine-tuning avec démarrage à chaud depuis un checkpoint publié (--pretrained-model), la config intégrée du checkpoint la remplace (le final_model.pth publié a été entraîné à target_dim=40). Vérifiez la config du checkpoint plutôt que de supposer 18 quand on raisonne sur le comportement PCA/padding pour fine-tuning avec démarrage à chaud.

timestamp,sensor_1,sensor_2,sensor_3
2024-01-01 00:00:00,0.42,1.10,-0.33
...

Passez uniquement les colonnes de features numériques à l'API d'inférence — elle lève ValueError sur les colonnes non-numériques au lieu de les supprimer. Utilisez df.select_dtypes(include="number") ou supprimez par nom avant d'appeler. Le fine-tuning gère cela via les args CLI --timestamp-col, --label-col et --drop-cols.

Structure de sortie

Inférence (examples/quick_example.py) :

examples/datasets/
└── kumo-anomaly-results.csv # colonnes originales + Anomaly (0/1) + MAE

Fine-tuning (--output-dir artifacts/finetune_my_data) :

artifacts/finetune_my_data/
├── best_finetuned_model.pth     # checkpoint avec la plus faible perte de validation
├── final_finetuned_model.pth    # checkpoint de la dernière époque
├── metrics.json                 # scalaire pour AutoML : {"val_loss": <best>}
├── epoch_metrics.json           # log par époque : [{"epoch": N, "train_loss": …, "val_loss": …}]
└── finetune_config.yaml         # config utilisée pendant l'entraînement (pour reproducibilité)

Configuration du modèle (curriculum_medium.yaml)

Champ Défaut Description
model.target_dim 18 Dimension de feature interne ; les données sont PCA'd/paddées à cela
dataset.window_length 100 Taille de la fenêtre glissante en pas de temps
dataset.split 10 Segments de masque alternés par fenêtre
dataset.scale_factor 1 Multiplicateur d'échelle après normalisation min-max
diffusion.num_steps 500 Étapes de diffusion complètes (remplacées par DPM-Solver)
diffusion.channels 128 Dimension cachée du modèle
diffusion.layers 6 Couches d'encodeur Transformer

Matériel

Tier Configuration Notes
Minimum 1× CPU Fonctionnel ; DPM-Solver réduit les étapes 500 → 20
Recommandé 1× GPU NVIDIA (≥8 GB VRAM) Fortement recommandé pour le fine-tuning
Inférence multi-GPU 2–8× GPUs NVIDIA auto-distribuées par perform_anomaly_analysis_with_diffusion
Fine-tuning multi-GPU 2+× GPUs NVIDIA DDP automatique via --num-gpus (par défaut tous les GPU visibles)

Pièges connus

Symptôme Cause Correction
HfHubHTTPError: 401 Dépôt restreint ou token manquant export HUGGINGFACE_HUB_TOKEN="hf_..." ou huggingface-cli login
504 / timeout au premier téléchargement de poids HF CDN limite les requêtes non authentifiées — les dépôts publics y sont toujours soumis au premier téléchargement Défini export HUGGINGFACE_HUB_TOKEN="$HF_TOKEN" avant d'exécuter ; les requêtes authentifiées utilisent un chemin CDN plus fiable
ValueError: No numeric columns Toutes les colonnes sont des chaînes/dates Supprimez les colonnes non-numériques avant d'appeler l'API
ValueError: PCA needs at least target_dim rows Moins de lignes que target_dim (18) Fournissez une série temporelle plus longue
ValueError: Need at least N rows (finetune) Split plus court que window_length Assurez-vous que chaque split train/val a ≥ 100 lignes
RuntimeError: CUDA out of memory Batch trop grand Réduisez --batch-size ou nsample
Tous les scores MAE identiques Colonnes à valeur constante Supprimez les colonnes à variance zéro avant d'appeler l'API
ModuleNotFoundError: sdk Mauvais répertoire de travail cd Kumo-Anomaly/ avant uv run, ou ajoutez-le à sys.path
Inférence lente sur CPU Nombreuses fenêtres de diffusion Réduisez nsample à 5–10 pour les smoke tests

Skills similaires