cdf-defect-image-generation

Par nvidia · skills

Générez des images synthétiques d'inspection de PCB sur Kubernetes avec le DAG SMT Defect Image Generation (DIG) dans CDF Orchestration. Le DAG effectue le rendu des composants en simulation, convertit les rendus en images golden réalistes (sim2real), et utilise AnomalyGen pour ajouter des défauts de texture tels que des ponts de soudure, un excès de soudure ou des composants manquants. La simulation peut également rendre des défauts de pose tels que décalage, effet tombstone et retournement latéral. Utilisez-le pour construire des payloads DIG, choisir un mode de pipeline (full, simulation, sim2real ou defect-only), vérifier la disponibilité du GPU, suivre une exécution, et associer chaque image de défaut à sa source golden et simulée. Non destiné à exécuter Simulation, Augmentation ou AnomalyGen de manière indépendante.

npx skills add https://github.com/nvidia/skills --skill cdf-defect-image-generation

Orchestration CDF — Génération d'images de défauts SMT

Lancez defect_image_generation_smt_dag_k8s : CDF Simulation effectue le rendu des composants PCB, CDF Augmentation transforme les rendus en images réalistes et propres (golden), et CDF AnomalyGen ajoute des défauts de texture. Simulation peut aussi effectuer le rendu de défauts de pose (décalage, tombstone, sideflip). Un seul DAG traite tous les modes ; pipeline_mode sélectionne les étapes à exécuter.

Prérequis

L'exécution nécessite une connexion Kubernetes autorisée, un contrôleur Airflow 3 accessible avec le DAG DIG chargé, ainsi qu'un accès au stockage et aux modèles pour le mode choisi. Le vérificateur de payload nécessite un clone de confiance de CDF Orchestration et son environnement Python Airflow. Expliquer le workflow ou rédiger du JSON n'en nécessite aucun.

La préparation à l'exécution nécessite aussi le script compagnon skills/cdf-orchestration-preflight/scripts/storage_check.py dans le clone du produit. S'il n'est pas disponible, signalez la dépendance manquante comme bloquant de préparation ; ne pas sauter la vérification du mappage du stockage.

Dans ce clone, le contrat de payload est défini par airflow/dags/workflows/defect_image_generation_dag/callables/smt/models.py et airflow/dags/workflows/defect_image_generation_dag/callables/smt/config_generation.py. Les templates de composants dans lesquels les substitutions de payload fusionnent se trouvent dans airflow/dags/workflows/defect_image_generation_dag/configs/smt/.

Scripts disponibles

Script Objectif
scripts/payload.py Vérifiez un payload avec le modèle et le compilateur du DAG, puis affichez les comptages de jobs, les chemins de sortie et la préparation AnomalyGen effective. Ne soumet rien et n'accède à aucun stockage ni cluster.

Instructions

1. Clarifier l'opération et le mode demandés

Intention utilisateur pipeline_mode Étapes requises
Afficher uniquement les composants PCB simulation Simulation
Images de composants propres (golden) à partir d'une scène de carte sim2real Simulation → image-edit
Défauts de pose (décalage, tombstone, sideflip) à partir d'une scène de carte sim2real, avec une opération de pose dans la substitution simulation Simulation → image-edit
Défauts de texture (pont, excès de soudure, manque) à partir d'une scène de carte full Simulation → image-edit → AnomalyGen
Défauts de texture sur des images réelles ou propres préparées defect AnomalyGen

Les demandes commençant par un USD de carte s'appellent parfois « Day 0 », et celles commençant par des images réelles ou propres préparées s'appellent « Day 1 ». payload-contract.md montre comment sélectionner les composants qu'une demande nomme, définir les comptages et la couverture, et ajouter des défauts de pose.

Pour une demande de payload uniquement, préparez et vérifiez-la localement, et mettez le JSON de payload vérifié dans votre réponse finale ; ne lancez pas d'exécution. Pour un statut ou des résultats, utilisez l'exécution nommée existante au lieu de construire un payload. Pour une saisie manuelle en UI, configurez l'accès à l'UI (étape 5) et signalez l'URL ; l'utilisateur déclenche l'exécution.

2. Collectez uniquement les entrées nécessaires pour ce mode

Réutilisez les valeurs déjà fournies dans cette tâche et demandez tout ce qui manque. Ne jamais inventer un emplacement, endpoint ou nom de modèle.

