Hyper-Q / MPS

From Alliance Doc
Revision as of 22:40, 4 December 2023 by Diane27 (talk | contribs) (Created page with "Nos tests ont démontré que MPS peut augmenter le nombre d'opérations en virgule flottante (<i>flops</i>) même quand le GPU est partagé avec des processus CPU qui ne sont pas reliés. Ceci signifie que MPS est idéal pour des applications CUDA qui traitent des problèmes de relativement petite taille qui par eux-mêmes sont incapables de bien saturer les GPU modernes qui ont des milliers de cœurs.")
Jump to navigation Jump to search
Other languages:


Aperçu

Hyper-Q (ou MPS) est une fonctionnalité des GPU de NVIDIA avec capacité de calcul CUDA 3.5 et plus,[1] ce qui est le cas pour toutes nos grappes d'usage général (Béluga, Cedar, Graham et Narval).

According to NVIDIA,

The MPS runtime architecture is designed to transparently enable co-operative multi-process CUDA applications, typically MPI jobs, to utilize Hyper-Q capabilities on the latest NVIDIA (Kepler and later) GPUs. Hyper-Q allows CUDA kernels to be processed concurrently on the same GPU; this can benefit performance when the GPU compute capacity is underutilized by a single application process.


Nos tests ont démontré que MPS peut augmenter le nombre d'opérations en virgule flottante (flops) même quand le GPU est partagé avec des processus CPU qui ne sont pas reliés. Ceci signifie que MPS est idéal pour des applications CUDA qui traitent des problèmes de relativement petite taille qui par eux-mêmes sont incapables de bien saturer les GPU modernes qui ont des milliers de cœurs.

MPS n'est pas actif par défaut, mais il suffit de lancer les commandes suivantes avant de lancer votre application CUDA.

[name@server ~]$ export CUDA_MPS_PIPE_DIRECTORY=/tmp/nvidia-mps
[name@server ~]$ export CUDA_MPS_LOG_DIRECTORY=/tmp/nvidia-log
[name@server ~]$ nvidia-cuda-mps-control -d


Then you can use the MPS feature if you have more than one CPU thread accessing the GPU. This will happen if you run a hybrid MPI/CUDA application, a hybrid OpenMP/CUDA application, or multiple instances of a serial CUDA application (GPU farming).

Pour plus d'information sur MPS, voir la documentation de NVIDIA.

Farming avec GPU

One situation when the MPS feature can be very useful is when you need to run multiple instances of a CUDA application, but the application is too small to saturate a modern GPU. MPS allows you to run multiple instances of the application sharing a single GPU, as long as there is enough of GPU memory for all of the instances of the application. In many cases this should result in a significantly increased throughput from all of your GPU processes.

Le script suivant est un exemple pour configurer le farming avec GPU.


File : script.sh

#!/bin/bash
#SBATCH --gpus-per-node=v100:1
#SBATCH --time=0-10:00
#SBATCH --mem-per-cpu=8G
#SBATCH --cpus-per-task=8
 
mkdir -p $HOME/tmp
export CUDA_MPS_LOG_DIRECTORY=$HOME/tmp
nvidia-cuda-mps-control -d
 
for ((i=0; i<8; i++))
 do
 echo $i
 ./my_code $i  &
 done
 
wait


In the above example, we share a single V100 GPU between 8 instances of my_code (which takes a single argument-- the loop index $i). We request 8 CPU cores (#SBATCH -c 8) so there is one CPU core per application instance. The two important elements are & on the code execution line, which sends the code processes to the background, and the wait command at the end of the script, which ensures that the job runs until all background processes end.

  1. Voir le tableau des modèles, architectures et capacités de calcul CUDA dans https://en.wikipedia.org/wiki/Nvidia_Tesla.