Trackio documentation
Schéma de stockage et requêtes directes
Schéma de stockage et requêtes directes
Trackio stocke chaque projet dans sa propre base de données SQLite et peut exporter ces données au format parquet pour la synchronisation, les Spaces statiques et l’analyse directe. Cette page documente le schéma SQLite en direct, la structure parquet dérivée et la nouvelle commande trackio query pour exécuter des requêtes SQL en lecture seule.
Où se trouvent les données
- Les bases de données de projets locaux sont stockées dans
TRACKIO_DIR, dont la valeur par défaut est~/.cache/huggingface/trackio. - Chaque projet est stocké dans un fichier SQLite distinct :
{project}.db. - Les médias et les fichiers téléversés se trouvent sous
TRACKIO_DIR/media/. - Each trace is additionally written as a Hub-renderable agent session file under
TRACKIO_DIR/traces/(on a Space, the bucket’straces/prefix). These are a rendering artifact for the Hub’s agent trace viewer; thetracestable stays authoritative. See Traces. - Lors de la synchronisation avec Hugging Face, Trackio exporte les fichiers parquet depuis la base de données SQLite avant le téléversement.
Interroger les données directement
Utilisez l’interface en ligne de commande (CLI) lorsque vous avez besoin d’une requête générique non couverte par trackio list ou trackio get :
trackio query project --project "my-project" --sql "SELECT run_name, MAX(step) AS last_step FROM metrics GROUP BY run_name ORDER BY last_step DESC"Ajoutez --json pour une sortie lisible par machine :
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name" --jsonLa même commande fonctionne sur un Space distant :
trackio query project --project "my-project" --sql "SELECT COUNT(*) AS num_alerts FROM alerts" --space username/my-space --jsontrackio query n’accepte que des requêtes en lecture seule SELECT, WITH et des requêtes PRAGMA de schéma sûres, y compris la lecture de PRAGMA user_version.
Schéma SQLite
Le schéma en direct est défini dans trackio/sqlite_storage.py par SQLiteStorage.init_db().
métriques
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
timestamp | TEXT | Horodatage ISO |
run_name | TEXT | Identifiant d'exécution |
step | INTEGER | Étape d'entraînement |
metrics | TEXT | Blob JSON contenant les valeurs de métriques enregistrées |
log_id | TEXT | Clé de déduplication facultative ajoutée par la migration additive |
space_id | TEXT | Marqueur de synchronisation en attente facultatif ajouté par la migration additive |
Index :
idx_metrics_run_stepsur(run_name, step)idx_metrics_run_timestampsur(run_name, timestamp)idx_metrics_log_idindex partiel unique surlog_id- Index partiel
idx_metrics_pendingsurspace_id
configs
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
run_name | TEXT | Identifiant d'exécution |
config | TEXT | Blob JSON contenant la configuration d'exécution |
created_at | TEXT | Horodatage ISO |
Index et contraintes :
UNIQUE(run_name)idx_configs_run_namesur(run_name)
system_metrics
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
timestamp | TEXT | Horodatage ISO |
run_name | TEXT | Identifiant d'exécution |
metrics | TEXT | Blob JSON contenant les métriques système |
log_id | TEXT | Clé de déduplication facultative ajoutée par la migration additive |
space_id | TEXT | Marqueur de synchronisation en attente facultatif ajouté par la migration additive |
Index :
idx_system_metrics_run_timestampsur(run_name, timestamp)idx_system_metrics_log_idindex partiel unique surlog_id- Index partiel
idx_system_metrics_pendingsurspace_id
traces
| Colonne | Type | Notes |
|---|---|---|
id | TEXT | Clé primaire |
run_id | TEXT | Identifiant d'exécution stable |
timestamp | TEXT | Horodatage ISO au moment où la trace a été journalisée |
run_name | TEXT | Nom d’affichage de l’exécution |
step | INTEGER | Étape d'entraînement ou d'enregistrement |
key | TEXT | Clé utilisée dans la charge utile de trackio.log() |
trace_index | INTEGER | Position lorsque les traces ont été enregistrées sous forme de liste |
messages | TEXT | Messages au format JSON OpenAI |
metadata | TEXT | Métadonnées de trace JSON |
search_text | TEXT | Texte aplati utilisé par la recherche de trace |
log_id | TEXT | Clé de déduplication facultative du journal source |
space_id | TEXT | Marqueur de synchronisation en attente facultatif |
spans | TEXT | Spans d'exécution JSON ; par défaut [] |
Index :
idx_traces_run_stepsur(run_id, step)idx_traces_run_timestampsur(run_id, timestamp)idx_traces_searchsursearch_text
project_metadata
| Colonne | Type | Notes |
|---|---|---|
key | TEXT | Clé primaire |
value | TEXT | Valeur de métadonnées |
pending_uploads
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
space_id | TEXT | Espace de destination |
run_name | TEXT | Nom d'exécution facultatif |
step | INTEGER | Étape facultative |
file_path | TEXT | Chemin local absolu |
relative_path | TEXT | Chemin d'accès relatif au média |
created_at | TEXT | Horodatage ISO |
alertes
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
timestamp | TEXT | Horodatage ISO |
run_name | TEXT | Identifiant d'exécution |
title | TEXT | Titre de l'alerte |
text | TEXT | Corps de l'alerte facultatif |
level | TEXT | info, warn ou error |
step | INTEGER | Étape de formation facultative |
alert_id | TEXT | Clé de déduplication facultative |
Index :
idx_alerts_runsur(run_name)idx_alerts_timestampsur(timestamp)idx_alerts_alert_idindex partiel unique suralert_id
artefacts
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
name | TEXT | Nom de l'artefact |
type | TEXT | Catégorie libre telle que model ou dataset |
description | TEXT | Description facultative |
created_at | TEXT | Horodatage ISO |
Index et contraintes :
UNIQUE(name)
artifact_versions
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
artifact_id | INTEGER | Références artifacts.id |
version | INTEGER | Numéro de version séquentiel commençant à 0 |
manifest_digest | TEXT | Digest hex SHA-256 du manifeste JSON canonique |
manifest | TEXT | Blob JSON répertoriant les entrées du manifeste avec path, digest, size et ref facultatif |
metadata | TEXT | Métadonnées JSON facultatives |
size_bytes | INTEGER | Taille totale des entrées du manifeste de la version (somme de size) en octets |
producer_run_id | TEXT | Identifiant facultatif de l'exécution d'origine |
producer_run_name | TEXT | Nom facultatif de l'exécution d'origine |
created_at | TEXT | Horodatage ISO |
Index et contraintes :
UNIQUE(artifact_id, version)UNIQUE(artifact_id, manifest_digest)
artifact_aliases
| Colonne | Type | Notes |
|---|---|---|
artifact_id | INTEGER | Références artifacts.id |
alias | TEXT | Nom d'alias tel que latest |
artifact_version_id | INTEGER | Références artifact_versions.id |
Index et contraintes :
PRIMARY KEY (artifact_id, alias)
run_artifact_links
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
run_id | TEXT | Identifiant d'exécution facultatif |
run_name | TEXT | Nom d'exécution facultatif |
artifact_version_id | INTEGER | Références artifact_versions.id |
direction | TEXT | input ou output |
created_at | TEXT | Horodatage ISO |
Index et contraintes :
CHECK(direction IN ('input', 'output'))idx_run_artifact_links_runsur(run_id, run_name)idx_run_artifact_links_versionsur(artifact_version_id)idx_run_artifact_links_uniqueindex unique sur(run_id, artifact_version_id, direction)
Tableaux du registre
Les bases de données Registry — des projets nommés registry-<name>, créés par Api.create_registry — contiennent les tables standard ci-dessus ainsi que les quatre tables ci-dessous, définies dans trackio/registry_storage.py par RegistryStorage.init_registry_db(). Les numéros de version des collections proviennent de collections.next_version, qui n'avance que dans un sens : une version de collection n'est jamais réutilisée, même après un unlink. Chaque modification du registre ajoute également une ligne à registry_events dans la même transaction.
collections
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
name | TEXT | Nom de la collection, UNIQUE |
type | TEXT | Le type d'artefact unique que la collection accepte |
description | TEXT | Description facultative |
next_version | INTEGER | Compteur monotone pour les numéros de version de collection |
created_at | TEXT | Horodatage ISO |
collection_links
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
collection_id | INTEGER | Références collections(id) |
collection_version | INTEGER | Numéro de version au sein de la collection (v0, v1, …) |
source_project | TEXT | Projet dans lequel la version de l'artefact lié a été enregistrée |
source_artifact | TEXT | Nom de l'artefact lié |
source_version | INTEGER | Version de l'artefact lié |
source_space_id | TEXT | Espace contenant la version source, NULL lorsqu'elle est locale |
source_bucket_id | TEXT | Bucket contenant la version source, NULL lorsqu'elle est locale |
created_at | TEXT | Horodatage ISO |
Contraintes :
UNIQUE(collection_id, source_project, source_artifact, source_version)— une version source est liée au plus une fois par collectionUNIQUE(collection_id, collection_version)
collection_aliases
| Colonne | Type | Notes |
|---|---|---|
collection_id | INTEGER | Références collections(id) |
alias | TEXT | Nom d'alias |
link_id | INTEGER | Références collection_links(id) |
Contraintes :
PRIMARY KEY (collection_id, alias)— une version par alias et par collection
registry_events
| Colonne | Type | Notes |
|---|---|---|
id | INTEGER | Clé primaire |
event_uid | TEXT | <compact-utc>-<writer>-<seq>, unique ; ordonne totalement les événements entre les écrivains et rend la lecture idempotente |
ts | TEXT | Horodatage ISO |
kind | TEXT | create, link, promote, update ou unlink |
payload | TEXT | Blob JSON décrivant la mutation |
Le journal est la forme autoritaire d'un registre : les tableaux ci-dessus en sont un repli. Un registre adossé à un seau stocke les mêmes événements sous forme d'un objet chacun (voir le guide du Registre) et matérialise localement ces tableaux.
Comment les charges utiles des métriques sont stockées
- Les métriques utilisateur sont stockées sous forme de texte JSON dans
metrics.metrics. - Les métriques système sont stockées au format JSON dans
system_metrics.metrics. - La configuration d'exécution est stockée sous forme de texte JSON dans
configs.config. - Les API de plus haut niveau de Trackio désérialisent ces blobs JSON avant de les retourner.
Motif de requête directe courant :
trackio query project --project "my-project" --sql "SELECT timestamp, step, metrics FROM metrics WHERE run_name = 'run-1' ORDER BY step DESC LIMIT 5"Exemple d'introspection de schéma :
trackio query project --project "my-project" --sql "PRAGMA table_info(metrics)"Disposition Parquet
Trackio dérive des fichiers parquet à partir de SQLite en aplatissant les colonnes JSON en colonnes régulières.
Exports parquet locaux
SQLiteStorage.export_to_parquet() écrit :
{project}.parquetà partir demetrics{project}_system.parquetà partir desystem_metrics{project}_configs.parquetà partir deconfigs{project}_traces.parquetà partir detraces{project}_{table}.parquetpour chaque table d'artefacts (artifacts,artifact_versions,artifact_aliases,run_artifact_links)
Les fichiers parquet aplatis conservent les colonnes structurelles telles que timestamp, run_name et step, puis ajoutent une colonne pour chaque clé trouvée dans la charge utile JSON.
Espaces statiques et exports de jeux de données
SQLiteStorage.export_for_static_space() écrit :
metrics.parquetaux/system_metrics.parquetaux/configs.parquetaux/traces.parquetaux/artifacts.parquet,aux/artifact_versions.parquet,aux/artifact_aliases.parquetetaux/run_artifact_links.parquetruns.jsonsettings.json
Le déploiement statique copie les fichiers multimédias dans media/ et les blobs d’artefacts dans artifacts/blobs/sha256/{prefix}/{digest} aux côtés de ces exports, afin que le tableau de bord uniquement navigateur puisse servir les téléchargements d’artefacts directement depuis le jeu de données ou le bucket.
Ceci est la structure utilisée pour les Spaces statiques et les jeux de données exportés.
Exemples de requêtes utiles
Liste des tables :
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"Trouver la dernière étape pour chaque exécution :
trackio query project --project "my-project" --sql "SELECT run_name, MAX(step) AS last_step FROM metrics GROUP BY run_name ORDER BY last_step DESC"Inspecter les alertes récentes :
trackio query project --project "my-project" --sql "SELECT timestamp, run_name, level, title, step FROM alerts ORDER BY timestamp DESC LIMIT 20"Inspecter les configurations stockées :
trackio query project --project "my-project" --sql "SELECT run_name, created_at, config FROM configs ORDER BY created_at DESC"Versions de schéma et migrations
Chaque base de données de projet enregistre sa version de schéma dans PRAGMA user_version :
trackio query project --project "my-project" --sql "PRAGMA user_version"SQLiteStorage.init_db() met à jour une base de données jusqu’à la version SCHEMA_VERSION (définie dans trackio/sqlite_storage.py) à chaque ouverture en écriture, et un serveur Trackio migre la base de données de chaque projet au démarrage. Les bases de données écrites avant l’introduction de la gestion des versions signalent la version 0 et sont portées à la version 1 par les instructions additives CREATE TABLE IF NOT EXISTS et ALTER TABLE ... ADD COLUMN présentes dans init_db(). La version 2 attribue un run_id à chaque table de portée « run » des bases de données écrites avant Trackio 0.24 : ces versions identifiaient un run uniquement par son nom, de sorte que chaque nom de run devient un run distinct doté d’un nouvel identifiant.
Pour modifier le schéma ou réécrire des données existantes d'une manière que ces déclarations ne peuvent pas exprimer, ajoutez une étape à _SCHEMA_MIGRATIONS et incrémentez SCHEMA_VERSION :
def _split_loss_column(cursor):
cursor.execute("ALTER TABLE metrics ADD COLUMN loss REAL")
cursor.execute("UPDATE metrics SET loss = json_extract(metrics, '$.loss')")
SCHEMA_VERSION = 3
_SCHEMA_MIGRATIONS = {2: _migrate_add_run_ids, 3: _split_loss_column}_SCHEMA_MIGRATIONS[n] met à jour une base de données de la version n - 1 à la version n. Chaque étape s’exécute dans son propre savepoint, accompagnée de l’augmentation de sa version, de sorte qu’une étape échouée laisse la base de données à la dernière version complétée. Une base de données dont la version est plus récente que celle connue par l’instance Trackio en cours d’exécution est laissée intacte.
trackio bump s’appuie sur ce mécanisme : après le redémarrage d’un Space sur la version locale de Trackio, il vérifie que chaque base de données de projet signale la version locale de SCHEMA_VERSION. Le test e2e situé dans tests/e2e-spaces/test_space_bump.py exécute chaque migration sur des données écrites par Trackio 0.21.0 et 0.37.1.
Notes sur la stabilité
Trackio est encore en version bêta. Le schéma est documenté ici afin que les humains et les agents puissent l’interroger directement, mais les futures versions peuvent faire évoluer le schéma et nécessiter des migrations ou la régénération des bases de données locales.
Update on GitHub