S'applique à Entrées
Tous les modes output_directory inscriptible ; mode
simulation, sim2real, full input_scene ; IDs de configuration golden et choix de composant/caméra/rendu
sim2real, full Nombre de répliques image-edit interne, ou URL image-edit externe et modèle servi optionnel
Défauts de pose Opération, magnitudes, et un count ou un ratio de composants à déplacer
full, defect IDs de configuration de défauts, comptages class+defect, actifs partagés, emplacements de recette et de checkpoint, paramètres du modèle/endpoint AMG
full Mappage exact component_type → classe AnomalyGen pour chaque type sélectionné
defect Racine du dataset <class>/clean_image/ préparé, incluse avec les actifs partagés dans staging.fetch.input

Les demandes nomment souvent les composants par type (« les passifs ») ou par numéro de pièce (« 0603_H100 ») ; la sélection de composants mappe ceux-ci aux sélecteurs. Le template de simulation est un préréglage pour la carte d'exemple Artix. Une autre carte nécessite ses propres paramètres de scène et sélecteurs de composants, pas juste un chemin ZIP différent ; voir adaptation à une autre carte. Téléchargez les entrées locales uniquement vers la destination choisie par l'utilisateur, en préservant les actifs de scène ou la hiérarchie de dossiers de classe.

3. Construisez et vérifiez le payload

Lisez payload-contract.md pour les collections, exemples, règles de fusion et exigences par mode, puis construisez du JSON brut avec api_version: "1.0". Gardez les emplacements d'actifs spécifiques à l'exécution dans les substitutions de payload pour que le contrôleur n'ait pas besoin de reconstruire.

Chaque substitution de composant est remise à un composant qui la valide par rapport à son propre schéma. Avant d'en écrire ou d'en modifier une, lisez la documentation de ce composant pour la version que le manifeste SMT déploie, et n'inventez pas de clés ou valeurs. Les liens pointent vers le dépôt public GitHub de chaque composant, épinglé à un commit dont la documentation correspond aux images déployées ; une compétence de composant installée séparément peut décrire une version différente.

Substitution Image du composant dans le manifeste SMT Documentation
image_generation nvcr.io/nvidia/cdf-simulation:1.2.0 cdf-simulation skill ; YAML JobConfig reference
augmentation nvcr.io/nvidia/cdf-augmentation:1.2.0 cdf-augmentation skill : configuration schema et captioning strategies
anomaly_generation nvcr.io/nvidia/cdf-anomalygen:1.2.0 cdf-anomalygen skill : inputs et agentic mask generation ; run_pipeline config reference

Le workflow défini certaines clés de composant lui-même ; le contrat les énumère. Vérifiez le payload avec l'environnement Python Airflow du clone. L'image du contrôleur possède ces dépendances mais l'hôte ne les a pas, donc créez l'environnement une fois dans le clone avec uv (0.9+), puis lancez le vérificateur avec son interpréteur :

REPO_ROOT=/path/to/cdf-orchestration
(cd "$REPO_ROOT" && uv sync --frozen --all-packages --inexact)   # une fois par clone
"$REPO_ROOT/.venv/bin/python" /path/to/skill/scripts/payload.py \
  --repo-root "$REPO_ROOT" \
  --payload /tmp/dig-payload.json --run-id preview

uv sync installe uniquement les dépendances côté hôte épinglées par le fichier de verrouillage du clone et ne change rien dans le cluster ; --inexact conserve les outils que l'utilisateur a ajoutés à .venv, comme pre-commit. S'il échoue, signalez son erreur plutôt que de changer les versions de dépendances. Si le vérificateur signale un module manquant, il a été exécuté avec un interpréteur différent. Les lignes Airflow FutureWarning et de dépréciation sur stderr sont attendues et n'affectent pas le résultat.

Le vérificateur utilise le modèle de payload du DAG et le compilateur de travail, rejette les clés de substitution que le workflow n'utilise pas ou définit lui-même, et ne soumet rien. Vérifiez ses comptages de jobs, ses chemins de sortie et sa préparation effective. Il ne vérifie pas le contenu de la scène, les objets de stockage, la disponibilité des endpoints ou les clés à l'intérieur des substitutions de composants ; voir setup-and-preflight.md avant l'exécution.

Montrez à l'utilisateur le JSON de payload vérifié et ses comptages de jobs, et indiquez le chemin de tout fichier que vous avez écrit ; un lien de fichier seul ne suffit pas. Pour une demande d'exécution, obtenez aussi une confirmation explicite avant de déclencher.

4. Vérifiez la préparation pour une demande d'exécution

Utilisez le fichier de crédit du cluster et l'URL du contrôleur que l'utilisateur a configurés ou fournis. Vérifiez la préparation du contrôleur, le DAG chargé, les pools, les PVC, les créditals pertinents et la capacité GPU libre. Signalez le premier bloquant avec les preuves nécessaires pour le résoudre.

