
NxBench
nxbench is a comprehensive benchmarking suite designed to facilitate comparative profiling of graph analytic algorithms across NetworkX and compatible backends. Built using Prefect and Dask, nxbench places an emphasis on extensible and granular performance analysis, enabling developers and researchers to optimize their graph analysis workflows efficiently and reproducibly.
Key Features
- Cross-Backend Benchmarking: Leverage NetworkX's backend system to profile algorithms across multiple implementations (NetworkX, nx-parallel, GraphBLAS, and CuGraph)
- Configurable Suite: YAML-based configuration for algorithms, datasets, and benchmarking parameters
- Real-World Datasets: Automated downloading and caching of networks and their metadata from NetworkRepository
- Synthetic Graph Generation: Support for generating benchmark graphs using any of NetworkX's built-in generators
- Validation Framework: Comprehensive result validation for correctness across implementations
- Performance Monitoring: Track execution time and memory usage with detailed metrics
- Interactive Visualization: Dynamic dashboard for exploring benchmark results using Plotly Dash
- Flexible Storage: SQL result storage with pandas integration for dowstream analysis
Installation (Non-Docker Setup)
Prerequisites
- Python 3.10+: Ensure you have a compatible Python environment.
- PostgreSQL: To run Prefect Orion with a persistent database, we recommend PostgreSQL for better concurrency and stability than an ephemeral in-memory database.
- NetworkX Backend Installations: To comparative benchmark graph algorithm performance across different NetworkX backends, you will need to install each backend.
Setting up PostgreSQL
In a terminal window:
-
Install PostgreSQL:
-
On macOS (with Homebrew):
brew install postgresql
brew services start postgresql
-
On Linux (Debian/Ubuntu):
sudo apt-get update && sudo apt-get install -y postgresql postgresql-contrib
sudo service postgresql start
-
On Windows:
Download and run the PostgreSQL installer and follow the prompts.
-
Create a PostgreSQL User and Database:
psql postgres
In the psql
prompt, run:
CREATE USER prefect_user WITH PASSWORD 'pass';
CREATE DATABASE prefect_db OWNER prefect_user;
GRANT ALL PRIVILEGES ON DATABASE prefect_db TO prefect_user;
Exit the prompt with \q.
This sets up a prefect_user with password pass and a database named prefect_db.
Supported Backends
- NetworkX (default)
- nx-CuGraph (requires separate CuGraph installation and supported GPU hardware)
- GraphBLAS Algorithms (optional)
- nx-parallel (optional)
Installing nxbench
In a new terminal window:
PyPi:
pip install nxbench
From source (local clone):
git clone https://github.com/dpys/nxbench.git
cd nxbench
make install
This should install nxbench and all required dependencies (including prefect, asyncpg, and related packages).
Installation (Docker Setup)
Docker:
make build
make build-gpu
Quick Start
- Configure your benchmarks in a yaml file (see
configs/example.yaml
):
algorithms:
- name: "pagerank"
func: "networkx.pagerank"
params:
alpha: 0.85
groups: ["centrality"]
datasets:
- name: "karate"
source: "networkrepository"
- Start an instance of an orion server in a separate terminal window:
export PREFECT_API_URL="http://127.0.0.1:4200/api"
export PREFECT_API_DATABASE_CONNECTION_URL="postgresql+asyncpg://prefect_user:pass@localhost:5432/prefect_db"
prefect server start
- In the original terminal window, run benchmarks based on the configuration:
nxbench --config 'nxbench/configs/example.yaml' benchmark run
- Export results:
nxbench --config 'nxbench/configs/example.yaml' benchmark export 'results/9e3e8baa4a3443c392dc8fee00373b11_20241220002902.json' --output-format csv --output-file 'results/results.csv'
- View results:
nxbench viz serve
Advanced Command Line Interface
The CLI provides comprehensive management of benchmarks, datasets, and visualization:
nxbench data download karate
nxbench data list --category social
nxbench --config 'nxbench/configs/example.yaml' -vvv benchmark run
nxbench --config 'nxbench/configs/example.yaml' benchmark export 'results/9e3e8baa4a3443c392dc8fee00373b11_20241220002902.json' --output-format sql
Configuration
Benchmarks are configured through YAML files with the following structure:
algorithms:
- name: "algorithm_name"
func: "fully.qualified.function.name"
params: {}
requires_directed: false
groups: ["category"]
validate_result: "validation.function"
datasets:
- name: "dataset_name"
source: "networkrepository"
params: {}
Reproducible benchmarking through docker
Instead of invoking docker-compose directly, we provide a convenience script (docker/nxbench-run.sh
) to run each of the nxbench
commands. This script automatically:
- Resolves and mounts your configuration file.
- Switches between CPU and GPU modes using the --gpu flag.
- Detects the desired subcommand (benchmark run/export, viz, data download/list, etc.)
- Mounts your host's results directory when needed.
docker/nxbench-run.sh --config 'nxbench/configs/example.yaml' data download karate
docker/nxbench-run.sh --config 'nxbench/configs/example.yaml' data list --category social
docker/nxbench-run.sh --config 'nxbench/configs/example.yaml' benchmark run
docker/nxbench-run.sh --gpu --config 'nxbench/configs/example.yaml' benchmark run
docker/nxbench-run.sh --config 'nxbench/configs/example.yaml' benchmark export 'nxbench_results/9e3e8baa4a3443c392dc8fee00373b11_20241220002902.json' --output-format csv --output-file 'nxbench_results/results.csv'
docker/nxbench-run.sh --config 'nxbench/configs/example.yaml' viz serve
Contributing
Contributions are welcome! Please read our Contributing Guide for details on:
- Code style guidelines
- Development setup
- Testing requirements
- Pull request process
License
This project is licensed under the MIT License - see LICENSE for details.
Acknowledgments
- NetworkX community for the core graph library and dispatching support
- NetworkRepository.com for harmonized dataset access
Contact
For questions or suggestions: