Generated Artifact Layout#
Triton artifacts are written automatically to output_dir/infer/triton/ at the end of training. No manual export step is needed.
Edge prediction pipeline (kind: GNN_XGBoost):
output/infer/triton/
├── gnn_embedder/ ← GNN model (Python backend)
│ ├── config.pbtxt ← Triton model configuration
│ └── 1/ ← model version 1
│ ├── model.py ← Triton Python backend wrapper
│ ├── fraud_gnn.py ← self-contained GNN model class (no training deps)
│ ├── model_final.pt ← trained GNN weights
│ └── model_config.json ← graph schema, feature dimensions, num_neighbors, threshold
│
├── xgb_fraud/ ← XGBoost classifier (FIL backend — fast GPU inference)
│ ├── config.pbtxt
│ └── 1/
│ └── xgboost.json ← trained booster (native XGBoost JSON format)
│
├── xgb_explainer/ ← XGBoost + Captum SVS explainer (Python backend)
│ ├── config.pbtxt
│ └── 1/
│ ├── model.py
│ ├── xgboost.json ← same model as xgb_fraud
│ ├── feature_map.json ← feature group definitions for SVS
│ ├── feature_names.json ← human-readable feature names
│ └── svs_baseline.npy ← pre-computed Shapley baseline
│
├── llm_explainer/ ← LLM narrative generator (Python backend)
│ ├── config.pbtxt
│ └── 1/
│ ├── model.py
│ ├── model_config.json ← graph schema copy (for src/dst node type names in prompts)
│ ├── feature_map.json
│ └── feature_names.json
│
├── fraud_pipeline/ ← Ensemble: end-to-end scoring
│ ├── config.pbtxt ← wires gnn_embedder → xgb_fraud
│ └── 1/ ← empty version directory (required by Triton)
│
└── fraud_pipeline_explained/ ← Ensemble: scoring + explainability
├── config.pbtxt ← wires gnn_embedder → xgb_explainer → llm_explainer
└── 1/ ← empty version directory (required by Triton)
When save_node_embeddings: true, training also writes:
output/
│ ├── node_embeddings/ # only when save_node_embeddings: true
│ │ ├── {src_type}/
│ │ │ ├── rank=0_ids.pt # per-rank global node IDs
│ │ │ ├── rank=0_emb.pt # per-rank GNN embedding shard
│ │ │ ├── rank=0_feat.pt # per-rank raw feature shard
│ │ │ ├── embeddings.mmap # merged flat memmap (n_total × hidden_channels; created at first client startup)
│ │ │ ├── features.mmap # merged raw features (n_total × n_raw_features)
│ │ │ └── shape.json
│ │ ├── {dst_type}/
│ │ │ └── ...
│ │ └── manifest.json
The infer/ directory contains all client scripts:
│ └── infer/
│ ├── triton/
│ ├── serve.sh
│ ├── client.py # standard GNN pipeline (EP)
│ ├── client_np.py # standard GNN pipeline (NP)
│ ├── client_saved_emb.py # hybrid: saved-embedding fast path + GNN fallback
│ │ # requires save_node_embeddings: true
│ └── client_production.py # persistent HTTP service (--serve) or concurrent batch eval
│ # requires save_node_embeddings: true
Node prediction pipeline (kind: GNN_XGBoost_NP):
output/infer/triton/
├── np_gnn_embedder/ ← GNN model (Python backend)
│ ├── config.pbtxt
│ └── 1/
│ ├── model.py
│ ├── fraud_gnn.py
│ ├── model_final_np.pt ← trained GNN weights
│ └── model_config_np.json ← graph schema, feature dimensions, num_neighbors, threshold
│
├── xgb_fraud_np/ ← XGBoost classifier (FIL backend)
│ ├── config.pbtxt
│ └── 1/
│ └── xgboost.json
│
├── xgb_explainer_np/ ← XGBoost + Captum SVS explainer (Python backend)
│ ├── config.pbtxt
│ └── 1/
│ ├── model.py
│ ├── xgboost.json
│ ├── feature_map.json
│ ├── feature_names.json
│ └── svs_baseline.npy
│
├── llm_explainer_np/ ← LLM narrative generator (Python backend)
│ ├── config.pbtxt
│ └── 1/
│ ├── model.py
│ ├── model_config.json
│ ├── feature_map.json
│ └── feature_names.json
│
├── np_fraud_pipeline/ ← Ensemble: end-to-end scoring
│ ├── config.pbtxt ← wires np_gnn_embedder → xgb_fraud_np
│ └── 1/ ← empty version directory (required by Triton)
│
└── np_fraud_pipeline_explained/ ← Ensemble: scoring + explainability
├── config.pbtxt
└── 1/ ← empty version directory (required by Triton)
The model_config.json embedded inside gnn_embedder/1/ is the contract between training and inference. It stores the graph schema (node types, edge types, feature dimensions), the decision threshold calibrated on the validation set, the num_neighbors list used during GNN training (which the inference client uses by default for client-side subgraph sampling), and feat_dim (total XGBoost feature width including embeddings, raw features, and edge attributes — always present). The inference client reads it to configure its requests. When save_node_embeddings: true, model_config.json additionally contains inference_use_saved_embeddings: true and node_embeddings_dir (path to the merged memmap files).