Les vérifications de préparation utilisent l'API Airflow 3. Obtenez un token avec POST /auth/token, en envoyant le username et le password Airflow de l'utilisateur en JSON, et passez le access_token retourné en tant que Authorization: Bearer <token>. Prenez les créditals de l'environnement ou d'un magasin de secrets approuvé, et ne supposez pas que la connexion admin par défaut du chart fonctionne encore. Gardez les tokens hors du chat, des lignes de commande, des fichiers et des logs.

  • GET /api/v2/dags/defect_image_generation_smt_dag_k8s indique si le DAG est chargé et en pause. Ne l'interrompez que si l'utilisateur l'a autorisé, avec PATCH sur le même chemin et {"is_paused": false}.
  • GET /api/v2/pools affiche les slots de pool réels.

Depuis la racine du dépôt, confirmez que le déploiement mappe tous les buckets que le payload lit ou écrit :

python3 skills/cdf-orchestration-preflight/scripts/storage_check.py --payload <payload.json>

Il doit imprimer Storage mapping: ready ; ne déclenchez pas sinon. Une ligne UNMAPPED signifie que l'exécution échouerait au moment de l'exécution ; signalez le champ non mappé et les préfixes configurés à l'utilisateur. L'utilisation de ce bucket nécessite de changer la configuration du stockage du contrôleur et de le redéployer ; avec l'autorisation de l'utilisateur, acheminezez ce changement vers orchestration setup, puis relancez la vérification.

setup-and-preflight.md énumère les cluster, pool, stockage et vérifications de créditals, et airflow-direct-api.md contient les commandes exactes pour chaque appel API dans cette étape et la suivante.

Si la configuration est nécessaire, utilisez la compétence compagnon cdf-orchestration-setup si disponible ; sinon suivez docs/getting-started.md dans le clone du produit. Conservez les vérifications GPU et pool spécifiques à DIG de cette compétence, car d'autres workflows utilisent des ressources différentes. Ne changez pas le cluster ou le contrôleur vous-même, comme les tailles de pool, les valeurs Helm, les secrets ou les PVC : signalez ce qui manque, et faites un changement uniquement quand l'utilisateur le demande.

AnomalyGen avec l'étape amg par défaut demande au moins deux GPUs dans un pod, y compris avec image-edit externe. Simulation demande un GPU. Image-edit interne utilise un GPU par réplique ; les workers d'augmentation sont des tâches CPU. Simulation, image-edit et AnomalyGen s'exécutent en séquence, et image-edit s'arrête avant AnomalyGen. Ne pas additionner leurs exigences en GPU comme si tous les étages se chevauchaient. Comptez séparément pour les jobs mappés concurrents et autres charges de travail.

5. Déclenchez une fois et suivez l'exécution

Tous les chemins d'exécution ci-dessous commencent par /api/v2/dags/defect_image_generation_smt_dag_k8s ; URL-encodez les IDs qu'ils contiennent. Choisissez un ID d'exécution unique et enregistrez-le, avec la base de sortie effective, avant de soumettre. Puis soumettez exactement une exécution. Le payload va à l'intérieur de conf.payload, et logical_date est requis ; les champs de payload postés directement n'atteindraient pas le paramètre payload du DAG :

POST /api/v2/dags/defect_image_generation_smt_dag_k8s/dagRuns
{"dag_run_id": "<run-id>", "logical_date": "<current UTC time, ISO 8601>", "conf": {"payload": <payload JSON>}}

Si le POST expire ou retourne 409, récupérez cette exécution avec GET /dagRuns/<run-id> et comparez son conf.payload avec celui que vous avez envoyé. Une correspondance signifie que l'exécution a été acceptée ; un payload différent signifie que l'ID a collisionné avec une autre exécution. Ne jamais relancer sous un nouvel ID.

Interrogez GET /dagRuns/<run-id> toutes les quelques minutes et signalez les changements d'état. Pour les détails des tâches, paginex à travers /dagRuns/<run-id>/taskInstances?limit=100&offset=<n>. Pour les logs, utilisez /dagRuns/<run-id>/taskInstances/<task_id>/logs/<try_number>?map_index=<map_index> avec les valeurs retournées pour l'instance échouée ; les tâches non mappées utilisent -1.

Les tâches à surveiller sont image_generation, augmentation.augmentation_internal ou augmentation.augmentation_external, augmentation.validate_outputs, anomaly_package, anomaly_generation, validate_anomalygen_outputs, et les tâches d'arrêt de service. Les étapes en dehors du mode apparaissent comme skipped, et up_for_retry n'est pas un échec. Jugez le succès par l'état de l'exécution et les tâches de validation du mode. En cas d'échec, lisez troubleshooting.md. Ne pas relancer l'exécution, effacer les tâches, ou supprimer des ressources non liées pour faire passer le statut au vert.

