GPU And Clusters
| Status | Applies to | Owner |
|---|---|---|
| Pre-release draft | main branch as of 2026-06-30 GPU and cluster operation | Public user docs |
g executes statistical kernels through JAX. Choose the target device in TOML:
[compute]
device = "gpu" # or "cpu"
CPU support is installed by the base runtime dependencies. GPU support requires the GPU installation flow and a scheduler allocation on a GPU node.
GPU acceleration is workload-dependent. Single-trait runs can be limited by BGEN decode, host-device transfer, or output writing rather than JAX compute.
Cold, Warm, And Steady-State Runs
The first process on a node may pay for Python import, JAX backend initialization, and JAX compilation. A later run with the same shapes and cache policy can be faster. Treat these as different measurements:
| Run class | What it measures |
|---|---|
| Cold process | Startup, JAX initialization, compilation, decode, compute, and output. |
| Warm cache | Reused compilation artifacts when always-enabled persistent-cache entries match. |
| Steady state | Chunk decode, transfer, compute, and writer throughput after startup effects. |
The persistent cache is always enabled and defaults to
<platform temporary directory>/<user>/g-jax-cache.
[compute].jax_cache_dir overrides that location. Put overrides on local or
fast user-writable storage, and do not share CPU cache artifacts across nodes
with different CPU features.
When GPU May Not Help
GPU execution is not automatically faster. CPU can match or beat GPU for small or I/O-bound runs when:
- the scan has one phenotype and few variants;
- BGEN decode or sample alignment dominates;
- host-to-device transfer dominates compute;
- Parquet writing dominates runtime;
- approximate-Firth candidate density is low enough that GPU work is sparse;
- the command repeatedly changes shapes and recompiles.
What To Check First
Run these checks inside the same environment and allocation where the scan will run:
hostname
uv run python -c "import jax; print(jax.devices())"
uv run g regenie --help
If JAX does not list the expected GPU, fix the node allocation, driver, CUDA, or
JAX install before tuning g.
Probe the JAX Runtime
Run this check in the same environment and on the same kind of node where the scan will run:
uv run python -c "import jax; print(jax.devices())"
If JAX cannot see the expected accelerator, fix the driver, CUDA, or JAX wheel environment before
measuring g performance. On a login node without NVIDIA devices, a CPU-only result can be
expected even when the GPU environment is otherwise valid.
Generic SLURM GPU Job
Install and sync the checkout before submitting the job. Inside the batch script, use
uv run --no-sync so the job uses the already-created .venv/ instead of trying to change the
environment while the scan is running:
#!/usr/bin/env bash
#SBATCH --job-name=g-regenie2
#SBATCH --gres=gpu:1
#SBATCH --cpus-per-task=8
#SBATCH --mem=64G
#SBATCH --time=04:00:00
set -euo pipefail
cd /path/to/g
export UV_CACHE_DIR="${SCRATCH:-$HOME}/.cache/uv"
export UV_LINK_MODE=copy
uv run --no-sync g regenie \
--config /path/to/gpu.toml \
--qt \
--bgen /path/to/genotypes.bgen \
--sample /path/to/genotypes.sample \
--phenoFile /path/to/phenotypes.tsv \
--phenoCol phenotype_continuous \
--pred /path/to/regenie_step1_qt_pred.list \
--out /path/to/output/g_gpu_regenie2
Adjust #SBATCH options for your site's partitions, accounts, GPU resource syntax, and memory
policy.
Generic SLURM CPU Job
Large CPU scans should also run on a compute node rather than a login node:
#!/usr/bin/env bash
#SBATCH --job-name=g-regenie2-cpu
#SBATCH --cpus-per-task=16
#SBATCH --mem=64G
#SBATCH --time=04:00:00
set -euo pipefail
cd /path/to/g
export UV_CACHE_DIR="${SCRATCH:-$HOME}/.cache/uv"
export UV_LINK_MODE=copy
uv run --no-sync g regenie \
--config /path/to/cpu.toml \
--qt \
--bgen /path/to/genotypes.bgen \
--sample /path/to/genotypes.sample \
--phenoFile /path/to/phenotypes.tsv \
--phenoCol phenotype_continuous \
--pred /path/to/regenie_step1_qt_pred.list \
--out /path/to/output/g_cpu_regenie2
Cluster Notes
- Do not run GPU scans or large CPU scans on a login node.
- Keep
UV_CACHE_DIRand run output on user-writable storage with enough quota. - Use
UV_LINK_MODE=copyon shared filesystems where hardlinks or reflinks are unreliable. - Run
uv syncbefore submitting production jobs, then useuv run --no-syncinside batch jobs. - Use upstream
regenieto create Step 1 predictions before runninggStep 2.
The gauss development-server recipes and benchmark wrappers are documented in Server Gauss SLURM.
Runtime Knobs
Important runtime knobs include:
| Setting | Purpose |
|---|---|
--bsize / [trait].bsize |
Variants per chunk. |
[compute].device |
JAX execution target. |
[compute].cpu_threads |
Native Rayon worker count. |
[compute].multi_phenotype_sample_mode |
Per-phenotype or shared complete-case sample alignment. |
[output].writer_threads |
Output writer worker count. |
[compute].firth_batch_size |
Binary approximate-Firth batch size. |
[compute].jax_cache_dir |
Override for the always-enabled persistent JAX compilation cache directory. |
Scheduler queue depths, packed8 BGEN compatibility validation, decode tiling, packed8 selection, and Parquet grouping/compression are internal genotype/engine/output policies.
Fair performance comparisons require equivalent statistical modes. Compare score-only to score-only, and compare approximate Firth only when both tools use approximate Firth with the same fallback threshold.
For broader tuning and measurement guidance, see Performance Guide.