Wdrażanie autoskalowanego klastra HPC z systemem Slurm

1. Omówienie

Witamy na kursie Google Codelabs, który obejmuje uruchamianie klastra Slurm w Google Cloud Platform. Po ukończeniu tego ćwiczenia z programowania dobrze znasz łatwość udostępniania i obsługi autoskalowanego klastra Slurm.

c16fa310c142ac6f.png

Nawiązaliśmy współpracę z firmą SchedMD, aby udostępnić zestaw narzędzi, które ułatwiają uruchamianie menedżera zadań Slurm w Compute Engine oraz dynamiczne rozszerzanie istniejącego klastra, gdy potrzebne są dodatkowe zasoby. Tę integrację opracowali eksperci z firmy SchedMD zgodnie ze sprawdzonymi metodami Slurm.

Jeśli planujesz skorzystać z integracji z Slurm w Google Cloud Platform lub masz jakieś pytania, zachęcamy do dołączenia do naszych usług Google Cloud i Grupa dyskusyjna społeczności Slurm!

Informacje o Slurm

a739730a41acff0a.png

Podstawowy schemat architektury samodzielnej klastra Slurm w Google Cloud Platform.

Slurm to jeden z wiodących menedżerów zadań w klastrach HPC na całym świecie. Slurm to odporny na awarie, wysoce skalowalny system open source do zarządzania zadaniami i planowania zadań dla małych i dużych klastrów z systemem Linux. Slurm nie wymaga modyfikacji jądra i jest stosunkowo samodzielna. Jako menedżer zadań klastra Slurm ma 3 kluczowe funkcje:

  1. Przyznaje użytkownikom wyłączny lub niewyłączny dostęp do zasobów (węzłów obliczeniowych) na określony czas, aby mogli oni wykonywać pracę.
  2. Stanowi platformę do rozpoczynania, wykonywania i monitorowania pracy (zwykle jest to zadanie równoległe) w zbiorze przydzielonych węzłów.
  3. Rozstrzyga rywalizacja o zasoby, zarządzając kolejką zadań oczekujących.

Czego się nauczysz

  • Jak skonfigurować klaster Slurm za pomocą Terraform
  • Jak uruchomić zadanie za pomocą SLURM
  • Jak wykonywać zapytania o informacje o klastrze i monitorować uruchomione zadania w SLURM
  • Jak autoskalować węzły w celu dostosowania do konkretnych parametrów i wymagań zadania
  • Gdzie mogę uzyskać pomoc dotyczącą Slurm

Wymagania wstępne

  • Konto Google Cloud Platform i projekt z płatnościami
  • Podstawowa obsługa Linuksa

2. Konfiguracja

Samodzielne konfigurowanie środowiska

Utwórz projekt

Jeśli nie masz jeszcze konta Google (Gmaila lub G Suite), musisz je utworzyć. Zaloguj się w konsoli Google Cloud Platform ( console.cloud.google.com) i otwórz stronę zarządzania zasobami:

359c06e07e6d699f.png

Kliknij Utwórz projekt.

25c23d651abb837b.png

Wpisz nazwę projektu. Zapamiętaj identyfikator projektu (zaznaczony na czerwono na zrzucie ekranu powyżej). Identyfikator projektu musi być unikalną nazwą we wszystkich projektach Google Cloud. Jeśli nazwa projektu nie jest niepowtarzalna, Google Cloud wygeneruje losowy identyfikator projektu na podstawie jego nazwy.

Następnie musisz włączyć płatności w Developers Console, aby korzystać z zasobów Google Cloud.

Ukończenie tego ćwiczenia w Codelabs nie powinno kosztować więcej niż kilka dolarów, ale może okazać się droższe, jeśli zdecydujesz się użyć więcej zasobów lub nie chcesz ich uruchamiać (patrz sekcja „Podsumowanie” na końcu tego dokumentu). Kalkulator cen Google Cloud Platform jest dostępny tutaj.

Nowi użytkownicy Google Cloud Platform mogą skorzystać z bezpłatnego okresu próbnego o wartości 300 USD.

Google Cloud Shell,

Google Cloud można obsługiwać zdalnie z Twojego laptopa, ale w ramach tego ćwiczenia z programowania wykorzystamy Google Cloud Shell – środowisko wiersza poleceń działające w chmurze.

Uruchom Google Cloud Shell

W konsoli GCP kliknij ikonę Cloud Shell na górnym pasku narzędzi:

dbad104cef962719.png

Następnie kliknij Uruchom Cloud Shell:

4e50db320508ac88.png

Uzyskanie dostępu do środowiska i połączenie się z nim powinno zająć tylko kilka chwil:

20b0aa80492144d.png

