Файл хоста с Mpirun на многоузле с slurm

#mpi #hpc #slurm

#mpi #hpc #slurm

Вопрос:

У меня есть два исполняемых файла, которые я хотел бы запустить следующим образом: для каждого узла я хочу запустить N-1 процесс для exe1 и 1 exe2

В предыдущей системе slurm, которая работала, выполняя такие:

 #!/bin/bash -l
#SBATCH --job-name=XXX
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=2
#SBATCH --mem=120GB
#SBATCH --time=04:00:00



module purge
module load intel/compiler/2020.1.217
module load openmpi/intel/4.0.5_2020.1.217


scontrol show hostname $SLURM_JOB_NODELIST | perl -ne 'chomb; print "$_"x1'> myhostall
scontrol show hostname $SLURM_JOB_NODELIST | perl -ne 'chomb; print "$_"x1'>>myhostall

mpirun --mca btl_openib_allow_ib 1 --report-bindings -hostfile myhostall -np 2 ./exe1 : -np 2 ./exe2
 

В этом примере у меня есть два узла с каждой двумя задачами / узлом. Итак, exe1 должен иметь 1 ранг от каждого узла и аналогично для exe2.

Если я скажу cat myhostall :

 come-0-12
come-0-13
come-0-12
come-0-13
 

Но в моем коде при вводе имени процессора с помощью MPI_GET_PROCESSOR_NAME оказывается, что exe1 оба ранжирует печать come-0-12 , а для exe2 оба печатает come-0-13 .

Итак, вопрос здесь:

Как мне указать N количество задач на каждый узел в exe1 и M количество задач на каждый узел в exe2

Ответ №1:

Вы можете указать 2 файла хоста, по одному на exe

например

mpirun -np 2 --hostfile hostfile_1 exe1 : -np 2 --hostfile hostfile_2 exe2

В каждом hostfile вы можете указать, сколько слотов каждый exe-файл будет использовать на каждом узле.

например (подробнее см. На https://www.open-mpi.org/faq/?category=running#mpirun-hostfile ), в случае, если вы хотите, чтобы оба exe1 и exe2 имели по 1 процессору от каждого узла, hostfile_1 и hostfile_2 могут быть идентичными или, возможно, даже одним и тем же файлом:

 node1 slots=1
node2 slots=1
 

Однако, если hostsfile_1 и hostfile_2 содержат одни и те же узлы, mpirun, скорее всего, перераспределит задачи так, как он «считает» более оптимальным.

Другой подход заключается в указании того же файла hosts и использовании директивы «—map-by node» (поведение по умолчанию — «—map-by slot»), например:

 mpirun -hostfile hosts.txt -np 2 --map-by node ./exe1 : -hostfile hosts.txt -np 2 --map-by node ./exe2
 

где hosts.txt содержит:

 node1 slots=2
node2 slots=2
 

что дает в моем случае (OpenMPI-4.0.4)

 EXE1 from processor node1, rank 0 out of 4 processors
EXE1 from processor node2, rank 1 out of 4 processors
EXE2 from processor node1, rank 2 out of 4 processors
EXE2 from processor node2, rank 3 out of 4 processors
 

Также потенциально можно использовать rankfiles (если вы используете OpenMPI) для более явной привязки задач к конкретному процессору, но это может быть немного громоздким…

Комментарии:

1. Спасибо! — Но не могли бы вы привести пример того, как будет выглядеть hostfile в этом случае

2. добавлен пример файла хоста и ссылки на часто задаваемые вопросы OpenMPI