docs(poc): share dgx spark readiness context
This commit is contained in:
207
docs/POC/MENAGE_PRE_POC_2026-05-29.md
Normal file
207
docs/POC/MENAGE_PRE_POC_2026-05-29.md
Normal file
@@ -0,0 +1,207 @@
|
||||
# Ménage pré-POC — Plan d'exécution
|
||||
|
||||
**Date** : 2026-05-29
|
||||
**Objectif** : rendre le projet `rpa_vision_v3` propre, lisible et portable sur DGX Spark avant déploiement clinique J+15.
|
||||
**Scénario retenu** : **médian** — tri code/tests/docs + archivage modules orphelins, sans ajout de nouveaux tests POC critiques (dette POC acceptée).
|
||||
|
||||
## Photo de départ
|
||||
|
||||
| Élément | Valeur |
|
||||
|---------|--------|
|
||||
| Taille totale | 112 Go |
|
||||
| Fichiers Python | 44 172 |
|
||||
| Tests | 273 fichiers, ~98 K lignes |
|
||||
| Markdown | 1 149 fichiers (160 racine `docs/`) |
|
||||
| Modules `core/` orphelins | 21 / 41 |
|
||||
| Git non commité au démarrage | 79 untracked + 49 modifiés |
|
||||
|
||||
## Décisions validées (2026-05-29)
|
||||
|
||||
1. **`agent_v0/agent_v1/` (client Windows Léa) sort du repo principal** → repo dédié `agent_v1_windows_client`. Cycle de release indépendant (déjà géré par SCP auto `feedback_scp_auto_modif_client_windows`). Le DGX ne le porte pas.
|
||||
2. **Tests POC critiques manquants** (ollama_client, vlm_config, dialog_handler) **non ajoutés en POC** — dette POC explicite, chantier post-POC.
|
||||
3. **Politique archivage** : branche dédiée `cleanup/pre-poc-2026-05-29`, commit unique par phase, rollback possible. Pas de suppression bourrine — tout est archivé dans `archive/` ou `_legacy/` selon la nature.
|
||||
4. **Filtrage transfert DGX** : `data/` (27 Go RGPD), `logs/`, `htmlcov/`, `_archive/`, `archive/`, `output/`, venvs, `agent_rust/`, `models/*` lourds **ne partent pas** sur DGX.
|
||||
|
||||
## Plan d'exécution — 9-10 j-h sur 15 j calendrier
|
||||
|
||||
Branche : `cleanup/pre-poc-2026-05-29`
|
||||
Commits : un par phase avec préfixe `chore(cleanup):`
|
||||
|
||||
### Phase F — Git cleanup (1 j) — **À FAIRE EN PREMIER**
|
||||
|
||||
Pré-requis avant tout autre tri. État : 79 untracked + 49 modifiés.
|
||||
|
||||
- [ ] `git status --short` → catégoriser : à commit, à stash, à supprimer
|
||||
- [ ] Commit le pertinent (1 ou plusieurs commits thématiques)
|
||||
- [ ] Stash l'expérimental sur branche dédiée `experimental/<topic>`
|
||||
- [ ] Supprimer fichiers morts confirmés
|
||||
- [ ] `pending_uncommitted_files.md` à jour ou supprimé après tri
|
||||
|
||||
### Phase A — Filtrage transfert DGX (0,5 j)
|
||||
|
||||
- [ ] Créer `.dgxignore` ou `tar --exclude-from=`:
|
||||
- `data/`, `logs/`, `htmlcov/`, `output/`, `_archive/`, `archive/`
|
||||
- `venv_v3/`, `.venv/`, `node_modules/`
|
||||
- `agent_rust/` (Rust pas dans le POC)
|
||||
- `models/` sauf liste explicite POC
|
||||
- `*.pyc`, `__pycache__/`, `.pytest_cache/`, `.ruff_cache/`, `.vite/`
|
||||
- [ ] Test tarball local : mesurer taille résultante (cible < 5 Go)
|
||||
|
||||
### Phase B — Code `core/` orphelin (2-3 j)
|
||||
|
||||
Cible : `archive/core_v3_projections_2026-05-29/`
|
||||
|
||||
Modules à archiver (21) : `analytics`, `capture`, `coaching`, `cognition`, `corrections`, `data`, `evaluation`, `extraction`, `gpu`, `healing`, `interfaces`, `monitoring`, `persistence`, `precision`, `security`, `supervision`, `system`, `training`, `variants`, `visual`
|
||||
|
||||
Méthode :
|
||||
- [ ] Pour chaque module : `grep -r "from core.<module>" --include="*.py" .` → vérifier zéro import depuis points d'entrée actifs (api_stream, replay_engine, workflow_pipeline, VWB backend)
|
||||
- [ ] Documenter dans `archive/core_v3_projections_2026-05-29/README.md` : raison d'archivage, modules dépendants éventuels, plan de réintégration possible
|
||||
- [ ] `git mv` pour préserver l'historique
|
||||
- [ ] Lancer fast suite → vérifier rien n'est cassé
|
||||
|
||||
Modules **gardés** (17 actifs) : `anonymisation`, `auth`, `detection`, `embedding`, `execution`, `federation`, `graph`, `grounding`, `knowledge`, `learning`, `llm`, `matching`, `models`, `pipeline`, `validation`, `vision`, `workflow`
|
||||
|
||||
### Phase C — Doublons code (1-1,5 j)
|
||||
|
||||
- [ ] **Consolider `config.py`** :
|
||||
- Source de vérité : `core/config.py`
|
||||
- Supprimer `agent_v0/config.py` (58 L), import depuis core
|
||||
- `agent_v0/agent_v1/config.py` (101 L) → suit phase H (externalisation)
|
||||
- [ ] **Fusionner models orphelins** :
|
||||
- `core/corrections/models.py` (480 L) → archive (corrections est orphelin)
|
||||
- `core/system/models.py` (340 L) → archive (system est orphelin)
|
||||
- Pas de fusion nécessaire si les deux partent en archive — vérifier qu'aucun module actif ne les importe
|
||||
- [ ] **Sortir `agent_v0/agent_v1/`** vers repo dédié (voir phase H)
|
||||
|
||||
### Phase D — Tests (2 j, sans ajout)
|
||||
|
||||
- [ ] Diagnostic full : `pytest --collect-only 2>&1 | tee /tmp/pytest_collect.log` → identifier import errors, xfail cascade
|
||||
- [ ] Archiver tests orphelins → `archive/tests_orphan_2026-05-29/` :
|
||||
- `tests/unit/test_cognition_dataclasses.py`
|
||||
- `tests/unit/test_learning_pack.py`
|
||||
- `tests/unit/test_pii_blur.py`
|
||||
- `tests/unit/test_extraction_engine.py`
|
||||
- `tests/unit/test_process_mining_bridge.py` (xfail)
|
||||
- `tests/unit/test_circular_imports.py` (xfail)
|
||||
- `tests/property/test_analytics_properties.py` (620 L xfail)
|
||||
- [ ] Supprimer tests cassés irrécupérables :
|
||||
- `tests/test_cross_frame_cache.py`
|
||||
- `tests/test_visual_rpa_checkpoint.py` (661 L, imports `core.visual` manquants)
|
||||
- [ ] À investiguer avant action :
|
||||
- `tests/property/test_self_healing_properties.py` (~450 L, healing orphelin)
|
||||
- 4 fichiers `test_learning_*.py` (~800 L, learning module statut à confirmer)
|
||||
- [ ] Valider fast suite reste verte : `pytest tests/test_pipeline_e2e.py tests/test_phase0_integration.py -q`
|
||||
- [ ] Documenter dette POC dans `docs/POC/DETTE_POC.md` : 3 tests manquants (ollama_client, vlm_config, dialog_handler) à ajouter post-POC
|
||||
|
||||
### Phase E — Docs (1 j)
|
||||
|
||||
Cible structure DGX :
|
||||
```
|
||||
docs/
|
||||
├─ POC/ (gardé — actif)
|
||||
├─ architecture/ (gardé)
|
||||
├─ reference/ (gardé)
|
||||
├─ guides/ (gardé)
|
||||
├─ README.md, STATUS.md, CI_SETUP.md, OLLAMA_INTEGRATION.md, PLAYBOOK_DSI_RSSI.md
|
||||
└─ archive/
|
||||
├─ audits/ (17 AUDIT_*, BENCH_*, ANALYSE_*)
|
||||
├─ sessions/ (12 HANDOFF_*, SESSION_*)
|
||||
├─ plans/ (10 PLAN_*, VISION_*, ROADMAP_*)
|
||||
├─ tasks-logs/ (71 TACHE_*, PHASE_*, RESOLUTION_*)
|
||||
├─ brouillons/ (44 divers)
|
||||
└─ coordination-logs/ (567 fichiers coordination/)
|
||||
```
|
||||
|
||||
- [ ] Script de tri par préfixe (`AUDIT_*` → `archive/audits/`, etc.)
|
||||
- [ ] Déduplication doublons identifiés (3 groupes : CORRECTION_FINALE_TYPESCRIPT_VWB, RESOLUTION_FINALE_PALETTE, RESUME_FINAL_PHASE_2)
|
||||
- [ ] QA liens internes (sed sur les chemins déplacés)
|
||||
|
||||
### Phase G — Requirements ARM (0,5 j)
|
||||
|
||||
- [ ] Désépingler tous les `nvidia-*-cu12` du `requirements.txt`
|
||||
- [ ] Créer `requirements-server.txt` (sans PyQt5, mss, pyautogui, pynput, evdev, python-xlib)
|
||||
- [ ] Garder `requirements-dev.txt` pour le poste Dom
|
||||
- [ ] Vérifier coherence avec `setup.py`
|
||||
|
||||
### Phase H — Externalisation `agent_v0/agent_v1/` (incluse dans 1 j de Phase C)
|
||||
|
||||
- [ ] Créer nouveau repo Gitea `agent_v1_windows_client`
|
||||
- [ ] `git subtree split --prefix=agent_v0/agent_v1 -b extract-agent-v1` pour préserver l'historique
|
||||
- [ ] Push vers nouveau repo
|
||||
- [ ] Supprimer `agent_v0/agent_v1/` du repo principal
|
||||
- [ ] Mettre à jour `feedback_scp_auto_modif_client_windows` (chemin source change)
|
||||
- [ ] Mettre à jour `tests/integration/conftest.py` (le workaround sur `agent_v0` n'est plus nécessaire)
|
||||
|
||||
### Validation finale (0,5 j)
|
||||
|
||||
- [ ] Fast suite verte : `pytest tests/test_pipeline_e2e.py tests/test_phase0_integration.py tests/integration/test_stream_processor.py -m "not slow" -q`
|
||||
- [ ] Smoke test pipeline complet (mockup local)
|
||||
- [ ] Tarball test avec `.dgxignore` → mesure taille
|
||||
- [ ] PR ou merge sur main avec changelog clair
|
||||
|
||||
## Branche et commits
|
||||
|
||||
```
|
||||
git checkout -b cleanup/pre-poc-2026-05-29
|
||||
|
||||
# Phase F : Git cleanup
|
||||
git commit -m "chore(cleanup): trier 79 untracked + 49 modifiés pré-POC"
|
||||
|
||||
# Phase A : Filtrage transfert
|
||||
git commit -m "chore(cleanup): ajouter .dgxignore pour transfert DGX"
|
||||
|
||||
# Phase B : core orphelins
|
||||
git commit -m "chore(cleanup): archiver 21 modules core orphelins vers archive/core_v3_projections_2026-05-29"
|
||||
|
||||
# Phase C : Doublons
|
||||
git commit -m "chore(cleanup): consolider config.py + sortir agent_v1 vers repo dédié"
|
||||
|
||||
# Phase D : Tests
|
||||
git commit -m "chore(cleanup): archiver tests orphelins + supprimer tests cassés irrécupérables"
|
||||
|
||||
# Phase E : Docs
|
||||
git commit -m "chore(cleanup): restructurer docs/ en archive/ par catégorie"
|
||||
|
||||
# Phase G : Requirements
|
||||
git commit -m "chore(cleanup): désépingler nvidia-cu12 + split requirements-server.txt"
|
||||
|
||||
# Validation
|
||||
git commit -m "chore(cleanup): valider fast suite + tarball DGX < 5Go"
|
||||
```
|
||||
|
||||
Merge sur `main` à la fin uniquement si validation OK. Si problème → rollback ciblé par phase (`git revert <hash>`).
|
||||
|
||||
## Rollback plan
|
||||
|
||||
- Branche `cleanup/pre-poc-2026-05-29` reste intacte pendant le POC
|
||||
- Modules archivés sont `git mv`, historique préservé → restauration en 1 commit
|
||||
- Tag git `pre-cleanup-2026-05-29` posé sur `main` AVANT la branche cleanup
|
||||
- En cas de besoin de récupérer un orphelin : `git checkout <tag> -- core/<module>`
|
||||
|
||||
## Dette POC explicite
|
||||
|
||||
À traiter après stabilisation POC clinique :
|
||||
|
||||
1. **Tests POC critiques manquants** : ollama_client (1 → 5+), vlm_config (1 → 4+), dialog_handler (0 → 3+)
|
||||
2. **Modules orphelins** : revue cas par cas pour rebrancher ou supprimer définitivement
|
||||
3. **Refacto profond doublons models** : `core/corrections/models.py` vs `core/system/models.py` (si rebranchés post-POC)
|
||||
4. **Migration `OllamaClient` → `VLMClient` multi-backend** (cf. `PORTAGE_DGX_SPARK_2026-05-28` §3)
|
||||
|
||||
## Décisions
|
||||
|
||||
| # | Décision | Date |
|
||||
|---|----------|------|
|
||||
| 1 | Scénario médian retenu, ~9-10 j-h | 2026-05-29 |
|
||||
| 2 | `agent_v0/agent_v1/` sort dans repo dédié `agent_v1_windows_client` | 2026-05-29 |
|
||||
| 3 | Tests POC critiques (ollama_client, vlm_config, dialog_handler) acceptés en dette POC | 2026-05-29 |
|
||||
| 4 | Politique archivage : branche `cleanup/pre-poc-2026-05-29`, commit par phase, tag `pre-cleanup-2026-05-29` sur main | 2026-05-29 |
|
||||
| 5 | `data/`, `logs/`, `htmlcov/`, `archive/`, `_archive/`, `output/`, `agent_rust/`, `models/*` lourds ne partent pas sur DGX | 2026-05-29 |
|
||||
| 6 | 17 modules `core/*` gardés actifs, 21 archivés | 2026-05-29 |
|
||||
| 7 | `web_dashboard/` inclus dans le périmètre DGX — **interface de pilotage centrale** (admin modèles, prompts, supervision), pas un nice-to-have | 2026-05-29 |
|
||||
| 8 | Amina = source de vérité métier (codage médical) **uniquement**. Ne participe pas au code, au tri, au déploiement. Dom (+ assistant technique) exécute la transformation en programme | 2026-05-29 |
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- Quand démarrer ? (en parallèle de la prep DGX semaine 2026-06-01 ou avant ?)
|
||||
- Politique de tag : `pre-cleanup-2026-05-29` ou autre nomenclature préférée ?
|
||||
- `agent_chat/` (692 K, 7 678 L) : maintenu en POC ou archivé ? À trancher Phase B
|
||||
181
docs/POC/PORTAGE_DGX_SPARK_2026-05-28.md
Normal file
181
docs/POC/PORTAGE_DGX_SPARK_2026-05-28.md
Normal file
@@ -0,0 +1,181 @@
|
||||
# Portage RPA Vision V3 — Ubuntu x86 → NVIDIA DGX Spark ARM aarch64
|
||||
|
||||
**Date** : 2026-05-28
|
||||
**Contexte** : Dom reçoit un DGX Spark la semaine du 2026-06-01. La machine partira en clinique 15 jours plus tard pour héberger le POC. Document de référence pour cadrer le portage de la stack actuelle (Ubuntu x86_64 + RTX 5070) vers le DGX Spark.
|
||||
|
||||
---
|
||||
|
||||
## 1. Architecture cible POC
|
||||
|
||||
- **DGX Spark en clinique** : **headless**, inférence pure + APIs HTTP, **tout en containers Docker**.
|
||||
- **Pas de PyQt5, pas de capture/clic, pas de X11 côté serveur DGX**.
|
||||
- **Client Léa** reste sur PC Windows clinique (x86), inchangé.
|
||||
- Reverse proxy NPM (existant) gère TLS et exposition.
|
||||
|
||||
## 2. Specs DGX Spark — rappels critiques
|
||||
|
||||
| Élément | Valeur |
|
||||
|---------|--------|
|
||||
| SoC | GB10 Grace Blackwell (codesign MediaTek) |
|
||||
| CPU | 20 cores ARM (10× Cortex-X925 + 10× Cortex-A725) |
|
||||
| GPU | Blackwell, 6144 CUDA cores, **compute capability sm_121** |
|
||||
| RAM | 128 Go LPDDR5X **unifiée CPU+GPU** |
|
||||
| Bande passante mémoire | **273 Go/s** (plafond dur perf inférence) |
|
||||
| Stockage | 4 To NVMe |
|
||||
| Réseau | Wi-Fi 7, 10 GbE, ConnectX-7 2× QSFP 200 Gbps |
|
||||
| Conso | ~240 W typique, 300 W crête |
|
||||
| OS | **DGX OS 7 = Ubuntu 24.04 ARM64**, CUDA Toolkit 13.0, driver NVIDIA 580.126.09 |
|
||||
|
||||
**Points sensibles** :
|
||||
- `sm_120` est binaire-compat `sm_121` (confirmé ptrblck PyTorch). Donc **wheels PyTorch cu128 ARM suffisent**, pas obligation de passer cu13.
|
||||
- Mélanger CUDA 12.8 épinglé x86 et CUDA 13 préinstallé = source #1 d'erreurs `libcudart.so` rapportées sur les forums NVIDIA.
|
||||
|
||||
## 3. Moteur d'inférence — palmarès mai 2026
|
||||
|
||||
| Moteur | Statut Spark + VLM | Verdict J+15 |
|
||||
|--------|--------------------|--------------|
|
||||
| **Ollama** | Officiel NVIDIA, llama.cpp dessous. Bugs P0 sur certains modèles texte (`qwen2.5:7B` hang) | **GO POC** ✅ |
|
||||
| **vLLM** | Pas de container officiel arm64+sm_121 (issues #36821, #31128). Workarounds maison + memory leaks confirmés Qwen3-VL | NO-GO |
|
||||
| **TensorRT-LLM** | +2.5× annoncé CES 2026 mais engine build = heures, multi-modèle pénible | NO-GO démo, GO post-POC |
|
||||
| **NIM** | Pas de NIM VLM Spark dans catalogue mai 2026 (Qwen3-32B text only) | NO-GO |
|
||||
| **SGLang** | Issue #11658 non mergée, PTXAS crash sm_121a | NO-GO |
|
||||
| **llama-server (llama.cpp natif sm_121)** | Compile et tourne, GGUF Qwen2.5/3-VL OK, API OpenAI-compat, build NVIDIA officiel | GO (alternative prod si Ollama bugue) |
|
||||
| **Docker Model Runner** | Wrapper, pas de VLM dans catalogue | NO-GO |
|
||||
|
||||
**Décision POC** : garder **Ollama** sur Spark. Migration vers llama-server gardée comme **chantier post-POC** si Ollama instable en production.
|
||||
|
||||
## 4. Modèle VLM cible
|
||||
|
||||
| Modèle | Taille | Latence indicative | Verdict POC |
|
||||
|--------|--------|--------------------|-------------|
|
||||
| Qwen2.5-VL-7B | ~5 Go | ~1-2 s | Fallback éprouvé |
|
||||
| **Qwen3-VL-8B Q5_K_M** | ~7 Go | ~1-2 s | **Cible POC** (code déjà préparé) |
|
||||
| Qwen3-VL-32B Q4_K_M | ~20 Go | ~3-5 s | À tester J+3 pour mesurer le gain qualité |
|
||||
|
||||
**Modèles à bannir sur Spark** :
|
||||
- `gemma4` (segfault au chargement, Ollama issue #15318)
|
||||
- `medgemma` vision (broken, Ollama issue #10970)
|
||||
|
||||
Code déjà préparé pour Qwen3-VL :
|
||||
- `core/detection/vlm_config.py:136-148` (`is_thinking_model()`)
|
||||
- `core/detection/ollama_client.py:189-204` (workaround prefill thinking auto)
|
||||
- Note `vlm_config.py:32` documente l'échec antérieur Qwen3-VL sur Ollama 0.18 (think:false ignoré). **À retester sur Ollama 0.21+ sur Spark.**
|
||||
|
||||
## 5. Compatibilité wheels Python — résumé
|
||||
|
||||
### À installer via index PyTorch ARM
|
||||
```
|
||||
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
|
||||
```
|
||||
|
||||
### Wheels ARM disponibles sur PyPI (RAS)
|
||||
`faiss-cpu`, `opencv-python`, `transformers`, `accelerate`, `timm`, `open_clip_torch`, `onnx` (CPU), `uvloop`, `pypdfium2`, `lxml`, `h5py`, `protobuf`, `pyclipper`, `shapely`, `python-doctr`
|
||||
|
||||
### Risques à traiter
|
||||
|
||||
| Paquet | Risque | Mitigation |
|
||||
|--------|--------|-----------|
|
||||
| `nvidia-*-cu12` épinglés x86 | Conflit avec CUDA 13 DGX OS | **Désépingler** tous les `nvidia-*-cu12` du `requirements.txt`, laisser pip résoudre |
|
||||
| `triton==3.5.1` | PTXAS embarqué peut crasher avec CUDA 13 | Rester cu128, OU `export TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas` |
|
||||
| `onnxruntime-gpu` | Pas de wheel PyPI ARM+CUDA | **Vérifier si vraiment utilisé** ; sinon supprimer. Sinon wheel HF non-officiel (`Jay0515/onnxruntime-gpu-aarch64-cuda13-sm121`) ou compile source |
|
||||
| `PyQt5`, `mss`, `pyautogui`, `pynput`, `evdev`, `python-xlib` | Pas/peu utilisables headless ARM | **Non bloquant** car non chargés sur DGX en mode container inférence pure. À garder hors image Docker server |
|
||||
|
||||
## 6. Front Docker arm64 — RAS
|
||||
|
||||
```dockerfile
|
||||
# Build Vite
|
||||
FROM node:22-slim AS build
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN --mount=type=cache,target=/root/.npm npm ci
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Serve
|
||||
FROM nginx:alpine
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
```
|
||||
|
||||
- `node:22-slim` (éviter `alpine` à cause du piège musl/Rollup esbuild).
|
||||
- `python:3.12-slim` pour le backend Flask.
|
||||
- **Pas de `platform: linux/arm64`** dans docker-compose : DGX est natif aarch64, Docker prend la bonne variante du manifest multi-arch.
|
||||
- BuildKit obligatoire (`DOCKER_BUILDKIT=1`).
|
||||
|
||||
Pas de deps natives JS connues (`sharp`, `canvas`, `node-gyp` absents).
|
||||
|
||||
## 7. transformers stack — à porter sur Spark
|
||||
|
||||
Modèles HuggingFace conservés :
|
||||
- `InfiX-ai/InfiGUI-G1-3B` (4-bit) → `core/grounding/server.py`
|
||||
- `google/owlv2-base-patch16-ensemble` → `core/detection/owl_detector.py`
|
||||
- `cckevinn/SeeClick` → `core/detection/seeclick_adapter.py`
|
||||
- CLIP embedder → `core/embedding/clip_embedder.py`
|
||||
- YOLO `.pt` SOM Engine → `core/detection/som_engine.py` (state_dict portable, à vérifier au chargement)
|
||||
|
||||
Dépendent de PyTorch ARM cu128 → installables, mais bench perf à valider.
|
||||
|
||||
## 8. Chiffrage effort portage
|
||||
|
||||
| Phase | Durée | Détail |
|
||||
|-------|-------|--------|
|
||||
| J+1-2 : Env Spark | 2 j | CUDA 12.8 ARM, PyTorch cu128, Ollama, deps Python, sanity-check |
|
||||
| J+3-4 : Containers Docker arm64 | 2 j | Backend Flask + front Vite + nginx + compose, validation pipeline complet |
|
||||
| J+5-6 : Bench Qwen3-VL + calibration | 2 j | Test prefill thinking, comparaison 8B/32B, validation 16 cas LeaBench |
|
||||
| Marge | 8 j | Intégration mockup clinique, E2E, debug, recettes |
|
||||
|
||||
**Total effort dev : 4-6 jours homme effectifs**, dans le budget des 15 jours.
|
||||
|
||||
## 9. Plan B explicite
|
||||
|
||||
Si à J+5 :
|
||||
- Ollama hang sur Qwen3-VL → bascule llama-server natif (1 j supplémentaire)
|
||||
- Spark instable globalement → **maintenir RTX 5070 x86 chez le client** (boîtier + UPS + tunnel Tailscale), migrer Spark après stabilisation Ollama 0.21+.
|
||||
|
||||
**La démo clinique n'est pas négociable. Le DGX Spark est négociable.**
|
||||
|
||||
## 10. Décisions consignées
|
||||
|
||||
| # | Décision | Date |
|
||||
|---|----------|------|
|
||||
| 1 | DGX Spark headless, tout en containers, pas de GUI Qt côté serveur | 2026-05-28 |
|
||||
| 2 | Ollama gardé sur Spark pour POC, migration llama-server post-POC | 2026-05-28 |
|
||||
| 3 | Cible Qwen3-VL-8B Q5_K_M, fallback Qwen2.5-VL-7B, test 32B en J+3 | 2026-05-28 |
|
||||
| 4 | Désépingler `nvidia-*-cu12` du `requirements.txt` avant install ARM | 2026-05-28 |
|
||||
| 5 | Plan B = maintenir RTX 5070 x86 si Spark instable J+5 | 2026-05-28 |
|
||||
| 6 | transformers stack conservé (InfiGUI, OWLv2, SeeClick, CLIP) | 2026-05-28 |
|
||||
|
||||
## 11. Questions ouvertes
|
||||
|
||||
- `onnxruntime-gpu` est-il utilisé en runtime ? (audit code à faire avant Spark)
|
||||
- Stratégie modèle 8B vs 32B : à trancher après bench J+3
|
||||
- Reverse proxy NPM en clinique : nouveau déploiement ou réutilisation existant ?
|
||||
- Backups / snapshots du DGX en clinique : politique à définir
|
||||
- Tunnel admin distant (Tailscale ?) : à valider avec DSI clinique
|
||||
|
||||
## 12. Sources clés
|
||||
|
||||
### DGX Spark
|
||||
- [DGX Spark product page](https://www.nvidia.com/en-us/products/workstations/dgx-spark/)
|
||||
- [DGX Spark User Guide](https://docs.nvidia.com/dgx/dgx-spark/dgx-spark.pdf)
|
||||
- [DGX OS 7 User Guide](https://docs.nvidia.com/dgx/dgx-os-7-user-guide/dgx-os-7-user-guide.pdf)
|
||||
- [CUDA install pitfalls Ubuntu 24.04 ARM64](https://forums.developer.nvidia.com/t/dgx-spark-cuda-install-pitfalls-on-ubuntu-24-04-arm64-fixed/349881)
|
||||
- [SM121 software support thread](https://forums.developer.nvidia.com/t/dgx-spark-sm121-software-support-is-severely-lacking-official-roadmap-needed/357663)
|
||||
|
||||
### Inférence / VLM
|
||||
- [Ollama Blog — DGX Spark](https://ollama.com/blog/nvidia-spark)
|
||||
- [Choosing an Inference Engine on DGX Spark (Amegilla, mars 2026)](https://medium.com/sparktastic/choosing-an-inference-engine-on-dgx-spark-8a312dfcaac6)
|
||||
- [Stack llama-swap + LiteLLM + vLLM + llama.cpp + Ollama](https://forums.developer.nvidia.com/t/running-a-full-llm-stack-on-dgx-spark-gb10-your-application-litellm-llama-swap-vllm-llama-cpp-ollama/367580)
|
||||
- [Arm Learning Path — llama.cpp GPU GB10](https://learn.arm.com/learning-paths/laptops-and-desktops/dgx_spark_llamacpp/2_gb10_llamacpp_gpu/)
|
||||
- [vLLM issue #36821 — No sm_121 aarch64](https://github.com/vllm-project/vllm/issues/36821)
|
||||
- [Ollama issue #15318 — gemma4 segfault Spark](https://github.com/ollama/ollama/issues/15318)
|
||||
- [Ollama issue #10970 — medgemma vision broken](https://github.com/ollama/ollama/issues/10970)
|
||||
|
||||
### Python ARM
|
||||
- [PyTorch forums — DGX Spark CUDA 13 SM121](https://discuss.pytorch.org/t/dgx-spark-gb10-cuda-13-0-python-3-12-sm-121/223744)
|
||||
- [natolambert/dgx-spark-setup](https://github.com/natolambert/dgx-spark-setup)
|
||||
- [HF — onnxruntime-gpu-aarch64-cuda13-sm121](https://huggingface.co/Jay0515/onnxruntime-gpu-aarch64-cuda13-sm121)
|
||||
- [PyQt5 issue — wheels aarch64 manquants](https://github.com/PyQt5/PyQt/issues/150)
|
||||
|
||||
### Front Docker ARM
|
||||
- [Vite issue #15167 — Rollup arm64 multi-platform](https://github.com/vitejs/vite/issues/15167)
|
||||
- [DGX Spark porting guide — compilation](https://docs.nvidia.com/dgx/dgx-spark-porting-guide/porting/compilation.html)
|
||||
29
docs/POC/README.md
Normal file
29
docs/POC/README.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# POC — Préparation déploiement clinique
|
||||
|
||||
Dossier de consignation des décisions, arbitrages et notes liés au passage **dev → POC/MVP** en vue du déploiement clinique sur **NVIDIA DGX Spark** (livraison semaine du 2026-06-01, mise en clinique J+15).
|
||||
|
||||
## Convention
|
||||
|
||||
- Un fichier par sujet, daté : `SUJET_AAAA-MM-JJ.md`
|
||||
- Ce dossier consigne des **décisions** et **chiffrages**, pas du code.
|
||||
- Chaque doc termine par une section *Décisions* et *Questions ouvertes*.
|
||||
- Mettre à jour cet index à chaque nouveau doc.
|
||||
|
||||
## Index des sujets
|
||||
|
||||
| Sujet | Doc | Statut |
|
||||
|-------|-----|--------|
|
||||
| Portage stack Ubuntu x86 → DGX Spark ARM aarch64 | [PORTAGE_DGX_SPARK_2026-05-28.md](PORTAGE_DGX_SPARK_2026-05-28.md) | Synthèse initiale validée |
|
||||
| Préparation réseau clinique (doc DSI) | [RESEAU_CLINIQUE_2026-05-28.md](RESEAU_CLINIQUE_2026-05-28.md) | V1, en attente arbitrages Dom + retour DSI |
|
||||
| Ménage pré-POC (tri code/tests/docs avant transfert DGX) | [MENAGE_PRE_POC_2026-05-29.md](MENAGE_PRE_POC_2026-05-29.md) | Plan validé scénario médian ~9-10 j-h, à exécuter |
|
||||
|
||||
## Calendrier indicatif
|
||||
|
||||
| Jalon | Date |
|
||||
|-------|------|
|
||||
| Livraison DGX Spark | semaine 2026-06-01 |
|
||||
| Validation env Spark (CUDA, PyTorch, Ollama, deps) | J+2 |
|
||||
| Containers Docker arm64 front/backend OK | J+4 |
|
||||
| Bench Qwen3-VL + calibration prefill | J+6 |
|
||||
| Intégration mockup clinique + tests E2E | J+8 → J+14 |
|
||||
| Mise en clinique | J+15 |
|
||||
284
docs/POC/RESEAU_CLINIQUE_2026-05-28.md
Normal file
284
docs/POC/RESEAU_CLINIQUE_2026-05-28.md
Normal file
@@ -0,0 +1,284 @@
|
||||
# Préparation réseau — Installation DGX Spark POC en clinique
|
||||
|
||||
**Date** : 2026-05-28
|
||||
**Destinataire** : Nicolas PORQUET — DSI externe, Hôpital privé Wallerstein, 14 Boulevard Javal, 33740 Arès
|
||||
**Émetteur** : Dom Bazin — porteur projet RPA Vision V3
|
||||
**Partenaire métier** : Dr Amina [Nom à confirmer] — cabinet médical DIM (Bordeaux). Contribue au volet codage médical. **Interlocuteur projet unique côté technique : Dom Bazin.**
|
||||
**Objet** : Demande de pré-requis réseau et sécurité pour l'installation d'une machine NVIDIA DGX Spark dans le cadre d'un POC de 3 mois à l'Hôpital privé Wallerstein.
|
||||
|
||||
---
|
||||
|
||||
## 1. Présentation du projet (résumé non-technique)
|
||||
|
||||
RPA Vision V3 est une solution d'automatisation 100 % vision qui assiste les TIM (Techniciens d'Information Médicale) dans la saisie de codes diagnostiques sur Easily Assure. L'assistant **Léa** s'exécute sur le PC du TIM (Windows existant, inchangé) et délègue la compréhension visuelle de l'écran à un serveur d'inférence (le DGX Spark), installé dans une salle technique de l'établissement.
|
||||
|
||||
**Objectifs du POC** :
|
||||
- Mesurer le gain de productivité TIM sur un périmètre pilote restreint (**≤ 5 TIM**, volume de dossiers à cadrer avec le référent métier de l'établissement)
|
||||
- Valider l'ergonomie et l'acceptation utilisateur
|
||||
- Vérifier l'intégration dans l'environnement IT de l'établissement
|
||||
|
||||
**Durée prévue** : 3 mois — possibilité de retrait à tout moment.
|
||||
|
||||
---
|
||||
|
||||
## 2. Description matérielle DGX Spark
|
||||
|
||||
| Élément | Spécification |
|
||||
|---------|---------------|
|
||||
| Modèle | NVIDIA DGX Spark (Founders Edition) |
|
||||
| Format | Boîtier compact bureau (~150 × 150 × 50 mm) |
|
||||
| Alimentation | 240 W typique, 300 W crête — prise C13 standard |
|
||||
| Réseau | 10 GbE + Wi-Fi 7 (Wi-Fi désactivé en clinique) |
|
||||
| Stockage | 4 To NVMe interne, chiffré au repos (LUKS) |
|
||||
| OS | DGX OS 7 (Ubuntu 24.04 LTS ARM64) — maintenu par NVIDIA |
|
||||
| Mises à jour OS | `unattended-upgrades` pour les correctifs de sécurité |
|
||||
| Antivirus / EDR | Compatible ClamAV. EDR du marché [À DÉFINIR avec DSI] |
|
||||
|
||||
**Sécurité physique** :
|
||||
- Machine à installer en salle technique fermée, accès limité.
|
||||
- Étiquetage avec contact responsable (Dom Bazin).
|
||||
- Pas d'accès USB en production (verrouillé via udev).
|
||||
|
||||
---
|
||||
|
||||
## 3. Description logicielle (services hébergés sur le DGX)
|
||||
|
||||
Tous les services tournent **en containers Docker isolés** sur le DGX. Aucune installation native côté OS hors stack NVIDIA / Docker / outils standards Ubuntu.
|
||||
|
||||
| Service | Container | Port interne | Exposition |
|
||||
|---------|-----------|--------------|-----------|
|
||||
| Reverse proxy TLS local (Caddy ou Traefik) | `proxy` | 443 | LAN clinique uniquement |
|
||||
| Frontend RPA (VWB React) | `frontend` | 80 (interne) | Via reverse proxy |
|
||||
| Backend RPA (Flask) | `backend` | 5002 (interne) | Via reverse proxy |
|
||||
| Streaming agent (Flask SocketIO) | `streaming` | 5005 (interne) | Via reverse proxy |
|
||||
| Dashboard supervision | `dashboard` | 5001 (interne) | Via reverse proxy |
|
||||
| Inférence VLM (Ollama / llama-server) | `ollama` | 11434 (interne) | **Jamais exposé**, accès local containers uniquement |
|
||||
|
||||
**Aucun service exposé en clair sur le LAN.** Toute communication entrante passe par 443/HTTPS avec authentification (Basic Auth + Bearer token applicatif).
|
||||
|
||||
---
|
||||
|
||||
## 4. Plan réseau souhaité
|
||||
|
||||
```
|
||||
┌─────────────────────────────┐
|
||||
│ Internet (sortie filtrée) │
|
||||
└──────────────┬──────────────┘
|
||||
│
|
||||
Pare-feu clinique
|
||||
│
|
||||
┌────────────────────────┴────────────────────────┐
|
||||
│ │
|
||||
│ LAN clinique — VLAN [À CONFIRMER] │
|
||||
│ │
|
||||
│ ┌──────────────────┐ ┌──────────────┐ │
|
||||
│ │ Poste TIM │ HTTPS │ DGX Spark │ │
|
||||
│ │ Windows + Léa │────────▶│ (headless) │ │
|
||||
│ │ (existant) │ :443 │ │ │
|
||||
│ └──────────────────┘ └──────────────┘ │
|
||||
│ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Pré-requis réseau demandés à la DSI
|
||||
|
||||
| Élément | Demande |
|
||||
|---------|---------|
|
||||
| Adressage | **1 IP fixe** (DHCP réservation par MAC ou statique) sur VLAN postes de travail ou VLAN dédié |
|
||||
| MAC | Communiquée à l'installation (étiquette boîtier) |
|
||||
| Hostname | `rpa-spark-01` (modifiable selon convention DSI) |
|
||||
| DNS interne | Résolution `rpa-spark-01.[domaine.interne]` |
|
||||
| Synchronisation horloge | Accès NTP (serveur clinique ou `pool.ntp.org`) |
|
||||
| Découverte | Pas de mDNS / Bonjour requis |
|
||||
|
||||
---
|
||||
|
||||
## 5. Flux entrants requis (LAN clinique → DGX Spark)
|
||||
|
||||
| Source | Destination | Port | Protocole | Usage |
|
||||
|--------|-------------|------|-----------|-------|
|
||||
| Postes TIM (Léa) | DGX Spark | 443 | TCP HTTPS | Accès apps web RPA (VWB, dashboard, API streaming) |
|
||||
| Postes admin clinique | DGX Spark | 22 | TCP SSH | Maintenance locale [optionnel, peut être supprimé] |
|
||||
|
||||
**Pas de flux entrant depuis Internet.** Le DGX n'expose aucun port public.
|
||||
|
||||
---
|
||||
|
||||
## 6. Flux sortants requis (DGX Spark → Internet)
|
||||
|
||||
Justification : maintenance, mises à jour, pull d'images Docker et de modèles d'IA. **Aucune donnée patient ne sort du DGX** (voir §8 Conformité).
|
||||
|
||||
### Whitelist FQDN demandée
|
||||
|
||||
| Domaine | Port | Usage |
|
||||
|---------|------|-------|
|
||||
| `archive.ubuntu.com`, `security.ubuntu.com` | 80, 443 | Mises à jour Ubuntu |
|
||||
| `ports.ubuntu.com` | 80, 443 | Paquets Ubuntu ARM64 |
|
||||
| `developer.download.nvidia.com`, `apt.nvidia.com` | 443 | Driver + CUDA NVIDIA |
|
||||
| `registry-1.docker.io`, `auth.docker.io`, `index.docker.io` | 443 | Images Docker |
|
||||
| `registry.ollama.ai` | 443 | Modèles d'inférence Ollama |
|
||||
| `huggingface.co`, `cdn-lfs.huggingface.co` | 443 | Modèles HuggingFace (poids ML) |
|
||||
| `github.com`, `objects.githubusercontent.com`, `raw.githubusercontent.com` | 443 | Code projet (déploiement / mise à jour) |
|
||||
| `pypi.org`, `files.pythonhosted.org` | 443 | Dépendances Python |
|
||||
| `pool.ntp.org` ou NTP clinique | 123 UDP | Synchronisation horloge |
|
||||
| Résolveur DNS clinique | 53 UDP/TCP | Résolution DNS |
|
||||
|
||||
### Flux sortant accès admin distant (selon option choisie §7)
|
||||
|
||||
| Option | Domaines / IP | Port | Usage |
|
||||
|--------|---------------|------|-------|
|
||||
| OpenVPN clinique | Concentrateur VPN désigné par la DSI | 1194 UDP ou 443 TCP | VPN entrant Dom → réseau clinique |
|
||||
| Reverse SSH bastion (repli) | IP fixe bastion Dom (à communiquer) | 22 ou 443 TCP | Tunnel SSH inversé |
|
||||
| Tailscale (alternative, si DSI valide) | `*.tailscale.com`, `controlplane.tailscale.com`, `derpN.tailscale.com` | 443 TCP, 3478/41641 UDP | Mesh VPN sortant |
|
||||
|
||||
---
|
||||
|
||||
## 7. Accès administrateur distant — options à arbitrer avec la DSI
|
||||
|
||||
Le porteur projet (Dom Bazin) doit pouvoir intervenir sur le DGX **depuis son poste de travail externe** pour : déployer les mises à jour applicatives, diagnostiquer les incidents, ajuster les modèles d'IA. **Aucune intervention sur les données patient à distance**.
|
||||
|
||||
Dom Bazin utilise habituellement **OpenVPN + SSH par certificat** dans le cadre de ses interventions sur infrastructures clientes. Cette pratique s'aligne sur les standards courants en milieu hospitalier et permet une intégration directe à la politique de la DSI.
|
||||
|
||||
| Option | Principe | Avantage DSI | Inconvénient | Préférence Dom |
|
||||
|--------|----------|--------------|--------------|----------------|
|
||||
| **A. OpenVPN clinique + SSH par certificat** | Dom devient utilisateur d'un tunnel OpenVPN existant ou monté pour le POC par la DSI. Accès SSH au DGX restreint aux IP du sous-réseau VPN. Authentification SSH par clé publique RSA/Ed25519 (pas de mot de passe). | Politique maîtrisée par la DSI, traçabilité dans les logs OpenVPN + sshd, pas de tiers de confiance externe. Compatible audit ANSSI. | Charge initiale de configuration (création du compte VPN, distribution certificat, ACL pare-feu vers le DGX). | **Recommandé** — pratique habituelle de Dom, simple, conforme |
|
||||
| **B. Reverse SSH tunnel via bastion** | Le DGX initie un tunnel SSH inversé vers un bastion contrôlé par Dom (clé SSH, MFA TOTP, audit en place). Aucune ouverture de flux entrant côté clinique. | Aucun flux entrant à ouvrir, isolement réseau total. | Repose sur un bastion externe (responsabilité Dom), à auditer si exigence DSI. | Repli si l'option A pose un blocage opérationnel |
|
||||
| **C. Tailscale (mesh VPN WireGuard)** | Le DGX initie une connexion sortante sur 443 vers le contrôle Tailscale. Aucun port entrant ouvert. ACL stricte, MFA obligatoire. Solution citée par NVIDIA dans les playbooks DGX Spark. | Pas de port entrant, MFA, audit, granularité ACL. | Dépendance fournisseur tiers (Tailscale Inc.), nouveau dans l'environnement Dom — courbe de validation supplémentaire pour le POC. | Alternative si la DSI souhaite éviter le VPN traditionnel |
|
||||
|
||||
**Position Dom** : option A si Nicolas PORQUET valide la mise à disposition d'un compte OpenVPN dédié POC, sinon option B avec bastion personnel. Option C laissée à la discrétion de la DSI.
|
||||
|
||||
**Engagement Dom** :
|
||||
- Clé SSH publique communiquée à la DSI, clé privée stockée chiffrée (passphrase + keystore matériel YubiKey si exigé)
|
||||
- Session SSH limitée au compte `dom` (sudo journalisé), pas de root direct
|
||||
- Activité distante journalisée et exportable sur demande DSI
|
||||
- Suppression de l'accès en fin de POC ou sur demande immédiate de la DSI
|
||||
|
||||
---
|
||||
|
||||
## 8. Conformité — RGPD / HDS / certifications
|
||||
|
||||
### Données traitées
|
||||
- Le DGX traite **uniquement en mémoire vive** des captures d'écran issues du poste TIM (éléments d'interface logiciel Easily Assure).
|
||||
- **Aucun stockage permanent** des captures sur le DGX, y compris en POC. Les captures sont chargées en RAM, traitées par le pipeline VLM, et **détruites immédiatement** après la réponse au client Léa.
|
||||
- Pas de copie de base de données patient sur le DGX.
|
||||
- Pas de communication patient ↔ DGX. Le DGX assiste un TIM qui reste l'utilisateur unique du PMSI.
|
||||
|
||||
### Anonymisation
|
||||
- Module `core/anonymisation/pii_blur.py` (EDS-NLP NER médical français + regex de secours) **activé par défaut** sur le pipeline VLM côté serveur. Identités et dates sont floutées avant tout traitement VLM. Le contenu clinique métier (codes, libellés) reste intact.
|
||||
|
||||
### Hébergement
|
||||
- **100 % on-premise dans la clinique** : pas de cloud, pas de sortie de donnée patient hors LAN clinique.
|
||||
- Le porteur projet ne reçoit **aucune donnée patient** en dehors de la clinique, ni en RAM ni en fichier. Les sessions de maintenance à distance portent exclusivement sur configuration, logs applicatifs et métriques techniques — jamais sur les captures écran.
|
||||
|
||||
### Audit / traçabilité
|
||||
- Logs applicatifs conservés 90 jours sur le DGX (rotation `logrotate`), exportables sur demande DSI.
|
||||
- Logs accès SSH/VPN tracés.
|
||||
- Accès admin distant audité (Tailscale / VPN clinique).
|
||||
|
||||
### Certifications
|
||||
- DGX OS 7 = Ubuntu 24.04 LTS, mises à jour de sécurité jusqu'en 2034.
|
||||
- Pas de certification HDS sur la machine elle-même (POC, pas d'hébergement contractuel). Si industrialisation : hébergement en intra-clinique sous responsabilité de la DSI, ou migration chez hébergeur HDS certifié.
|
||||
|
||||
### DPO / contrat
|
||||
- Convention POC à signer (annexe à fournir) : finalité, durée, responsable de traitement, sous-traitant, mesures de sécurité.
|
||||
- Désignation des personnes habilitées à l'accès admin distant (nominatif : Dom Bazin).
|
||||
|
||||
---
|
||||
|
||||
## 9. Sécurité opérationnelle
|
||||
|
||||
| Mesure | Mise en œuvre |
|
||||
|--------|---------------|
|
||||
| Comptes locaux | 1 compte admin nominatif (`dom`), pas de root direct (sudo) |
|
||||
| Authentification | Clé SSH uniquement (mots de passe SSH désactivés) |
|
||||
| Pare-feu local | `ufw` activé, deny par défaut, règles explicites |
|
||||
| Chiffrement disque | LUKS sur partition de données (clé sous séquestre DSI possible) |
|
||||
| Mises à jour OS | `unattended-upgrades` automatique pour sécurité, redémarrage planifié hors heures TIM |
|
||||
| Mises à jour appli | Push contrôlé par Dom via Git + rebuild containers, fenêtre négociée avec TIM |
|
||||
| Sauvegarde config | Repo Git distant (pas de donnée patient sauvegardée hors DGX) |
|
||||
| Supervision | Métriques Prometheus + alertes si dégradation |
|
||||
| Plan d'arrêt | Possibilité d'arrêt à distance par DSI (kill switch via Tailscale ACL ou physiquement) |
|
||||
|
||||
---
|
||||
|
||||
## 10. Plan d'installation (J-7 → J+0)
|
||||
|
||||
| Jalon | Action | Acteur |
|
||||
|-------|--------|--------|
|
||||
| J-7 | Validation présent document par Nicolas PORQUET (DSI) | DSI |
|
||||
| J-5 | Réservation IP + ouverture flux pare-feu + création compte OpenVPN POC | DSI |
|
||||
| J-3 | Pré-configuration DGX hors clinique (env, containers, modèles d'IA) | Dom |
|
||||
| J-1 | Livraison et installation physique en salle technique | Dom + DSI |
|
||||
| J+0 | Connexion réseau, tests de bout en bout avec poste TIM pilote | Dom + DSI + TIM |
|
||||
| J+1 → J+90 | POC en production limitée (≤ 5 TIM), points hebdomadaires | Dom + référent métier clinique |
|
||||
|
||||
---
|
||||
|
||||
## 11. Responsabilités
|
||||
|
||||
| Domaine | Responsable |
|
||||
|---------|-------------|
|
||||
| Hardware DGX + OS + containers RPA | Dom Bazin (porteur projet) |
|
||||
| Réseau LAN, pare-feu, VLAN, DNS | Nicolas PORQUET (DSI externe) |
|
||||
| Accès distant administrateur | Dom (config) + DSI (validation politique et fourniture VPN) |
|
||||
| Conformité RGPD globale | DPO Hôpital Wallerstein + Dom comme sous-traitant |
|
||||
| Support utilisateur TIM | Dom + référent TIM clinique |
|
||||
| Volet métier codage médical | Dr Amina [Nom à confirmer] (partenaire) |
|
||||
| Incident sécurité | DSI (escalade), Dom (action technique) |
|
||||
|
||||
---
|
||||
|
||||
## 12. Coordonnées
|
||||
|
||||
| Rôle | Nom | Contact |
|
||||
|------|-----|---------|
|
||||
| Porteur projet, interlocuteur unique, contact technique 24/7 | Dom Bazin | **06 70 45 30 05** — [email à compléter] |
|
||||
| DSI externe Hôpital Wallerstein | Nicolas PORQUET | [contact à renseigner par DSI] |
|
||||
| Partenaire métier (cabinet médical DIM, Bordeaux) | Dr Amina [Nom à confirmer] | Non impliquée dans les échanges DSI directs |
|
||||
| Référent TIM clinique | [À renseigner par Hôpital Wallerstein] | — |
|
||||
| DPO Hôpital Wallerstein | [À renseigner] | — |
|
||||
|
||||
---
|
||||
|
||||
## 13. Annexes (à joindre)
|
||||
|
||||
- A. Fiche technique DGX Spark (PDF NVIDIA)
|
||||
- B. Diagramme d'architecture détaillé (data flow Léa ↔ DGX)
|
||||
- C. Convention POC type (RGPD, finalité, durée, sous-traitance)
|
||||
- D. Liste exhaustive des FQDN sortants (whitelist firewall)
|
||||
- E. Procédure d'arrêt d'urgence
|
||||
|
||||
---
|
||||
|
||||
## Décisions
|
||||
|
||||
| # | Décision | Date |
|
||||
|---|----------|------|
|
||||
| 1 | Cible POC : Hôpital privé Wallerstein, 14 Boulevard Javal, 33740 Arès — DSI externe Nicolas PORQUET | 2026-05-28 |
|
||||
| 2 | DGX déployé en salle technique clinique, headless, containers Docker, 100 % on-premise | 2026-05-28 |
|
||||
| 3 | Aucun flux entrant Internet, tout sortant via whitelist FQDN | 2026-05-28 |
|
||||
| 4 | Accès distant Dom : **option A privilégiée = OpenVPN clinique + SSH par certificat**, option B repli = reverse SSH bastion, option C = Tailscale si DSI le préfère | 2026-05-28 |
|
||||
| 5 | Anonymisation PII activée par défaut sur le pipeline VLM en POC | 2026-05-28 |
|
||||
| 6 | Captures écran traitées **uniquement en RAM**, détruites immédiatement après réponse VLM, jamais persistées sur disque | 2026-05-28 |
|
||||
| 7 | Périmètre pilote ≤ 5 TIM, volume dossiers à cadrer avec référent métier | 2026-05-28 |
|
||||
| 8 | Interlocuteur unique côté Dom Bazin (Amina = partenaire métier, hors échanges DSI) | 2026-05-28 |
|
||||
|
||||
## Questions ouvertes
|
||||
|
||||
- VLAN d'accueil du DGX (poste de travail / dédié / DMZ interne)
|
||||
- Modalités OpenVPN : OpenVPN existant pour Wallerstein ou à mettre en place pour le POC ?
|
||||
- EDR / antivirus à installer en sus (politique Nicolas PORQUET)
|
||||
- Politique de séquestre de clé LUKS (clé conservée par DSI ?)
|
||||
- Fenêtre d'installation physique (J-1 / J+0)
|
||||
- Désignation du référent TIM clinique côté Wallerstein
|
||||
- Coordonnées DPO Wallerstein pour validation convention POC RGPD
|
||||
- Volume de dossiers cible par TIM par jour (cadrage avec référent métier)
|
||||
- Email professionnel Dom à inscrire sur le doc final
|
||||
|
||||
## Sources et références techniques
|
||||
|
||||
- [DGX Spark connectivité et provisioning — NVIDIA Playbooks](https://deepwiki.com/NVIDIA/dgx-spark-playbooks/2.2-connecting-to-your-spark)
|
||||
- [DGX OS 7 User Guide](https://docs.nvidia.com/dgx/dgx-os-7-user-guide/dgx-os-7-user-guide.pdf)
|
||||
- [Tailscale architecture et conformité](https://tailscale.com/security/)
|
||||
- [ANSSI — Guide d'hygiène informatique](https://cyber.gouv.fr/sites/default/files/document/guide_hygiene_informatique_anssi.pdf)
|
||||
- [HDS — Référentiel ASIP Santé](https://esante.gouv.fr/labels-certifications/hds/referentiel-de-certification)
|
||||
@@ -0,0 +1,68 @@
|
||||
# Codex -> Claude - ADDENDUM docs/POC DGX Spark readiness
|
||||
|
||||
Claude,
|
||||
|
||||
Dom signale qu'un autre agent a prepare la migration POC dans `docs/POC/`.
|
||||
Ces documents doivent devenir contexte connu pour nos prochains arbitrages.
|
||||
|
||||
Documents lus:
|
||||
- `docs/POC/README.md`
|
||||
- `docs/POC/PORTAGE_DGX_SPARK_2026-05-28.md`
|
||||
- `docs/POC/RESEAU_CLINIQUE_2026-05-28.md`
|
||||
- `docs/POC/MENAGE_PRE_POC_2026-05-29.md`
|
||||
|
||||
Points POC a integrer:
|
||||
|
||||
1. Architecture cible
|
||||
- DGX Spark en clinique, headless, inference + APIs HTTP.
|
||||
- Tout en containers Docker.
|
||||
- Pas de PyQt5, capture/clic, X11 cote DGX.
|
||||
- Client Lea reste sur PC Windows clinique.
|
||||
- Dashboard supervision est inclus dans le perimetre DGX, pas un nice-to-have.
|
||||
|
||||
2. Fonctionnalite centrale
|
||||
- POC = apprentissage par demonstration depuis plusieurs postes equipes.
|
||||
- Cible reseau doc: pilote <= 5 TIM.
|
||||
- Parcours attendu: enregistrer agents dans dashboard, generer ZIPs Lea identifies, installer sur postes, observer sessions par `machine_id`, apprendre, superviser, promouvoir via dashboard.
|
||||
|
||||
3. Inference Spark
|
||||
- Ollama = GO POC.
|
||||
- llama-server = plan B/post-POC si Ollama instable.
|
||||
- Qwen3-VL-8B Q5_K_M = cible POC.
|
||||
- Qwen2.5-VL-7B = fallback.
|
||||
- Qwen3-VL-32B = bench J+3.
|
||||
- vLLM/TensorRT-LLM/NIM/SGLang = no-go demo dans ces docs.
|
||||
|
||||
4. Reseau clinique
|
||||
- Wallerstein / DSI Nicolas PORQUET.
|
||||
- DGX on-prem, salle technique, LAN uniquement.
|
||||
- Entree LAN -> DGX: HTTPS 443.
|
||||
- Ollama jamais expose directement.
|
||||
- Sortants whitelistes pour Ubuntu/NVIDIA/Docker/Ollama/HF/GitHub/PyPI/NTP/DNS.
|
||||
- Acces admin prefere: OpenVPN clinique + SSH certificat; repli reverse SSH; Tailscale si DSI.
|
||||
|
||||
5. Mismatch a arbitrer avec Dom
|
||||
- Doc reseau affirme: captures traitees en RAM uniquement, jamais stockees.
|
||||
- Code actuel observe par Codex: `stream_image()` ecrit les images dans `data/training/live_sessions/<machine>/<session>/shots`.
|
||||
- Code PII actuel: version floutee pour affichage, mais brut conserve pour replay/grounding/entrainement.
|
||||
- Ceci est probablement incompatible avec la promesse DSI "aucun stockage permanent des captures", sauf si on modifie le contrat documentaire ou le mode POC.
|
||||
|
||||
6. Installateurs Lea
|
||||
- Dom confirme que les archives sont fabriquees a la volee et identifiables.
|
||||
- Verification code Codex:
|
||||
- template `deploy/Lea_v1.0.0.zip` existe;
|
||||
- contient `Lea/config.txt`;
|
||||
- `web_dashboard/app.py` remplace `Lea/config.txt` en memoire;
|
||||
- renvoie `Lea_<machine_id>.zip`;
|
||||
- config contient `RPA_SERVER_URL`, `RPA_API_TOKEN`, `RPA_MACHINE_ID`, `RPA_USER_LABEL`.
|
||||
- Reserve: token encore global dans le code lu, a arbitrer.
|
||||
|
||||
Mission Claude ajustee:
|
||||
- Produire ACK dans `docs/coordination/inbox_codex/`.
|
||||
- Mettre a jour ton plan POC autour du flux multi-postes et des docs `docs/POC`.
|
||||
- Classer les decisions Dom necessaires avant DSI/site:
|
||||
1. stockage captures pour apprentissage: autorise/retention courte/aucun brut ?
|
||||
2. token global temporaire ou token par poste obligatoire ?
|
||||
3. nombre de postes du test initial avant clinique ?
|
||||
4. cleanup pre-POC: demarrer maintenant ou apres validation humaine C-gamma ?
|
||||
- Ne pas coder sur auth/conformite sans validation Dom.
|
||||
@@ -0,0 +1,71 @@
|
||||
# Codex -> Qwen - ADDENDUM docs/POC DGX Spark tech audit
|
||||
|
||||
Qwen,
|
||||
|
||||
Dom indique que `docs/POC/` contient la preparation migration POC faite par un autre agent. Ces informations doivent etre integrees a ton audit technique.
|
||||
|
||||
Documents lus:
|
||||
- `docs/POC/README.md`
|
||||
- `docs/POC/PORTAGE_DGX_SPARK_2026-05-28.md`
|
||||
- `docs/POC/RESEAU_CLINIQUE_2026-05-28.md`
|
||||
- `docs/POC/MENAGE_PRE_POC_2026-05-29.md`
|
||||
|
||||
Synthese technique a prendre en compte:
|
||||
|
||||
1. Spark target
|
||||
- DGX Spark ARM aarch64, DGX OS 7 / Ubuntu 24.04 ARM64.
|
||||
- Serveur headless, containers Docker.
|
||||
- Client Lea Windows reste hors DGX.
|
||||
- Pas de modules GUI/capture/clic dans image serveur.
|
||||
- `requirements-server.txt` doit exclure PyQt5/mss/pyautogui/pynput/evdev/python-xlib.
|
||||
- Desepingler `nvidia-*-cu12` avant ARM; PyTorch cu128 ARM indique dans doc.
|
||||
|
||||
2. Inference
|
||||
- Ollama = moteur POC.
|
||||
- Qwen3-VL-8B Q5_K_M = cible.
|
||||
- Qwen2.5-VL-7B = fallback.
|
||||
- 32B = bench.
|
||||
- Verifier `core/detection/vlm_config.py` et `core/detection/ollama_client.py` deja prepares pour Qwen3-VL/thinking prefill.
|
||||
- Auditer `onnxruntime-gpu`: usage reel ou suppression possible.
|
||||
|
||||
3. Multi-postes / Fleet
|
||||
- Dashboard Fleet existe dans `web_dashboard/templates/index.html`.
|
||||
- Proxy `web_dashboard/app.py` vers `/api/v1/agents/*`.
|
||||
- Registre `agent_v0/server_v1/agent_registry.py`.
|
||||
- Endpoints `/agents/enroll`, `/agents/uninstall`, `/agents/fleet`.
|
||||
- Replay/streaming propagent deja `machine_id`.
|
||||
- POC doit verifier 2+ postes minimum, cible pilote <= 5 TIM.
|
||||
|
||||
4. Installateurs Lea verifies par Codex
|
||||
- `deploy/Lea_v1.0.0.zip` existe et contient `Lea/config.txt`.
|
||||
- `web_dashboard/app.py` genere un ZIP en memoire et remplace `Lea/config.txt`.
|
||||
- Nom de telechargement: `Lea_<machine_id>.zip`.
|
||||
- Config embarquee: `RPA_SERVER_URL`, `RPA_API_TOKEN`, `RPA_MACHINE_ID`, `RPA_USER_LABEL`.
|
||||
- Archive donc identifiable par nom + config interne.
|
||||
- Reserve majeure: token semble global (`RPA_API_TOKEN`), pas encore secret poste.
|
||||
|
||||
5. Compliance gap probable
|
||||
- `docs/POC/RESEAU_CLINIQUE_2026-05-28.md` promet: captures en RAM uniquement, aucune persistance permanente.
|
||||
- Code actuel verifie:
|
||||
- `api_stream.stream_image()` sauvegarde `shot_id.png` sous `data/training/live_sessions/.../shots`;
|
||||
- les heartbeats/focus/res shots sont aussi stockes;
|
||||
- PII blur ecrit une version floutee mais conserve le brut pour replay/grounding/entrainement;
|
||||
- finalisation persiste et envoie au worker VLM.
|
||||
- C'est possiblement le risque POC #1 face DSI/RGPD.
|
||||
|
||||
6. Menage pre-POC
|
||||
- Le doc propose branche `cleanup/pre-poc-2026-05-29`, 9-10 j-h.
|
||||
- Attention: ne pas appliquer massivement dans notre branche actuelle sale.
|
||||
- Priorite technique immediate: `.dgxignore`/tarball exclude + requirements-server + verifier taille transfer, plutot que grand archivage si on veut aller vite.
|
||||
|
||||
Mission Qwen ajustee:
|
||||
- Produire ACK/REVUE dans `docs/coordination/inbox_codex/`.
|
||||
- Classer Critical/Major/Minor:
|
||||
1. token global vs token poste;
|
||||
2. revocation agent effective ou non;
|
||||
3. mismatch "RAM-only" vs persistance apprentissage;
|
||||
4. requirements ARM/DGX;
|
||||
5. test ZIP genere a la volee;
|
||||
6. test multi-postes machine_id.
|
||||
- Proposer tests exacts, sans code non coordonne.
|
||||
- Ne pas recommander de cleanup massif avant arbitrage Dom/Codex.
|
||||
Reference in New Issue
Block a user