NV-Tesseract AD Diffusion
Détection d'anomalies basée sur la diffusion et fine-tuning pour séries temporelles multivariées. Le modèle reconstruit des segments masqués aléatoirement et évalue chaque pas de temps par l'erreur absolue moyenne (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/NV-Tesseract Poids pré-entraînés : https://huggingface.co/nvidia/nv-tesseract-ad-diffusion
Pour les informations d'utilisation les plus à jour, consultez les fichiers README du dépôt NV-Tesseract :
ad_diffusion/README.md— référence SDK complète, architecture du modèle et documentation APIad_diffusion/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 d'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/nv-tesseract-ad-diffusion est un dépôt public — aucun token requis pour télécharger les poids. Si vous rencontrez une erreur 401/403 (accès restreint ou fork privé) ou une 504 lors du premier téléchargement, consultez la section Pièges connus.
Démarrage rapide
git clone --branch main --single-branch https://github.com/NVIDIA/NV-Tesseract
cd NV-Tesseract/ad_diffusion
uv sync # installer les dépendances (une seule fois)
# Inférence — données synthétiques, télécharge automatiquement les poids de HF à la première exécution
uv run python examples/quick_example.py
# Inférence — vos propres données 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 les poids uniquement (réchauffer le cache avant d'aller 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, distribue automatiquement sur tous les GPUs 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/NV-Tesseract/ad_diffusion") # cloner NV-Tesseract 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 pour les colonnes non numériques — supprimer 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 automatiquement final_model.pth depuis HF
config_path=None, # None → télécharge automatiquement 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())
Référence CLI pour l'inférence
| Argument | Par défaut | Description |
|---|---|---|
--dataset-path |
synthétique | CSV avec colonnes de caractéristiques numériques |
--model-path |
téléchargement automatique | Chemin du checkpoint .pth |
--config-path |
téléchargement automatique | Chemin de curriculum_medium.yaml |
--download-weights |
— | Récupérer les poids depuis HF et quitter |
--skip-download |
false | Exiger les poids locaux ; ignorer la récupération HF |
Fine-tuning
Fine-tuner sur vos propres données. Le CSV d'entraînement devrait contenir principalement un 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 du fine-tuning
| Argument | Par défaut | Description |
|---|---|---|
--run-config |
— | Fichier config JSON/YAML généré par AutoMLRunner ({config_path}). Tous les champs ci-dessous peuvent y être définis ; les flags CLI explicites l'emportent sur le fichier. |
--csv |
requis | CSV d'entraînement (idéalement contenant un 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é (split temporel) |
--timestamp-col |
timestamp |
Colonne à supprimer des caractéristiques |
--label-col |
— | Colonne d'étiquette à supprimer |
--drop-cols |
— | Colonnes supplémentaires à supprimer (séparées par des virgules) |
--pretrained-model |
final_model.pth |
Checkpoint pour warm-start (téléchargement automatique s'il manque) |
--config |
curriculum_medium.yaml |
YAML de config du modèle |
--repo-id |
nvidia/nv-tesseract-ad-diffusion |
Dépôt HuggingFace pour le téléchargement automatique |
--no-download |
false | Échouer si les poids pré-entraînés ne sont pas locaux |
--epochs |
10 |
Epochs d'entraînement |
--batch-size |
16 |
Taille de batch par GPU |
--lr |
1e-5 |
Taux d'apprentissage AdamW |
--weight-decay |
1e-6 |
Décroissance de poids AdamW |
--grad-clip |
1.0 |
Clipping de norme du 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 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 durant l'entraînement |
--scale-factor |
config (1) | Multiplicateur d'échelle après normalisation min-max |
--num-gpus |
tous disponibles | Nombre de GPUs pour fine-tuning DDP ; défini à 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",
config_path="artifacts/finetune_my_data/finetune_config.yaml",
nsample=15,
)
AutoML (HPO : optimisation des hyperparamètres)
Cette skill supporte AutoML pour HPO de fine-tuning et HPO d'inférence avec étiquettes 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 réglables, la configuration VirtualEnvSDK, le flux config, les contraintes de window-length, les scripts de test d'inférence ou les détails de remise des résultats AutoML.
Exigences des données
| Propriété | Exigence |
|---|---|
| Lignes | ≥ window_length (par défaut 100) ; ≥ target_dim (par défaut 18) pour PCA |
| Colonnes | Doivent être numériques — l'API lève ValueError pour les colonnes non numériques ; supprimer timestamp, les IDs et les étiquettes avant d'appeler |
| Valeurs | Pas de NaN / ±Inf — remplir avant de passer à l'API |
Nombre de caractéristiques > target_dim |
Réduction PCA à target_dim ; nécessite ≥ target_dim lignes |
Nombre de caractéristiques < target_dim |
Complété par des zéros jusqu'à target_dim |
timestamp,sensor_1,sensor_2,sensor_3
2024-01-01 00:00:00,0.42,1.10,-0.33
...
Passer uniquement les colonnes de caractéristiques numériques à l'API d'inférence — elle lève ValueError pour les colonnes non numériques au lieu de les supprimer. Utiliser df.select_dtypes(include="number") ou supprimer 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/
└── 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 perte de validation la plus faible
├── final_finetuned_model.pth # checkpoint du dernier epoch
├── metrics.json # scalaire pour AutoML : {"val_loss": <best>}
├── epoch_metrics.json # log par epoch : [{"epoch": N, "train_loss": …, "val_loss": …}]
└── finetune_config.yaml # config utilisée durant l'entraînement (pour la reproductibilité)
Configuration du modèle (curriculum_medium.yaml)
| Champ | Par défaut | Description |
|---|---|---|
model.target_dim |
18 |
Dimension interne des caractéristiques ; les données sont PCA'd/complétées à ceci |
dataset.window_length |
100 |
Taille de 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
| Niveau | 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 | distribué automatiquement par perform_anomaly_analysis_with_diffusion |
| Fine-tuning multi-GPU | 2+× GPUs NVIDIA | DDP automatique via --num-gpus (par défaut tous les GPUs 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 lors du premier téléchargement de poids |
Le CDN HF ralentit les requêtes non authentifiées — les dépôts publics y sont toujours assujettis au premier téléchargement | Définir 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 | Supprimer 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) |
Fournir une série temporelle plus longue |
ValueError: Need at least N rows (finetune) |
Split plus court que window_length |
S'assurer que chaque split train/val a ≥ 100 lignes |
RuntimeError: CUDA out of memory |
Batch trop volumineux | Réduire --batch-size ou nsample |
| Tous les scores MAE identiques | Colonnes à valeur constante | Supprimer les colonnes à variance zéro avant d'appeler l'API |
ModuleNotFoundError: sdk |
Mauvais répertoire de travail | cd ad_diffusion/ avant uv run, ou l'ajouter à sys.path |
| Inférence lente sur CPU | Nombreuses fenêtres de diffusion | Réduire nsample à 5–10 pour les tests rapides |