Использование SLURM и MPI (4PY): невозможно выделить запрошенные ресурсы - PullRequest
2 голосов
/ 10 июня 2019

У меня есть настройка / установка 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_VERSION 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 узла.

Запуск 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

1 Ответ

2 голосов
/ 11 июня 2019

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

NodeName=desktop-comp CPUs=1 State=UNKNOWN

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

...