GridFM App Distribution
GridFM Distribution appkitgridfm-app-distribution is a Python library to train, finetune, and predict a foundation model of an electrical power grid.
Specialised training tasks can be developed for specific distribution applications.
Installation
Create and activate a virtual environment (make sure you use the right python version = 3.10, 3.11, 3.12 or 3.13.)
python -m venv venv
source venv/bin/activate
Install gridfm-app-distribution from PyPI
pip install gridfm-app-distribution
torch-scatter is a required dependency. It cannot be bundled in pyproject.toml because the correct wheel depends on your PyTorch and CUDA versions, so it must be installed separately.
Get PyTorch + CUDA version for torch-scatter
TORCH_CUDA_VERSION=$(python -c "import torch; print(torch.__version__ + ('+cpu' if torch.version.cuda is None else ''))")
Install the correct torch-scatter wheel
pip install torch-scatter -f https://data.pyg.org/whl/torch-${TORCH_CUDA_VERSION}.html
pip install torch-sparse -f https://data.pyg.org/whl/torch-${TORCH_CUDA_VERSION}.html
For documentation generation and unit testing, install with the optional dev and test extras:
pip install "gridfm-app-distribution[dev,test]"
Generating training data (contingency_data_gen)
The repository ships a second application, contingency_data_gen, that builds
distribution networks and runs N-k contingency analyses with pandapower, writing
the results as gridfm-datakit-format partitioned parquet under
<output_dir>/raw/ (bus_data, gen_data, branch_data). That is the layout
gridfm_app_dist reads from --data_path, so generation chains directly into
training:
contingency_data_gen --config data_gen_1.yaml # writes data/scenario_33radial/raw/, ...
gridfm_app_dist train --config configs/scenario_33radial.yaml --data_path data
Jobs are described in a YAML config (one entry per scenario). Networks can come
from an Excel workbook (flag: 1|2|3, network_file_path), a YAML network
definition built with the bundled netlib builder (flag: 9,
builtin_network: netbuilder/urban_LV.yaml), a MATPOWER file (flag: 10) or a
pandapower.networks factory (flag: null, builtin_network: case33bw).
Relative paths resolve against the config's folder and then the package's
configs/ folder; output_dir resolves against the working directory.
contingency_data_gen --list-configs # configs shipped with the package
contingency_data_gen --config my_jobs.yaml --dry-run # validate and print the plan
contingency_data_gen --config data_gen_1.yaml --only case33radial
Network builder examples (examples/datakit/) show how to assemble MV/LV
networks from the standard-type catalogue in contingency_data_gen.netlib.
CLI commands
Interface to train, fine-tune, evaluate, and run inference on GridFM models of distribution networks using YAML configs and MLflow tracking.
gridfm_app_dist <command> [OPTIONS]
Available commands:
train- Train a new model from scratchfinetune- Fine-tune an existing pre-trained modelevaluate- Evaluate model performance on a datasetpredict- Run inference and save predictions
Training Models
gridfm_app_dist --config path/to/config.yaml
Arguments
| Argument | Type | Description | Default |
|---|---|---|---|
--config |
str |
Required. Path to the training configuration YAML file. | None |
--exp_name |
str |
MLflow experiment name. | timestamp |
--run_name |
str |
MLflow run name. | run |
--log_dir |
str |
MLflow tracking/logging directory. | mlruns |
--data_path |
str |
Root dataset directory. | data |
--compile [MODE] |
str |
Enable torch.compile mode. Valid values: default, reduce-overhead, max-autotune, max-autotune-no-cudagraphs. If flag is passed without a value, mode is default. |
None |
--bfloat16 |
flag |
Cast model to torch.bfloat16 (model.to(torch.bfloat16)). |
False |
--tf32 |
flag |
Enable TF32 on Ampere+ GPUs via torch.set_float32_matmul_precision("high"). |
False |
--dataset_wrapper |
str |
Registered dataset wrapper name (see DATASET_WRAPPER_REGISTRY), e.g. SharedMemoryCacheDataset. |
None |
--plugins |
list[str] |
Python packages to import for plugin registration, e.g. gridfm_app_dist_scc. |
[] |
--num_workers |
int |
Override data.workers from YAML. Use 0 to debug worker crashes. |
None |
--dataset_wrapper_cache_dir |
str |
Disk cache directory for dataset wrapper; cache is loaded from here when present and saved after first population. | None |
--profiler |
str |
Enable Lightning profiler (simple, advanced, pytorch). |
None |
--compute_dc_ac_metrics |
flag |
Compute ground-truth AC/DC power balance metrics on the test split. | False |
--mp_context |
str |
DataLoader multiprocessing start method (spawn, fork, forkserver). Defaults to PyTorch's automatic choice. On Linux, spawn is recommended for safety (CUDA + fork is unsafe); other choices emit a warning. |
None |
Examples
Standard Training:
gridfm_app_dist train --config examples/config/rural_MVLV_test.yaml --data_path examples/data
Fine-Tuning Models
gridfm_app_dist finetune --config path/to/config.yaml --model_path path/to/model.pt
Arguments
| Argument | Type | Description | Default |
|---|---|---|---|
--config |
str |
Required. Fine-tuning configuration file. | None |
--model_path |
str |
Required. Path to a pre-trained model state dict. | None |
--exp_name |
str |
MLflow experiment name. | timestamp |
--run_name |
str |
MLflow run name. | run |
--log_dir |
str |
MLflow logging directory. | mlruns |
--data_path |
str |
Root dataset directory. | data |
--compile [MODE] |
str |
Enable torch.compile mode. Valid values: default, reduce-overhead, max-autotune, max-autotune-no-cudagraphs. If flag is passed without a value, mode is default. |
None |
--bfloat16 |
flag |
Cast model to torch.bfloat16 (model.to(torch.bfloat16)). |
False |
--tf32 |
flag |
Enable TF32 on Ampere+ GPUs via torch.set_float32_matmul_precision("high"). |
False |
--dataset_wrapper |
str |
Registered dataset wrapper name (see DATASET_WRAPPER_REGISTRY), e.g. SharedMemoryCacheDataset. |
None |
--plugins |
list[str] |
Python packages to import for plugin registration, e.g. gridfm_app_dist_scc. |
[] |
--num_workers |
int |
Override data.workers from YAML. Use 0 to debug worker crashes. |
None |
--dataset_wrapper_cache_dir |
str |
Disk cache directory for dataset wrapper; cache is loaded from here when present and saved after first population. | None |
--profiler |
str |
Enable Lightning profiler (simple, advanced, pytorch). |
None |
--compute_dc_ac_metrics |
flag |
Compute ground-truth AC/DC power balance metrics on the test split. | False |
--mp_context |
str |
DataLoader multiprocessing start method (spawn, fork, forkserver). Defaults to PyTorch's automatic choice. On Linux, spawn is recommended for safety (CUDA + fork is unsafe); other choices emit a warning. |
None |
Evaluating Models
gridfm_app_dist evaluate --config path/to/eval.yaml --model_path path/to/model.pt
Arguments
| Argument | Type | Description | Default |
|---|---|---|---|
--config |
str |
Required. Path to evaluation config. | None |
--model_path |
str |
Path to the trained model state dict. | None |
--normalizer_stats |
str |
Path to normalizer_stats.pt from a training run. Restores fit_on_train normalizers from saved statistics instead of re-fitting on current split. |
None |
--exp_name |
str |
MLflow experiment name. | timestamp |
--run_name |
str |
MLflow run name. | run |
--log_dir |
str |
MLflow logging directory. | mlruns |
--data_path |
str |
Dataset directory. | data |
--compile [MODE] |
str |
Enable torch.compile mode. Valid values: default, reduce-overhead, max-autotune, max-autotune-no-cudagraphs. If flag is passed without a value, mode is default. |
None |
--bfloat16 |
flag |
Cast model to torch.bfloat16 (model.to(torch.bfloat16)). |
False |
--tf32 |
flag |
Enable TF32 on Ampere+ GPUs via torch.set_float32_matmul_precision("high"). |
False |
--dataset_wrapper |
str |
Registered dataset wrapper name (see DATASET_WRAPPER_REGISTRY), e.g. SharedMemoryCacheDataset. |
None |
--plugins |
list[str] |
Python packages to import for plugin registration, e.g. gridfm_app_dist_scc. |
[] |
--num_workers |
int |
Override data.workers from YAML. Use 0 to debug worker crashes. |
None |
--dataset_wrapper_cache_dir |
str |
Disk cache directory for dataset wrapper; cache is loaded from here when present and saved after first population. | None |
--profiler |
str |
Enable Lightning profiler (simple, advanced, pytorch). |
None |
--compute_dc_ac_metrics |
flag |
Compute ground-truth AC/DC power balance metrics on the test split. | False |
--save_output |
flag |
Save predictions as <grid_name>_predictions.parquet under MLflow artifacts (.../artifacts/test). |
False |
--mp_context |
str |
DataLoader multiprocessing start method (spawn, fork, forkserver). Defaults to PyTorch's automatic choice. On Linux, spawn is recommended for safety (CUDA + fork is unsafe); other choices emit a warning. |
None |
Example with saved normalizer stats
When evaluating a model on a dataset, you can pass the normalizer statistics from the original training run to ensure the same normalization parameters are used:
gridfm_app_dist evaluate \
--config examples/config/HGNS_PF_datakit_case118.yaml \
--model_path mlruns/<experiment_id>/<run_id>/artifacts/model/best_model_state_dict.pt \
--normalizer_stats mlruns/<experiment_id>/<run_id>/artifacts/stats/normalizer_stats.pt \
--data_path data
Note: The
--normalizer_statsflag only affects normalizers withfit_strategy = "fit_on_train"(e.g.HeteroDataMVANormalizer). Per-sample normalizers (HeteroDataPerSampleMVANormalizer) always recompute their statistics from the current dataset regardless of this flag.
Running Predictions
gridfm_app_dist predict --config path/to/config.yaml --model_path path/to/model.pt
Arguments
| Argument | Type | Description | Default |
|---|---|---|---|
--config |
str |
Required. Path to prediction config file. | None |
--model_path |
str |
Path to trained model state dict. Optional; may be defined in config. | None |
--normalizer_stats |
str |
Path to normalizer_stats.pt from a training run. Restores fit_on_train normalizers from saved statistics. |
None |
--exp_name |
str |
MLflow experiment name. | timestamp |
--run_name |
str |
MLflow run name. | run |
--log_dir |
str |
MLflow logging directory. | mlruns |
--data_path |
str |
Dataset directory. | data |
--dataset_wrapper |
str |
Registered dataset wrapper name (see DATASET_WRAPPER_REGISTRY), e.g. SharedMemoryCacheDataset. |
None |
--plugins |
list[str] |
Python packages to import for plugin registration, e.g. gridfm_app_dist_scc. |
[] |
--num_workers |
int |
Override data.workers from YAML. Use 0 to debug worker crashes. |
None |
--dataset_wrapper_cache_dir |
str |
Disk cache directory for dataset wrapper; cache is loaded from here when present and saved after first population. | None |
--output_path |
str |
Directory where predictions are saved as <grid_name>_predictions.parquet. |
data |
--compile [MODE] |
str |
Enable torch.compile mode. Valid values: default, reduce-overhead, max-autotune, max-autotune-no-cudagraphs. If flag is passed without a value, mode is default. |
None |
--bfloat16 |
flag |
Cast model to torch.bfloat16 (model.to(torch.bfloat16)). |
False |
--tf32 |
flag |
Enable TF32 on Ampere+ GPUs via torch.set_float32_matmul_precision("high"). |
False |
--profiler |
str |
Enable Lightning profiler (simple, advanced, pytorch). |
None |
--mp_context |
str |
DataLoader multiprocessing start method (spawn, fork, forkserver). Defaults to PyTorch's automatic choice. On Linux, spawn is recommended for safety (CUDA + fork is unsafe); other choices emit a warning. |
None |
Benchmarking Dataloader Throughput
gridfm_app_dist benchmark --config path/to/config.yaml
Arguments
| Argument | Type | Description | Default |
|---|---|---|---|
--config |
str |
Required. Path to configuration YAML file. | None |
--data_path |
str |
Root dataset directory. | data |
--epochs |
int |
Number of epochs to iterate through the train dataloader. | 3 |
--dataset_wrapper |
str |
Registered dataset wrapper name (see DATASET_WRAPPER_REGISTRY), e.g. SharedMemoryCacheDataset. |
None |
--dataset_wrapper_cache_dir |
str |
Directory for dataset wrapper disk cache. | None |
--num_workers |
int |
Override data.workers from YAML. |
None |
--plugins |
list[str] |
Python packages to import for plugin registration. | [] |
--mp_context |
str |
DataLoader multiprocessing start method (spawn, fork, forkserver). Defaults to PyTorch's automatic choice. On Linux, spawn is recommended for safety (CUDA + fork is unsafe); other choices emit a warning. |
None |
Use built-in help for full command details:
gridfm_app_dist --help
gridfm_app_dist <command> --help
Running Tests
Unit and Integration Tests
Install the test dependencies first (if not already done):
pip install -e .[dev,test]
Run the full unit test suite:
pytest ./tests
Run the base set integration tests:
pytest ./integrationtests/test_base_set.py
Running Base Set Tests on an LSF Cluster (GPU)
To submit the base set integration tests as an interactive LSF job with GPU access, use bsub. Adjust the paths to match your environment:
bsub -gpu "num=1" \
-n 16 \
-R "rusage[mem=32GB] span[hosts=1]" \
-Is \
-J gridfm_base_set_tests \
/bin/bash -c "
cd /path/to/gridfm-app-distribution && \
export PATH=/path/to/cuda/bin:\$PATH \
CUDA_HOME=/path/to/cuda \
LD_LIBRARY_PATH=/path/to/cuda/lib64:\$LD_LIBRARY_PATH && \
source /path/to/venv/bin/activate && \
pytest ./integrationtests/test_base_set.py
"
Key bsub options used above:
| Option | Description |
|---|---|
-gpu "num=1" |
Request 1 GPU |
-n 16 |
Request 16 CPU slots |
-R "rusage[mem=32GB] span[hosts=1]" |
Reserve 32 GB of memory on a single host |
-Is |
Run as an interactive shell session |
-J <job_name> |
Assign a name to the job |
Concrete example (adapt paths to your cluster setup):
bsub -gpu "num=1" -n 16 -R "rusage[mem=32GB] span[hosts=1]" -Is -J hpo_trial_190 /bin/bash -c "cd /dccstor/terratorch/users/rkie/gitco/gridfm-app-distribution && export PATH=/opt/share/cuda-12.8.1/bin:\$PATH CUDA_HOME=/opt/share/cuda-12.8.1 LD_LIBRARY_PATH=/opt/share/cuda-12.8.1/lib64:\$LD_LIBRARY_PATH && source /u/rkie/venvs/venv_gridfm-graphkit/bin/activate && pytest ./integrationtests/test_base_set.py"
Metadata
Release files for gridfm-app-distribution 0.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| gridfm_app_distribution-0.0.1.tar.gz | 297.0 kB | With provenance | Details for gridfm_app_distribution-0.0.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| gridfm_app_distribution-0.0.1-py3-none-any.whl | Python 3 | none | any | Details for gridfm_app_distribution-0.0.1-py3-none-any.whl |
Total release size: 606.3 kB
Release files / gridfm_app_distribution-0.0.1.tar.gz
| Download URL | gridfm_app_distribution-0.0.1.tar.gz |
|---|---|
| Size | 297.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1255e8785a790a540157c68b961db692af6a696a737ba6f29b5640e93de4b5a9
|
|
BLAKE2b-256 checksum How to use checksums |
1cf8ad224f156cfc3b260ed6efba61be7e436bad34b95d82be542ac834b301c0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logRelease files / gridfm_app_distribution-0.0.1-py3-none-any.whl
| Download URL | gridfm_app_distribution-0.0.1-py3-none-any.whl |
|---|---|
| Size | 309.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6128045f1475729537f9bc7b6f31e2bce01627803567a6c79aaf429d194865d6
|
|
BLAKE2b-256 checksum How to use checksums |
e7e30663e958f0707becf24407e1ee6f421da6094107227aa46149d09035672c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logSecurity for gridfm-app-distribution 0.0.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for gridfm_app_distribution-0.0.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 2, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.