Ta maszyna wirtualna ma wszystkie potrzebne narzędzia dla programistów. Zawiera stały katalog domowy o pojemności 5 GB i działa w Google Cloud, co znacznie zwiększa wydajność sieci i upraszcza uwierzytelnianie. Większość zadań w tym module można wykonać w przeglądarce lub na Chromebooku Google.

Po nawiązaniu połączenia z Cloud Shell powinno pojawić się informacja, że użytkownik jest już uwierzytelniony i że projekt jest już ustawiony na Twój PROJECT_ID:

$ gcloud auth list

Wynik polecenia:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

Wynik polecenia:

[core]
project = <PROJECT_ID>

Jeśli identyfikator projektu nie jest poprawnie ustawiony, możesz go ustawić za pomocą tego polecenia:

$ gcloud config set project <PROJECT_ID>

Wynik polecenia:

Updated property [core/project].

3. Przygotowywanie i sprawdzanie konfiguracji Terraform Slurm

Pobierz konfigurację Terraform dla Slurm

W sesji Cloud Shell uruchom to polecenie, aby sklonować (pobrać) repozytorium Git zawierające pliki Slurm dla plików Terraform z Google Cloud Platform:

git clone https://github.com/SchedMD/slurm-gcp.git

Przejdź do katalogu konfiguracji wdrożenia Slurm, wykonując to polecenie:

cd slurm-gcp

Konfigurowanie pakietów tfvar w Terraform

Plik Basic.tfvars.example zawiera szczegóły konfiguracji wdrożenia, w tym sieć, instancje i miejsce na dane, które mają zostać wdrożone. Skopiuj go do nowego pliku o nazwie „plik tfvars” i w razie potrzeby zmodyfikuj go.

cd tf/example/basic
cp basic.tfvars.example basic.tfvars

W sesji Cloud Shell otwórz plik tfvars basic.tfvars. Aby wyświetlić zawartość pliku, możesz użyć preferowanego edytora wiersza poleceń (vi, nano, emacs itp.) lub użyć edytora kodu konsoli Cloud:

214f43bba6c917aa.png

Sprawdź zawartość pliku tfvars.

cluster_name = "g1"
project      = "<project>"
zone         = "us-west1-b"

# network_name            = "<existing network name>"
# subnetwork_name         = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"

# disable_controller_public_ips = true
# disable_login_public_ips      = true
# disable_compute_public_ips    = true

# suspend_time  = 300

controller_machine_type = "n1-standard-2"
controller_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type    = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes          = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
#   server_ip = "<cloudsql ip>"
#   user      = "slurm"
#   password  = "verysecure"
#   db_name   = "slurm_accounting"
# }
# controller_secondary_disk      = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null

login_machine_type = "n1-standard-2"
login_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type    = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null

# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/home"
#   local_mount   = "/home"
#   fs_type       = "nfs"
#   mount_options = null
# }]
#
# login_network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/net_storage"
#   local_mount   = "/shared"
#   fs_type       = "nfs"
#   mount_options = null
# }]

# compute_node_service_account = "default"
# compute_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]

partitions = [
  { name                 = "debug"
    machine_type         = "n1-standard-2"
    static_node_count    = 0
    max_node_count       = 10
    zone                 = "us-west1-b"
    image                ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
    image_hyperthreads   = false
    compute_disk_type    = "pd-standard"
    compute_disk_size_gb = 20
    compute_labels       = {}
    cpu_platform         = null
    gpu_count            = 0
    gpu_type             = null
    network_storage      = []
    preemptible_bursting = false
    vpc_subnet           = null
    exclusive            = false
    enable_placement     = false
    regional_capacity    = false
    regional_policy      = {}
    instance_template    = null
  },
  #  { name                 = "partition2"
  #    machine_type         = "n1-standard-16"
  #    static_node_count    = 0
  #    max_node_count       = 20
  #    zone                 = "us-west1-b"
  #    image                = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
  #    image_hyperthreads   = false
  #
  #    compute_disk_type    = "pd-ssd"
  #    compute_disk_size_gb = 20
  #    compute_labels       = {
  #      key1 = "val1"
  #      key2 = "val2"
  #    }
  #    cpu_platform         = "Intel Skylake"
  #    gpu_count            = 8
  #    gpu_type             = "nvidia-tesla-v100"
  #    network_storage      = [{
  #      server_ip     = "none"
  #      remote_mount  = "<gcs bucket name>"
  #      local_mount   = "/data"
  #      fs_type       = "gcsfuse"
  #      mount_options = "file_mode=664,dir_mode=775,allow_other"
  #    }]
  #    preemptible_bursting = true
  #    vpc_subnet           = null
  #    exclusive            = false
  #    enable_placement     = false
  #
  #    ### NOTE ####
  #    # regional_capacity is under development. You may see slowness in
  #    # deleting lots of instances.
  #    #
  #    # With regional_capacity : True, the region can be specified in the zone.
  #    # Otherwise the region will be inferred from the zone.
  #    zone = "us-west1"
  #    regional_capacity    = True
  #    # Optional
  #    regional_policy      = {
  #        locations = {
  #            "zones/us-west1-a" = {
  #                preference = "DENY"
  #            }
  #        }
  #    }
  #
  #    When specifying an instance template, specified compute fields will
  #    override the template properties.
  #    instance_template = "my-template"
]

