Kumo-Forecast
Forecasting de séries temporelles multivariées basé sur Transformer utilisant du préentraînement autosupervisé sur des données temporelles diverses. Trois modes d'inférence : standard (prédiction directe), DARR (récupération kNN améliorée par contexte avec fusion), et interpretability (extraction de trajectoire latente, flux sémantique, attribution lag×horizon, stabilité de trajectoire et ratios diagnostiques — bundle d'explication complet avec rapport PDF). Le fine-tuning adapte la tête de prédiction — et optionnellement la couche cross-channel — à votre domaine.
Code source : https://github.com/NVIDIA/Kumo-TS Poids préentraînés : https://huggingface.co/nvidia/Kumo-Forecast
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é, heatmap PNG, graphiques de flux et stabilité | uv add matplotlib |
Identifiants
nvidia/Kumo-Forecast est un repo public — aucun token requis pour télécharger les poids.
Si vous recevez une erreur 401/403 (accès restreint ou licence non acceptée) ou 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-Forecast
uv sync --group dev
uv pip install -e . # installation modifiable — requise pour les imports sdk.* propres
# Inférence standard (télécharge automatiquement les poids depuis HF au premier lancement, aucune auth nécessaire)
uv run python sdk/quick_example.py
Inférence
Importez et appelez perform_forecasting depuis sdk/forecasting.py. Il télécharge automatiquement les poids,
normalise l'entrée, exécute un déroulement autorégressif pour les horizons longs, et retourne un DataFrame
avec les lignes {target_column}_forecast pour l'horizon demandé.
import sys, pandas as pd
sys.path.append("/path/to/Kumo-TS/Kumo-Forecast") # clonez Kumo-TS avec --branch main
from sdk.forecasting import ForecastingConfig, perform_forecasting
df = pd.read_csv("your_data.csv") # doit avoir timestamp + colonne cible numérique
config = ForecastingConfig(
timestamp_column="timestamp", # colonne datetime analysable
target_column="target", # cible principale à prédir
seq_len=512, # longueur du contexte d'entrée (lignes consommées)
forecast_horizon=72, # pas à prédire en avant (max 512)
model_horizon=72, # horizon natif du modèle ; change 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 table Checkpoints
)
results = perform_forecasting(df=df, config=config)
# Retourne DataFrame : timestamp | {target_column}_forecast (forecast_horizon lignes)
print(results.head())
Pour une inférence régulière, placez les arguments de forecasting dans YAML et passez le fichier comme
config. Commencez par le modèle entièrement commenté
dans sdk/forecasting_inference_config.yaml.
inference:
# Nombre de lignes historiques consommées pour la fenêtre de contexte d'entrée.
seq_len: 512
# Nombre de lignes futures à prédire.
forecast_horizon: 72
# Horizon natif utilisé lors du training du checkpoint.
model_horizon: 72
# Active l'attention cross-channel pour le forecasting multivarié.
use_cross_channel: true
results = perform_forecasting(df=df, config="sdk/forecasting_inference_config.yaml")
Le YAML peut être plat ou utiliser une section inference: au niveau supérieur dans une spec TAO/AutoML plus large.
Les clés inconnues lèvent une ValueError.
Checkpoints
| Fichier | Mode | Téléchargé quand |
|---|---|---|
run8_best_model_cr.pt |
Défaut (cross-channel activé) | use_cross_channel=True (défaut) |
moment_head_512_6hr.pt |
Standard (sans cross-channel) | use_cross_channel=False |
standardizer.pkl |
Les deux | Toujours |
Définissez use_cross_channel=False dans ForecastingConfig ou YAML pour utiliser le checkpoint standard :
results = perform_forecasting(df=df, config=ForecastingConfig(use_cross_channel=False))
Mode DARR (forecasting amélioré 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") # nécessite ≥ seq_len + model_horizon lignes
config = ForecastingConfig(
forecast_horizon=72,
alpha=0.2, # 0,2 = 20% direct, 80% kNN (défaut : 0,01)
k=64, # nombre de voisins les plus proches
temperature=0.05, # température softmax kNN
)
results = perform_forecasting(df=df, config=config, context_df=context_df)
Les datasets contexte et entrée n'ont pas besoin de colonnes identiques — le SDK s'aligne sur les features 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 Model-Agnostic Interpretability Framework. Il produit des explications localisées, spécifiques à l'horizon, conscientes du temps — incluant l'attribution lag×horizon, le flux sémantique, la stabilité de trajectoire, les ratios diagnostiques, et (pour les entrées multivariées) l'attribution et l'analyse de couplage par canal.
Pour la référence complète des paramètres, le bundle de sortie et les descriptions de composants, consultez
Kumo-Forecast/README.md.
Fine-tuning
Fine-tunez la tête de prédiction (encodeur/embedder gelés par défaut) sur vos propres séries temporelles.
--ckpt-init auto démarre à chaud depuis le checkpoint Kumo-Forecast publié ; --ckpt-init none
entraîne une tête fraîche à partir du backbone de base.
cd /path/to/Kumo-TS/Kumo-Forecast
# 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 de fine-tuning
| Argument | Défaut | Description |
|---|---|---|
--run-config |
— | Config YAML depuis AutoMLRunner ({config_path}). Les flags CLI remplacent les valeurs du fichier. |
--csv |
**requis*** | Un seul CSV divisé temporellement en train/val |
--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 features |
--target-cols |
toutes numériques | Colonnes séparées par des virgules à prédire |
--model-name |
AutonLab/MOMENT-1-large |
Identifiant du modèle backbone |
--ckpt-init |
auto |
auto = poids Kumo-Forecast publiés ; none = tête fraîche ; ou chemin vers .pt |
--standardizer-init |
standardizer.pkl |
Pickle Standardizer utilisé quand --ckpt-init auto |
--repo-id |
nvidia/Kumo-Forecast |
Repo HuggingFace pour téléchargement auto |
--seq-len |
512 |
Longueur du contexte d'entrée |
--forecast-horizon |
72 |
Pas à prédire en avant |
--stride |
forecast_horizon |
Stride de fenêtre glissante (None → horizon) |
--val-ratio |
0.1 |
Fraction de validation quand --csv est utilisé |
--test-ratio |
0.0 |
Fraction de test retendue quand --csv est utilisé |
--no-standardize |
false | Désactive la normalisation par dataset |
--epochs |
5 |
Epochs d'entraînement |
--batch-size |
8 |
Batch size par GPU |
--lr |
1e-4 |
Taux d'apprentissage AdamW (scheduler OneCycleLR) |
--weight-decay |
0.0 |
Décroissance de poids AdamW |
--head-dropout |
0.1 |
Dropout de la tête de prédiction |
--max-norm |
5.0 |
Clip de norme de gradient |
--num-workers |
0 |
Workers DataLoader |
--seed |
13 |
Graine aléatoire |
--output-dir |
artifacts/finetune |
Répertoire de sortie |
--local-files-only |
false | Ne pas télécharger les poids backbone depuis HuggingFace |
--unfreeze-encoder |
false | Entraîne aussi l'encodeur transformer |
--unfreeze-embedder |
false | Entraîne aussi l'embedder de patch |
--use-cross-channel |
false | Ajoute couche d'attention cross-channel |
--cross-channel-heads |
8 |
Heads 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 le fine-tuning DDP ; définissez 1 pour forcer single-GPU |
*L'un de --csv ou --train-csv est requis.
Inférence avec checkpoint fine-tuné
config = ForecastingConfig(
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éfinissez True si entraîné avec --use-cross-channel
)
results = perform_forecasting(df=df, config=config)
Exigences de données
| Propriété | Exigence |
|---|---|
| Lignes | ≥ seq_len (défaut 512) pour inférence ; le split de validation doit aussi avoir ≥ seq_len + forecast_horizon lignes |
| Colonnes | timestamp + une ou plusieurs colonnes numériques ; NULLs remplis de zéros automatiquement |
| Timestamp | Analysable par pandas ; pas de NULLs ; fréquence uniforme déduite du mode des diffs |
| Cible | Doit être numérique ; NULLs remplis de zéros |
forecast_horizon |
Max 512 pas ; au-delà de l'horizon natif de 72 déclenche un 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)
Fine-tuning (--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 args
├── metrics.json # résumé scalaire : {"val_mse": float, "val_mae": float} — consommé par 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× GPU NVIDIA (≥8 GB VRAM) | Fortement recommandé pour le fine-tuning |
| Apple Silicon | MPS | Détection automatique ; équivalent au CPU pour cette charge |
| Fine-tuning multi-GPU | 2+× GPUs NVIDIA | DDP auto via --num-gpus (défaut à tous les GPUs visibles) |
AutoML (HPO : optimisation des hyperparamètres)
Cette skill est activée AutoML pour le fine-tuning et l'inférence DARR. Quand une requête HPO arrive, routez-la via tao-skill-bank:tao-run-automl avec le skill_dir de ce modèle.
Consultez references/automl.md quand l'utilisateur demande une config AutoML/HPO, des paramètres tuables, des exemples de runner, des scripts d'inférence de trial, HPO DARR, ou des détails de remise de résultats AutoML.
Pièges connus
| Symptôme | Cause | Solution |
|---|---|---|
ModuleNotFoundError: backbone |
Installation modifiable manquante | Lancez uv pip install -e . depuis Kumo-Forecast/ |
HfHubHTTPError: 401 / 403 |
Licence de modèle non acceptée ou fork restreint | Acceptez la licence sur la page du repo HF ; ou huggingface-cli login |
504 / timeout au premier téléchargement de poids |
HF CDN limite les requêtes non authentifiées — les repos publics y sont sujets au premier téléchargement | Définissez export HUGGINGFACE_HUB_TOKEN="$HF_TOKEN" avant l'exécution ; 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 appels perform_forecasting multiples |
ValueError: No common numeric columns (DARR) |
Contexte sans features chevauchantes | 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 | Contexte nécessite ≥ 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 stale mentionnant package backbone |
Ancien fichier lock | uv cache clean && uv sync --group dev |