Per semplificare l'utilizzo del progetto Graphagate su GPU (ottimizzato per RTX Blackwell, CUDA 13), è stato predisposto un file docker-compose.yml con profili dedicati.
Questa struttura permette di eseguire le diverse fasi del progetto isolando gli ambienti e senza dover ricordare complessi comandi Docker.
- Docker e Docker Compose installati
- NVIDIA Container Toolkit installato e configurato (per l'utilizzo della GPU)
- Driver NVIDIA compatibili con CUDA 13 (es. driver per RTX 5090 / B200 Blackwell)
Il docker-compose.yml contiene sei profili: training-tgn, verify-tgn, serve-tgn e i tre profili di confronto baseline-iforest, baseline-ocsvm e baseline-gnn.
Avvia il container per l'addestramento della rete dinamica basata su grafi temporali (Temporal Graph Network). Questo profilo genera dati in stream continuo con contesti Zero Trust (JA3, alert snort, sonde). Gli artifact risultanti vengono salvati nella cartella public/.
docker compose --profile training-tgn up(Esegue in background python -m graphagate.train_tgn)
Dopo il training TGN (che salva public/tgn_checkpoint.pt e public/tgn_stats.json),
questo profilo ricarica l'artifact e verifica le proprietà di serving real-time:
determinismo del reload, gate anti-poisoning della memoria (un evento anomalo non
aggiorna la baseline) e ammissione di entità mai viste (nodi dinamici).
docker compose --profile verify-tgn up(Esegue python -m graphagate.verify_tgn)
A differenza dei due profili batch, questo avvia un servizio HTTP persistente:
carica gli artifact da public/ ed espone l'API REST/JSON (graphagate.serve_api)
sulla porta 8088, pensata per essere consumata dall'orchestrator ZTA (vedi
orchestrator_integration.md). Lo stato evoluto dagli
eventi approvati viene riscritto su public/ via POST /persist e automaticamente
allo spegnimento del container.
Prerequisito: gli artifact (
tgn_checkpoint.pt,tgn_stats.json) devono già esistere inpublic/. Vanno prodotti una volta dal profilotraining-tgnprima di avviare il servizio.
docker compose --profile serve-tgn up(Esegue python -m graphagate.serve_api; healthcheck su GET /health)
Avvio standalone equivalente (stessa immagine, senza Compose):
docker run --rm --gpus all -p 8088:8088 \
-v "$PWD/public:/app/public" graphagate graphagate.serve_apiConfigurazione via variabili d'ambiente (tutte opzionali): GRAPHAGATE_CHECKPOINT e
GRAPHAGATE_STATS (path degli artifact), GRAPHAGATE_HOST (default 0.0.0.0),
GRAPHAGATE_PORT (default 8088).
Una sola replica. Il modello è uno stato mutabile in RAM: il servizio gira con un singolo worker e non va scalato orizzontalmente.
Gli artifact TGN persistiti in public/ sono:
tgn_checkpoint.pt— pesi (inclusi identità di nodo e teste di scoring) + buffer di memoria + raw-message store + buffer del neighbour loader (per continuare esattamente lo stato temporale e la storia dei vicini tra riavvii);tgn_stats.json— soglia di decisione calibrata,capacitye mappaturaNodeRegistry(entità esterne → slot di memoria).
Due detector più semplici, eseguibili in container dedicati per un confronto
riproducibile col TGN (stesso stream sintetico, split cronologico, soglia calibrata
all'1% di FPR e protocollo di valutazione). Dettagli e metriche attese in
../tests/baselines/README.md.
-
Isolation Forest (sklearn): detector non relazionale sulle sole feature statiche per-evento — il "pavimento" privo di informazione strutturale.
docker compose --profile baseline-iforest up
(Esegue
python tests/baselines/isolation_forest/isolation_forest_baseline.py) -
One-Class SVM (sklearn, kernel RBF): controparte kernel dell'Isolation Forest, anch'essa non relazionale sulle sole feature statiche per-evento (fit su subsample benigno per scalabilità).
docker compose --profile baseline-ocsvm up
(Esegue
python tests/baselines/ocsvm/ocsvm_baseline.py) -
GNN non temporale (GraphSAGE): ablation del TGN su grafo statico aggregato, con lo stesso curriculum de-circolarizzato del TGN (negativo strutturale a destinazione casuale + contestuale gaussiano, pesi uguali) ma senza memoria ricorrente né vicinato temporale — isola il contributo della sola componente temporale (lateral AUC 0.59 vs 0.71 del TGN completo).
docker compose --profile baseline-gnn up
(Esegue
python tests/baselines/simple_gnn/simple_gnn_baseline.py)
Prerequisito: i container delle baseline montano la cartella
./testsdell'host (gli script non sono copiati nell'immagine) e sovrascrivono l'entrypointpython -m. Non producono artifact inpublic/: stampano le metriche a console.
Esegue gli esperimenti multi-seed di rimozione strutturale (ablation) per certificare matematicamente il contributo di specifiche componenti del modello (come history causale e precursor) isolandole dal resto. Questo profilo viene anche utilizzato per lanciare unit-test specifici sovrascrivendo l'entrypoint.
docker compose --profile ablations upPer valutare il comportamento del modello omettendo obbligatoriamente il tracciamento hardware/dispositivo (key_device), è disponibile un profilo di ablation in tempo reale che lancia un test set di 120 secondi. Questo simula uno scenario in cui nessun dispositivo client è identificato, bypassando l'arco logico e testando la classificazione diretta IP -> Utente:
docker compose --profile serve-tgn --profile ablation-no-device up --buildAvvia la pipeline di inferenza isolata sul dataset governativo pubblico LANL Comprehensive Multi-Source. Fondamentale per provare sul campo l'efficacia del cost-sensitive routing su attacchi laterali reali (red-team).
Prerequisito: I file pesanti
auth.txt.gzeredteam.txt(scaricati manualmente dal sito csr.lanl.gov) devono risiedere nella cartella./data/locale (ignorata su GitHub).
docker compose --profile eval-lanl upGli artifact (tgn_checkpoint.pt, tgn_stats.json) sono automaticamente persistiti tramite un volume bind-mount sulla cartella ./public dell'host. Tali artefatti potranno poi essere utilizzati dai microservizi di validazione ZTA (Zero Trust Architecture).