W tym pliku tfvars jest kilka pól do skonfigurowania. Jedyne pole, które trzeba skonfigurować, to project. Wszystkie inne konfiguracje z tego przykładu mogą być używane w takiej postaci, w jakiej są, ale w razie potrzeby zmodyfikuj je. Bardziej szczegółowy opis opcji konfiguracji znajdziesz tutaj.

  • cluster_name: nazwa klastra Slurm
  • project:identyfikator projektu Google Cloud, w którym zostaną wdrożone zasoby.
  • zone: strefa Google Cloud, która będzie zawierać kontroler i instancje logowania tego klastra – więcej informacji.
  • network_name: sieć prywatnego środowiska wirtualnego w chmurze, w której chcesz wdrożyć klaster Slurm.
  • subnetwork_name: podsieć prywatnego środowiska wirtualnego w chmurze, w której zostanie wdrożony klaster Slurm
  • shared_vpc_host_project: współdzielona sieć VPC umożliwiająca wdrożenie klastra Slurm;
  • disable_controller_public_ips: Przypisać zewnętrzny adres IP do kontrolera Slurm?
  • disable_login_public_ips: Przypisać zewnętrzny adres IP do węzła logowania Slurm?
  • disable_compute_login_ips: Przypisać zewnętrzny adres IP do węzła logowania Slurm?
  • suspend_time::czas oczekiwania od momentu, gdy węzeł jest bezczynny, przed jego zawieszeniem.
  • controller_machine_type: typ instancji węzła kontrolera
  • controller_image: obraz GCP użyty do utworzenia instancji kontrolera Slurm.
  • controller_disk_type: typ dysku rozruchowego instancji kontrolera.
  • controller_disk_size_gb: rozmiar dysku rozruchowego instancji kontrolera
  • controller_labels::etykiety, które chcesz dołączyć do instancji kontrolera.
  • controller_service_account: konto usługi, które będzie używane w instancji kontrolera.
  • controller_scopes: zakres dostępu do instancji kontrolera.
  • cloudsql: serwer Google Cloud SQL, który będzie używany jako baza danych Slurm zamiast do hostowania bazy danych w instancji kontrolera.
  • server_ip::adres IP serwera Cloud SQL.
  • user: nazwa użytkownika Cloud SQL
  • password: hasło do Cloud SQL
  • db_name: nazwa bazy danych Cloud SQL
  • controller_secondary_disk: dodać dysk dodatkowy na potrzeby pamięci serwera NFS?
  • controller_secondary_disk_type: typ dysku dodatkowego kontrolera
  • controller_secondary_disk_size_gb: rozmiar dysku dodatkowego kontrolera
  • controller_instance_template: szablon instancji GCP używany na potrzeby instancji kontrolera. Wszystkie określone pola obliczeniowe zastąpią właściwości szablonu. Na przykład: jeśli jest określony parametr player_image, zastąpi on obraz w szablonie instancji.
  • login_machine_type: typ instancji węzła logowania (dostęp przez SSH)
  • login_image: obraz GCP użyty do utworzenia instancji logowania Slurm;
  • login_disk_type: typ dysku rozruchowego instancji logowania.
  • login_disk_size_gb: rozmiar dysku rozruchowego instancji logowania
  • login_labels: etykiety, które chcesz dołączyć do instancji logowania;
  • login_node_count: liczba węzłów logowania do utworzenia.
  • login_node_service_account: konto usługi, które będzie używane w instancjach logowania;
  • login_node_scopes: zakres dostępu do instancji logowania;
  • login_instance_template: szablon instancji GCP używany na potrzeby instancji logowania. Wszystkie określone pola obliczeniowe zastąpią właściwości szablonu. Na przykład: Jeśli jest określony parametr login_image, zastąpi obraz w szablonie instancji.
  • network_storage: pamięć sieciowa do podłączenia we wszystkich węzłach. Pola zostaną dodane bezpośrednio do fstab. Można to powtórzyć w przypadku dodatkowych uchwytów.
  • server_ip: adres IP serwera pamięci masowej
  • remote_mount: nazwa podłączenia pamięci (nazwa systemu plików)
  • local_mount: lokalny katalog podłączenia
  • fs_type: typ systemu plików (NFS, CIFS, Lustre, GCSFuse instalowane automatycznie).
  • mount_options: opcje podłączenia (np.wartości defaults,_netdev).
  • login_network_storage: sieć pamięci masowej do podłączenia w węzłach logowania i kontrolera. NFS, CIFS, Lustre i GCSFuse zostaną zainstalowane automatycznie. Można to powtórzyć w przypadku dodatkowych uchwytów.
  • server_ip: adres IP serwera pamięci masowej
  • remote_mount: nazwa podłączenia pamięci (nazwa systemu plików)
  • local_mount: lokalny katalog podłączenia
  • fs_type: typ systemu plików (NFS, CIFS, Lustre, GCSFuse instalowane automatycznie).
  • mount_options: opcje podłączenia (np.wartości defaults,_netdev).
  • compute_node_service_account: konto usługi, które będzie używane na instancjach obliczeniowych.
  • compute_node_scopes: zakres dostępu do instancji obliczeniowych.
  • partycje:konfiguracja partycji Slurm. Można ją powtórzyć dla dodatkowych partycji.
  • name: nazwa partycji
  • machine_type: typ instancji węzłów obliczeniowych.
  • static_node_count: liczba zawsze włączonych węzłów obliczeniowych
  • max_node_count: maksymalna dozwolona liczba węzłów obliczeniowych to maksymalnie 64 tys.
  • zone: strefa Google Cloud zawierająca zasoby tej partycji – więcej informacji.
  • image: typ maszyny węzła obrazu obliczeniowego
  • image_hyperthreads: włączanie i wyłączanie funkcji HyperThreading w instancji.
  • compute_disk_type: typ dysku rozruchowego instancji obliczeniowej (pd-standard, pd-ssd)
  • compute_disk_size_gb: rozmiar dysku rozruchowego instancji obliczeniowej
  • compute_labels: etykiety, które mają zostać dołączone do instancji Compute.
  • cpu_platform::minimalna platforma CPU wymagana dla wszystkich węzłów obliczeniowych.
  • gpu_count: liczba procesorów graficznych do podłączenia do każdej instancji w partycji
  • gpu_type: typ procesora graficznego, który ma zostać podłączony do instancji partycji.
  • network_storage: sieciowa pamięć masowa do podłączenia we wszystkich węzłach obliczeniowych partycji. Pola zostaną dodane bezpośrednio do fstab. Można to powtórzyć w przypadku dodatkowych uchwytów.
  • server_ip: adres IP serwera pamięci masowej
  • remote_mount: nazwa podłączenia pamięci (nazwa systemu plików)
  • local_mount: lokalny katalog podłączenia
  • fs_type: typ systemu plików (NFS, CIFS, Lustre, GCSFuse instalowane automatycznie).
  • mount_options::opcja podłączenia.
  • preemptible_bursting: czy instancje będą instancjami z możliwością wywłaszczania?
  • vpc_subnet: podsieć prywatnego środowiska wirtualnego w chmurze do wdrożenia partycji Slurm
  • wyłącznie: włącz funkcję Slurm, aby przydzielać całe węzły do zadań.
  • enable_placement::włącz zasady rozmieszczenia, w których instancje będą znajdować się blisko siebie, co pozwoli zminimalizować opóźnienia sieciowe między instancjami.
  • regional_capacity: zezwalaj na umieszczanie instancji w dowolnej strefie regionu na podstawie dostępności.
  • regional_policy: jeśli wartość regional_capacity ma wartość true (prawda), ta zasada określa, którego regionu należy użyć, a które strefy w tym regionie nie mają być używane.
  • Instance_template: szablon instancji GCP używany na potrzeby instancji obliczeniowych. Wszystkie określone pola obliczeniowe zastąpią właściwości szablonu. Na przykład: jeśli jest określony obraz, zastąpi on obraz w szablonie instancji.

