Slurm
Slurm to wysoce konfigurowalny menedżer obciążeń open source. Aby zapoznać się z omówieniem, zobacz witrynę projektu Slurm .
Uwaga
Od wersji CycleCloud 8.4.0 integracja slurm została przepisana w celu obsługi nowych funkcji i funkcji. Aby uzyskać więcej informacji, zobacz dokumentację programu Slurm 3.0 .
Slurm można łatwo włączyć w klastrze CycleCloud, modyfikując "run_list" w sekcji konfiguracji definicji klastra. Dwa podstawowe składniki klastra Slurm to węzeł "master" (lub "scheduler"), który udostępnia udostępniony system plików, w którym działa oprogramowanie Slurm, oraz węzły "execute", które są hostami, które zainstalują udostępniony system plików i wykonują przesłane zadania. Na przykład prosty fragment kodu szablonu klastra może wyglądać następująco:
[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 można łatwo włączyć w klastrze CycleCloud, modyfikując "run_list" w sekcji konfiguracji definicji klastra. Dwa podstawowe składniki klastra Slurm to węzeł "scheduler", który udostępnia udostępniony system plików, w którym działa oprogramowanie Slurm, oraz węzły "execute", które są hostami, które instaluje udostępniony system plików i wykonują przesłane zadania. Na przykład prosty fragment kodu szablonu klastra może wyglądać następująco:
[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
Edytowanie istniejących klastrów slurm
Klastry Slurm uruchomione w usłudze CycleCloud w wersji 7.8 lub nowszej implementują zaktualizowaną wersję interfejsów API skalowania automatycznego, która umożliwia klastrom korzystanie z wielu węzłów i partycji. Aby ułatwić tę funkcję w narzędziu Slurm, usługa CycleCloud wstępnie wypełnia węzły wykonywania w klastrze. W związku z tym należy uruchomić polecenie w węźle harmonogramu Slurm po wprowadzeniu jakichkolwiek zmian w klastrze, takich jak limity skalowania automatycznego lub typy maszyn wirtualnych.
Wprowadzanie zmian w klastrze
Klaster Slurm wdrożony w usłudze CycleCloud zawiera skrypt, który to ułatwia. Po wprowadzeniu jakichkolwiek zmian w klastrze uruchom następujące polecenie jako katalog główny (np. przez uruchomienie polecenia sudo -i
) w węźle harmonogramu Slurm, aby ponownie skompilować slurm.conf
i zaktualizować węzły w klastrze:
/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale
Uwaga
W przypadku aplikacji CycleCloud w wersji < 7.9.10 cyclecloud_slurm.sh
skrypt znajduje się w folderze /opt/cycle/jetpack/system/bootstrap/slurm.
Ważne
Jeśli wprowadzisz jakiekolwiek zmiany wpływające na maszyny wirtualne dla węzłów w partycji MPI (na przykład rozmiar maszyny wirtualnej, obraz lub plik cloud-init), wszystkie węzły muszą zostać najpierw zakończone.
Polecenie remove_nodes
wyświetla ostrzeżenie w tym przypadku, ale nie kończy się z błędem.
Jeśli są uruchomione węzły, wystąpi błąd podczas uruchamiania This node does not match existing scaleset attribute
nowych węzłów.
/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes
Uwaga
W przypadku aplikacji CycleCloud w wersji < 8.2 cyclecloud_slurm.sh
skrypt znajduje się w lokalizacji /opt/cycle/jetpack/system/bootstrap/slurm.
Jeśli wprowadzisz zmiany wpływające na maszyny wirtualne dla węzłów w partycji MPI (na przykład rozmiar maszyny wirtualnej, obraz lub plik cloud-init), a węzły są uruchomione, wystąpi błąd This node does not match existing scaleset attribute
podczas uruchamiania nowych węzłów. Z tego powodu polecenie upewnia się, apply_changes
że węzły zostały zakończone i kończy się niepowodzeniem z następującym komunikatem o błędzie, jeśli nie: Następujące węzły muszą zostać w pełni zakończone przed zastosowaniem zmian.
Jeśli wprowadzasz zmianę, która nie ma wpływu na właściwości maszyny wirtualnej dla węzłów MPI, nie musisz najpierw przerywać uruchamiania węzłów. W takim przypadku możesz wprowadzić zmiany przy użyciu następujących dwóch poleceń:
/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale
Uwaga
Polecenie apply_changes
istnieje tylko w aplikacji CycleCloud 8.3 lub nowszej, więc jedynym sposobem wprowadzenia zmiany we wcześniejszych wersjach jest użycie powyższych remove_nodes
+ scale
poleceń.
Upewnij się, że remove_nodes
polecenie nie wyświetla ostrzeżenia o węzłach, które muszą zostać zakończone.
Tworzenie dodatkowych partycji
Domyślny szablon dostarczany z usługą Azure CycleCloud ma dwie partycje (hpc
i htc
) i można zdefiniować niestandardowe elementy nodearray mapujące bezpośrednio na partycje Slurm. Aby na przykład utworzyć partycję procesora GPU, dodaj następującą sekcję do szablonu klastra:
[[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
Ustawienia pamięci
Usługa CycleCloud automatycznie ustawia ilość dostępnej pamięci dla programu Slurm do użycia na potrzeby planowania. Ponieważ ilość dostępnej pamięci może ulec nieznacznej zmianie ze względu na różne opcje jądra systemu Linux, a system operacyjny i maszyna wirtualna mogą używać małej ilości pamięci, która w przeciwnym razie byłaby dostępna dla zadań, usługa CycleCloud automatycznie zmniejsza ilość pamięci w konfiguracji slurm. Domyślnie usługa CycleCloud przechowuje 5% zgłoszonej dostępnej pamięci na maszynie wirtualnej, ale tę wartość można zastąpić w szablonie klastra, ustawiając slurm.dampen_memory
wartość procentową pamięci do wstrzymania. Na przykład aby wstrzymać 20% pamięci maszyny wirtualnej:
slurm.dampen_memory=20
Wyłączanie automatycznego skalowania dla określonych węzłów lub partycji
Chociaż wbudowana funkcja CycleCloud "KeepAlive" nie działa obecnie w przypadku klastrów Slurm, istnieje możliwość wyłączenia automatycznego skalowania dla uruchomionego klastra Slurm przez bezpośrednie edytowanie pliku slurm.conf. Można wykluczyć pojedyncze węzły lub całe partycje z automatycznego skalowania.
Wykluczanie węzła
Aby wykluczyć węzeł lub wiele węzłów z autoskalowania, dodaj SuspendExcNodes=<listofnodes>
go do pliku konfiguracji Slurm. Aby na przykład wykluczyć węzły 1 i 2 z partycji hpc, dodaj następujące polecenie do /sched/slurm.conf
:
SuspendExcNodes=hpc-pg0-[1-2]
Następnie uruchom ponownie usługę slurmctld
, aby nowa konfiguracja weszła w życie.
Wykluczanie partycji
Wykluczanie całych partycji z autoskalowania jest podobne do wykluczania węzłów. Aby wykluczyć całą hpc
partycję, dodaj następujące polecenie do /sched/slurm.conf
SuspendExcParts=hpc
Następnie uruchom ponownie usługę slurmctld
.
Rozwiązywanie problemów
Konflikty identyfikatorów UID dla użytkowników Slurm i Munge
Domyślnie ten projekt używa identyfikatorów UID i GID 11100 dla użytkownika Slurm i 11101 dla użytkownika Munge. Jeśli spowoduje to konflikt z innym użytkownikiem lub grupą, te wartości domyślne mogą zostać zastąpione.
Aby zastąpić identyfikator UID i GID, kliknij przycisk edycji dla obu węzłów scheduler
:
execute
I
i dodaj następujące atrybuty do Configuration
sekcji:
slurm.user.name = slurm
slurm.user.uid = 11100
slurm.user.gid = 11100
munge.user.name = munge
munge.user.uid = 11101
munge.user.gid = 11101
Automatyczne skalowanie
Usługa CycleCloud używa funkcji elastic computing firmy Slurm. Aby debugować problemy z autoskalowaniem, w węźle harmonogramu można sprawdzić kilka dzienników. Pierwszy polega na upewnieniu się, że wywołania wznawiania zapisywania energii są wykonywane przez sprawdzenie /var/log/slurmctld/slurmctld.log
. Powinny zostać wyświetlone następujące wiersze:
[2019-12-09T21:19:03.400] power_save: pid 8629 waking nodes htc-1
Drugi dziennik do sprawdzenia to /var/log/slurmctld/resume.log
. Jeśli krok wznawiania kończy się niepowodzeniem, wystąpi również element /var/log/slurmctld/resume_fail.log
. Jeśli istnieją komunikaty o nieznanych lub nieprawidłowych nazwach węzłów, upewnij się, że nie dodano węzłów do klastra bez wykonywania kroków opisanych w powyższej sekcji "Wprowadzanie zmian klastra".
Dokumentacja konfiguracji slurm
Poniżej przedstawiono opcje konfiguracji specyficzne dla programu Slurm, które można przełączać w celu dostosowania funkcjonalności:
Opcje konfiguracji specyficzne dla programu Slurm | Opis |
---|---|
slurm.version | Ustawienie domyślne: "18.08.7-1". Jest to wersja slurm do zainstalowania i uruchomienia. Jest to obecnie opcja domyślna i tylko . W przyszłych dodatkowych wersjach oprogramowania Slurm może być obsługiwane. |
slurm.autoscale | Wartość domyślna: "false". Jest to ustawienie dla węzła, które kontroluje, czy slurm powinien automatycznie zatrzymywać i uruchamiać węzły w tym węźle. |
slurm.hpc | Wartość domyślna: "true". Jest to ustawienie na węzeł, które kontroluje, czy węzły w węźle zostaną umieszczone w tej samej grupie umieszczania. Używana głównie w przypadku węzłów z rodzinami maszyn wirtualnych z rozwiązaniem InfiniBand. Ma zastosowanie tylko wtedy, gdy parametr slurm.autoscale jest ustawiony na wartość "true". |
slurm.default_partition | Wartość domyślna: "false". Jest to ustawienie dla poszczególnych węzłów, które kontroluje, czy właściwość nodearray powinna być domyślną partycją dla zadań, które nie żądają jawnie partycji. |
slurm.dampen_memory | Wartość domyślna: "5". Procent pamięci do wstrzymania obciążenia systemu operacyjnego/maszyny wirtualnej. |
slurm.suspend_timeout | Wartość domyślna: "600". Czas (w sekundach) między wywołaniem zawieszenia a ponownym użyciem tego węzła. |
slurm.resume_timeout | Wartość domyślna: "1800". Czas oczekiwania na pomyślne uruchomienie węzła (w sekundach). |
slurm.install | Wartość domyślna: "true". Określa, czy narzędzie Slurm jest zainstalowane podczas rozruchu węzła ('true'). Jeśli narzędzie Slurm jest zainstalowane w obrazie niestandardowym, powinno to być ustawione na wartość "false". (proj w wersji 2.5.0 lub nowszej) |
slurm.use_pcpu | Wartość domyślna: "true". Jest to ustawienie per-nodearray do sterowania planowaniem za pomocą hiperwątków vcpus. Ustaw wartość "false", aby ustawić procesory CPU=vcpus w pliku cyclecloud.conf. |
slurm.user.name | Ustawienie domyślne: "slurm". Jest to nazwa użytkownika usługi Slurm do użycia. |
slurm.user.uid | Wartość domyślna: "11100". Identyfikator użytkownika do użycia dla użytkownika Slurm. |
slurm.user.gid | Wartość domyślna: "11100". Identyfikator grupy do użycia dla użytkownika Slurm. |
munge.user.name | Ustawienie domyślne: "munge". Jest to nazwa użytkownika usługi uwierzytelniania MUNGE do użycia. |
munge.user.uid | Wartość domyślna: "11101". Identyfikator użytkownika do użycia dla użytkownika MUNGE. |
munge.user.gid | Wartość domyślna: "11101". Identyfikator grupy do użycia dla użytkownika MUNGE. |
Usługa CycleCloud obsługuje standardowy zestaw atrybutów autostopu między harmonogramami:
Atrybut | Opis |
---|---|
cyclecloud.cluster.autoscale.stop_enabled | Czy automatyczne zatrzymanie jest włączone w tym węźle? [prawda/fałsz] |
cyclecloud.cluster.autoscale.idle_time_after_jobs | Czas (w sekundach) dla węzła do bezczynności po zakończeniu zadań przed skalowaniem w dół. |
cyclecloud.cluster.autoscale.idle_time_before_jobs | Czas (w sekundach) dla węzła do bezczynności przed ukończeniem zadań przed skalowaniem w dół. |