Отправить задание с кодом Python (mpi4py) в кластере HPC

Я работаю над кодом Python с MPI (mpi4py), и я хочу реализовать свой код на многих узлах (каждый узел имеет 16 процессоров) в очереди в кластере HPC.

Мой код структурирован следующим образом:

from mpi4py import MPI

comm = MPI.COMM_WORLD 
size = comm.Get_size()
rank = comm.Get_rank()

count = 0
for i in range(1, size):
    if rank == i:
        for j in range(5):
            res = some_function(some_argument)
            comm.send(res, dest=0, tag=count) 

Я могу отлично запустить этот код на головном узле кластера с помощью команды

$mpirun -np 48 python codename.py

Здесь «код» - это имя скрипта Python, а в данном примере я выбираю 48 процессоров. На головном узле для моей конкретной задачи работа занимает около 1 секунды (и она успешно дает желаемый результат).

Однако, когда я запускаю, пытаюсь отправить этот же точный код в качестве задания в одну из очередей кластера HPC, он продолжает работать очень долго (много часов) (не завершается) и я должен вручную убить работу через день или около того. Кроме того, он не дает ожидаемого результата.

Вот файл pbs, который я использую,

#!/bin/sh

#PBS -l nodes=3:ppn=16 
#PBS -N phy
#PBS -m abe
#PBS -l walltime=23:00:00
#PBS -j eo
#PBS -q queue_name

cd $PBS_O_WORKDIR
echo 'This job started on: ' `date`

module load python27-extras
mpirun -np 48 python codename.py

Я использую команду qsub jobname.pbs, чтобы отправить задание.

Я не понимаю, почему код должен отлично работать на головном узле, но сталкиваюсь с этой проблемой, когда отправляю это задание для запуска кода на многих процессорах в очереди. Я предполагаю, что мне может потребоваться изменить сценарий pbs. Я буду очень благодарен, если кто-нибудь подскажет, что мне делать, чтобы запустить такой MPI-скрипт как задание в очереди в кластере HPC.


person Commoner    schedule 25.05.2017    source источник
comment
Не могли бы вы опубликовать полный код? Как есть, все процессы, кроме 0, отправляют 5 сообщений процессу 0. Не могли бы вы отредактировать свое сообщение, чтобы показать нам, как эти сообщения получаются? Если send не завершается recv, может возникнуть тупик, и программа будет работать бесконечно.   -  person francis    schedule 25.05.2017


Ответы (1)


Мне не нужно было менять мой код. Это скрипт pbs, который сработал. знак равно

По-видимому, мне нужно было вызвать соответствующий mpirun в сценарии задания, чтобы при запуске кода в кластерах он использовал тот же mpirun, который использовался в головном узле.

Это строка, которая имеет значение: /opt/intel/impi/4.1.1.036/intel64/bin/mpirun

Это рабочий сценарий, который сработал.

#!/bin/sh

#PBS -l nodes=3:ppn=16
#PBS -N phy
#PBS -m abe
#PBS -l walltime=23:00:00
#PBS -j eo
#PBS -q queue_name

cd $PBS_O_WORKDIR
export OMP_NUM_THREADS=16
export I_MPI_PIN=off
echo 'This job started on: ' `date`

/opt/intel/impi/4.1.1.036/intel64/bin/mpirun -np 48 python codename.py
person Commoner    schedule 26.05.2017