Konfiguracja zaawansowana

W razie potrzeby w ramach procesu wdrażania klastra możesz zainstalować dodatkowe pakiety i oprogramowanie. Możesz zainstalować oprogramowanie w klastrze Slurm na wiele sposobów opisanych w artykule „Instalowanie aplikacji w klastrze Slurm w Compute Engine” lub dostosować obraz wdrożony przez Slurm. Obecnie Slurm wdraża udostępniony przez SchedMD obraz maszyny wirtualnej oparty na obrazie maszyny wirtualnej Google Cloud HPC z zainstalowanym systemem Slurm.

Aby użyć własnego obrazu, utwórz obraz z własną konfiguracją na podstawie publicznego obrazu maszyny wirtualnej SchedMD wymienionego w pliku tfvars. Następnie zastąp identyfikator URI obrazu określony w pliku tfvars własnym obrazem i przetestuj zmianę.

Rozwiązywanie problemów

W trakcie tego ćwiczenia w programie zapoznaj się z sekcją rozwiązywania problemów w pliku ReadMe repozytorium Slurm-GCP.

Typowe problemy to błędy popełnione podczas konfigurowania pliku tfvars i ograniczenia limitów. To ćwiczenie z programowania zostało opracowane w ramach standardowego limitu nowego użytkownika i w ramach bezpłatnych środków w wysokości 300 USD, które nowy użytkownik otrzymuje. Jeśli próba utworzenia maszyny wirtualnej się nie uda, sprawdź plik /var/log/slurm/resume.log w węźle kontrolera, aby poszukać błędów interfejsu API.

