VSS Warehouse — Helm Deploy
N'utilisez pas cette skill pour :
- Le déploiement Docker Compose warehouse — utilisez
references/warehouse.mddevss-deploy-profile; elle détient la table de mappingHARDWARE_PROFILE→ GPU et la sémantique de stream-capblueprint_config.ymlque cette skill réutilise. - Les profils Helm non-warehouse (
base,search,lvs,alerts) — ils n'ont pas de stream cap GPU-awarebp-configurator; déployez-les selon leurs propres README de chart. - Les opérations runtime (ajout de caméras, requête sur les analytiques comportementales) — utilisez
vss-manage-alerts/vss-query-analyticssur le déploiement en cours d'exécution.
Pourquoi cela existe
Docker Compose plafonne NUM_STREAMS par GPU automatiquement lors du déploiement warehouse : le configurateur lit la table max_streams_supported de deploy/docker/industry-profiles/warehouse-operations/blueprint-configurator/blueprint_config.yml pour le HARDWARE_PROFILE et le mode détectés, et limite final_stream_count = min(NUM_STREAMS, max_streams_supported).
Les charts Helm (deploy/helm/industry-profiles/warehouse-operations/warehouse-{2d,3d,mv3dt}-app) ne le font pas — leur bp-configurator.env embarque un NUM_STREAMS fixe et ne définit jamais HARDWARE_PROFILE du tout (ENABLE_PROFILE_CONFIGURATOR=false). Un utilisateur qui demande plus de streams que le GPU peut supporter n'obtient aucune protection. Cette skill comble cette lacune en calculant le même plafond que Compose appliquerait et en l'écrivant dans un fichier de valeurs-override Helm avant l'installation.
Scripts disponibles
| Script | Objectif | Arguments |
|---|---|---|
../../../deploy/helm/industry-profiles/warehouse-operations/scripts/compute_stream_cap.py |
Détecter le GPU (ou prendre un HARDWARE_PROFILE explicite), lire max_streams_supported depuis blueprint_config.yml, plafonner le nombre de streams demandé, et écrire un YAML de valeurs-override avec bp-configurator.env patché. Passer tout(s) fichier(s) de valeurs utilisé(s) par votre installation via -f pour que les entrées bp-configurator.env personnalisées ne soient pas supprimées. |
--mode {2d,3d,mv3dt} --num-streams N [--hardware-profile P] [--gpu-index I] [-f VALUES]... [-o FILE] |
Ce script n'a pas de dépendance skill/agent — un utilisateur qui ne veut pas utiliser cette skill peut l'exécuter directement (python3 compute_stream_cap.py --mode 2d --num-streams 8) et passer le fichier généré à helm upgrade/install -f lui-même.
Instructions
-
Précheck du cluster et des entrées requises avant de toucher Helm — ne supposez pas qu'un cluster neuf a déjà ceux-ci. Exécutez chaque vérification et rapportez pass/fail à l'utilisateur :
kubectl cluster-info # cluster accessible kubectl get nodes # tous les nœuds Ready kubectl get storageclass # une StorageClass existe kubectl get nodes -o jsonpath='{.items[*].status.allocatable.nvidia\.com/gpu}{"\n"}' # non-vide -> GPU Operator a enregistré les GPUs helm version --short # Helm 3.xDemandez aussi si l'utilisateur a déjà une clé API NGC — cela ne peut pas être vérifié depuis l'état du cluster, seulement demandé.
En cas d'échec, ne signalez pas simplement le README à l'utilisateur et n'arrêtez pas — donnez-lui le correctif réel, copié depuis le README du chart, et proposez de l'exécuter pour lui :
- Pas de
StorageClass→ relayez l'extrait d'installationlocal-path-provisioner+kubectl patch storageclassdu READMEwarehouse-<mode>-app§Prérequis (option bare-metal) — ou demandez quelle StorageClass ils envisagent d'utiliser s'ils en ont déjà une en tête. - Pas d'allocatable
nvidia.com/gpu→ relayez les étapes d'installation NVIDIA GPU Operator du §Prérequis (liens vers le guide de démarrage GPU Operator) et les versions de pilote recommandées listées là. - Cluster inaccessible / nœuds pas
Ready→ cela, l'utilisateur doit le corriger en dehors de Helm/cette skill entièrement ; dites-le clairement plutôt que de suggérer un correctif au niveau du chart. - Pas de clé API NGC → pointez vers §Required secrets du README du chart pour savoir comment créer le secret d'extraction, ne dites pas simplement « obtenez une clé API NGC ».
Procédez à l'étape 2 seulement une fois que le cluster/StorageClass/GPU-Operator/Helm passent tous et que l'utilisateur a confirmé avoir une clé API NGC — une installation commencée avant cela échouera à mi-chemin d'une façon plus difficile à déboguer que de la détecter ici.
- Pas de
-
Demandez ingress vs. NodePort — cela détermine à la fois ce qui est installé dans cette étape et quelle commande d'installation est utilisée à l'étape 6, donc résolvez-le avant d'aller plus loin, ne définissez pas silencieusement l'un ou l'autre par défaut :
- Ingress (nécessaire hors-cluster / pour un nom d'hôte stable) → vérifiez si un contrôleur ingress est déjà installé (
kubectl get ingressclass). Sinon, relayez l'extrait d'installationhaproxy-ingressdu READMEwarehouse-<mode>-app§"Install the ingress controller" et proposez de l'exécuter. Notez que c'est une étape unique, par cluster, pas par application. - NodePort (le plus simple pour un déploiement local/single-node rapide, aucun contrôleur ingress nécessaire) → dites à l'utilisateur que le chart embarque
values-nodeport.yamlpour cela — la commande d'installation à l'étape 6 passe à-f values-nodeport.yamlmis en couches sous le fichier stream-cap, et les URLs de service se déplacent à<NODE_IP>:<port>au lieu de<NODE_IP>/<path>. Voir §"No ingress controller: NodePort" et §URLs du README du chart pour les ports exacts. Si l'utilisateur n'a pas dit lequel il veut et qu'il n'y a pas de signal clair (par ex. « juste le faire fonctionner localement » implique NodePort ; « l'exposer pour l'équipe » implique Ingress), demandez plutôt que de deviner.
- Ingress (nécessaire hors-cluster / pour un nom d'hôte stable) → vérifiez si un contrôleur ingress est déjà installé (
-
Déterminez le mode et si vous devez activer les Alerts :
- Mode. Utilisez
2d,3d, oumv3dtsi la demande en nomme déjà un. Sinon demandez — ne devinez pas :2d— détection et suivi d'objets 2D.3d— suivi 3D multi-caméra RTVI-CV-3D autonome / sur entrées calibrées.mv3dt— profil warehouse Multi-View 3D Tracking. A aussi besoin quertvi.vss-rtvi-cv.standaloneWarehouse.mv3dt.fusion.maxExpectedSensorssoit défini au nombre de streams effectif à l'étape 6/7 (par défaut4) — c'est le paramètre de compte de caméra de la fusion BEV elle-même, séparé deNUM_STREAMS/syncFileCount, et le script stream-cap ne le touche pas.
- Alerts. Pas un quatrième mode — une surcharge optionnelle, désactivée par défaut, et disponible seulement sur
2d(seulwarehouse-2d-appavss-alert-bridge/agent/vss-agent-uicomme dépendances ;3detmv3dtne les ont pas). Si l'utilisateur est sur3d/mv3dtet demande les Alerts, dites que c'est indisponible là au lieu d'essayer de l'activer. Sur2d, demandez à l'utilisateur s'il le souhaite, et expliquez le compromis d'abord plutôt que de l'activer ou de le sauter pour lui : sans Alerts ils obtiennent le flux RT-CV de détection/suivi brut ; avec, les détections passent aussi par une étape d'analytique comportementale et une étape de vérification VLM (RT-VLM) avant qu'un incident soit surfacé, requêtable via l'agent/agent UI. Cette étape de vérification est la raison de l'activer — c'est ce qui empêche chaque détection brute de devenir un ticket. S'ils le veulent, notez que les quatre drapeaux doivent être définis ensemble (vss-alert-bridge.enabled,agent.enabled,vss-agent-ui.enabled,rtvi.vss-rtvi-vlm.enabled— remplacez le dernier par unvlmBaseUrlexterne si n'utilisant pas le VLM dans le cluster) plus les valeurs endpoint Kafka/Elasticsearch/VST. Bloc complet :warehouse-2d-app/README.md§Alerts — mettez-le en couches pendant l'étape 6. - Nombre de streams. Demandez s'il n'est pas donné ; il dimensionne le plafond
NUM_STREAMSà l'étape 5.
- Mode. Utilisez
-
Demandez si l'installation personnalise
bp-configurator.env(variables d'env supplémentaires, défauts différents) — ne supposez pas qu'aucune n'existe juste parce que l'utilisateur n'en a pas mentionné une. S'ils ne sont pas sûrs, demandez-leur de vérifier leur commandehelm upgrade --installexistante pour tout ce qui touchebp-configurator.env, fichier-basé ou inline. Énoncez le résultat en retour de toute façon :- Fichier de valeurs (
-f my-values.yaml) → notez son chemin. Il est passé au script via-fà l'étape suivante et àhelmlui-même à l'étape 7 — la sortie du script porte seulementbp-configurator.env, donc tout ce qui est d'autre dans ce fichier (storage class, ingress, drapeaux alerts) a toujours besoin quehelmvoit le fichier original directement. Voirreferences/streams.md. - Inline (
--set/--set-jsonsurbp-configurator.env) → le script ne lit que des fichiers YAML, il ne peut pas consommer une chaîne--set. Déplacez-la dans un fichier de valeurs d'abord — voirreferences/streams.mdpour la commandehelm get values -a(secrets inclus, manipulez avec soin) et pourquoi elle ne peut pas être réduite. Ensuite traitez-la comme le cas de fichier de valeurs ci-dessus. - Pas de personnalisations — dites-le explicitement (par ex. « aucune surcharge
bp-configurator.envpersonnalisée, donc rien de supplémentaire n'est nécessaire ici ») et procédez sans aucun de ce qui précède.
- Fichier de valeurs (
-
Exécutez le script stream-cap depuis la racine du repository :
python3 deploy/helm/industry-profiles/warehouse-operations/scripts/compute_stream_cap.py \ --mode <mode> --num-streams <N> -o values-stream-cap.generated.yaml- Si l'étape 4 a trouvé un fichier de valeurs de personnalisation, passez-le aussi ici via
-f— autrement le fichier généré (construit à partir des défauts du chart, mis en couches en dernier) supprime silencieusement ces personnalisations. Voirreferences/streams.md. - Sans
--hardware-profile, il exécutenvidia-smisur l'index GPU 0 et mappe le nom à unHARDWARE_PROFILEen utilisant la même table que la référence warehouse devss-deploy-profile. Si la détection échoue ou que le GPU n'est pas dans cette table, passez--hardware-profileexplicitement. Les appareils edgeIGX-THOR/DGX-SPARKne sont pas supportés par ce chemin Helm. - Il affiche le nombre de streams effectif (possiblement plafonné) et la valeur
syncFileCountpour rester synchronisé (voirreferences/streams.mdpour pourquoi). - Il ne baisse jamais silencieusement la demande sans le dire — un plafond est toujours enregistré sur stderr.
- Si l'étape 4 a trouvé un fichier de valeurs de personnalisation, passez-le aussi ici via
-
Préparez le reste des valeurs — secrets, storage class, soit ingress/
externalHostsoit le fichier de valeurs NodePort selon le choix fait à l'étape 2, et — si les Alerts ont été activées à l'étape 3 — le bloc de valeurs Alerts à quatre drapeaux du READMEwarehouse-2d-app§Alerts (endpoints Kafka/Elasticsearch/VST inclus). Surmv3dt, ajoutez aussi--set rtvi.vss-rtvi-cv.standaloneWarehouse.mv3dt.fusion.maxExpectedSensors=<effective-streams>(même valeur quesyncFileCountde l'étape 5). Si l'étape 4 a trouvé un fichier de valeurs de personnalisation, il va ici aussi (-f my-values.yaml) — le passer seulement au script à l'étape 5 couvrebp-configurator.envmais supprime tout le reste dans ce fichier de l'installation. Voirreferences/streams.mdpour la commandehelm upgrade --installcomplète avec le fichier généré mis en couches en dernier via-f. -
Installez/mettez à jour, en chaînant le fichier généré après n'importe quel autre
-f/--setoverride pour qu'il gagne surbp-configurator.env. La commande de base est la même de toute façon ; seuls les overrides ingress-vs-NodePort diffèrent :helm dependency update deploy/helm/industry-profiles/warehouse-operations/warehouse-<mode>-app # Ingress: helm upgrade --install wh deploy/helm/industry-profiles/warehouse-operations/warehouse-<mode>-app \ -n <namespace> --create-namespace \ --set global.vssIngress.enabled=true \ --set global.externalHost=<NODE_IP> \ --set global.storageClass=<STORAGE_CLASS> \ --set vios.vss-vios-nvstreamer.syncFileCount=<effective-streams> \ ... \ -f values-stream-cap.generated.yaml # dernier : gagne sur bp-configurator.env # NodePort: helm upgrade --install wh deploy/helm/industry-profiles/warehouse-operations/warehouse-<mode>-app \ -n <namespace> --create-namespace \ -f deploy/helm/industry-profiles/warehouse-operations/warehouse-<mode>-app/values-nodeport.yaml \ --set global.storageClass=<STORAGE_CLASS> \ --set vios.vss-vios-nvstreamer.syncFileCount=<effective-streams> \ -f values-stream-cap.generated.yaml # dernier : gagne sur bp-configurator.env...sont les overrides secrets/URL restants de l'étape 6 — voirreferences/streams.md.-f values-stream-cap.generated.yamldoit être le dernier-fdans la commande — c'est ce qui le fait gagner surbp-configurator.env(plusieurs fichiers-ffusionnent dans l'ordre donné, le dernier gagne par clé de top-level). Cela inclut venir aprèsvalues-nodeport.yamldans le cas NodePort et après chaque autre-fdans les deux cas.--setne suit pas cette règle : Helm applique toujours--setaprès chaque fichier-findépendamment de la position en ligne de commande, donc un--setégaré surbp-configurator.envici remporterait toujours quoi qu'il en soit — l'étape 4 devrait déjà avoir converti tout tel override en un fichier de valeurs, pas l'avoir laissé inline. -
Validation post-installation — confirmez que les pods se lèvent réellement avant de déclarer le succès ; voir
warehouse-<mode>-app/README.md§Post-install validation, mais n'exécutez pas sonkubectl get pods -w/port-forwardverbatim — ceux-ci se bloquent éternellement. Utilisezkubectl wait --for=condition=Ready pod --all -n <namespace> --timeout=5met unport-forwarden arrière-plan à la place. -
Réexécutez le script chaque fois que
NUM_STREAMSou le GPU cible change — le fichier de valeurs-override n'est pas suivi automatiquement ; régénérez ethelm upgradeaprès un changement matériel.
Prérequis
- Cluster Kubernetes accessible via
kubectl, tous les nœudsReady. - NVIDIA GPU Operator installé, pour que les nœuds rapportent
nvidia.com/gpucomme allocatable. - StorageClass présent pour les PVCs VST/Elasticsearch (
global.storageClass). - Helm 3.x et kubectl.
- Clé API NGC pour le secret d'extraction d'images et le job de téléchargement de modèles/données d'application.
- Contrôleur ingress installé si utilisant ingress (voir la section « No ingress controller: NodePort » du README du chart pour l'alternative).
- Serveur TURN pour la lecture WebRTC hors-cluster (
global.turnServerUrl).
Détail complet, valeurs, et commandes exactes : voir deploy/helm/industry-profiles/warehouse-operations/warehouse-<mode>-app/README.md §Prérequis (identique entre 2d/3d/mv3dt). Cette skill ajoute seulement l'étape stream-cap ; elle ne remplace pas la configuration du chart — le précheck à l'étape 1 est une passe de santé rapide, pas un substitut à la lecture de cette section au premier déploiement.