Trackio documentation
Esquema de Armazenamento e Consultas Diretas
Esquema de Armazenamento e Consultas Diretas
O Trackio armazena cada projeto em seu próprio banco de dados SQLite e pode exportar esses dados para parquet para sincronização, Spaces estáticos e análise direta. Esta página documenta o esquema SQLite ao vivo, o layout parquet derivado e o novo comando trackio query para executar SQL somente leitura.
Onde os dados ficam
- Os bancos de dados de projetos locais ficam em
TRACKIO_DIR, que por padrão é~/.cache/huggingface/trackio. - Cada projeto é armazenado como um arquivo SQLite separado:
{project}.db. - Mídia e arquivos enviados ficam em
TRACKIO_DIR/media/. - Cada trilha é adicionalmente gravada como um arquivo de sessão de agente renderizável no Hub, localizado em
TRACKIO_DIR/traces/(em um Space, no prefixotraces/do bucket). Esses arquivos são um artefato de renderização para o visualizador de trilhas de agentes do Hub; a tabelatracespermanece como a fonte de verdade. Consulte Trilhas. - Ao sincronizar com o Hugging Face, o Trackio exporta arquivos parquet do banco de dados SQLite antes do upload.
Consultando Dados Diretamente
Use a CLI quando precisar de uma consulta geral que ainda não esteja coberta por 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"Adicione --json para uma saída legível por máquina:
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name" --jsonO mesmo comando funciona contra um Space remoto:
trackio query project --project "my-project" --sql "SELECT COUNT(*) AS num_alerts FROM alerts" --space username/my-space --jsontrackio query aceita apenas consultas somente leitura SELECT, WITH e consultas seguras de esquema PRAGMA, incluindo a leitura de PRAGMA user_version.
Esquema do SQLite
O esquema ao vivo é definido em trackio/sqlite_storage.py por SQLiteStorage.init_db().
métricas
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
timestamp | TEXT | Timestamp ISO |
run_name | TEXT | Identificador de execução |
step | INTEGER | Etapa de treinamento |
metrics | TEXT | Blob JSON contendo os valores de métricas registrados |
log_id | TEXT | Chave de desduplicação opcional adicionada pela migração aditiva |
space_id | TEXT | Marcador opcional de sincronização pendente adicionado pela migração aditiva |
Índices:
idx_metrics_run_stepem(run_name, step)idx_metrics_run_timestampem(run_name, timestamp)idx_metrics_log_idíndice parcial único emlog_id- índice parcial
idx_metrics_pendingemspace_id
configs
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
run_name | TEXT | Identificador de execução |
config | TEXT | Blob JSON contendo a configuração da execução |
created_at | TEXT | Timestamp ISO |
Índices e restrições:
UNIQUE(run_name)idx_configs_run_nameem(run_name)
system_metrics
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
timestamp | TEXT | Timestamp ISO |
run_name | TEXT | Identificador de execução |
metrics | TEXT | Blob JSON contendo métricas do sistema |
log_id | TEXT | Chave de desduplicação opcional adicionada pela migração aditiva |
space_id | TEXT | Marcador opcional de sincronização pendente adicionado pela migração aditiva |
Índices:
idx_system_metrics_run_timestampem(run_name, timestamp)idx_system_metrics_log_idíndice parcial único emlog_id- índice parcial
idx_system_metrics_pendingemspace_id
traces
| Coluna | Tipo | Observações |
|---|---|---|
id | TEXT | Chave primária |
run_id | TEXT | Identificador de execução estável |
timestamp | TEXT | Carimbo de data e hora ISO quando o rastro foi registrado |
run_name | TEXT | Nome de exibição da execução |
step | INTEGER | Etapa de treinamento ou registro |
key | TEXT | Chave usada no payload de trackio.log() |
trace_index | INTEGER | Posição quando os rastros foram registrados como uma lista |
messages | TEXT | Mensagens no estilo OpenAI em JSON |
metadata | TEXT | Metadados de rastreamento JSON |
search_text | TEXT | Texto achatado usado pela busca de rastreamento |
log_id | TEXT | Chave opcional de deduplicação do log de origem |
space_id | TEXT | Marcador opcional de sincronização pendente |
spans | TEXT | Spans de execução em JSON; padrão é [] |
Índices:
idx_traces_run_stepem(run_id, step)idx_traces_run_timestampem(run_id, timestamp)idx_traces_searchemsearch_text
project_metadata
| Coluna | Tipo | Observações |
|---|---|---|
key | TEXT | Chave primária |
value | TEXT | Valor de metadados |
pending_uploads
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
space_id | TEXT | Espaço de Destino |
run_name | TEXT | Nome de execução opcional |
step | INTEGER | Etapa opcional |
file_path | TEXT | Caminho local absoluto |
relative_path | TEXT | Caminho relativo da mídia |
created_at | TEXT | Timestamp ISO |
alertas
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
timestamp | TEXT | Timestamp ISO |
run_name | TEXT | Identificador de execução |
title | TEXT | Título do alerta |
text | TEXT | Corpo do alerta opcional |
level | TEXT | info, warn ou error |
step | INTEGER | Etapa de treinamento opcional |
alert_id | TEXT | Chave de desduplicação opcional |
Índices:
idx_alerts_runem(run_name)idx_alerts_timestampem(timestamp)idx_alerts_alert_idíndice parcial único emalert_id
artefatos
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
name | TEXT | Nome do artefato |
type | TEXT | Categoria livre, como model ou dataset |
description | TEXT | Descrição opcional |
created_at | TEXT | Timestamp ISO |
Índices e restrições:
UNIQUE(name)
artifact_versions
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
artifact_id | INTEGER | Referências artifacts.id |
version | INTEGER | Número de versão sequencial começando em 0 |
manifest_digest | TEXT | Digest hexadecimal SHA-256 do JSON do manifesto canônico |
manifest | TEXT | Blob JSON listando entradas do manifesto com path, digest, size e ref opcional |
metadata | TEXT | Metadados JSON opcionais |
size_bytes | INTEGER | Tamanho total das entradas do manifesto da versão (soma de size) em bytes |
producer_run_id | TEXT | Identificador opcional da execução que gerou |
producer_run_name | TEXT | Nome opcional da execução produtora |
created_at | TEXT | Timestamp ISO |
Índices e restrições:
UNIQUE(artifact_id, version)UNIQUE(artifact_id, manifest_digest)
artifact_aliases
| Coluna | Tipo | Observações |
|---|---|---|
artifact_id | INTEGER | Referências artifacts.id |
alias | TEXT | Nome de alias, como latest |
artifact_version_id | INTEGER | Referências artifact_versions.id |
Índices e restrições:
PRIMARY KEY (artifact_id, alias)
run_artifact_links
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
run_id | TEXT | Identificador de execução opcional |
run_name | TEXT | Nome de execução opcional |
artifact_version_id | INTEGER | Referências artifact_versions.id |
direction | TEXT | input ou output |
created_at | TEXT | Timestamp ISO |
Índices e restrições:
CHECK(direction IN ('input', 'output'))idx_run_artifact_links_runem(run_id, run_name)idx_run_artifact_links_versionem(artifact_version_id)idx_run_artifact_links_uniqueíndice único em(run_id, artifact_version_id, direction)
Tabelas de registro
Bancos de dados de Registry — projetos nomeados registry-<name>, criados por Api.create_registry — contêm as tabelas padrão acima, além das quatro tabelas abaixo, definidas em trackio/registry_storage.py por RegistryStorage.init_registry_db(). Os números de versão das coleções vêm de collections.next_version, que só avança: uma versão de coleção nunca é reutilizada, mesmo após um unlink. Toda mutação no registry também adiciona uma linha a registry_events na mesma transação.
collections
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
name | TEXT | Nome da coleção, UNIQUE |
type | TEXT | O único tipo de artefato que a coleção aceita |
description | TEXT | Descrição opcional |
next_version | INTEGER | Contador monótono para números de versão de coleção |
created_at | TEXT | Timestamp ISO |
collection_links
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
collection_id | INTEGER | Referências collections(id) |
collection_version | INTEGER | Número da versão dentro da coleção (v0, v1, …) |
source_project | TEXT | O projeto em que a versão do artefato vinculado foi registrada |
source_artifact | TEXT | Nome do artefato vinculado |
source_version | INTEGER | Versão do artefato vinculado |
source_space_id | TEXT | Espaço que contém a versão de origem, NULL quando é local |
source_bucket_id | TEXT | Bucket que contém a versão de origem, NULL quando é local |
created_at | TEXT | Timestamp ISO |
Restrições:
UNIQUE(collection_id, source_project, source_artifact, source_version)— uma versão de origem é vinculada no máximo uma vez por coleçãoUNIQUE(collection_id, collection_version)
collection_aliases
| Coluna | Tipo | Observações |
|---|---|---|
collection_id | INTEGER | Referências collections(id) |
alias | TEXT | Nome de alias |
link_id | INTEGER | Referências collection_links(id) |
Restrições:
PRIMARY KEY (collection_id, alias)— uma versão por alias por coleção
registry_events
| Coluna | Tipo | Observações |
|---|---|---|
id | INTEGER | Chave primária |
event_uid | TEXT | <compact-utc>-<writer>-<seq>, único; ordena totalmente os eventos entre escritores e torna a reprodução idempotente |
ts | TEXT | Timestamp ISO |
kind | TEXT | create, link, promote, update ou unlink |
payload | TEXT | Blob JSON descrevendo a mutação |
O log é a forma autoritativa de um registro: as tabelas acima são uma agregação dele. Um registro baseado em bucket armazena os mesmos eventos como um objeto cada (veja o guia de Registro) e materializa essas tabelas localmente.
Como os Cargas de Métricas São Armazenadas
- As métricas do usuário são armazenadas como texto JSON em
metrics.metrics. - As métricas do sistema são armazenadas como texto JSON em
system_metrics.metrics. - A configuração de execução é armazenada como texto JSON em
configs.config. - As APIs de nível superior do Trackio desserializam esses blobs JSON antes de retorná-los.
Padrão comum de consulta direta:
trackio query project --project "my-project" --sql "SELECT timestamp, step, metrics FROM metrics WHERE run_name = 'run-1' ORDER BY step DESC LIMIT 5"Exemplo de introspecção de esquema:
trackio query project --project "my-project" --sql "PRAGMA table_info(metrics)"Layout Parquet
O Trackio deriva arquivos parquet do SQLite ao aplanar colunas JSON em colunas regulares.
Exportações locais em parquet
SQLiteStorage.export_to_parquet() grava:
{project}.parquetdemetrics{project}_system.parquetdesystem_metrics{project}_configs.parquetdeconfigs{project}_traces.parquetdetraces{project}_{table}.parquetpara cada tabela de artefatos (artifacts,artifact_versions,artifact_aliases,run_artifact_links)
Os arquivos parquet achatados mantêm as colunas estruturais, como timestamp, run_name e step, e em seguida adicionam uma coluna para cada chave encontrada no payload JSON.
Espaço Estático e exportações de dataset
SQLiteStorage.export_for_static_space() escreve:
metrics.parquetaux/system_metrics.parquetaux/configs.parquetaux/traces.parquetaux/artifacts.parquet,aux/artifact_versions.parquet,aux/artifact_aliases.parqueteaux/run_artifact_links.parquetruns.jsonsettings.json
A implantação estática copia os arquivos de mídia para media/ e os blobs de artefatos para artifacts/blobs/sha256/{prefix}/{digest} junto a essas exportações, para que o dashboard exclusivo para navegador possa servir os downloads de artefatos diretamente do dataset ou do bucket.
Este é o layout usado para Spaces estáticos e conjuntos de dados exportados.
Exemplos Úteis de Consultas
Listar tabelas:
trackio query project --project "my-project" --sql "SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name"Encontre o passo mais recente para cada execução:
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"Inspecionar alertas recentes:
trackio query project --project "my-project" --sql "SELECT timestamp, run_name, level, title, step FROM alerts ORDER BY timestamp DESC LIMIT 20"Inspecionar configurações armazenadas:
trackio query project --project "my-project" --sql "SELECT run_name, created_at, config FROM configs ORDER BY created_at DESC"Versões de Esquema e Migrações
Cada banco de dados de projeto registra sua versão de esquema em PRAGMA user_version:
trackio query project --project "my-project" --sql "PRAGMA user_version"SQLiteStorage.init_db() atualiza um banco de dados para a versão SCHEMA_VERSION (definida em trackio/sqlite_storage.py) sempre que ele é aberto para escrita, e um servidor Trackio migra o banco de dados de cada projeto ao iniciar. Bancos de dados gravados antes da existência da versionamento relatam a versão 0 e são atualizados para a versão 1 pelas instruções aditivas CREATE TABLE IF NOT EXISTS e ALTER TABLE ... ADD COLUMN em init_db(). A versão 2 fornece um run_id para cada tabela com escopo de execução em bancos de dados gravados antes do Trackio 0.24: nessas versões, uma execução era identificada apenas pelo seu nome, de modo que cada nome de execução se torna uma execução com um novo id.
Para alterar o esquema ou reescrever dados existentes de uma forma que essas declarações não possam expressar, adicione uma etapa a _SCHEMA_MIGRATIONS e incremente 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] atualiza um banco de dados da versão n - 1 para a n. Cada etapa é executada em seu próprio savepoint junto com o aumento de sua versão, de modo que uma etapa falha deixa o banco de dados na última versão concluída. Um banco de dados em uma versão mais recente do que a conhecida pelo Trackio em execução permanece inalterado.
trackio bump depende disso: após reiniciar um Space na versão local do Trackio, ele verifica se todos os bancos de dados de projeto relatam a SCHEMA_VERSION local. O teste e2e em tests/e2e-spaces/test_space_bump.py executa todas as migrações contra dados gravados pelo Trackio 0.21.0 e 0.37.1.
Notas de Estabilidade
O Trackio ainda está em beta. O esquema está documentado aqui para que humanos e agentes possam consultá-lo diretamente, mas as próximas versões podem evoluir o esquema e exigir migrações ou a regeneração dos bancos de dados locais.
Update on GitHub