# Perlmutter execution The package does not encode Perlmutter paths, modules, or allocation policy. Create the uv environment in the project location appropriate for your account, select a site-compatible GPU/driver environment, and use the same Hydra configuration as on a workstation. ## Single GPU ```bash uv run gnn4colliders train \ data.cache.path=/path/to/graphs.pt \ environment=perlmutter \ trainer.device=cuda \ trainer.max_epochs=10 ``` The equivalent Slurm wrapper is: ```bash sbatch scripts/slurm/train_single_gpu.sh \ data.cache.path=/path/to/graphs.pt trainer.max_epochs=10 ``` ## Single-node DDP ```bash GPUS_PER_NODE=4 sbatch scripts/slurm/train_multi_gpu.sh \ data.cache.path=/path/to/graphs.pt trainer.max_epochs=10 ``` The wrapper uses `torchrun`; `batch_size` and `num_workers` are per GPU. Effective batch size is `data.batch_size * number_of_processes`, and only rank 0 writes the shared checkpoint/config/prediction artifacts. ## Multi-node DDP ```bash GPUS_PER_NODE=4 sbatch scripts/slurm/train_multi_node.sh \ data.cache.path=/path/to/graphs.pt trainer.max_epochs=10 ``` Use the provided script as a template and adapt only allocation/account settings required by the site. Evaluation and prediction can use `scripts/slurm/evaluate.sh`; prediction currently gathers moderate-size results in memory. ## Checks and common failures ```bash uv run python -c "import torch, dgl; print(torch.__version__, dgl.__version__, torch.cuda.is_available())" uv run gnn4colliders --help ``` An unavailable DGL wheel, incompatible driver, missing cache, or mismatched cache schema should be fixed in the environment/input rather than hidden with package-level path changes. GPU kernels and distributed execution are not promised bitwise deterministic. ## Large ROOT graph preparation Large samples should be prepared as persistent shards. Each Slurm array task reads one contiguous global event range and writes one `shard-NNNNN.pt` file; completed shards are validated and reused when an interrupted array is resubmitted. No full-cache in-memory merge is performed. Create the range manifest once: ```bash uv run gnn4colliders prepare-manifest \ --config-name config_tth_cp_even_odd \ --shard-count 256 \ --output-dir outputs/ttH_cp_even_odd/shards ``` Submit the CPU array, limiting concurrent tasks to match the filesystem and allocation capacity: ```bash sbatch --array=0-255%32 scripts/slurm/prepare_tth_cp_even_odd.sh ``` The script defaults to 64 process workers per task and 256 shards. Set `SHARD_DIR`, `SHARD_COUNT`, or `CONFIG` at submission time to use another location or configuration. The current training loader still expects a single cache, so the next step after extraction is a streaming sharded loader; do not merge the full benchmark into one `.pt` file.