4. Wdrażanie i weryfikowanie konfiguracji

Wdrażanie konfiguracji

W sesji Cloud Shell wykonaj to polecenie z folderu slurm-gcp/tf/example:

terraform init
terraform apply -var-file=basic.tfvars

W zależności od ustawionych konfiguracji pojawi się prośba o zaakceptowanie opisanych działań. Wpisz „yes” aby rozpocząć wdrażanie. Możesz też wyświetlić konfigurację do wdrożenia, uruchamiając polecenie „terraform plan”.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

Ta operacja może potrwać kilka minut, więc prosimy o cierpliwość.

Po zakończeniu wdrażania zobaczysz dane wyjściowe podobne do tych:

Apply complete! Resources: 8 added, 0 changed, 0 destroyed.

Outputs:

controller_network_ips = [
  [
    "10.0.0.2",
  ],
]
login_network_ips = [
  [
    "10.0.0.3",
  ],
]

Weryfikowanie tworzenia instancji maszyny wirtualnej

Otwórz menu nawigacyjne i wybierz Compute Engine > Maszyny wirtualne.

d5832bdd527794ed.png

Powinny się wyświetlić kontroler i instancja maszyny wirtualnej logowania:

7a1fc9603758d58d.png

W sekcji Instancje maszyn wirtualnych sprawdź 2 instancje maszyn wirtualnych utworzone przez Terraform.

Jeśli pole cluster_name zostało zmodyfikowane, nazwy będą inne.

  • Kontroler G1
  • g1-login0

5. Logowanie do klastra Slurm

Dostęp do klastra Slurm

Wróć do edytora kodu/na kartę Cloud Shell. Uruchom to polecenie, aby zalogować się do swojej instancji, zastępując <ZONE> strefą węzła g1-login0 (powinno być us-central1-b):

gcloud compute ssh g1-login0 --zone=<ZONE>

To polecenie spowoduje zalogowanie Cię do maszyny wirtualnej g1-login0.

Inną metodą łatwego dostępu do węzła logowania jest kliknięcie „SSH” obok maszyny wirtualnej g1-login0 na stronie Instancje maszyn wirtualnych, aby otworzyć nową kartę z połączeniem SSH.

8c373a87d13620f7.png

Jeśli używasz Cloud Shell po raz pierwszy, możesz zobaczyć komunikat podobny do tego poniżej z prośbą o utworzenie klucza SSH:

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/user/.ssh] before being
 able to generate SSH keys.

Do you want to continue (Y/n)?

Jeśli tak, wpisz Y. Jeśli pojawi się prośba o wybranie hasła, pozostaw je puste, naciskając Enter.

Jeśli podczas logowania zostanie wyświetlony następujący komunikat:

*** Slurm is currently being configured in the background. ***
A terminal broadcast will announce when installation and configuration is
complete.

Zaczekaj i nie kontynuuj modułu, dopóki nie zobaczysz tego komunikatu (ok. 5 minut):

*** Slurm login setup complete ***

Po wyświetleniu powyższego komunikatu musisz się wylogować i zalogować ponownie w g1-login0, aby kontynuować moduł. Aby to zrobić, naciśnij CTRL + C, aby zakończyć zadanie.

Następnie wykonaj to polecenie, wyloguj się ze swojej instancji:

exit

Teraz połącz się ponownie z maszyną wirtualną logowania. Uruchom to polecenie, aby zalogować się do swojej instancji, zastępując <ZONE> strefą węzła g1-login0:

gcloud compute ssh g1-login0 --zone=<ZONE>

Podobnie jak powyżej, być może trzeba będzie poczekać chwilę lub dwie, zanim nawiążesz połączenie i ukończysz wszystkie aspekty konfiguracji.

Prezentacja narzędzi interfejsu wiersza poleceń Slurm

Jesteś zalogowany(-a) w węźle logowania Slurm w klastrze. Ten węzeł jest przeznaczony do interakcji z użytkownikami/administratorami, planowania zadań Slurm i działań administracyjnych.

Uruchommy kilka poleceń, które pozwolą Ci zapoznać się z wierszem poleceń Slurm.

Uruchom polecenie sinfo, aby wyświetlić stan zasobów naszego klastra:

sinfo

Przykładowe wyniki wyszukiwania informacji są widoczne poniżej. sinfo zgłasza węzły dostępne w klastrze, stan tych węzłów oraz inne informacje, takie jak partycja, dostępność i wszelkie ograniczenia czasowe nałożone na te węzły.

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

