Использование SLURM и MPI (4PY): невозможно выделить запрошенные ресурсы

У меня есть настройка/установка SLURM на моем настольном компьютере, чтобы провести некоторое тестирование и понять, как это работает, прежде чем развертывать его в кластере. На настольном компьютере установлена ​​Ubuntu 18.10 (Cosmic), так как все узлы в кластере работают. Используемая версия SLURM — 17.11.9. Я протестировал некоторые функции SLURM, например. массивы заданий и его развертывание задач. Однако я хотел бы общаться с различными задачами, отправляемыми на каждый узел или ЦП в кластере, чтобы собирать его результаты (без дискового ввода-вывода). По этой причине я посмотрел, как управлять этим, например. очередь сообщений и MPI или OpenMPI. (Любая другая стратегия реализации, как совет или рекомендация, высоко ценится.)

Я протестировал MPI с помощью простого фрагмента Python, запустив связь между двумя процессами. Я использую MPI4PY для обработки этого сообщения. Этот фрагмент кода отлично работает с mpiexec-command, но запуская его через SLURM и sbatch-command, я не могу заставить его работать. SLURM настроен с OpenMPI, и opmi_info указывает, что SLURM поддерживается.

OpenMPI версии 3.1.2-6 (из dpkg -l | grep mpi) SLURM_ВЕРСИЯ 17.11.9 Ubuntu 18.10 (космический) MPI4PY версии 3.0.1. (из списка пунктов)

Это фрагмент кода Python3.6:

    $cat mpi_test.py
    from mpi4py import MPI

    if __name__=='__main__':

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

      if rank==0:
          data = {'param1':1, 'param2':2, 'param3':3}        
          destinationNode = 1
          print('Im', rank, 'sending to ', destinationNode)
          comm.send(data, dest=destinationNode, tag=11)
      elif rank!=0:
          sourceNode = 0
          dataRx=comm.recv(source=sourceNode, tag=11)
          print('Im', rank, 'recieving from ', sourceNode)
          for keys in dataRx.keys():
              print('Data recieved: ',str(dataRx[keys]))

python.mpi.sbatch, используемый при вызове с помощью sbatch:

    $cat python.mpi.sbatch
    #!/bin/bash -l
    #SBATCH --job-name=mpiSimpleExample
    #SBATCH --nodes=1
    #SBATCH --error=slurm-err-%j.err
    #SBATCH --export=all
    #SBATCH --time=0-00:05:00
    #SBATCH --partition=debug

    srun -N 1 mpiexec -n 2 python3 mpi_test.py
    #mpiexec -n 2 python3 mpi_test.py

    exit 0

Запуск «sbatch python.mpi.sbatch» с этой настройкой дает следующий результат:

    $sbatch python.mpi.sbatch
    $cat slurm-err-104.err 
    ----------------------------------------------------------------------
    There are not enough slots available in the system to satisfy the 2 
    slots
    that were requested by the application:
    python3

    Either request fewer slots for your application, or make more slots
    available for use.
    --------------------------------------------------------------------

Изменение python.mpi.sbatch для использования:

«srun -n 1 mpiexec -n 1 python3 mpi_test.py» выдает ошибку:

    $cat slurm-err-105.error
    Traceback (most recent call last):
      File "mpi_test.py", line 18, in <module>
        comm.send(data, dest=destinationNode, tag=11)
      File "mpi4py/MPI/Comm.pyx", line 1156, in mpi4py.MPI.Comm.send
      File "mpi4py/MPI/msgpickle.pxi", line 174, in mpi4py.MPI.PyMPI_send
        mpi4py.MPI.Exception: MPI_ERR_RANK: invalid rank
    ---------------------------------------------------------------------
    mpiexec detected that one or more processes exited with non-zero 
    status, thus causing the job to be terminated. The first process to do 
    so was:

    Process name: [[44366,1],0]
    Exit code:    1
    ---------------------------------------------------------------------

Что ожидается, поскольку он запускается только с 1 node.

Запуск mpirun hostname дает четыре экземпляра машины, поэтому для этой машины должно быть доступно четыре слота. Я могу успешно запустить Python3.6 с четырьмя (после модификации mpi_test.py) процессами с помощью команды «mpiexec -n 4 python3 mpi_test.py».

Любая помощь горячо приветствуется.

slurm.conf-файл:

