FEAT: Télémétrie agent — inventaire GPU détaillé (marque, modèle, VRAM, driver, température, backend) #84

Closed
opened 2026-08-12 10:16:26 +02:00 by nonobis · 1 comment
Owner

🎯 Contexte

Le GPU est la ressource mutualisée (tickets #72-77). L'entité Agent ne connaît que HasGpu (bool) + GpuType (enum None/Cuda/OpenVino…). Il faut l'inventaire complet pour l'ordonnanceur (#74) : marque, modèle exact, VRAM, driver, température, encodage (NVENC/QSV/VAAPI), et le backend ONNX utilisable.

📚 Référence spec / décision

Décision : inventaire GPU multi-fournisseurs au démarrage + refresh, remonté au central.

  • NVIDIA : nvidia-smi --query-gpu=name,memory.total,driver_version,temperature.gpu,utilization.gpu,pci.bus_id (dans le conteneur si nvidia-container-toolkit — ticket #77)
  • AMD : /sys/class/drm/card*/device/ (vendor/device IDs → nom), rocm-smi si dispo, HSA_OVERRIDE_GFX_VERSION
  • Intel / iGPU : /sys/class/drm/card*/device/ + vainfo (VAAPI) — modèle, driver i915, encodage QSV
  • Champs : GpuVendor, GpuModel, VramBytes, DriverVersion, TemperatureCelsius, UtilizationPercent, Backend (Cuda/Rocm/Vaapi/Cpu), EncoderSupport (NVENC/QSV/VAAPI), IsHealthy
  • Multi-GPU : une liste (une machine peut avoir 2× RTX 3090 ou un iGPU + une carte dédiée)

🔍 État actuel (vérifié dans le code)

Agent : HasGpu, GpuType (enum) uniquement. Aucun collecteur GPU. FrameAnalyzerService n'a pas de backend ONNX GPU branché (ticket #2). Le compose ne monte aucun device GPU (ticket #77). Le heartbeat ne transporte pas de détails GPU.

🧩 À faire

  • Collecteur GpuInventoryProvider : détection multi-fournisseurs (nvidia-smi, sysfs drm, vainfo, rocm-smi) avec fallback silencieux
  • Mapper vendor/device IDs sysfs → noms lisibles (base de données PCI IDs embarquée ou lspci -nn)
  • Entité Agent + migration (AddAgentGpuInventory) : liste de GPU (JSON structuré ou table AgentGpu)
  • Heartbeat : transporter l'inventaire + métriques live GPU (temp, util%) — refresh périodique
  • Alimenter l'ordonnanceur (#74) : capacité de traitement estimée (ex. EstimatedThroughputJobsPerMin) utilisable pour le routage
  • UI Admin : section GPU par agent (badge vendor, modèle, VRAM, temp, util, backend ONNX)
  • Tests : parsing nvidia-smi (fixture), sysfs AMD/Intel, absence GPU → None

🧪 Critères d'acceptation

  • Un agent avec RTX 3090 déclare : vendor Nvidia, modèle « NVIDIA GeForce RTX 3090 », 24576 MB VRAM, driver, temp, util, backend Cuda
  • Un agent iGPU Intel déclare : vendor Intel, modèle (ex. UHD Graphics 630), VAAPI, encodage QSV
  • Une machine à 2 GPU déclare les deux (liste)
  • Sans GPU : inventaire vide, pas de crash, HasGpu=false
  • make test vert

📁 Fichiers concernés

src/Heimdall.Agent/Services/GpuInventoryProvider.cs (nouveau), src/Heimdall.Domain/Entities/Agent.cs (+ AgentGpu si table), src/Heimdall.Infrastructure/Data/Migrations/, src/Heimdall.Web/Pages/Agents/AgentDetail.razor, src/Heimdall.Application/Services/IAnalysisScheduler.cs (consommation), tests/

⚠️ Impact

Dépend du ticket #77 (accès GPU au conteneur) pour la détection complète ; sans devices montés, l'inventaire reste vide/CPU — comportement attendu et documenté.

📝 Notes

C'est la donnée de base de l'ordonnanceur inter-sites (#74) : sans VRAM/driver/charge fiables, la mutualisation GPU ne peut pas router correctement.


Maquette

Ce ticket est couvert par la maquette du ticket #86 — UI Admin — page inventaire matériel agent (pièce maîtresse du lot télémétrie) : la section « Inventaire » de #86 maquette l'affichage des métriques et specs correspondantes (voir #86, section Maquette).

  • Maquette de référence : #86 (PNG + README attachés)
  • Application Penpot : différée (plugin MCP non connecté)
## 🎯 Contexte Le GPU est la ressource mutualisée (tickets #72-77). L'entité Agent ne connaît que `HasGpu` (bool) + `GpuType` (enum None/Cuda/OpenVino…). Il faut l'inventaire complet pour l'ordonnanceur (#74) : marque, modèle exact, VRAM, driver, température, encodage (NVENC/QSV/VAAPI), et le backend ONNX utilisable. ## 📚 Référence spec / décision Décision : inventaire GPU multi-fournisseurs au démarrage + refresh, remonté au central. - **NVIDIA** : `nvidia-smi --query-gpu=name,memory.total,driver_version,temperature.gpu,utilization.gpu,pci.bus_id` (dans le conteneur si nvidia-container-toolkit — ticket #77) - **AMD** : `/sys/class/drm/card*/device/` (vendor/device IDs → nom), `rocm-smi` si dispo, `HSA_OVERRIDE_GFX_VERSION` - **Intel / iGPU** : `/sys/class/drm/card*/device/` + `vainfo` (VAAPI) — modèle, driver i915, encodage QSV - Champs : `GpuVendor`, `GpuModel`, `VramBytes`, `DriverVersion`, `TemperatureCelsius`, `UtilizationPercent`, `Backend` (Cuda/Rocm/Vaapi/Cpu), `EncoderSupport` (NVENC/QSV/VAAPI), `IsHealthy` - Multi-GPU : une liste (une machine peut avoir 2× RTX 3090 ou un iGPU + une carte dédiée) ## 🔍 État actuel (vérifié dans le code) `Agent` : `HasGpu`, `GpuType` (enum) uniquement. Aucun collecteur GPU. `FrameAnalyzerService` n'a pas de backend ONNX GPU branché (ticket #2). Le compose ne monte aucun device GPU (ticket #77). Le heartbeat ne transporte pas de détails GPU. ## 🧩 À faire - [ ] Collecteur `GpuInventoryProvider` : détection multi-fournisseurs (nvidia-smi, sysfs drm, vainfo, rocm-smi) avec fallback silencieux - [ ] Mapper vendor/device IDs sysfs → noms lisibles (base de données PCI IDs embarquée ou `lspci -nn`) - [ ] Entité `Agent` + migration (`AddAgentGpuInventory`) : liste de GPU (JSON structuré ou table `AgentGpu`) - [ ] Heartbeat : transporter l'inventaire + métriques live GPU (temp, util%) — refresh périodique - [ ] Alimenter l'ordonnanceur (#74) : capacité de traitement estimée (ex. `EstimatedThroughputJobsPerMin`) utilisable pour le routage - [ ] UI Admin : section GPU par agent (badge vendor, modèle, VRAM, temp, util, backend ONNX) - [ ] Tests : parsing nvidia-smi (fixture), sysfs AMD/Intel, absence GPU → None ## 🧪 Critères d'acceptation - [ ] Un agent avec RTX 3090 déclare : vendor Nvidia, modèle « NVIDIA GeForce RTX 3090 », 24576 MB VRAM, driver, temp, util, backend Cuda - [ ] Un agent iGPU Intel déclare : vendor Intel, modèle (ex. UHD Graphics 630), VAAPI, encodage QSV - [ ] Une machine à 2 GPU déclare les deux (liste) - [ ] Sans GPU : inventaire vide, pas de crash, `HasGpu=false` - [ ] `make test` vert ## 📁 Fichiers concernés src/Heimdall.Agent/Services/GpuInventoryProvider.cs (nouveau), src/Heimdall.Domain/Entities/Agent.cs (+ AgentGpu si table), src/Heimdall.Infrastructure/Data/Migrations/, src/Heimdall.Web/Pages/Agents/AgentDetail.razor, src/Heimdall.Application/Services/IAnalysisScheduler.cs (consommation), tests/ ## ⚠️ Impact Dépend du ticket #77 (accès GPU au conteneur) pour la détection complète ; sans devices montés, l'inventaire reste vide/CPU — comportement attendu et documenté. ## 📝 Notes C'est la donnée de base de l'ordonnanceur inter-sites (#74) : sans VRAM/driver/charge fiables, la mutualisation GPU ne peut pas router correctement. --- ## Maquette Ce ticket est couvert par la maquette du ticket **#86 — UI Admin — page inventaire matériel agent** (pièce maîtresse du lot télémétrie) : la section « Inventaire » de #86 maquette l'affichage des métriques et specs correspondantes (voir #86, section Maquette). - Maquette de référence : #86 (PNG + README attachés) - Application Penpot : différée (plugin MCP non connecté)
Author
Owner

Maquette : couverte par le ticket #86 (inventaire matériel agent) — section ## Maquette ajoutée au corps.

Maquette : couverte par le ticket #86 (inventaire matériel agent) — section ## Maquette ajoutée au corps.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#84
No description provided.