Проведение расчетов на кластере HybriLIT с использованием графических ускорителей NVIDIA ДОСТУПНЫЕ ДЛЯ РАСЧЕТОВ ГРАФИЧЕСКИЕ УСКОРИТЕЛИ На гетерогенном кластере HybriLIT доступны три представителя семейства графических ускорителей NVIDIA Tesla: Tesla K20X, Tesla K40, Tesla K80. В Таблице 1 представлена информация об вычислительных узах, оснащенных GPU и в какой очереди планировщика задач SLURM они доступны для расчетов. Таблица 1. Доступные для расчетов графические ускорители. Графический Вычислительные Количество Общее ускоритель узлы графических количество ускорителей графических на одном ускорителей узле Tesla K20X blade02 1 1 Tesla K40 Tesla K80 blade04 blade05 blade06 blade07 blade08 blade09 Название очереди в SLURM interactive 3 12 gpu-k40 2 4 gpu-k80 Отметим, что вычислительный узел blade02, содержащий графический ускоритель NVIDIA Tesla K20, включен в интерактивную очередь SLURM, для отладки приложений, и имеет ограничение по времени расчетов один час. Для проведения расчетов необходимо использовать пакетный режим SLURM с запуском зада через команду sbatch <script-file>. ЗАПУСК GPU-ПРИЛОЖЕНИЙ НА КЛАСТЕРЕ В СИСТЕМЕ SLURM Для запуска приложений, использующих графические ускорители, в пакетном режиме в системе SLURM необходимо указать в запускаемом скрипт-файле следующие обязательные параметры/опции: имя соответствующей очереди, в зависимости от типа GPU (См. Таблицу 1). Например, при использование в расчетах графических ускорителей NVIDIA Tesla K40 , в скриптфайл надо добавить строку: #SBATCH -p gpu_k40 количество требуемых графических процессоров (GPU), которое задается опцией --gres (Generic сonsumable RESources) в виде: --gres=gpu:<кол-во GPU на одном узле>. Например, для использования трех GPU на одном узле, в скрипт-файл надо добавить строку: #SBATCH --gres=gpu:3 Для использования в расчетах большего количества GPU, чем на одном узле, в скрипт-файл надо добавить две строки: #SBATCH --nodes=2 #SBATCH --gres=gpu:3 В этом случае будет задействовано два вычислительных узла с тремя графическими процессорами на каждом, суммарно 6 GPU. Особенности вычислений с использованием ускорителя NVIDIA K80. Графический ускоритель Tesla K80 является двухпроцессорным устройством (два графических процессора в одном устройстве) и обладает почти в два раза более высокой производительностью и вдвое более широкой полосой пропускания памяти по сравнению с предшественником - Tesla K40. Для задействования двух процессоров ускорителя Tesla K80 в скрипт-файле необходимо указать параметр –gres=gpu:2 #SBATCH --gres=gpu:2 Приложения, использующие один графический процессор. Ниже, в Таблице 2, представлены общие скрипт-файлы для запуска приложений с использованием графического ускорителя NVIDIA Tesla K40 и одного процессора ускорителя Tesla K80 в пакетном режиме в системе SLURM. Таблица 2. Примеры скрипт-файлов для запуска GPU-приложений. Тип используемых в расчетах ускорителей NVIDIA Tesla Tesla K40 #!/bin/sh # Example for one-GPU applications # # Set the partition where the job will run: #SBATCH -p gpu_k40 # #Set the number of GPUs per node #SBATCH --gres=gpu:1 # #Submit a job for execution: srun ./testK40 # # End of submit file Tesla K80 #!/bin/sh # Example for one-GPU applications # # Set the partition where the job will run: #SBATCH -p gpu_k80 # #Set the number of GPUs per node #SBATCH --gres=gpu:1 # #Submit a job for execution: srun ./testK80 # # End of submit file Для использования в расчетах нескольких графических процессоров необходим механизм распределения задач между различными устройствами, в том числе, находящимся на различных узлах кластера, т.е. возможны следующие случаи: несколько GPU на одном вычислительном узле; несколько вычислительных узлов с графическими процессорами. Для эффективного использования нескольких графических ускорителей разрабатываются гибридные приложения, например, OpenMP+CUDA, MPI+CUDA, MPI+OpenMP+CUDA и т.п. Более подробную информацию можно найти в проекте GitLab “Parallel features”: https://gitlab-hlit.jinr.ru/ Приложения, использующие несколько графических процессоров (multi-GPU application) на одном узле. Пример запуска приложения OpenMP+CUDA, в котором каждому потоку/нити (OpenMP-thread) ставится в соответствие один графический процессор. Таблица 3. Примеры скрипт-файлов для запуска multi-GPU приложений на одном вычислительном узле. Тип используемых в расчетах ускорителей NVIDIA Tesla Tesla K40 Tesla K80 #!/bin/sh #!/bin/sh # Example for multi-GPU applications, # Example for multi-GPU applications, # job running on a single node # job running on a single node # # # Set the partition where the job will run: # Set the partition where the job will run: #SBATCH -p gpu_k40 #SBATCH -p gpu_k80 # # #Set the number of GPUs per node #Set the number of GPUs per node # (maximum 3 ): # (maximum 4 - K80=2 x K40): #SBATCH --gres=gpu:3 #SBATCH --gres=gpu:4 # # #Set number of cores per task #Set number of cores per task #SBATCH -c 3 #SBATCH -c 4 # # #Set OMP_NUM_THREADS to the same #Set OMP_NUM_THREADS to the same # value as –c # value as –c if [ -n "$SLURM_CPUS_PER_TASK" ]; then if [ -n "$SLURM_CPUS_PER_TASK" ]; then omp_threads=$SLURM_CPUS_PER_TASK omp_threads=$SLURM_CPUS_PER_TASK else else omp_threads=1 omp_threads=1 fi fi export OMP_NUM_THREADS=$omp_threads export OMP_NUM_THREADS=$omp_threads # # #Submit a job for execution: #Submit a job for execution: srun ./testK40 srun ./ testK80 # # # End of submit file # End of submit file Приложения, использующие несколько графических процессоров (multi-GPU application) на нескольких вычислительных узлах. Пример запуска приложения MPI+CUDA, в котором каждому процессу ставится в соответствие один графический процессор, при этом явно указано количество процессов на узел. Таблица 4. Примеры скрипт-файлов для запуска multi-GPU приложений на нескольких вычислительных узлах. Тип используемых в расчетах ускорителей NVIDIA Tesla Tesla K40 Tesla K80 #!/bin/sh #!/bin/sh # Example for GPU applications # Example for GPU applications # # # Set the partition where the job will run: # Set the partition where the job will run: #SBATCH -p gpu_k40 #SBATCH -p gpu_k80 # # # Set the number of nodes (maximum 4): # Set the number of nodes (maximum 2): #SBATCH --nodes=2 #SBATCH --nodes=2 # # #Specifies the number of GPU per node #Specifies the number of GPU per node # (maximum 3 ): # (maximum 4 - K80=2 x K40): #SBATCH --gres=gpu:3 #SBATCH --gres=gpu:4 # # # Set number of MPI tasks # Set number of MPI tasks #SBATCH -n 6 #SBATCH -n 8 # # #Submit a job for execution: #Submit a job for execution: mpirun ./testK40mpiCuda mpirun ./testK80mpiCuda # # # End of submit file # End of submit file