GPU Resources on BMRC¶
Overview¶
The BMRC cluster provides GPU-accelerated compute nodes for machine learning, deep learning, and other GPU-intensive workloads. These nodes feature NVIDIA GPUs with varying specifications to suit different computational requirements.
Due to rapidly evolving hardware capabilities, our GPU nodes have considerable variation in CPU, RAM, and GPU configurations. This guide will help you understand the available resources and how to request them efficiently.
More information
This documentation covers the essentials of GPU types available on the cluster and how to select and request them. For an extensive guide on choosing the right GPU for your codebase, benchmarking, and GPU profiling, refer to our GPU profiling training material.
🛎️ GPU Jobs Require a Separate Slurm Account¶
Use gpu_kir.prj for GPU jobs only
All GPU jobs must specify the dedicated GPU Slurm account:
Do not use gpu_kir.prj for CPU-only jobs. GPU allocations are billed at a higher rate than CPU allocations — using the GPU account for CPU jobs will result
in our project being charged at the more expensive GPU rate unnecessarily.
GPU Partitions¶
GPU resources are available through the following Slurm partitions:
Partition Table¶
| Partition | GPUs | GPU Memory (GB) | Max Runtime (hrs) | Default CPUs | Default Memory (GB) |
|---|---|---|---|---|---|
| Batch partitions | |||||
gpu_p100_16gb |
12 | 16 | 60 | 5 | 90 |
gpu_v100_16gb |
4 | 16 | 60 | 11 | 60 |
gpu_v100_32gb |
2 | 32 | 60 | 7 | 750 |
gpu_rtx8000_48gb |
12 | 48 | 60 | 7 | 185 |
gpu_a100_40gb |
16 | 40 | 60 | 7 | 90 |
gpu_a100_80gb |
24 | 80 | 60 | 11 | 120 |
gpu_gh200_144gb |
40 | 144 | TBD | 72 | TBD |
| Interactive partition | |||||
gpu_interactive |
18 | 24 | 12 | 7 | 80 |
Partition Selection¶
- Use
gpu_interactivefor interactive development, debugging, and testing (12-hour limit, 1 GPU per user) - Use a batch partition for non-interactive workloads — prefer partitions with sufficient GPU memory for your job rather than requesting the largest available
gpu_gh200_144gbis a high-capability partition; runtime limits are still to be confirmedgpu_v100_32gbhas a very high default memory allocation (750 GB) — only request what your job actually needs
How to request a GPU on a script for sbatch or via srun¶
The recommended methods for requesting GPUs are --gres or --gpus-per-node:
Using --gres (Generic Resource Scheduling):
The gpu_interactive Partition is Heterogeneous¶
Unlike the batch partitions — where the partition name implies a single GPU type — gpu_interactive contains multiple GPU models across its nodes.
If you submit without specifying a type, Slurm will assign whichever GPU is available.
To see what is currently in the partition:
Select a Specific GPU type from gpu_interactive partition
If you need a specific GPU model, use the full GRES type name as reported by sinfo:
# Interactive session pinned to a Quadro RTX 6000
srun --account gpu_kir.prj -p gpu_interactive --gres gpu:quadro-rtx6000:1 --pty bash
# Or in a batch script
#SBATCH --account gpu_kir.prj
#SBATCH --partition gpu_interactive
#SBATCH --gres gpu:quadro-rtx6000:1
gpu: and :N must match the GRES column in sinfo exactly. If you omit this and just request --gres gpu:1, Slurm will schedule you on whichever node has a free GPU — which may or may not be the model you need.
Using GPU Constraints
Another way to request a GPU type of interest is to use --constraint
Selecting Runtime and QOS¶
The maximum runtime for most GPU partitions is 60 hours. If you know your job will finish sooner, you can apply a Quality of Service (QOS) at submission. This gives your job a significant priority boost in the queue and applies an appropriate runtime cap.
The priority boost is greatest for jobs under 4 hours, followed by 24 hours — 60-hour jobs receive no boost.
GPU QOS Table¶
| QOS Name | Runtime (hrs) | Notes |
|---|---|---|
gpu_bmrc_4hr |
4 | Highest priority boost |
gpu_bmrc_24hr |
24 | Moderate priority boost |
To apply a one of the above QOS at submission:
Resource Limits¶
GPU usage limits
GPUs are a limited resource under considerable demand. Limits are applied to ensure fair throughput across all projects and to allow for scheduled maintenance.
- Per-project GPU limit: 24 GPUs in use simultaneously (across all partitions)
- Minimum per job: at least 1 GPU must be requested (
--gres gpu:1) - Batch partitions: 60-hour maximum runtime — this cannot be extended
- Interactive partition: 1 GPU per user, 12-hour maximum runtime
Runtime limits cannot be extended for jobs in normal operation. If your workload exceeds 60 hours, consider:
- Checkpointing — save model/state periodically and resume from the last checkpoint
- Parallelisation — break work into smaller independent chunks that fit within shorter runtimes
Both approaches also improve resilience against unexpected job interruption.
⚠️ P100 GPU Compatibility Warning¶
P100 GPUs are not compatible with PyTorch 2.0+ or modern ML frameworks
P100 GPUs have CUDA Compute Capability 6.0. PyTorch 2.0+, TensorFlow 2.12+, JAX, and similar frameworks require Compute Capability 7.0 or higher. Jobs will fail with cryptic CUDA errors if inadvertently scheduled on P100 nodes.
Always exclude P100s for modern ML/DL workloads
Example Job Scripts¶
#!/bin/bash
#SBATCH --account gpu_kir.prj
#SBATCH --partition gpu_a100_80gb
#SBATCH --qos gpu_bmrc_4hr
#SBATCH --gpus-per-node 1
#SBATCH --mem 64G
#SBATCH --cpus-per-task 8
#SBATCH --job-name my_training_job
#SBATCH --output logs/%j.out
module load Python/3.11.3-GCCcore-12.3.0
module load CUDA
source ~/venvs/pytorch/bin/activate
python train_model.py --epochs 50 --batch-size 32
#!/bin/bash
#SBATCH --account gpu_kir.prj
#SBATCH --partition gpu_a100_40gb
#SBATCH --gres gpu:4
#SBATCH --mem 200G
#SBATCH --cpus-per-task 32
#SBATCH --job-name multi_gpu_training
module load Python/3.11.3-GCCcore-12.3.0 CUDA
source ~/venvs/pytorch/bin/activate
torchrun --nproc_per_node=4 train_distributed.py
#!/bin/bash
#SBATCH --account gpu_kir.prj
#SBATCH --partition gpu_rtx8000_48gb
#SBATCH --gpus-per-node 2
#SBATCH --mem-per-gpu 150G
#SBATCH --cpus-per-task 16
#SBATCH --job-name memory_intensive
module load Python/3.11.3-GCCcore-12.3.0
source ~/venvs/tensorflow/bin/activate
python train_large_model.py
Resource Allocation¶
CPU Cores¶
Each GPU slot comes with a default number of CPU cores (see partition table above). To override:
System Memory (RAM)¶
Total RAM available scales with the number of GPUs requested: RAM per slot × number of GPUs.
Circle-info
You can request up to the RAM-per-slot limit shown in the detailed node specifications. For example, compg028 has 187 GB per slot, so requesting 4 GPUs on that node could give you up to 748 GB total RAM.
Best Practices¶
- Choose the right partition — use
gpu_interactivefor development and testing; use a batch partition for production workloads - Apply a QOS — if your job will finish in under 4 or 24 hours, use
--qos gpu_bmrc_4hror--qos gpu_bmrc_24hrto improve queue priority - Request appropriate resources — don't over-request GPUs, CPUs, or RAM; test with 1 GPU before scaling up
- Exclude P100s for modern ML/DL — always add
--constraint "v100|rtx6000|rtx8000|a100"for PyTorch 2.0+ / TensorFlow 2.12+ jobs - Monitor your jobs — use
nvidia-smiin interactive sessions; review efficiency after completion withseff <job_id> - Plan for heterogeneity — different nodes have different CPU/RAM allocations; check the node specs table if you need specific resources
Quick Reference¶
Common Commands¶
# View available GPUs in a partition
sinfo -p gpu_a100_80gb -o "%N %G" -N
# Check GPU queue status
squeue -p gpu_a100_80gb
# Submit a GPU job with a 4-hour QOS
sbatch --account gpu_kir.prj -p gpu_a100_80gb --qos gpu_bmrc_4hr --gres gpu:1 script.sh
# Interactive session
srun --account gpu_kir.prj -p gpu_interactive --gres gpu:1 --pty bash
GPU GRES Quick Reference¶
# P100 (⚠️ avoid for PyTorch 2.0+)
--gres gpu:p100-sxm2-16gb:N
# V100
--gres gpu:v100-pcie-32gb:N
--gres gpu:v100-sxm2-16gb:N
# RTX
--gres gpu:quadro-rtx6000:N
--gres gpu:quadro-rtx8000:N
# A100
--gres gpu:a100-pcie-40gb:N
--gres gpu:a100-pcie-80gb:N
Advanced Options¶
Contact KIR Research Computing before using these options
The flags --gpus, --gpus-per-task, and --gpus-per-socket are relevant for MPI workloads and can create blocking reservations that affect other users. Please contact KIR Research Computing Manager before using these options.
Getting Help¶
- Check job output files for error messages
- Use
scontrol show job <job_id>to inspect job details - Contact KIR Research Computing at kir-rc@kennedy.ox.ac.uk
- For MPI or advanced GPU scheduling, contact us first to discuss your requirements