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 :
Kumo-Anomaly/README.md— référence SDK complète, architecture du modèle et documentation APIKumo-Anomaly/examples/datasets/README.md— format des données, génération de données synthétiques et conventions CSV
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 |