Freigeben über


Slurm

Slurm ist ein hochgradig konfigurierbarer Open Source Workload-Manager. Eine Übersicht finden Sie auf der Slurm-Projektwebsite .

Hinweis

Ab CycleCloud 8.4.0 wurde die Slurm-Integration umgeschrieben, um neue Features und Funktionen zu unterstützen. Weitere Informationen finden Sie in der Dokumentation zu Slurm 3.0 .

Slurm kann auf einfache Weise in einem CycleCloud-Cluster aktiviert werden, indem Sie den "run_list" im Konfigurationsabschnitt Ihrer Clusterdefinition ändern. Die beiden grundlegenden Komponenten eines Slurm-Clusters sind der Knoten "master" (oder "Scheduler"), der ein freigegebenes Dateisystem bereitstellt, auf dem die Slurm-Software ausgeführt wird, und die "execute"-Knoten, die die Hosts sind, die das freigegebene Dateisystem einbinden und die übermittelten Aufträge ausführen. Ein einfacher Clustervorlagenausschnitt kann beispielsweise wie folgt aussehen:

[cluster custom-slurm]

[[node master]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:master]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

Slurm kann auf einfache Weise in einem CycleCloud-Cluster aktiviert werden, indem Sie den "run_list" im Konfigurationsabschnitt Ihrer Clusterdefinition ändern. Die beiden grundlegenden Komponenten eines Slurm-Clusters sind der Knoten "scheduler", der ein freigegebenes Dateisystem bereitstellt, auf dem die Slurm-Software ausgeführt wird, und die "execute"-Knoten, die die Hosts sind, die das freigegebene Dateisystem einbinden und die übermittelten Aufträge ausführen. Ein einfacher Clustervorlagenausschnitt kann beispielsweise wie folgt aussehen:

[cluster custom-slurm]

[[node scheduler]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:scheduler]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

Bearbeiten vorhandener Slurm-Cluster

Slurm-Cluster, die in CycleCloud-Versionen 7.8 und höher ausgeführt werden, implementieren eine aktualisierte Version der APIs für die automatische Skalierung, die es den Clustern ermöglicht, mehrere Nodearrays und Partitionen zu verwenden. Um diese Funktionalität in Slurm zu vereinfachen, füllt CycleCloud die Ausführungsknoten im Cluster vorab auf. Daher müssen Sie einen Befehl auf dem Slurm-Planerknoten ausführen, nachdem Sie Änderungen am Cluster vorgenommen haben, z. B. Grenzwerte für die automatische Skalierung oder VM-Typen.

Vornehmen von Clusteränderungen

Der in CycleCloud bereitgestellte Slurm-Cluster enthält ein Skript, das dies erleichtert. Nachdem Sie Änderungen am Cluster vorgenommen haben, führen Sie Folgendes als Stamm (z. B. durch Ausführen sudo -ivon ) auf dem Planerknoten Slurm aus, um die slurm.conf Knoten im Cluster neu zu erstellen und die Knoten im Cluster zu aktualisieren:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

Hinweis

Für CycleCloud-Versionen < 7.9.10 befindet sich das cyclecloud_slurm.sh Skript in /opt/cycle/jetpack/system/bootstrap/slurm.

Wichtig

Wenn Sie Änderungen vornehmen, die sich auf die VMs für Knoten in einer MPI-Partition auswirken (z. B. VM-Größe, Image oder cloud-init), müssen alle Knoten zuerst beendet werden. Der remove_nodes Befehl gibt in diesem Fall eine Warnung aus, wird aber nicht mit einem Fehler beendet. Wenn Knoten ausgeführt werden, erhalten Sie die Fehlermeldung This node does not match existing scaleset attribute , wenn neue Knoten gestartet werden.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Hinweis

Für CycleCloud-Versionen < 8.2 befindet sich das cyclecloud_slurm.sh Skript in /opt/cycle/jetpack/system/bootstrap/slurm.

Wenn Sie Änderungen vornehmen, die sich auf die VMs für Knoten in einer MPI-Partition auswirken (z. B. VM-Größe, Image oder cloud-init), und die Knoten ausgeführt werden, erhalten Sie eine Fehlermeldung, This node does not match existing scaleset attribute wenn neue Knoten gestartet werden. Aus diesem Grund stellt der apply_changes Befehl sicher, dass die Knoten beendet werden, und schlägt mit der folgenden Fehlermeldung fehl, wenn dies nicht der Fall ist: Die folgenden Knoten müssen vor dem Anwenden von Änderungen vollständig beendet werden.

Wenn Sie eine Änderung vornehmen, die sich NICHT auf die VM-Eigenschaften für MPI-Knoten auswirkt, müssen Sie die ausgeführten Knoten nicht zuerst beenden. In diesem Fall können Sie die Änderungen mit den folgenden beiden Befehlen vornehmen:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

Hinweis

