#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