Wyświetli się 10 naszych węzłów. Jest to określane przez wartość „max_node_count” partycji debugowania z 10 jest oznaczonych jako „idle~” (węzeł jest w trybie bezczynności i nieprzydzielonym, gotowy do uruchomienia).

Następnie uruchom polecenie squeue, aby wyświetlić stan kolejki w klastrze:

squeue

Oczekiwane dane wyjściowe kolejki są widoczne poniżej. funkcja squeue raportuje stan kolejki klastra. Obejmuje on identyfikator każdego zadania zaplanowanego w klastrze, partycję, do której zadanie jest przypisane, nazwę zadania, użytkownika, który je uruchomił, stan zadania, czas działania zadania oraz węzły, do których zadanie zostało przydzielone. Nie mamy uruchomionych żadnych zadań, więc zawartość tego polecenia jest pusta.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Polecenia Slurm „uciekaj” i „sbatch” służą do uruchamiania zadań umieszczonych w kolejce. „srun” uruchamia równoległe zadania i może być używany jako kod mpiruna. „sbatch” służy do przesyłania zadania wsadowego do skontrolowania i może wywoływać srun raz lub wiele razy w różnych konfiguracjach. „sbatch” może pobierać skrypty wsadowe, ale możesz też użyć opcji -wrap, by uruchomić całe zadanie z wiersza poleceń.

Uruchommy zadanie, aby zobaczyć działanie Slurm w akcji i dostać zadanie w kolejce.

6. Uruchamianie zadania Slurm i skalowanie klastra

Uruchamianie zadania Slurm i skalowanie klastra

Klaster Slurm jest już uruchomiony, czas więc uruchomić zadanie i przeskalować klaster w górę.

„Sbatch” służy do uruchamiania poleceń i skryptów wsadowych Slurm. Uruchommy prosty skrypt sbatch, który uruchomi „nazwa hosta”. na naszych autoskalowanych maszynach wirtualnych.

Po zalogowaniu się do g1-login0 uruchom następujące polecenie:

sbatch -N2 --wrap="srun hostname"

To polecenie uruchamia polecenie wsadowe Slurm. Określa, że w wyniku sbatch uruchomione są 2 węzły z symbolem „-N” . Określa też, że każdy z tych węzłów będzie uruchamiać „uruchomioną nazwę hosta”. w funkcji „-wrap” .

Domyślnie narzędzie sbatch zapisze swoje dane wyjściowe w „slurm-%j.out”. w katalogu roboczym, z którego jest uruchamiane polecenie, gdzie %j jest zastępowany identyfikatorem zadania zgodnie ze wzorcami nazw plików Slurm. W naszym przykładzie plik jest uruchamiany z folderu /home użytkownika, który jest domyślnie udostępnianym systemem plików opartym na NFS i hostowanym na kontrolerze. Dzięki temu węzły obliczeniowe mogą udostępniać dane wejściowe i wyjściowe w razie potrzeby. W środowisku produkcyjnym pamięć robocza powinna być oddzielona od pamięci masowej /home, aby uniknąć negatywnego wpływu na wydajność działania klastra. Osobne punkty montowania pamięci masowej można określić w pliku tfvars w „network_storage” .

Po wykonaniu skryptu sbatch przy użyciu wiersza poleceń sbatch zwróci on identyfikator zadania dla zaplanowanego zadania, na przykład:

Submitted batch job 2

Możemy użyć identyfikatora zadania zwróconego w poleceniu sbatch do śledzenia wykonania zadania i zasobów oraz zarządzania nimi. Wykonaj to polecenie, aby wyświetlić kolejkę zadań Slurm:

squeue

Prawdopodobnie zobaczysz wykonane zadanie wymienione poniżej:

JOBID PARTITION               NAME     USER ST       TIME  NODES   NODELIST(REASON)
    2     debug g1-compute-0-[0-1] username  R       0:10      2 g1-compute-0-[0-1]

Nie mieliśmy udostępnionych węzłów obliczeniowych, dlatego Slurm automatycznie utworzy instancje obliczeniowe zgodnie z wymaganiami zadania. Automatyczny charakter tego procesu ma dwie zalety. Po pierwsze, eliminuje to zadanie, które zwykle jest wymagane w klastrze HPC z ręcznym udostępnianiem węzłów, konfigurowania oprogramowania, integracji węzła z klastrem i wdrażania zadania. Po drugie pozwala użytkownikom zaoszczędzić pieniądze, ponieważ nieaktywne, nieużywane węzły są skalowane w dół do momentu uruchomienia minimalnej liczby węzłów.

Aby zobaczyć, jak klaster Slurm się uruchamia, możesz uruchomić polecenie sinfo:

sinfo

