tao-data-io
Transférer les données vers et depuis le conteneur de calcul. Décidez d'abord du niveau de stockage —
en stratégie A (montage pré-positionné), aucun octet ne se déplace — et quand une
récupération est nécessaire, déplacez-la côté hôte avec aws/s5cmd/boto3/huggingface-cli/ngc
directement — pas de nvidia-tao-sdk, pas de runtime dans le conteneur. Les autres skills de plateforme
appellent ce skill pour préparer les entrées avant le lancement et synchroniser les sorties après. Il ne
lance jamais un conteneur lui-même. Le niveau choisi est estampillé dans l'enregistrement du travail au
moment de la soumission.
Quand NE PAS invoquer ce skill : si les entrées sont déjà lisibles depuis le cadre de calcul (un chemin local sur l'hôte d'exécution, un montage Lustre/PVC/bind existant), c'EST le niveau A — enregistrez-le et ignorez entièrement ce skill ; il n'y a rien à déplacer. Hôtes hermétiques : le niveau A est le seul niveau — ne tentez jamais une récupération S3/HF/NGC ; tout ce qui manque (datasets, checkpoints, et les images conteneur elles-mêmes) doit être pré-positionné par l'opérateur, et le contrôle de préflight est la seule étape de données qui s'exécute.
Credentials (variables env ; les valeurs ne sont jamais écrites sur disque par ce skill)
Les credentials S3 utilisent les variables env AWS officiellement documentées, lues depuis
l'environnement de session : AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, et (pour
les stores compatibles S3) AWS_ENDPOINT_URL, AWS_DEFAULT_REGION. Le CLI aws et boto3 les
lisent nativement — ne lancez jamais aws configure et n'écrivez jamais ~/.aws/credentials :
set -a; source /path/to/.env; set +a # omit if already exported
aws s3 ls "s3://$S3_BUCKET_NAME/..." # reads AWS_* from the environment
Si une session ne fournit que les noms TAO hérités (ACCESS_KEY, SECRET_KEY,
S3_ENDPOINT_URL, CLOUD_REGION), mappez-les une fois, limités à la commande :
AWS_ACCESS_KEY_ID="$ACCESS_KEY" AWS_SECRET_ACCESS_KEY="$SECRET_KEY" aws s3 ...
HF_TOKEN / NGC_KEY sont passés inchangés pour les pulls PTM. Ne passez jamais une
credential en argument CLI (-p, --token, -e KEY=value) ; utilisez
--password-stdin ou -e VAR (sans valeur).
Stratégie de stockage (l'agent décide ; la porte le vérifie)
Choisissez par backend parmi ce que le cluster/daemon offre réellement :
- A — montage pré-positionné (PVC / NFS / Lustre / bind mount contenant déjà les données) : montez-le, écrivez les chemins de montage dans la spec. Pas de récupération S3. C'est aussi la réponse pour l'air-gap.
- B — volume rempli depuis S3 : un initContainer / étape de staging remplit un volume durable ; le calcul le monte ; une étape finale le vide vers S3 si nécessaire.
- C — éphémère + récupération dans le calcul : aucun montage persistant — récupérez dans le conteneur de calcul et uploadez à la fin (par défaut K8s actuel).
Porte de vérification avant lancement (l'invariant)
Le chemin référencé par la spec est lisible depuis le cadre de calcul (pas du lanceur), et la destination de sortie persiste après la fermeture du conteneur.
Testez dans le cadre de référence du calcul (in-container aws s3 cp/touch sur
le results_dir résolu, ou une probe kubectl run/srun) — un aws s3 ls vert sur le lanceur n'est pas une preuve que le pod peut lire les données (les backends gérés injectent des credentials différentes dans le conteneur de calcul).
Préparation des entrées
- Dossier en masse :
s5cmd cp 's3://.../*' <stage>ouaws s3 sync. - Fichier unique :
aws s3 cp. - Sélectif par annotation (télécharger seulement les fichiers référencés par une annotation) : utilisez
references/selective_download.py(ci-dessous). - Archive :
tar -xzf X -C <dir> --strip-components=1gardée par un marqueur.extracted(idempotent). - PTM (
ngc:///hf://):huggingface-cli download/ngc registry model download-version, puis écrivez le chemin local.
Après la préparation, écrivez la spec avec des chemins locaux et exécutez la porte de vérification.
Routage des sorties (3 voies) + upload
TAO_RESULTS_ROOTdéfini → écrire sur ce montage, pas d'upload.- sinon
S3_BUCKET_NAMEdéfini → uploader verss3://$S3_BUCKET_NAME/results/$TAO_JOB_ID/. - sinon → avertissement éphémère bruyant.
SLURM : ne définissez jamais S3_BUCKET_NAME (Lustre seulement) ; exécutez tout upload sur le nœud de connexion, pas à l'intérieur de l'allocation GPU. Uploadez avec exclusions :
aws s3 sync <local>/ s3://... --exclude '.tao/*' <upload_excludes...>.
Démarrage rapide — préparation sélective par annotation
Téléchargez seulement les fichiers qu'une annotation référence (p. ex. la colonne video),
en préservant les chemins relatifs, dans un répertoire de staging local :
set -a; source /path/to/.env; set +a # omit if already exported
python references/selective_download.py \
--annotation /path/to/annotation.parquet \
--key video \
--bucket "$S3_BUCKET_NAME" --src-prefix datasets/clips \
--dest /data/stage/clips
--key est répétable ou séparé par des virgules ; --format remplace l'inférence d'extension
(parquet/jsonl/json/csv).
Helpers
references/selective_download.py— téléchargement sélectif piloté par annotation (boto3 + pandas). Les tests unitaires vivent dansreferences/tests/; lancez avecpython -m pytest.