Udostępnij za pośrednictwem


Slurm

Slurm to wysoce konfigurowalny menedżer obciążeń typu open source. Aby uzyskać więcej informacji, zobacz omówienie witryny projektu Slurm.

Uwaga

Począwszy od CycleCloud 8.4.0, przepisaliśmy integrację Slurm, aby obsługiwać nowe funkcje i możliwości. Aby uzyskać więcej informacji, zobacz dokumentację programu Slurm 3.0 .

Aby włączyć narzędzie Slurm w klastrze CycleCloud, zmodyfikuj element "run_list", dostępny w sekcji konfiguracji definicji klastra. Klaster Slurm składa się z dwóch głównych części: węzła głównego (lub węzła harmonogramującego), który uruchamia oprogramowanie Slurm na udostępnionym systemie plików, oraz węzłów wykonywania, które montują ten system plików i uruchamiają 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

Aby włączyć Slurm w klastrze CycleCloud, zmodyfikuj element run_list w sekcji konfiguracji definicji klastra. Klaster Slurm ma dwie główne części: węzeł harmonogramu, który udostępnia udostępniony system plików i uruchamia oprogramowanie Slurm, oraz węzły wykonywania, które zainstalują udostępniony system plików i uruchomą 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 działające w wersji 7.8 i nowszej używają zaktualizowanej wersji interfejsów API skalowania automatycznego, które umożliwiają klastrom używanie wielu tablic węzłów i partycji. Aby ta funkcja działała w środowisku Slurm, usługa CycleCloud wstępnie wypełnia wykonane węzły w klastrze. Ze względu na to wstępne wypełnianie, należy uruchomić polecenie na węźle schedulera Slurm po wprowadzeniu jakichkolwiek zmian w klastrze, takich jak zmiana limitów skalowania automatycznego lub typów maszyn wirtualnych.

Wprowadzanie zmian w klastrze

Klaster Slurm wdrożony w usłudze CycleCloud zawiera skrypt ułatwiający zmiany. Po wprowadzeniu jakichkolwiek zmian w klastrze uruchom następne polecenie jako główne (na przykład, uruchamiając polecenie sudo -i) w węźle harmonogramu Slurm, aby ponownie skompilować slurm.conf plik 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 wersji CycleCloud przed 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 (np. rozmiar maszyny wirtualnej, obraz lub plik cloud-init), musisz najpierw zakończyć wszystkie węzły. Polecenie remove_nodes wyświetla ostrzeżenie w tym przypadku, ale nie kończy się z błędem. Jeśli zmienisz parametry maszyn wirtualnych dla węzłów w partycji MPI (na przykład rozmiar maszyny wirtualnej, obraz lub plik cloud-init), gdy węzły są aktywne, nowe węzły nie mogą zostać uruchomione i pojawi się błąd This node doesn't match existing scaleset attribute.

/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 zmienisz parametry maszyn wirtualnych dla węzłów w partycji MPI (na przykład rozmiar maszyny wirtualnej, obraz lub plik cloud-init), gdy węzły są aktywne, nowe węzły nie mogą zostać uruchomione i pojawi się błąd This node doesn't match existing scaleset attribute. Z tego powodu apply_changes polecenie zapewnia zakończenie węzłów. Jeśli węzły nie zostaną zakończone, polecenie zakończy się niepowodzeniem z tym komunikatem o błędzie: 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 tych dwóch poleceń:

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

Uwaga

Polecenie apply_changes jest dostępne tylko w aplikacji CycleCloud 8.3 lub nowszej. We wcześniejszych wersjach należy użyć poleceń remove_nodes i scale do wprowadzenia zmiany. Upewnij się, że polecenie remove_nodes nie wyświetla ostrzeżenia dotyczącego węzłów, które muszą zostać zakończone.

Tworzenie partycji uzupełniających

Domyślny szablon dostarczany z usługą Azure CycleCloud ma dwie partycje (hpc i htc), a można zdefiniować niestandardowe tablice węzłów 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 w celach planowania. Ponieważ dostępna pamięć może się nieznacznie różnić w zależności od opcji jądra systemu Linux, a system operacyjny i maszyna wirtualna używają niewielkiej ilości pamięci, usługa CycleCloud automatycznie zmniejsza wartość pamięci w konfiguracji Slurm. Domyślnie usługa CycleCloud zatrzymuje 5% z dostępnej zgłoszonej pamięci na maszynie wirtualnej, ale możesz zastąpić tę wartość w szablonie klastra, ustawiając slurm.dampen_memory jako procent pamięci do zatrzymania. 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, możesz wyłączyć automatyczne skalowanie dla uruchomionego klastra Slurm, edytując plik slurm.conf bezpośrednio. Można wykluczyć pojedyncze węzły lub całe partycje z automatycznego skalowania.

Wykluczenie węzła