Der apply_changes Befehl ist nur in CycleCloud 8.3 und höher vorhanden, sodass die einzige Möglichkeit, eine Änderung in früheren Versionen vorzunehmen, die oben genannten remove_nodes + scale Befehle sind. Stellen Sie sicher, dass der remove_nodes Befehl keine Warnung zu Knoten ausgibt, die beendet werden müssen.

Erstellen zusätzlicher Partitionen

Die Standardvorlage, die im Lieferumfang von Azure CycleCloud enthalten ist, enthält zwei Partitionen (hpc und htc), und Sie können benutzerdefinierte Nodearrays definieren, die direkt Slurm-Partitionen zugeordnet werden. Um beispielsweise eine GPU-Partition zu erstellen, fügen Sie der Clustervorlage den folgenden Abschnitt hinzu:

    [[nodearray gpu]]
    MachineType = $GPUMachineType
    ImageName = $GPUImageName
    MaxCoreCount = $MaxGPUExecuteCoreCount
    Interruptible = $GPUUseLowPrio
    AdditionalClusterInitSpecs = $ExecuteClusterInitSpecs

        [[[configuration]]]
        slurm.autoscale = true
        # Set to true if nodes are used for tightly-coupled multi-node jobs
        slurm.hpc = false

        [[[cluster-init cyclecloud/slurm:execute:2.0.1]]]
        [[[network-interface eth0]]]
        AssociatePublicIpAddress = $ExecuteNodesPublic

Speichereinstellungen

CycleCloud legt automatisch die Menge des verfügbaren Arbeitsspeichers fest, den Slurm zu Planungszwecken verwenden soll. Da sich die Menge des verfügbaren Arbeitsspeichers aufgrund verschiedener Linux-Kerneloptionen geringfügig ändern kann und betriebssystem und VM eine kleine Menge an Arbeitsspeicher verbrauchen können, die andernfalls für Aufträge verfügbar wäre, reduziert CycleCloud automatisch die Arbeitsspeichermenge in der Slurm-Konfiguration. Standardmäßig hält CycleCloud 5 % des gemeldeten verfügbaren Arbeitsspeichers auf einem virtuellen Computer zurück, aber dieser Wert kann in der Clustervorlage überschrieben werden, indem auf den Prozentsatz des Arbeitsspeichers festgelegt slurm.dampen_memory wird, der zurückgehalten werden soll. Wenn Sie beispielsweise 20 % des Arbeitsspeichers einer VM zurückhalten möchten:

    slurm.dampen_memory=20

Deaktivieren der automatischen Skalierung für bestimmte Knoten oder Partitionen

Während das integrierte CycleCloud-Feature "KeepAlive" derzeit nicht für Slurm-Cluster funktioniert, ist es möglich, die automatische Skalierung für einen ausgeführten Slurm-Cluster zu deaktivieren, indem Sie die Datei slurm.conf direkt bearbeiten. Sie können einzelne Knoten oder ganze Partitionen von der automatischen Skalierung ausschließen.

Ausschließen eines Knotens

Um einen Knoten oder mehrere Knoten von der automatischen Skalierung auszuschließen, fügen Sie der Slurm-Konfigurationsdatei hinzu SuspendExcNodes=<listofnodes> . Um beispielsweise die Knoten 1 und 2 aus der HPC-Partition auszuschließen, fügen Sie Folgendes zu /sched/slurm.confhinzu:

SuspendExcNodes=hpc-pg0-[1-2]

Starten Sie dann den slurmctld Dienst neu, damit die neue Konfiguration wirksam wird.

Ausschließen einer Partition

Das Ausschließen ganzer Partitionen aus der automatischen Skalierung ähnelt dem Ausschließen von Knoten. Um die gesamte hpc Partition auszuschließen, fügen Sie Folgendes zu hinzu: /sched/slurm.conf

SuspendExcParts=hpc

Starten Sie den slurmctld-Dienst dann neu.

Problembehandlung

UID-Konflikte für Slurm- und Munge-Benutzer

Standardmäßig verwendet dieses Projekt eine UID und gid von 11100 für den Slurm-Benutzer und 11101 für den Munge-Benutzer. Wenn dies zu einem Konflikt mit einem anderen Benutzer oder einer anderen Gruppe führt, werden diese Standardwerte möglicherweise überschrieben.

Um die UID und GID außer Kraft zu setzen, klicken Sie auf die Schaltfläche Bearbeiten für beide Knoten scheduler :

Planer bearbeiten

Planer bearbeiten

Und das execute nodearray: Edit Nodearray

und fügen Sie dem Abschnitt die Configuration folgenden Attribute hinzu:

Konfiguration bearbeiten

    slurm.user.name = slurm
    slurm.user.uid = 11100
    slurm.user.gid = 11100
    munge.user.name = munge
    munge.user.uid = 11101
    munge.user.gid = 11101

Autoscale

