Prévision NV-Tesseract
Prévision multivariée de séries temporelles basée sur Transformer utilisant un préentraînement autosupervisé sur des données temporelles diversifiées. Trois modes d'inférence : standard (prévision directe), DARR (fusion kNN améliorée par contexte), et interprétabilité (extraction de trajectoire latente, flux sémantique, attribution lag×horizon, stabilité de trajectoire et ratios de diagnostic — bundle d'explication complet avec rapport PDF). L'ajustement affine l'en-tête de prévision — et optionnellement la couche cross-channel — à votre domaine.
Code source : https://github.com/NVIDIA/NV-Tesseract Poids préentraînés : https://huggingface.co/nvidia/nv-tesseract-forecasting
Dépendances externes
| Dépendance | Objectif | Installation |
|---|---|---|
| Python 3.10+ | Runtime | https://www.python.org/downloads/ |
| uv | Gestionnaire de paquets + environnement | pip install uv |
| CUDA toolkit (optionnel) | Accélération GPU | https://developer.nvidia.com/cuda-downloads |
| matplotlib (optionnel) | Rapport PDF d'interprétabilité, PNG heatmap, graphiques flux + stabilité | uv add matplotlib |
Identifiants
nvidia/nv-tesseract-forecasting est un repo public — aucun token requis pour télécharger les poids.
Si vous rencontrez une erreur 401/403 (accès verrouillé ou licence non acceptée) ou 504 au premier téléchargement, voir la section Pièges connus.
Démarrage rapide
git clone --branch main --single-branch https://github.com/NVIDIA/NV-Tesseract
cd NV-Tesseract/forecasting
uv sync --group dev
uv pip install -e . # installation éditable — requise pour les imports sdk.* propres
# Inférence standard (télécharge automatiquement les poids depuis HF au premier lancement, aucune auth requise)
uv run python sdk/quick_example.py
Inférence
Importez et appelez perform_forecasting depuis sdk/forecasting.py. Elle télécharge automatiquement les poids,
standardise l'entrée, lance un déroulement autorégressif pour les longs horizons, et retourne un DataFrame
avec des lignes {target_column}_forecast pour l'horizon demandé.
import sys, pandas as pd
sys.path.append("/path/to/NV-Tesseract/forecasting") # clonez NV-Tesseract avec --branch main
from sdk.forecasting import perform_forecasting
df = pd.read_csv("your_data.csv") # doit avoir une colonne timestamp + colonne numérique cible
results = perform_forecasting(
df=df,
timestamp_column="timestamp", # colonne datetime analysable
target_column="target", # cible primaire à prévoir
seq_len=512, # longueur du contexte d'entrée (lignes consommées)
forecast_horizon=72, # pas en avant à prédire (max 512)
model_horizon=72, # horizon natif du modèle ; changer avec des poids personnalisés
standardizer_pkl="standardizer.pkl", # téléchargé automatiquement depuis HF s'il manque
ckpt="run8_best_model_cr.pt", # téléchargé automatiquement ; voir tableau Checkpoints
)
# Retourne DataFrame : timestamp | {target_column}_forecast (forecast_horizon lignes)
print(results.head())
Checkpoints
| Fichier | Mode | Téléchargé quand |
|---|---|---|
run8_best_model_cr.pt |
Par défaut (cross-channel activé) | use_cross_channel=True (défaut) |
moment_head_512_6hr.pt |
Standard (pas de cross-channel) | use_cross_channel=False |
standardizer.pkl |
Les deux | Toujours |
Passez use_cross_channel=False pour utiliser le checkpoint standard :
results = perform_forecasting(df=df, use_cross_channel=False, ...)
Mode DARR (prévision améliorée par contexte)
Fournissez context_df pour activer DARR : le SDK construit une mémoire kNN à partir de fenêtres historiques et
fusionne les prédictions directes avec les voisins récupérés (alpha * direct + (1 - alpha) * kNN).
context_df = pd.read_csv("historical_data.csv") # besoin de ≥ seq_len + model_horizon lignes
results = perform_forecasting(
df=df,
context_df=context_df, # active DARR
forecast_horizon=72,
alpha=0.2, # 0,2 = 20% direct, 80% kNN (défaut : 0,01)
k=64, # nombre de plus proches voisins
temperature=0.05, # température softmax kNN
)
Les datasets de contexte et d'entrée n'ont pas besoin de colonnes identiques — le SDK s'aligne sur les caractéristiques communes
et avertit quand les colonnes diffèrent. Les deux doivent partager timestamp_column et target_column.
Interprétabilité
Définissez interpretability=True pour activer le Framework d'Interprétabilité Agnostique au Modèle. Il produit des explications localisées, spécifiques à l'horizon et conscientes du temps — incluant l'attribution lag×horizon, le flux sémantique, la stabilité de trajectoire, les ratios de diagnostic, et (pour les entrées multivariées) l'attribution axe-canal et l'analyse de couplage.
Pour la référence complète des paramètres, le bundle de sortie et les descriptions des composants, voir
forecasting/README.md.
Ajustement affine
Affinez l'en-tête de prévision (encodeur/embedder gelé par défaut) sur vos propres séries temporelles.
--ckpt-init auto lance le démarrage à chaud depuis le checkpoint NV-Tesseract publié ; --ckpt-init none
entraîne un nouvel en-tête depuis le backbone de base.
cd /path/to/NV-Tesseract/forecasting
# Sans cross-channel (utilise moment_head_512_6hr.pt)
uv run python examples/finetune_example.py \
--csv /path/to/timeseries.csv \
--timestamp-col timestamp \
--target-cols target \
--seq-len 512 --forecast-horizon 72 \
--epochs 5 --batch-size 8 --lr 1e-4 \
--output-dir artifacts/finetune_my_data
# Avec couche cross-channel (utilise run8_best_model_cr.pt)
uv run python examples/finetune_example.py \
--csv /path/to/timeseries.csv \
--timestamp-col timestamp \
--target-cols sensor_1,sensor_2,sensor_3 \
--use-cross-channel --cross-channel-heads 8 \
--epochs 5 \
--output-dir artifacts/finetune_cross_channel
Arguments d'ajustement affine
| Argument | Défaut | Description |
|---|---|---|
--run-config |
— | Config YAML depuis AutoMLRunner ({config_path}). Les drapeaux CLI remplacent les valeurs du fichier. |
--csv |
**requis*** | CSV unique divisé temporellement en entraînement/validation |
--train-csv |
**requis*** | CSV d'entraînement (mutuellement exclusif avec --csv) |
--val-csv |
— | CSV de validation quand --train-csv est utilisé |
--timestamp-col |
timestamp |
Colonne datetime à exclure des caractéristiques |
--target-cols |
toutes numériques | Colonnes séparées par des virgules à prévoir |
--model-name |
AutonLab/MOMENT-1-large |
Identifiant du modèle backbone |
--ckpt-init |
auto |
auto = poids NV-Tesseract publiés ; none = nouvel en-tête ; ou chemin vers .pt |
--standardizer-init |
standardizer.pkl |
Pickle standardizer utilisé quand --ckpt-init auto |
--repo-id |
nvidia/nv-tesseract-forecasting |
Repo HuggingFace pour téléchargement automatique |
--seq-len |
512 |
Longueur du contexte d'entrée |
--forecast-horizon |
72 |
Pas en avant à prédire |
--stride |
forecast_horizon |
Pas de fenêtre glissante (None → horizon) |
--val-ratio |
0.1 |
Fraction de validation quand --csv est utilisé |
--test-ratio |
0.0 |
Fraction de rétention de test quand --csv est utilisé |
--no-standardize |
faux | Désactiver la standardisation par dataset |
--epochs |
5 |
Epochs d'entraînement |
--batch-size |
8 |
Taille batch par GPU |
--lr |
1e-4 |
Taux d'apprentissage AdamW (planificateur OneCycleLR) |
--weight-decay |
0.0 |
Décroissance de poids AdamW |
--head-dropout |
0.1 |
Dropout de l'en-tête de prévision |
--max-norm |
5.0 |
Écrêtage de la norme de gradient |
--num-workers |
0 |
Workers du DataLoader |
--seed |
13 |
Graine aléatoire |
--output-dir |
artifacts/finetune |
Répertoire de sortie |
--local-files-only |
faux | Ne pas télécharger les poids du backbone depuis HuggingFace |
--unfreeze-encoder |
faux | Entraîner aussi l'encodeur transformer |
--unfreeze-embedder |
faux | Entraîner aussi l'embedder de patch |
--use-cross-channel |
faux | Ajouter une couche d'attention cross-channel |
--cross-channel-heads |
8 |
Têtes d'attention dans la couche cross-channel |
--cross-channel-dropout |
0.1 |
Dropout dans la couche cross-channel |
--num-gpus |
tous disponibles | Nombre de GPUs pour l'ajustement affine DDP ; définir 1 pour forcer single-GPU |
*L'un de --csv ou --train-csv est requis.
Inférence avec checkpoint ajusté affin
results = perform_forecasting(
df=df,
timestamp_column="timestamp",
target_column="target",
seq_len=512,
forecast_horizon=72,
model_horizon=72,
standardizer_pkl="artifacts/finetune_my_data/standardizer.pkl",
ckpt="artifacts/finetune_my_data/best_model.pt",
use_cross_channel=False, # définir True si entraîné avec --use-cross-channel
)
Exigences de données
| Propriété | Exigence |
|---|---|
| Lignes | ≥ seq_len (défaut 512) pour l'inférence ; la division de validation doit aussi avoir ≥ seq_len + forecast_horizon lignes |
| Colonnes | timestamp + une ou plusieurs colonnes numériques ; NULLs remplies de zéros automatiquement |
| Timestamp | Analysable par pandas ; pas de NULLs ; fréquence uniforme déduite du mode des différences |
| Cible | Doit être numérique ; NULLs remplies de zéros |
forecast_horizon |
Max 512 pas ; au-delà du 72 natif du modèle déclenche le déroulement autorégressif |
| Contexte DARR | ≥ seq_len + model_horizon lignes ; doit partager colonnes timestamp + target avec l'entrée |
Structure de sortie
Inférence (standard / DARR) :
DataFrame : timestamp | {target_column}_forecast (forecast_horizon lignes)
Ajustement affine (--output-dir artifacts/finetune_my_data) :
artifacts/finetune_my_data/
├── best_model.pt # checkpoint avec MSE de validation le plus bas
├── standardizer.pkl # statistiques de normalisation pour ce dataset
├── finetune_metadata.json # config du modèle, canaux, meilleur epoch, tous les arguments
├── metrics.json # résumé scalaire : {"val_mse": float, "val_mae": float} — consommé par le runner AutoML
└── epoch_metrics.json # liste par epoch : [{epoch, train_mse, val_mse, val_mae}, ...]
Matériel
| Tier | Configuration | Notes |
|---|---|---|
| Minimum | 1× CPU | Fonctionnel ; lent pour les longs horizons |
| Recommandé | 1× NVIDIA GPU (≥8 GB VRAM) | Fortement recommandé pour l'ajustement affine |
| Apple Silicon | MPS | Détecté automatiquement ; équivalent au CPU pour cette charge |
| Ajustement affine multi-GPU | 2+× NVIDIA GPUs | DDP automatique via --num-gpus (défaut à tous les GPUs visibles) |
AutoML (HPO : optimisation des hyperparamètres)
Cette skill est activée pour AutoML pour l'ajustement affine et l'inférence DARR. Quand une demande HPO arrive, routez-la 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, les exemples de runner, les scripts d'inférence de trial, HPO DARR, ou les détails de remise des résultats AutoML.
Pièges connus
| Symptôme | Cause | Correction |
|---|---|---|
ModuleNotFoundError: backbone |
Installation éditable manquante | Exécutez uv pip install -e . depuis forecasting/ |
HfHubHTTPError: 401 / 403 |
Licence du modèle non acceptée ou fork verrouillé | Acceptez la licence sur la page du repo HF ; ou huggingface-cli login |
504 / timeout au premier téléchargement de poids |
Le CDN HF limite les requêtes non authentifiées — les repos publics y sont toujours soumis au premier téléchargement | Définissez export HUGGINGFACE_HUB_TOKEN="$HF_TOKEN" avant d'exécuter ; les requêtes authentifiées utilisent un chemin CDN plus fiable |
ValueError: DataFrame has X rows but seq_len requires Y |
Entrée trop courte | Fournissez ≥ seq_len (512) lignes ou réduisez --seq-len |
ValueError: forecast_horizon must be <= 512 |
Horizon trop grand | Divisez en plusieurs appels perform_forecasting |
ValueError: No common numeric columns (DARR) |
Le contexte n'a aucune caractéristique chevauchante | Assurez-vous que le contexte partage ≥ 1 colonne numérique avec l'entrée |
ValueError: Context DataFrame has X rows but requires Y |
Contexte trop petit | Le contexte a besoin de ≥ seq_len + model_horizon lignes |
Interpretability PDF skipped: matplotlib not installed |
Dépendance optionnelle manquante | uv add matplotlib ou utilisez interpretability_output="json" |
ValueError: No training windows (finetune) |
Données trop courtes pour les fenêtres | Réduisez --seq-len / --forecast-horizon, ou augmentez la taille du dataset |
Erreurs d'environnement obsolète mentionnant le paquet backbone |
Ancien fichier lock | uv cache clean && uv sync --group dev |