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).