Aby wykluczyć jeden lub więcej węzłów z autoskalowania, dodaj SuspendExcNodes=<listofnodes> do pliku konfiguracji Slurm. Aby na przykład wykluczyć węzły 1 i 2 z hpc partycji, dodaj następujący kod 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

Aby wykluczyć całe partycje z autoskalowania, użyj podobnego procesu do wykluczania węzłów. Aby wykluczyć całą hpc partycję, dodaj następujący kod do :/sched/slurm.conf

SuspendExcParts=hpc

Następnie uruchom ponownie usługę slurmctld.

Rozwiązywanie problemów

Konflikty UID dla użytkowników Slurm i Munge

Domyślnie ten projekt używa identyfikatora UID i GID 11100 dla użytkownika Slurm i 11101 dla użytkownika munge. Jeśli te wartości domyślne powodują konflikt z innym użytkownikiem lub grupą, możesz je zastąpić.

Aby zastąpić wartości UID i GID, wybierz przycisk edycji dla obu węzłów scheduler :

Edytuj harmonogram

Edytuj harmonogram

execute I nodearray: Edytuj nodearray

Dodaj następujące atrybuty do Configuration sekcji: Edytuj konfigurację

    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 ze skalowaniem automatycznym, przejrzyj kilka dzienników na węźle harmonizującym. Najpierw upewnij się, że wywołania wznowienia trybu oszczędzania energii są wykonywane, sprawdzając /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

Sprawdź element /var/log/slurmctld/resume.log. Jeśli krok wznawiania kończy się niepowodzeniem, sprawdź polecenie /var/log/slurmctld/resume_fail.log. Jeśli widzisz komunikaty o nieznanych lub nieprawidłowych nazwach węzłów, przed dodaniem węzłów do klastra wykonaj kroki opisane w sekcji "Wprowadzanie zmian klastra".

Dokumentacja konfiguracji programu Slurm

W poniższej tabeli opisano 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 Wartość domyślna: 18.08.7-1. Ustawia wersję programu Slurm do zainstalowania i uruchomienia. Obecnie jest to domyślna i dostępna tylko wersja. W przyszłości może być obsługiwanych więcej wersji.
slurm.autoscale Wartość domyślna: false. Ustawienie przypisane do każdej tablicy węzłów, które kontroluje, czy Slurm automatycznie zatrzymuje i włącza węzły w tej tablicy węzłów.
slurm.hpc Wartość domyślna: true. Ustawienie dla tablicy węzłów, które kontroluje, czy węzły w tablicy znajdują się w jednej grupie umieszczania. Głównie używane w przypadku macierzy serwerów korzystających z rodzin maszyn wirtualnych z wykorzystaniem InfiniBand. Ma zastosowanie tylko wtedy, gdy slurm.autoscale jest ustawiony na true.
slurm.domyślna_partycja Wartość domyślna: false. Ustawienie dla nodearray, które określa, czy nodearray powinno być domyślną partycją dla zadań, które nie żądają partycji jawnie.
slurm.osłabić_pamięć 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 wstrzymania a możliwością ponownego użycia tego węzła.
slurm.resume_timeout Wartość domyślna: 1800. Czas w sekundach oczekiwania na pomyślne uruchomienie węzła.
slurm.install Wartość domyślna: true. Określa, czy narzędzie Slurm jest zainstalowane podczas rozruchu węzła (true). Jeśli zainstalujesz narzędzie Slurm w obrazie niestandardowym, ustaw tę opcję konfiguracji na false (w wersji proj 2.5.0 lub nowszej).
slurm.use_pcpu Wartość domyślna: true. Ustawienie dla grupy węzłów, które kontroluje planowanie z użyciem wirtualnych procesorów z hyper-threadingiem. Ustaw false na CPUs=vcpus w cyclecloud.conf.
slurm.user.name Wartość domyślna: slurm. Nazwa użytkownika usługi Slurm do użycia.
slurm.użytkownik.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 Wartość domyślna: munge. 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 użytkownika MUNGE.

Usługa CycleCloud obsługuje standardowy zestaw atrybutów automatycznego zatrzymania w różnych harmonogramach.

Atrybut Opis
cyclecloud.klaster.autoskalowanie.zatrzymanie_wlaczone Włącza automatyczne zatrzymanie w tym węźle. [prawda/fałsz]
cyclecloud.cluster.autoscale.czas_bezczynności_po_zadaniach Ilość czasu (w sekundach), przez jaki węzeł pozostaje bezczynny po zakończeniu zadań, zanim nastąpi jego automatyczne zatrzymanie.
cyclecloud.klaster.autoskalowanie.czas_bezczynności_przed_zadaniami Czas (w sekundach), przez który węzeł pozostaje bezczynny przed ukończeniem zadań, zanim zostanie automatycznie zatrzymany.