Spowoduje to wyświetlenie węzłów znajdujących się w kolejce w kolumnie „alloc#” co oznacza przydzielanie węzłów:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2 alloc#  g1-compute-0-[0-1]

Nowo udostępnione węzły znajdziesz też w sekcji Instancje maszyn wirtualnych w konsoli Google Cloud. Uruchamianie węzłów i uruchomienie Slurm może zająć kilka minut, zanim zadanie zostanie przydzielone do nowo przydzielonych węzłów. Lista instancji maszyn wirtualnych wkrótce będzie wyglądać mniej więcej tak:

9997efff595f1e.png

Po uruchomieniu zadania przez węzły instancje zostaną przeniesione do „przydzielenia” co oznacza, że zadania są przypisane do jednego z nich:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2  alloc g1-compute-0-[0-1]

Po zakończeniu zadania nie będzie już wyświetlane w kolejce, a „alloc” (alloc) węzły w sinfo powróci do stanu „nieaktywny” stanu. Uruchom „squeue” okresowo, po minucie lub dwóch, do zakończenia zadania.

Plik wyjściowy slurm-%j.out zostanie zapisany w folderze /home udostępniony przez NFS i będzie zawierać nazwy hostów. Otwórz lub przeszukaj plik wyjściowy (zwykle jest to slurm-2.out). Jego zawartość będzie zawierać:

g1-compute-0-0
g1-compute-0-1

Dobra robota! Udało Ci się uruchomić zadanie i skalować klaster Slurm.

7. Uruchom zadanie MPI

Teraz uruchommy zadanie MPI w naszych węzłach. Po zalogowaniu się do g1-login0 użyj narzędzia Wget, aby pobrać program MPI napisany w języku programowania C:

wget https://raw.githubusercontent.com/mpitutorial/mpitutorial/gh-pages/tutorials/mpi-hello-world/code/mpi_hello_world.c

Aby użyć narzędzi OpenMPI, musisz wczytać moduły OpenMPI, uruchamiając to polecenie:

module load openmpi

Użyjemy parametru „mpicc”, narzędzie do kompilacji kodu MPI C. Uruchom to polecenie:

mpicc mpi_hello_world.c -o mpi_hello_world

Spowoduje to skompilowanie kodu C do kodu maszynowego, dzięki czemu będziemy mogli uruchamiać kod w klastrze przez Slurm.

Następnie w preferowanym edytorze tekstu utwórz skrypt „helloworld_batch”:

vi helloworld_batch

Wpisz i, aby przejść do trybu wstawiania vi.

Skopiuj i wklej ten tekst, by utworzyć prosty skrypt sbatch:

#!/bin/bash
#
#SBATCH --job-name=hello_world
#SBATCH --output=hello_world-%j.out
#
#SBATCH --nodes=2

srun mpi_hello_world

Zapisz i zamknij edytor kodu, naciskając Escape oraz wpisując „:wq” bez cudzysłowów.

Ten skrypt określa środowisko i zadania wsadowego wykonywania Slurm. Po pierwsze, środowisko wykonawcze jest definiowane jako bash. Następnie skrypt najpierw definiuje opcje Slurm za pomocą parametru „#SBATCH”, . Nazwa zadania jest zdefiniowana jako „hello_world”.

Plik wyjściowy jest ustawiony na „hello_world_%j.out”. gdzie %j jest zastępowane identyfikatorem zadania zgodnie ze wzorcami nazw plików Slurm. Ten plik wyjściowy jest zapisywany w katalogu, z którego uruchamia się skrypt sbatch. W naszym przykładzie jest to folder /home użytkownika, który jest udostępnianym systemem plików opartym na NFS. Dzięki temu węzły obliczeniowe mogą udostępniać dane wejściowe i wyjściowe w razie potrzeby. W środowisku produkcyjnym pamięć robocza powinna być oddzielona od pamięci masowej /home, aby uniknąć negatywnego wpływu na wydajność działania klastra.

Liczba węzłów, na których powinien działać skrypt, jest zdefiniowana jako 2.

Po zdefiniowaniu opcji zostaną udostępnione polecenia wykonywalne. Ten skrypt uruchomi równolegle kod mpi_hello_world przy użyciu polecenia srun, które jest niezastąpionym zamiennikiem polecenia mpirun.

Następnie uruchom skrypt sbatch przy użyciu wiersza poleceń sbatch:

sbatch helloworld_batch

Uruchomienie sbatcha zwróci identyfikator zadania zaplanowanego zadania, na przykład:

Submitted batch job 3

Spowoduje to uruchomienie polecenia hostname w 2 węzłach z 1 zadaniem na węzeł oraz wydrukowanie danych wyjściowych do pliku hello_world-3.out.

Ponieważ mieliśmy już udostępnione 2 węzły, to zadanie będzie działać szybko.