# slurm.conf file generated by configurator.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=desktop-comp
#ControlAddr=
#BackupController=
#BackupAddr=
#
AuthType=auth/munge
#CheckpointType=checkpoint/none
CryptoType=crypto/munge
#DisableRootJobs=NO
#EnforcePartLimits=NO
#Epilog=
#EpilogSlurmctld=
#FirstJobId=1
#MaxJobId=999999
#GresTypes=
#GroupUpdateForce=0
#GroupUpdateTime=600
#JobCheckpointDir=/var/slurm/checkpoint
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
#JobFileAppend=0
#JobRequeue=1
#JobSubmitPlugins=1
#KillOnBadExit=0
#LaunchType=launch/slurm
#Licenses=foo*4,bar
#MailProg=/bin/mail
#MaxJobCount=5000
#MaxStepCount=40000
#MaxTasksPerNode=128
MpiDefault=openmpi
#MpiParams=ports=#-#
#PluginDir=
#PlugStackConfig=
#PrivateData=jobs
#ProctrackType=proctrack/cgroup
#Prolog=
#PrologFlags=
#PrologSlurmctld=
#PropagatePrioProcess=0
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#RebootProgram=
ReturnToService=1
#SallocDefaultCommand=
SlurmctldPidFile=/var/run/slurm-llnl/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm-llnl/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/lib/slurm-llnl/slurmd
SlurmUser=slurm
#SlurmdUser=root
#SrunEpilog=
#SrunProlog=
StateSaveLocation=/var/lib/slurm-llnl/slurmd
SwitchType=switch/none
#TaskEpilog=
#TaskPlugin=task/affinity
#TaskPluginParam=Sched
#TaskProlog=
#TopologyPlugin=topology/tree
#TmpFS=/tmp
#TrackWCKey=no
#TreeWidth=
#UnkillableStepProgram=
#UsePAM=0
#
#
# TIMERS
#BatchStartTimeout=10
#CompleteWait=0
#EpilogMsgTime=2000
#GetEnvTimeout=2
#HealthCheckInterval=0
#HealthCheckProgram=
InactiveLimit=0
KillWait=30
#MessageTimeout=10
#ResvOverRun=0
MinJobAge=300
#OverTimeLimit=0
SlurmctldTimeout=120
SlurmdTimeout=300
#UnkillableStepTimeout=60
#VSizeFactor=0
Waittime=0
#
#
# SCHEDULING
#DefMemPerCPU=0
FastSchedule=1
#MaxMemPerCPU=0
#SchedulerTimeSlice=30
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core
#
#
# JOB PRIORITY
#PriorityFlags=
#PriorityType=priority/basic
#PriorityDecayHalfLife=
#PriorityCalcPeriod=
#PriorityFavorSmall=
#PriorityMaxAge=
#PriorityUsageResetPeriod=
#PriorityWeightAge=
#PriorityWeightFairshare=
#PriorityWeightJobSize=
#PriorityWeightPartition=
#PriorityWeightQOS=
#
#
# LOGGING AND ACCOUNTING
#AccountingStorageEnforce=0
#AccountingStorageHost=
#AccountingStorageLoc=
#AccountingStoragePass=
#AccountingStoragePort=
AccountingStorageType=accounting_storage/none
#AccountingStorageUser=
AccountingStoreJobComment=YES
ClusterName=cluster
#DebugFlags=
#JobCompHost=
#JobCompLoc=
#JobCompPass=
#JobCompPort=
JobCompType=jobcomp/none
#JobCompUser=
#JobContainerType=job_container/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=3
#SlurmctldLogFile=
SlurmdDebug=3
#SlurmdLogFile=
#SlurmSchedLogFile=
#SlurmSchedLogLevel=
#
#
# POWER SAVE SUPPORT FOR IDLE NODES (optional)
#SuspendProgram=
#ResumeProgram=
#SuspendTimeout=
#ResumeTimeout=
#ResumeRate=
#SuspendExcNodes=
#SuspendExcParts=
#SuspendRate=
#SuspendTime=
#
#
# COMPUTE NODES
NodeName=desktop-comp CPUs=1 State=UNKNOWN
PartitionName=debug Nodes=desktop-compDefault=YES MaxTime=INFINITE State=UP

На справочной странице sbatch указано, что количество задач по умолчанию (--ntasks) — одна на узел. Вы просите один узел и не указываете --ntasks. Попробуйте добавить #SBATCH --ntasks=2.

rtoijala 10.06.2019 10:34

Спасибо за ваше неравнодушное отношение, однако предложенное изменение не сработало. Вместо этого работа ставится в очередь и ожидает доступности второго узла (которого у меня нет).

Pälle 11.06.2019 10:10

Вы должны настроить slurm с ядрами в качестве ресурсов (CR_CORE_MEMORY или что-то подобное). Затем вы можете запускать несколько задач на одном узле. Кроме того, если библиотека mpi была настроена с интеграцией slurm, вы не должны использовать mpiexec, просто srun.

janneb 11.06.2019 13:44

Не могли бы вы показать файл slurm.conf?

Bub Espinja 11.06.2019 15:44

Да, см. обновленное поле выше.

Pälle 11.06.2019 16:25
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
1 002
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем вопросе об обновлении у вас есть в вашем slurm.conf строка

NodeName=desktop-comp CPUs=1 State=UNKNOWN

Это сообщает slurm, что на вашем узле доступен только один ЦП. Вы можете попробовать запустить slurmd -C, чтобы увидеть, что slurm обнаруживает о вашем компьютере, и скопировать значения CPUs, CoresPerSocket и т. д. в ваш slurm.conf.

Большое спасибо, Яннеб, что я пропустил. Теперь, пытаясь запустить мою mpi-задачу, я получаю, что работа поставлена ​​в очередь и помечена как ожидающая по причине, указанной в столбце NODELIST «squeue» как «Ресурсы». Сбор данных из «sinfo» указывает, что мой раздел или узел находится в состоянии «слива». Но я прошу только два ресурса, которые у меня должны быть. вывод «slurmd -C» дал: CPUs=8 Boards=1 SocketsPerBoard=1 CoresPerSocket=4 ThreadsPerCore=2 RealMemory=15945.

Pälle 12.06.2019 08:58

Если ваш узел истощен, он ничего не запустит. Поднимите свой узел.

Poshi 12.06.2019 09:54

Спасибо Поши. Будучи полным новичком в slurm, я не могу заставить узел изменить свое состояние. Даже после холодной перезагрузки. Как мне сбросить его состояние с помощью slurm-команд?

Pälle 12.06.2019 11:05

Другие вопросы по теме