tao-artifacts
Quatre artefacts typés circulent dans chaque job TAO. Leurs schémas vivent ici et nulle part ailleurs — les producteurs (skills modèle/données) et les consommateurs (skills plateforme) valident tous deux contre la references/ de ce skill.
| Artefact | Schéma | Produit par → consommé par |
|---|---|---|
| spec-bundle | references/spec_bundle.schema.json |
skill modèle/données → skill plateforme (à la couture de soumission) |
| job-record | references/job_record.schema.json |
scripts/tao_job_record.py (l'UNIQUE rédacteur) → tout agent/poller qui se rattache |
| results_dir layout | references/results_dir.contract.md |
skill plateforme à la soumission → qui collecte les sorties |
| best_rec | references/best_rec.schema.json |
adaptateur tao-run-automl → démarrage à chaud DEFT |
Démarrage rapide — valider un artefact
python - <<'PY'
import json, yaml, jsonschema, pathlib
ref = pathlib.Path("${TAO_SKILL_BANK_PATH:?}/skills/core/tao-artifacts/references")
schema = json.loads((ref / "spec_bundle.schema.json").read_text())
bundle = yaml.safe_load(open("/path/to/bundle.yaml")) # ou un dict construit en contexte
jsonschema.validate(bundle, schema) # lève une exception en cas de violation
print("bundle OK")
PY
Validez le bundle avant la gate verify-before-launch ; validez un job-record seulement lors du débogage (le script rédacteur applique déjà le schéma).
Les deux règles que les schémas appliquent structurellement
- Imbriqué, pas pointé. Un
specest un dict imbriqué qui reflète la forme de la config du conteneur —{"train": {"num_epochs": 12}}. Toute clé contenant.à n'importe quelle profondeur est rejetée ({"train.num_epochs": 12}est l'erreur d'authoring #1). Notez la distinction :declared_inputs[].spec_keyetgpu_spec_keysont des pointeurs pointés/indexés dans le spec (dataset.train_data_sources[0].image_dir) — les points y sont corrects. - Discrimination de mode.
mode: confignécessitespec+config_formatet unecommandcontenant{config_path}, et interditargs.mode: argsnécessiteargset interditspec. Il n'y a pas d'autre mode.
Cycle de vie optionnel des actions
Utilisez execution quand une action nécessite plus que sa commande principale. C'est la couture partagée modèle-vers-plateforme ; n'ajoutez pas un renderer Docker, Kubernetes ou SLURM spécifique au modèle juste pour porter l'environnement d'exécution, les attestations, le post-traitement ou les dépendances assistantes.
- Le skill modèle/données producteur possède
environment, lespre_commandsordonnés, lespost_commandsordonnés, l'intent de lancement distribué et la preuve d'achèvement. - La plateforme possède les montages de conteneurs, la syntaxe scheduler/conteneur, la liaison tâche/rang, les timeouts, les chemins de logs et la préservation du vrai code de sortie enfant.
environmentn'est pas secret. Les valeurs de credentials continuent à utiliser le contrat secret/sidecar de la plateforme sélectionnée et n'entrent jamais dans un spec-bundle.- Les commandes, les valeurs d'environnement et les valeurs string dans
specpeuvent utiliser{config_path},{job_id}et{results_dir}. La plateforme les lie seulement après que le job record a été ouvert ; leresults_dirdu job record est autoritaire sur tout chemin d'affichage pré-révision. Persistez les hashes du bundle producteur et de la config d'exécution liée. - Les noms
supporting_filessont des helpers orchestration archivés relatifs à la racine du skill producteur. La plateforme prépare l'ensemble fermé, vérifie chaque SHA256 déclaré, et rejette la traversal, les frères non déclarés ou la réécriture d'un bundle différent. Les fichiers de support orchestrent une action ; ils ne doivent jamais masquer ou patcher le code à l'intérieur de l'image sélectionnée. - Une déclaration
torchrunexprime la topologie des processus, non la syntaxe SLURM/Kubernetes. Chaque plateforme la mappe à son lanceur distribué natif.
Vocabulaire de statut fixe
Tout état de job n'importe où dans le pipeline est exactement l'un de :
PENDING · RUNNING · COMPLETE · ERROR · CANCELED · UNKNOWN
Les sous-états natifs de la plateforme (ImagePullBackOff, PENDING-faute-de-ressources, Insufficient-GPU, slurm COMPLETING…) ne sont jamais des états nouveaux — ils circulent dans le champ message de la transition. Terminal = COMPLETE | ERROR | CANCELED. C'est ce qui permet à la loop de poll in-turn et au poller détaché de partager un chemin de code unique entre docker/slurm/kubernetes/brev.
Invariants d'ordre (appliqués à la couture, énoncés ici)
- La gate verify-before-launch s'exécute sur le spec-bundle, avant qu'aucun job id n'existe.
tao_job_record.py openécritPENDING+ leresults_dirrésolu en premier et retourne l'id — l'unique handle qu'un lancement peut utiliser. Une soumission qui a sauté la gate n'a pas d'id, donc elle ne peut pas être lancée.transitionsest append-only ;.tao/vit en dehors de chaque arbre results synchronisé.