Monitoruj stan squeue, aż zadanie się zakończy i nie będzie już wyświetlane:

squeue

Po zakończeniu otwórz lub uruchom plik hello_world-3.out i potwierdź, że został uruchomiony w g1-compute-0-[0-1]:

Hello world from processor g1-compute-0-0, rank 0 out of 2 processors
Hello world from processor g1-compute-0-1, rank 1 out of 2 processors

Po 5 minutach bezczynności (można skonfigurować to za pomocą pola zawieszania YAML pliku YAML lub pola suspTime w pliku slurm.conf) dynamicznie udostępniane węzły obliczeniowe zostaną anulowane do zasobów wersji. Aby to sprawdzić, okresowo uruchamiaj sinfo i obserwuj, jak rozmiar klastra zmienia się na 0:

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite     10  idle~ g1-compute-0-[0-9]

Zwiększ liczbę instancji, maksymalnie do limitu dozwolonego w regionie, w którym wdrożyłeś klaster, oraz uruchom różne aplikacje MPI.

8. Podsumowanie

Gratulujemy! Udało Ci się utworzyć klaster Slurm w Google Cloud Platform i skorzystać z najnowszych funkcji, aby automatycznie skalować klaster w celu spełnienia wymogów związanych z zadaniami. Tego modelu można używać do uruchamiania różnych zadań. Skalowany jest do setek instancji w ciągu kilku minut po wysłaniu żądania węzłów w Slurm.

Jeśli chcesz kontynuować naukę korzystania z usługi Slurm w GCP, zapoznaj się z dokumentem Tworzenie sfederowanych klastrów HPC z funkcją Slurm ćwiczenie w Codelabs. Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak skonfigurować 2 sfederowane klastry Slurm w chmurze. Dzięki temu dowiesz się, jak osiągnąć federację wieloklastrową, zarówno lokalnie, jak i w chmurze.

Czy tworzysz coś ciekawego, używając nowej, natywnej funkcji GCP na platformie Slurm? Masz pytania? Masz propozycję funkcji? Już dziś skontaktuj się z zespołem Google Cloud na stronie rozwiązań Google Cloud do przetwarzania wysokiej wydajności lub porozmawiaj z nami w Google Cloud Grupa dyskusyjna Slurm!

Oczyszczanie wdrożenia Terraform

Wyloguj się z węzła slurm:

exit

Zanim usuniesz wdrożenie, poczekaj, aż wszystkie automatycznie skalowane węzły skalują w dół. Te węzły możesz też usunąć ręcznie, uruchamiając polecenie „gcloud compute instances delete <Nazwa instancji>”. dla każdej instancji lub za pomocą graficznego interfejsu konsoli, aby wybrać wiele węzłów i kliknąć „Usuń”.

Po zakończeniu wdrożenia możesz łatwo wyczyścić wdrożenie Terraform, wykonując w Google Cloud Shell to polecenie po wylogowaniu się z g1-login0:

cd ~/slurm-gcp/tf/examples/basic
terraform destroy -var-file=basic.tfvars

Gdy pojawi się komunikat, wpisz yes, aby kontynuować. Ta operacja może potrwać kilka minut. Prosimy o cierpliwość.

Usuwanie projektu

Aby wyczyścić dane, po prostu usuwamy nasz projekt.

  • W menu nawigacyjnym wybierz Administracja Administracja
  • Następnie kliknij ustawienia w menu podrzędnym.
  • Kliknij ikonę kosza z tekstem „Usuń projekt”.
  • Postępuj zgodnie z wyświetlanymi instrukcjami.

Omówione zagadnienia

  • Wdrażanie Slurm w GCP za pomocą Terraform.
  • Jak uruchomić zadanie przy użyciu Slurm w GCP.
  • Jak wysyłać zapytania o informacje o klastrze i monitorować uruchomione zadania w Slurm.
  • Jak autoskalować węzły za pomocą Slurm w GCP w celu dostosowania do konkretnych parametrów i wymagań zadania.
  • Jak kompilować i uruchamiać aplikacje MPI w Slurm w GCP.

Znajdź pomoc dla Slurm

Jeśli potrzebujesz pomocy przy korzystaniu z tych integracji w środowiskach testowych lub produkcyjnych, skontaktuj się bezpośrednio z firmą SchedMD, korzystając z informacji kontaktowych tej firmy: https://www.schedmd.com/contact.php

Możesz też skorzystać z przewodników dotyczących rozwiązywania problemów:

Możesz też zadać pytanie zespołowi Google Cloud & Grupę dyskusyjną Slurm można znaleźć tutaj: https://groups.google.com/g/google-cloud-slurm-discuss.

Więcej informacji

Prześlij opinię

Prześlij opinię o tym ćwiczeniach z programowania, korzystając z tego linku. Przesłanie opinii zajmie mniej niż 5 minut. Dziękujemy!