tao-data-io

Par nvidia · skills

Le déplaceur de données pour les jobs TAO — décide du niveau de stockage (A montage pré-positionné avec zéro fetch / B volume depuis S3 / C fetch éphémère in-compute), prépare les entrées (bulk + sélection par annotation + extraction d'archive + PTM HF/NGC), mappe les credentials sur l'environnement, route les sorties en 3 directions avec exclusions d'upload, et exécute la porte de vérification compute-frame. Un skill de support que les autres skills de plateforme (docker, kubernetes, slurm, brev, virtualenv) appellent pour acheminer les données vers et depuis le conteneur de calcul sans le TAO SDK. Les phrases déclencheuses incluent : « stage inputs », « mount the dataset », « upload TAO results », « download only referenced files », « resolve results_dir », « verify the container can read the data ».

npx skills add https://github.com/nvidia/skills --skill tao-data-io

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> ou aws 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=1 gardé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_ROOT défini → écrire sur ce montage, pas d'upload.
  • sinon S3_BUCKET_NAME défini → uploader vers s3://$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 dans references/tests/ ; lancez avec python -m pytest.

Skills similaires