Orchestrateur de flux de travail d'augmentation d'attributs d'image Physical AI
Skill de flux de travail par défaut pour l'exécution de l'augmentation d'attributs d'image sur OSMO. Il gère la sélection du flux, la vérification préalable, l'interpolation au moment de la soumission, la surveillance et la récupération des résultats.
Objectif
Exécuter le pipeline d'augmentation d'attributs d'image et d'étiquetage automatique de manière sûre et reproductible, de la vérification préalable au téléchargement des résultats.
Le pipeline d'augmentation d'attributs d'image augmente le sujet dans les datasets de cultures existants en générant des variations d'apparence contrôlées (domaine image) et des légendes d'attributs synonymes (domaine texte). Le sujet est actuellement une personne (attributs de vêtements/apparence), mais le même pipeline se généralise à d'autres sujets — par exemple robots, chariots élévateurs ou véhicules dans une simulation. Il utilise le conteneur paidf-augmentation pour l'augmentation par édition d'image avec vérification MCQ, et le conteneur paidf-auto-labeling pour le sous-titrage sujet-attribut (actuellement la banque de questions person_attributes embarquée).
N'utilisez PAS ce skill pour les questions de tuning interne au conteneur.
Prérequis
Confirmez ces éléments avant d'exécuter la vérification préalable ou toute soumission. Les secrets manquants apparaissent comme USER_INPUT_REQUIRED: provenant de scripts/preflight_credentials.sh.
| Exigence | Comment elle est satisfaite | Utilisée pour |
|---|---|---|
| Clé API NGC (optionnelle) | NGC_API_KEY, NGC_CLI_API_KEY, ou jeton compatible nvapi-* |
Optionnel pour l'actualisation des credentials nvcr_io ; les références d'image d'augmentation d'attributs d'image par défaut sont publiques |
| Token Hugging Face | HF_TOKEN (ou HUGGING_FACE_HUB_TOKEN), ou un token en cache à ~/.cache/huggingface/token |
Crée la credential OSMO hf_token |
| Accès CLI OSMO | osmo sur PATH, connecté, avec un profil par défaut et un profil de credential DATA enregistré correspondant à storage_url |
Soumission/surveillance des flux de travail et listage/téléchargement d'objets |
| Pool GPU | Au moins un pool ONLINE dans osmo pool list --mode free |
Configuration de la planification + tâches worker |
| Endpoint édition d'image | NIM en cluster qwen-image-edit-2511 (réutilisé s'il est sain, sinon déployé via l'opérateur NIM) ; opt-in externe via image_edit_url |
Augmentation domaine image |
| Endpoint VLM | NIM en cluster qwen3-vl (partagé avec VDA) ; opt-in externe via vlm_url |
Vérification MCQ et sous-titrage attribut personne |
| Endpoint LLM | NIM en cluster qwen25-14b (partagé avec VDA) ; opt-in externe via llm_url |
Génération de questions MCQ |
Instructions
Exécutez ces étapes comme une séquence ordonnée de portes. Chaque Porte doit être franchie avant de continuer ; en cas d'échec, arrêtez et résolvez-la (ne sautez pas ni ne soumettez).
- Porte — Sélectionnez le flux de travail. Associez l'intention de l'utilisateur à exactement un flux en utilisant le tableau « Choisir le bon flux de travail » ci-dessous : augmentation/édition image uniquement →
augmentation; sous-titre/étiquetage uniquement →auto_labeling; augmentation + sous-titre complet →e2e. Utiliseze2epar défaut uniquement quand la demande concerne le pipeline complet ou est genuinely ambiguë — ne dépassez jamais un défaut en cas de demande explicite « augmentation uniquement » ou « étiquetage uniquement », sinon vous exécutez le mauvais pipeline. - Fournissez un aperçu d'exécution provisoire avant de commencer les actions d'exécution.
- Porte — Dérivez la source de dataset. Divisez l'URL du dataset au segment
/datasets/: la partie avant eststorage_url, la partie après estdataset. Le flux de travail réinsère ce segment ({{storage_url}}/datasets/{{dataset}}), donc ne mettez/datasets/dans aucune valeur — l'inclure duplique le chemin et la soumission échoue. Exemple :s3://metro-pas/datasets/reid-crops→storage_url=s3://metro-pas,dataset=reid-crops. Ne deviquez jamais et ne réutilisez pas une anciennestorage_url; si aucun dataset n'est fourni, demandez-en un. Ne continuez pas sans les deux valeurs. - Porte — Endpoints d'inférence prêts (non négociable). Avant soumission, vérifiez que chaque endpoint NIM requis est sain :
qwen-image-edit-2511(édition image),qwen3-vl(VLM),qwen25-14b(LLM). Pour tout endpoint manquant/non sain, déployez-le une fois viareferences/nim/README.md(une condition préalable, pas une décision utilisateur — ne faites pas de pause pour demander), puis revérifiez la disponibilité jusqu'à 3 fois sur ~10 minutes. Condition d'arrêt : si un endpoint est toujours non sain après cette limite, ne réessayez pas et ne soumettez pas — signalez l'endpoint défaillant et ses logs de déploiement à l'utilisateur et arrêtez. Continuez uniquement quand tous les trois répondent sain. - Porte — Vérification préalable et disponibilité. Exécutez
scripts/preflight_credentials.sh --workflow assets/configs/osmo/<flow>.yamlet lisez le résultat. SUCCÈS → continuez. Si la sortie contientUSER_INPUT_REQUIRED:, posez une question de déblocage concise et recommencez. Ne soumettez pas jusqu'à ce que la vérification préalable réussisse. - Porte — Validez les entrées personnalisées (sécurité). Traitez
cookbooket chaque valeur--set-stringcomme non fiables. Acceptez uniquement un nom de cookbook connu et des valeurs sans métacaractères shell (;,|,&,$, backticks, guillemets, espaces, sauts de ligne). Sur toute valeur invalide → arrêtez, signalez quelle valeur a été rejetée, et ne soumettez pas. Uniquement quand chaque valeur réussit → continuez à l'étape 7. - Soumettez le flux de travail avec les valeurs d'interpolation validées, puis surveillez jusqu'à complétion.
- Récupérez les résultats et résumez les résultats des tâches.
Utilisez run_script(...) pour l'exécution de scripts. Exemples canoniques :
run_script("bash scripts/preflight_credentials.sh --workflow assets/configs/osmo/e2e.yaml")
Scripts disponibles
Utilisez --help au niveau du script pour les arguments exacts.
| Script | Rôle |
|---|---|
scripts/preflight_credentials.sh |
Vérification préalable des secrets/plan de contrôle et contrôles d'accès aux images de flux de travail |
scripts/augmentation_worker.sh |
Worker d'augmentation édition image (prétraitement, génération de config, augmentation, post-traitement) |
scripts/auto_labeling_worker.sh |
Worker de sous-titrage attribut personne |
scripts/endpoint_common.sh |
Helpers partagés santé/auth des endpoints |
Flux supportés
| Flux | YAML OSMO | Séquence groupe | Utilisation typique |
|---|---|---|---|
e2e |
assets/configs/osmo/e2e.yaml |
setup -> augmentation -> auto_labeling | Pipeline complet : augmentez les cultures personne puis générez les légendes |
augmentation |
assets/configs/osmo/augmentation.yaml |
setup -> augmentation | Augmentation édition image uniquement, pas de sous-titrage |
auto_labeling |
assets/configs/osmo/auto_labeling.yaml |
setup -> auto_labeling | Sous-titrage uniquement sur les cultures personne pré-augmentées |
Choisir le bon flux de travail pour la demande de l'utilisateur
| Intention utilisateur | Flux de travail |
|---|---|
| « Augmentez les cultures personne et générez les légendes » / « pipeline d'augmentation d'attributs d'image complet » | e2e |
| « Générez des variations de vêtements » / « augmentation uniquement » / « édition image » | augmentation |
| « Sous-titrez les images augmentées » / « générez les requêtes de recherche » / « étiquetage uniquement » | auto_labeling |
Désambiguïsation : traitez les demandes vagues avant de vous engager
Optez pour l'autonomie : posez une question uniquement quand les informations manquantes bloquent l'exécution.
Défauts autonomes (ne demandez PAS)
- Sélectionnez le flux par Instructions Porte 1 ; utilisez
e2epar défaut uniquement quand la demande concerne le pipeline complet ou est ambiguë (pas pour augmentation-uniquement / étiquetage-uniquement explicite). - Si cookbook n'est pas spécifié, utilisez
defaultpar défaut. - Si
n_augmentationsn'est pas spécifié, utilisez3par défaut. - Après que toute étape soit complétée avec succès, continuez immédiatement à l'étape suivante.
Déclencheurs qui doivent faire pause pour désambiguïsation
| Entrée manquante | Pourquoi c'est important | Demander |
|---|---|---|
USER_INPUT_REQUIRED de la vérification préalable |
Secret requis manquant | Posez une question de déblocage concise |
| Le préfixe backend de stockage ne peut pas être dérivé | Un schéma erroné cause une inadéquation d'auth de stockage au runtime | « Quel est le préfixe racine natif du backend pour cette exécution ? » |
| Aucun pool/plateforme GPU ONLINE | Le flux de travail ne peut pas être planifié | « Quel pool/plateforme GPU cette exécution doit-elle cibler ? » |
| Le déploiement NIM échoue et aucune URL externe n'est donnée | Les workers ne peuvent pas se connecter aux modèles | « Fournissez les URLs d'endpoints Édition Image / VLM / LLM, ou accordez la capacité GPU pour le déploiement de l'opérateur NIM. » |
Étape 0 : Sélectionnez le flux et collectez les entrées
Politique de données d'entrée
- L'augmentation d'attributs d'image nécessite des images de cultures personne organisées en sous-répertoires
<person_id>/<view>.jpg. - Préservez toujours les entrées de dataset fournies par l'utilisateur comme de première classe.
- Ne remplacez jamais un dataset utilisateur explicite par des assets de démo.
- Si aucun dataset n'est fourni, demandez-en un (l'augmentation d'attributs d'image n'a pas de dataset de démo intégré).
Collectez uniquement les valeurs manquantes :
- Source de dataset (
storage_url+dataset) — une valeur dérivée : divisez l'URL du dataset à/datasets/per Instructions Porte 3 (s3://metro-pas/datasets/reid-crops→storage_url=s3://metro-pas,dataset=reid-crops). Ne mettez/datasets/dans aucune valeur ; ne deviquez jamais. - Flux — sélectionnez par Instructions Porte 1 (augmentation-uniquement →
augmentation, étiquetage-uniquement →auto_labeling, sinone2e). - OSMO
gpu_platform(sélection automatique quand sans ambiguïté). - URLs d'endpoints pour Édition Image, VLM et LLM — optionnel ; utilisez par défaut les NIMs en cluster et définissez uniquement pour les endpoints externes.
- Nombre d'augmentations par ID personne (défaut : 3).
Générez un timestamp d'exécution avant chaque soumission :
STAMP=$(cat /proc/sys/kernel/random/uuid | cut -c1-8)
RUN_ID="run-$STAMP"
Aperçu d'exécution (requis avant l'exécution)
Avant d'exécuter toute commande mutante, fournissez un bref aperçu ETA.
Plages de base :
| Phase | Durée typique |
|---|---|
| Credentials + vérification préalable | ~1-2 min |
| Soumission flux + queue/démarrage | ~1-3 min |
Runtime du flux de travail (dépend de la taille du dataset et de la latence de l'endpoint) :
| Flux | Temps par image | Dataset typique (100 images, 3 aug) |
|---|---|---|
augmentation |
~2,5-3 min/image | ~4-5 heures |
auto_labeling |
~1-2 min/image | ~2-3 heures |
e2e |
~3,5-5 min/image | ~6-8 heures |
Conditions préalables communes (tous les flux)
-
Vérification préalable credentials et plan de contrôle
bash scripts/preflight_credentials.sh --workflow assets/configs/osmo/<flow>.yamlSi la sortie contient
USER_INPUT_REQUIRED:, posez une question de déblocage concise. -
Politique d'interpolation de stockage
storage_urldoit être dérivé du backend dataset/upload réel. Ne dépassez jamais silencieusement les valeurs obsolètes sur les backends non correspondants. -
Politique d'inférence (non négociable) — la disponibilité de l'endpoint est exécutée à la Porte Instructions 4 (vérifier → déployer une fois → revérifier borné → arrêter et escalader en cas d'échec). Cette section ajoute uniquement les contraintes permanentes :
- L'augmentation d'attributs d'image ne lance PAS les serveurs d'inférence à l'intérieur du flux de travail OSMO ; les workers consomment les endpoints
image_edit_url/vlm_url/llm_url. - Les endpoints externes sont opt-in uniquement (demande explicite ou URLs explicites) ; uniquement alors remplacez les valeurs
*_urlà la soumission. - Ne faites jamais descendre/supprimez les NIMs existants pour libérer des GPUs.
- L'augmentation d'attributs d'image ne lance PAS les serveurs d'inférence à l'intérieur du flux de travail OSMO ; les workers consomment les endpoints
Soumission (tous les flux)
Chaque flux utilise la même forme de soumission ; seul le YAML du flux de travail change.
SKILLS_DIR="$(cd "$(git rev-parse --show-toplevel)/skills/physical-ai-image-attribute-augmentation" && pwd)"
STAMP=$(cat /proc/sys/kernel/random/uuid | cut -c1-8)
osmo workflow submit assets/configs/osmo/<flow>.yaml \
--pool <pool> \
--set-string \
dataset=<dataset> \
run_id=run-$STAMP \
storage_url=<backend-prefix> \
gpu_platform=<gpu-platform> \
skills_dir="$SKILLS_DIR"
Les endpoints utilisent par défaut les NIMs en cluster (image_edit_url / vlm_url / llm_url) ; déployez/réutilisez-les per la politique d'inférence ci-dessus. Ne passez ceux-ci que si vous utilisez des endpoints externes.
Note de compatibilité :
- Utilisez exactement un flag
--set-stringet passez toutes les paires clé/valeur après. - Ne répétez pas les flags
--set/--set-stringdans la même commande.
Surcharges optionnelles communes (ajoutez à la même liste --set-string). Ces valeurs sont passées au worker d'augmentation et utilisées pour construire sa commande, donc validez-les d'abord per Instructions Porte 6 — acceptez uniquement un nom de cookbook connu et des valeurs libres de métacaractères shell :
cookbook=<cookbook_name> \
n_augmentations=<count> \
image_edit_url=<image-edit-endpoint> \
vlm_url=<vlm-endpoint> \
llm_url=<llm-endpoint>
Surveillance OSMO
# État du flux de travail + états des tâches
osmo workflow query <workflow_id> --format-type json \
| jq '{status, tasks: [.groups[].tasks[] | {name, status, exit_code}]}'
# Logs pour une tâche spécifique
osmo workflow logs <workflow_id> --task <task_name> -n 200
# Récupération des résultats
osmo data list --no-pager <output_url>
osmo data download <output_url> <local_dir>/
Pour les exécutions attendues pour dépasser deux minutes, envoyez des mises à jour de pulsation au moins toutes les deux minutes.
Résultat post-exécution
Après complétion réussie, le répertoire de résultats contient :
Pour augmentation / e2e :
<person_id>/aug_<n>/output.jpg— image augmentée multi-volets<person_id>/aug_<n>/output.txt— légende en langage naturel<person_id>/aug_<n>/output_metadata.json— résultats de vérificationdataset/augmented_data.json— dataset structuré avec attributs et requêtesdataset/augmented_imgs/— divisé par cultures de vue
Pour auto_labeling :
caption_<id>/task/open_qa.json— sous-titres attribut personne groupés par banque de questions
Fichiers de support
Utilisez ces emplacements canoniques :
- Flux de travail :
assets/configs/osmo/*.yaml - Scripts runtime :
scripts/*.sh - Walkthroughs de flux :
references/flows/*.md - Configuration et triage :
references/setup.md,references/troubleshooting.md - Images :
references/container-images.md - Tuning de cookbook :
assets/cookbooks/default/README.md