Using GPUs with Slurm: Difference between revisions
(Marked this version for translation) |
(change advice from --gres=gpu to --gpus-per-node) |
||
Line 1: | Line 1: | ||
<languages /> | <languages /> | ||
<translate> | <translate> | ||
== Introduction == | |||
To request one or more GPUs for a Slurm job, use this form: | |||
--gpus-per-node=[type:]number | |||
The square-bracket notation means that you must specify the number of GPUs, and you may optionally specify the GPU type. Choose a type from the "Available hardware" table below. Here are two examples: | |||
--gpus-per-node=2 | |||
--gpus-per-node=v100:1 | |||
The first example requests two GPUs per node, of any type available on the cluster. The second example requests one GPU per node, with the GPU being of the V100 type. | |||
The following form can also be used: | |||
--gres=gpu[[:type]:number] | |||
This is older, and we expect it will no longer be supported in some future release of Slurm. We recommend that you replace it in your scripts with the above --gpus-per-node form. | |||
There are a variety of other directives that you can use to request GPUs and related resources: --gpus, --gpus-per-socket, --gpus-per-task, --mem-per-gpu, and --ntasks-per-gpu. Please see the Slurm documentation for [https://slurm.schedmd.com/sbatch.html sbatch] for more about these. Alliance staff have not tested many combinations of these, so if you try them and don't get the resources you expect or want, [[Technical support|contact support]]. | |||
<!--T:15--> | <!--T:15--> | ||
Line 48: | Line 65: | ||
It is not a measure of performance. It is relevant only if you are compiling your own GPU programs. See the page on [[CUDA#.22Compute_Capability.22|CUDA programming]] for more. | It is not a measure of performance. It is relevant only if you are compiling your own GPU programs. See the page on [[CUDA#.22Compute_Capability.22|CUDA programming]] for more. | ||
== | == Mist == <!--T:38--> | ||
[https://docs.scinet.utoronto.ca/index.php/Mist Mist] is a cluster comprised of IBM Power9 CPUs (not Intel x86!) and NVIDIA V100 GPUs. | |||
Users with access to Niagara can also access Mist. To specify job requirements on Mist, | |||
please see the specific instructions on the [https://docs.scinet.utoronto.ca/index.php/Mist#Submitting_jobs SciNet web site]. | |||
== Selecting the type of GPU to use == <!--T:16--> | |||
<!--T:37--> | <!--T:37--> | ||
Some clusters have more than one GPU type available ([[Cedar]], [[Graham]], [[Hélios/en|Hélios]]), and some clusters only have GPUs on certain nodes ([[Béluga/en|Béluga]], [[Cedar]], [[Graham]]). | Some clusters have more than one GPU type available ([[Cedar]], [[Graham]], [[Hélios/en|Hélios]]), and some clusters only have GPUs on certain nodes ([[Béluga/en|Béluga]], [[Cedar]], [[Graham]]). | ||
<!--T:40--> | <!--T:40--> | ||
If you do not supply a type specifier, Slurm may send your job to a node equipped with any type of GPU. | If you do not supply a type specifier, Slurm may send your job to a node equipped with any type of GPU. | ||
For certain workflows this may be undesirable. | For certain workflows this may be undesirable. | ||
For example, molecular dynamics code requires high double-precision performance, | For example, molecular dynamics code requires high double-precision performance, for which T4 GPUs are not appropriate. | ||
In such a case, make sure you include a type specifier. | In such a case, make sure you include a type specifier. | ||
== Single-core job == <!--T:3--> | == Single-core job == <!--T:3--> | ||
Line 75: | Line 89: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --account=def-someuser | #SBATCH --account=def-someuser | ||
#SBATCH -- | #SBATCH --gpus-per-node=1 | ||
#SBATCH --mem=4000M # memory | #SBATCH --mem=4000M # memory per node | ||
#SBATCH --time=0-03:00 | #SBATCH --time=0-03:00 | ||
./program # you can use 'nvidia-smi' for a test | ./program # you can use 'nvidia-smi' for a test | ||
}} | }} | ||
== Multi-threaded job == <!--T:4--> | == Multi-threaded job == <!--T:4--> | ||
For GPU | For a GPU job which needs multiple CPUs in a single node: | ||
{{File | {{File | ||
|name=gpu_threaded_job.sh | |name=gpu_threaded_job.sh | ||
Line 89: | Line 103: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --account=def-someuser | #SBATCH --account=def-someuser | ||
#SBATCH -- | #SBATCH --gpus-per-node=1 # Number of GPU(s) per node | ||
#SBATCH --cpus-per-task=6 # CPU cores/threads | #SBATCH --cpus-per-task=6 # CPU cores/threads | ||
#SBATCH --mem=4000M # memory per node | #SBATCH --mem=4000M # memory per node | ||
#SBATCH --time=0-03:00 | #SBATCH --time=0-03:00 | ||
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK | export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK | ||
./program | ./program | ||
}} | }} | ||
For each GPU requested on: | For each GPU requested on: | ||
* Béluga, we recommend no more than 10 CPU cores. | * Béluga, we recommend no more than 10 CPU cores. | ||
Line 108: | Line 123: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --account=def-someuser | #SBATCH --account=def-someuser | ||
#SBATCH -- | #SBATCH --gpus=8 # total number of GPUs | ||
#SBATCH -- | #SBATCH --ntasks-per-gpu=1 # total of 8 MPI processes | ||
#SBATCH --cpus-per-task=6 # CPU cores per MPI process | |||
#SBATCH --cpus-per-task= | #SBATCH --mem-per-cpu=5G # host memory per CPU core | ||
#SBATCH --mem= | |||
#SBATCH --time=0-03:00 # time (DD-HH:MM) | #SBATCH --time=0-03:00 # time (DD-HH:MM) | ||
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK | export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK | ||
Line 128: | Line 142: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --nodes=1 | #SBATCH --nodes=1 | ||
#SBATCH -- | #SBATCH --gpus-per-node=p100:2 | ||
#SBATCH --ntasks-per-node=32 | #SBATCH --ntasks-per-node=32 | ||
#SBATCH --mem=127000M | #SBATCH --mem=127000M | ||
Line 143: | Line 157: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --nodes=1 | #SBATCH --nodes=1 | ||
#SBATCH -- | #SBATCH --gpus-per-node=p100:4 | ||
#SBATCH --ntasks-per-node=24 | #SBATCH --ntasks-per-node=24 | ||
#SBATCH --exclusive | #SBATCH --exclusive | ||
Line 164: | Line 178: | ||
#!/bin/bash | #!/bin/bash | ||
#SBATCH --nodes=1 | #SBATCH --nodes=1 | ||
#SBATCH -- | #SBATCH --gpus-per-node=p100l:4 | ||
#SBATCH --ntasks=1 | #SBATCH --ntasks=1 | ||
#SBATCH --cpus-per-task=24 # There are 24 CPU cores on P100 Cedar GPU nodes | #SBATCH --cpus-per-task=24 # There are 24 CPU cores on P100 Cedar GPU nodes |
Revision as of 19:21, 8 April 2022
Introduction[edit]
To request one or more GPUs for a Slurm job, use this form:
--gpus-per-node=[type:]number
The square-bracket notation means that you must specify the number of GPUs, and you may optionally specify the GPU type. Choose a type from the "Available hardware" table below. Here are two examples:
--gpus-per-node=2 --gpus-per-node=v100:1
The first example requests two GPUs per node, of any type available on the cluster. The second example requests one GPU per node, with the GPU being of the V100 type.
The following form can also be used:
--gres=gpu[[:type]:number]
This is older, and we expect it will no longer be supported in some future release of Slurm. We recommend that you replace it in your scripts with the above --gpus-per-node form.
There are a variety of other directives that you can use to request GPUs and related resources: --gpus, --gpus-per-socket, --gpus-per-task, --mem-per-gpu, and --ntasks-per-gpu. Please see the Slurm documentation for sbatch for more about these. Alliance staff have not tested many combinations of these, so if you try them and don't get the resources you expect or want, contact support.
For general advice on job scheduling, see Running jobs.
Available hardware[edit]
These are the GPUs currently available:
Cluster | # of Nodes | Slurm type specifier |
Per node | GPU model | Compute Capability(*) |
GPU mem (GiB) |
Notes | ||
---|---|---|---|---|---|---|---|---|---|
CPU cores | CPU memory | GPUs | |||||||
Béluga | 172 | v100 | 40 | 191000M | 4 | V100-SXM2 | 70 | 16 | All GPUs associated with the same CPU socket, connected via NVLink |
Cedar | 114 | p100 | 24 | 128000M | 4 | P100-PCIE | 60 | 12 | Two GPUs per CPU socket |
32 | p100l | 24 | 257000M | 4 | P100-PCIE | 60 | 16 | All GPUs associated with the same CPU socket | |
192 | v100l | 32 | 192000M | 4 | V100-SXM2 | 70 | 32 | Two GPUs per CPU socket; all GPUs connected via NVLink | |
Graham | 160 | p100 | 32 | 127518M | 2 | P100-PCIE | 60 | 12 | One GPU per CPU socket |
7 | v100 | 28 | 183105M | 8 | V100-PCIE | 70 | 16 | See Graham: Volta GPU nodes | |
2 | v100l | 28 | 183105M | 8 | V100-? | 70 | 32 | See Graham: Volta GPU nodes | |
30 | t4 | 44 | 192000M | 4 | Tesla T4 | 75 | 16 | Two GPUs per CPU socket | |
6 | t4 | 16 | 192000M | 4 | Tesla T4 | 75 | 16 | ||
Hélios | 15 | k20 | 20 | 110000M | 8 | K20 | 35 | 5 | Four GPUs per CPU socket |
6 | k80 | 24 | 257000M | 16 | K80 | 37 | 12 | Eight GPUs per CPU socket | |
Mist | 54 | (none) | 32 | 256GiB | 4 | V100-SXM2 | 70 | 32 | See Mist specifications |
Narval | 159 | a100 | 48 | 510000M | 4 | A100 | 80 | 40 | Two GPUs per CPU socket; all GPUs connected via NVLink |
Arbutus | Cloud resources are not schedulable via Slurm. See Cloud resources for details of available hardware. |
(*) "Compute Capability" is a technical term created by NVidia as a compact way to describe what hardware functions are available on some models of GPU and not on others. It is not a measure of performance. It is relevant only if you are compiling your own GPU programs. See the page on CUDA programming for more.
Mist[edit]
Mist is a cluster comprised of IBM Power9 CPUs (not Intel x86!) and NVIDIA V100 GPUs. Users with access to Niagara can also access Mist. To specify job requirements on Mist, please see the specific instructions on the SciNet web site.
Selecting the type of GPU to use[edit]
Some clusters have more than one GPU type available (Cedar, Graham, Hélios), and some clusters only have GPUs on certain nodes (Béluga, Cedar, Graham).
If you do not supply a type specifier, Slurm may send your job to a node equipped with any type of GPU. For certain workflows this may be undesirable. For example, molecular dynamics code requires high double-precision performance, for which T4 GPUs are not appropriate. In such a case, make sure you include a type specifier.
Single-core job[edit]
If you need only a single CPU core and one GPU:
#!/bin/bash
#SBATCH --account=def-someuser
#SBATCH --gpus-per-node=1
#SBATCH --mem=4000M # memory per node
#SBATCH --time=0-03:00
./program # you can use 'nvidia-smi' for a test
Multi-threaded job[edit]
For a GPU job which needs multiple CPUs in a single node:
#!/bin/bash
#SBATCH --account=def-someuser
#SBATCH --gpus-per-node=1 # Number of GPU(s) per node
#SBATCH --cpus-per-task=6 # CPU cores/threads
#SBATCH --mem=4000M # memory per node
#SBATCH --time=0-03:00
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
./program
For each GPU requested on:
- Béluga, we recommend no more than 10 CPU cores.
- Cedar, we recommend no more than 6 CPU cores per P100 GPU (p100 and p100l) and no more than 8 CPU cores per V100 GPU (v100l).
- Graham, we recommend no more than 16 CPU cores.
MPI job[edit]
#!/bin/bash
#SBATCH --account=def-someuser
#SBATCH --gpus=8 # total number of GPUs
#SBATCH --ntasks-per-gpu=1 # total of 8 MPI processes
#SBATCH --cpus-per-task=6 # CPU cores per MPI process
#SBATCH --mem-per-cpu=5G # host memory per CPU core
#SBATCH --time=0-03:00 # time (DD-HH:MM)
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
srun ./program
Whole nodes[edit]
If your application can efficiently use an entire node and its associated GPUs, you will probably experience shorter wait times if you ask Slurm for a whole node. Use one of the following job scripts as a template.
Requesting a GPU node on Graham[edit]
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --gpus-per-node=p100:2
#SBATCH --ntasks-per-node=32
#SBATCH --mem=127000M
#SBATCH --time=3:00
#SBATCH --account=def-someuser
nvidia-smi
Requesting a P100 GPU node on Cedar[edit]
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --gpus-per-node=p100:4
#SBATCH --ntasks-per-node=24
#SBATCH --exclusive
#SBATCH --mem=125G
#SBATCH --time=3:00
#SBATCH --account=def-someuser
nvidia-smi
Requesting a P100-16G GPU node on Cedar[edit]
There is a special group of GPU nodes on Cedar which have four Tesla P100 16GB cards each. (Other P100 GPUs in the cluster have 12GB and the V100 GPUs have 32G.) The GPUs in a P100L node all use the same PCI switch, so the inter-GPU communication latency is lower, but bandwidth between CPU and GPU is lower than on the regular GPU nodes. The nodes also have 256GB RAM. You may only request these nodes as whole nodes, therefore you must specify --gres=gpu:p100l:4
. P100L GPU jobs up to 28 days can be run on Cedar.
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --gpus-per-node=p100l:4
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=24 # There are 24 CPU cores on P100 Cedar GPU nodes
#SBATCH --mem=0 # Request the full memory of the node
#SBATCH --time=3:00
#SBATCH --account=def-someuser
hostname
nvidia-smi
Packing single-GPU jobs within one SLURM job[edit]
If you need to run four single-GPU programs or two 2-GPU programs for longer than 24 hours, GNU Parallel is recommended. A simple example is given below:
cat params.input | parallel -j4 'CUDA_VISIBLE_DEVICES=$(({%} - 1)) python {} &> {#}.out'
In this example the GPU ID is calculated by subtracting 1 from the slot ID {%}. {#} is the job ID, starting from 1.
A params.input file should include input parameters in each line, like this:
code1.py code2.py code3.py code4.py ...
With this method, users can run multiple tasks in one submission. The -j4
parameter means GNU Parallel can run a maximum of four concurrent tasks, launching another as soon as each one ends. CUDA_VISIBLE_DEVICES is used to ensure that two tasks do not try to use the same GPU at the same time.