CycleCloud verwendet das Elastic Computing-Feature von Slurm. Um Probleme mit der automatischen Skalierung zu debuggen, gibt es einige Protokolle auf dem Planerknoten, die Sie überprüfen können. Die erste besteht darin, sicherzustellen, dass die Aufrufe zur Stromsparaufnahme ausgeführt werden, indem Sie überprüfen /var/log/slurmctld/slurmctld.log. Es sollten Zeilen wie folgt angezeigt werden:

[2019-12-09T21:19:03.400] power_save: pid 8629 waking nodes htc-1

Das andere zu überprüfende Protokoll ist /var/log/slurmctld/resume.log. Wenn der Fortsetzungsschritt fehlschlägt, gibt es auch eine /var/log/slurmctld/resume_fail.log. Wenn Meldungen zu unbekannten oder ungültigen Knotennamen vorhanden sind, stellen Sie sicher, dass Sie dem Cluster keine Knoten hinzugefügt haben, ohne die Schritte im Abschnitt "Vornehmen von Clusteränderungen" oben auszuführen.

Slurm-Konfigurationsreferenz

Im Folgenden finden Sie die slurm-spezifischen Konfigurationsoptionen, die Sie umschalten können, um die Funktionalität anzupassen:

Slurm-spezifische Konfigurationsoptionen BESCHREIBUNG
slurm.version Standardwert: '18.08.7-1'. Dies ist die Slurm-Version, die installiert und ausgeführt werden soll. Dies ist derzeit die Standardoption. In zukunft können zusätzliche Versionen der Slurm-Software unterstützt werden.
slurm.autoscale Standardwert: "false". Dies ist eine Einstellung pro Nodearray, die steuert, ob Slurm Knoten in diesem nodearray automatisch beenden und starten soll.
slurm.hpc Standardwert: "true". Dies ist eine Einstellung pro Nodearray, die steuert, ob Knoten im Nodearray in derselben Platzierungsgruppe platziert werden. Wird in erster Linie für Nodearrays mit VM-Familien mit InfiniBand verwendet. Sie gilt nur, wenn slurm.autoscale auf "true" festgelegt ist.
slurm.default_partition Standardwert: "false". Dies ist eine Pro-Nodearray-Einstellung, die steuert, ob nodearray die Standardpartition für Aufträge sein soll, die keine Partition explizit anfordern.
slurm.dampen_memory Standardwert: '5'. Der Prozentsatz des Arbeitsspeichers, der für den Betriebssystem-/VM-Overhead zurückgehalten werden soll.
slurm.suspend_timeout Standardwert: '600'. Die Zeitspanne (in Sekunden) zwischen einem Angehaltenen Aufruf und dem Zeitpunkt, an dem dieser Knoten erneut verwendet werden kann.
slurm.resume_timeout Standardwert: "1800". Die Zeitspanne (in Sekunden), die auf den erfolgreichen Start eines Knotens gewartet werden muss.
slurm.install Standardwert: "true". Bestimmt, ob Slurm beim Knotenstart installiert ist ('true'). Wenn Slurm in einem benutzerdefinierten Image installiert ist, sollte dies auf "false" festgelegt werden. (proj Version 2.5.0 und höher)
slurm.use_pcpu Standardwert: "true". Dies ist eine Nodearray-Einstellung zum Steuern der Planung mit hyperthreaded vcpus. Legen Sie auf "false" fest, um CPUs=vcpus in cyclecloud.conf festzulegen.
slurm.user.name Standardwert: "slurm". Dies ist der Benutzername, den der Slurm-Dienst verwenden soll.
slurm.user.uid Standardwert: '11100'. Die Benutzer-ID, die für den Slurm-Benutzer verwendet werden soll.
slurm.user.gid Standardwert: '11100'. Die Gruppen-ID, die für den Slurm-Benutzer verwendet werden soll.
munge.user.name Standardwert: "munge". Dies ist der Benutzername, den der MUNGE-Authentifizierungsdienst verwenden soll.
munge.user.uid Standardwert: "11101". Die Benutzer-ID, die für den MUNGE-Benutzer verwendet werden soll.
munge.user.gid Standardwert: "11101". Die Gruppen-ID, die für den MUNGE-Benutzer verwendet werden soll.

CycleCloud unterstützt einen Standardsatz von Autostop-Attributen für Planer:

Attribut BESCHREIBUNG
cyclecloud.cluster.autoscale.stop_enabled Ist autostop auf diesem Knoten aktiviert? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs Die Zeitspanne (in Sekunden), für die ein Knoten nach Abschluss von Aufträgen im Leerlauf bleibt, bevor er herunterskaliert wird.
cyclecloud.cluster.autoscale.idle_time_before_jobs Die Zeitspanne (in Sekunden), in der ein Knoten im Leerlauf sitzt, bevor aufträge abgeschlossen werden, bevor er herunterskaliert wird.