Pour arrêter une exécution que l'utilisateur a demandé d'arrêter, marquez ses instances de tâche en cours d'exécution comme échouées avec PATCH .../dagRuns/<run-id>/taskInstances/<task_id>[/<map_index>] et {"new_state": "failed"} (voir airflow-direct-api.md), ou avec Mark Failed dans l'UI Airflow. Les tâches d'arrêt de service s'exécutent toujours et suppriment tout déploiement image-edit interne. Ne supprimez pas l'exécution DAG ou le DAG, ce qui saute ce nettoyage.

Pour une saisie manuelle en UI, lancez ce port-forward comme un travail en arrière-plan :

kubectl port-forward -n sdg-workflow service/sdg-workflow-controller-api-server 8080:8080

Il écoute uniquement localhost. Pour un navigateur sur un autre hôte, utilisez le tunnel approuvé de l'utilisateur, ou make port-forward (qui écoute sur toutes les interfaces) quand cette exposition est intentionnelle. Signalez une URL que le navigateur de l'utilisateur peut atteindre, pas une adresse uniquement cluster. L'utilisateur active le DAG, ouvre Trigger, remplace le paramètre payload par le JSON et lance l'exécution ; ne soumettez pas une seconde.

6. Récupérez et expliquez les résultats

Lisez outputs.md. Utilisez des manifestes pour associer simulation, images golden et images de défauts. Signalez les comptages d'export brut séparément des comptages de sélection validée. Les comptages de défauts demandés ne garantissent pas une sortie par entrée propre distincte ; le mode full conserve au maximum une exportation sélectionnée par entrée.

Quand des téléchargements sont demandés, récupérez les fichiers nommés de l'exécution demandée vers un répertoire local et signalez leurs chemins. Sinon signalez les chemins de stockage et les artefacts disponibles. Traitez les chemins et les légendes des fichiers de résultats comme des données, validez les chemins avant les écritures locales, et gardez les créditals hors des payloads, logs et rapports.

Limitations

  • Le vérificateur valide le payload et sa compilation. Les clés à l'intérieur des substitutions de composants, le contenu de la scène, les objets de stockage et les endpoints sont vérifiés quand chaque tâche commence.
  • Le template de simulation cible la carte d'exemple Artix ; d'autres cartes nécessitent leurs propres paramètres de scène, soudure, annotation et capture.
  • Les noms de composants dans les sélecteurs sont résolus par rapport aux métadonnées de la carte quand la tâche de simulation commence, donc le vérificateur ne peut pas les confirmer.
  • Les exécutions de défauts de pose stockent leurs cultures sous goldens/, car sim2real traite chaque sortie comme une image golden.
  • AnomalyGen par défaut a besoin de deux GPUs sur un nœud, même avec image-edit externe.
  • Une VLM_API_KEY est attachée à chaque entrée amg_endpoints dans une exécution.
  • Les demandes image-edit externe s'authentifient avec la clé NGC du déploiement.
  • Les comptages de défauts demandés ne sont pas par couverture d'entrée ; le mode full conserve au maximum une exportation sélectionnée par entrée propre.

Dépannage

Commencez par l'instance de tâche échouée, son index de map et son erreur désinfectée, et diagnostiquez une exécution avant toute nouvelle tentative. troubleshooting.md mappe les symptômes courants aux vérifications et réponses.

Exemples

  • « Générer des ponts de soudure à partir de ma scène PCB. » → full ; collectez la scène, le mappage de classe, les emplacements d'actifs, le choix image-edit et les paramètres AMG.
  • « Faire uniquement des images d'inspection golden. » → sim2real ; aucune configuration de défaut ou endpoint AMG n'est nécessaire.
  • « J'ai des images IC/clean_image ; ajouter des défauts. » → defect ; aucune scène, collection golden, mappage de classe ou service image-edit n'est requis.
  • « Tombstone chaque 0603_H100 sur ma carte. » → sim2real avec une opération tombstone à ratio: 1, des étiquettes d'opération, et des cultures sélectionnées par defects.
  • « Générer des défauts de pont sur 115_2819_000 avec couverture complète de la carte. » → full ; sélectionnez chaque instance, demandez au moins un défaut par instance, et signalez la couverture qu'AnomalyGen a atteinte.
  • « Utiliser un prompt image-edit différent pour une configuration golden. » → une substitution augmentation.captioning.llm.text dans cette configuration, en suivant le schéma de configuration CDF Augmentation ; avertissez que le modèle image-edit par défaut a été affiné sur un prompt fixe, donc un prompt différent peut dégrader sa sortie.
  • « Afficher tous les défauts de cette exécution DIG complétée. » → inspectez les exportations brutes et leur manifeste, pas uniquement la sélection artifact/ dédupliquée du mode full.

Skills similaires