Slurm ile Otomatik Ölçeklendirmeli HPC Kümesi dağıtın

1. Genel Bakış

Google Cloud Platform'da Slurm kümesi çalıştırmak için Google Codelab'e hoş geldiniz. Bu codelab'in sonunda, otomatik ölçeklendirmeli Slurm kümesi sağlamanın ve çalıştırmanın ne kadar kolay olduğunu iyice anlamış olacaksınız.

c16fa310c142ac6f.png

Google Cloud, Compute Engine'de Slurm iş yükü yöneticisini başlatmayı ve ek kaynaklara ihtiyacınız olduğunda mevcut kümenizi dinamik olarak genişletmeyi kolaylaştıran bir dizi araç sunmak için SchedMD ile işbirliği yaptı. Bu entegrasyon, SchedMD'deki uzmanlar tarafından Slurm en iyi uygulamaları doğrultusunda geliştirilmiştir.

Google Cloud Platform'da Slurm entegrasyonlarını kullanmayı planlıyorsanız veya sorunuz varsa Google Cloud ve Slurm Topluluğu Tartışma Grubu'nu kullanın.

Slurm hakkında

a739730a41acff0a.png

Google Cloud Platform'daki bağımsız Slurm kümesinin temel mimari diyagramı.

Slurm, dünya genelindeki HPC kümeleri için önde gelen iş yükü yöneticilerinden biridir. Slurm, küçük ve büyük Linux kümeleri için açık kaynaklı, hatadan etkilenmez, son derece ölçeklenebilir bir iş yükü yönetimi ve iş planlama sistemi sunar. Slurm, çalışması için çekirdekte değişiklik gerektirmez ve nispeten bağımsız bir yöntemdir. Küme iş yükü yöneticisi olarak Slurm'un üç temel işlevi vardır:

  1. Kullanıcıların işlerini gerçekleştirebilmeleri için kaynaklara (işlem düğümleri) özel veya münhasır olmayan erişimleri belirli bir süre boyunca kullanıcılara ayırır.
  2. Ayrılmış düğümler kümesi üzerindeki çalışmaları (normalde paralel bir iş) başlatmak, yürütmek ve izlemek için bir çerçeve sağlar.
  3. Beklemedeki bir çalışma sırasını yöneterek kaynaklar için hakemlik yapar.

Neler öğreneceksiniz?

  • Terraform kullanarak Slurm kümesi oluşturma
  • SLURM kullanarak iş çalıştırma
  • SLURM'de küme bilgilerini sorgulama ve çalışan işleri izleme
  • Belirli iş parametrelerini ve gereksinimlerini karşılamak için düğümleri otomatik olarak ölçeklendirme
  • Slurm ile ilgili nereden yardım alabilirim?

Ön koşullar

  • Google Cloud Platform Hesabı ve Faturalandırmalı Bir Proje
  • Temel Linux Deneyimi

2. Kurulum

Kendi hızınızda ortam kurulumu

Proje oluştur

Google Hesabınız (Gmail veya G Suite) yoksa hesap oluşturmanız gerekir. Google Cloud Platform konsolunda ( console.cloud.google.com) oturum açın ve Kaynakları yönetin sayfasını açın:

359c06e07e6d699f.png

Proje Oluştur'u tıklayın.

25c23d651abb837b.png

Proje adı girin. Proje kimliğini hatırlayın (yukarıdaki ekran görüntüsünde kırmızıyla vurgulanmıştır). Proje kimliği, tüm Google Cloud projelerinde benzersiz bir ad olmalıdır. Projenizin adı benzersiz değilse Google Cloud, proje adını temel alarak rastgele bir proje kimliği oluşturur.

Ardından, Google Cloud kaynaklarını kullanmak için Developers Console'da faturalandırmayı etkinleştirmeniz gerekir.

Bu codelab'i kullanmanın maliyeti birkaç dolardan fazla olmayacaktır. Ancak daha fazla kaynak kullanmaya karar verirseniz veya kaynakları çalışır durumda bırakırsanız bu tutar daha yüksek olabilir (bu belgenin sonundaki "Sonuç" bölümüne bakın). Google Cloud Platform Fiyat Hesaplayıcı'ya buradan erişebilirsiniz.

Yeni Google Cloud Platform kullanıcıları 300 ABD doları değerinde ücretsiz denemeden yararlanabilir.

Google Cloud Shell

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacağız.

Google Cloud Shell'i başlatın

GCP Console'da, sağ üstteki araç çubuğunda yer alan Cloud Shell simgesini tıklayın:

dbad104cef962719.png

Ardından Cloud Shell'i Başlat'ı tıklayın:

4e50db320508ac88.png

Ortamın sağlanması ve bağlanması yalnızca birkaç dakika sürer:

20b0aa80492144d.png

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını büyük ölçüde artırır ve kimlik doğrulamayı basitleştirir. Bu laboratuvardaki çalışmalarınızın tamamı olmasa bile büyük bir kısmı yalnızca bir web tarayıcısı veya Google Chromebook ile yapılabilir.

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulanmış olduğunu ve projenin PROJECT_ID'nize ayarlanmış olduğunu göreceksiniz:

$ gcloud auth list

Komut çıkışı:

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

Komut çıkışı:

[core]
project = <PROJECT_ID>

Proje kimliği doğru ayarlanmadıysa şu komutla bunu ayarlayabilirsiniz:

$ gcloud config set project <PROJECT_ID>

Komut çıkışı:

Updated property [core/project].

3. Slurm Terraform Yapılandırmasını Hazırlama ve İnceleme

Slurm Terraform yapılandırmasını indirin

Cloud Shell oturumunda, Slurm for Google Cloud Platform Terraform dosyalarını içeren Git deposunu klonlamak (indirmek) için aşağıdaki komutu yürütün:

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

Aşağıdaki komutu çalıştırarak Slurm dağıtım yapılandırma dizinine geçin:

cd slurm-gcp

Slurm Terraform tfvar'larını yapılandırma

Basic.tfvars.example dosyası; dağıtılacak ağ, örnekler ve depolama alanı da dahil olmak üzere dağıtımın yapılandırmasını ayrıntılı olarak gösterir. Dosyayı, "tfvars dosyası" olarak adlandıracağımız yeni bir dosyaya kopyalayın ve gerektiği şekilde düzenleyin.

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

Cloud Shell oturumunda basic.tfvars tfvars dosyasını açın. Tercih ettiğiniz komut satırı düzenleyicisini (vi, nano, emacs vb.) veya Cloud Console Kod Düzenleyici'yi kullanarak dosya içeriklerini görüntüleyebilirsiniz:

214f43bba6c917aa.png

tfvars dosyasının içeriğini inceleyin.

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"
]

Bu tfvars dosyasında yapılandırılacak birkaç alan vardır. Yapılandırılması gereken tek alan projedir. Örnekteki diğer tüm yapılandırmalar olduğu gibi kullanılabilir, ancak durumunuza uygun şekilde değişiklik yapın. Yapılandırma seçenekleriyle ilgili daha ayrıntılı açıklama için buraya bakın.

  • cluster_name: Slurm kümesinin adı
  • proje: Kaynakların dağıtılacağı Google Cloud proje kimliği
  • zone: Bu kümenin denetleyici ve giriş örneklerini içeren Google Cloud alt bölgesi - Daha Fazla Bilgi
  • network_name: Slurm kümesini dağıtmak için Sanal Özel Bulut ağı
  • subnetwork_name: Slurm kümesini dağıtmak için Sanal Özel Bulut alt ağı
  • shared_vpc_host_project: Slurm kümesini dağıtmak için paylaşılan VPC ağı
  • disable_controller_public_ips: Slurm denetleyicisine harici IP atansın mı?
  • disable_login_public_ips: Slurm giriş düğümüne harici IP atansın mı?
  • disable_compute_login_ips: Slurm giriş düğümüne harici IP atansın mı?
  • suspend_time: Düğümü askıya almadan önce bir düğüm boşta kaldıktan sonra bekleme süresi
  • controller_machine_type: Denetleyici düğümü örnek türü
  • controller_image: Slurm denetleyici örneği oluşturmak için kullanılan GCP görüntüsü
  • controller_disk_type: Denetleyici örneği önyükleme diskinin türü
  • controller_disk_size_gb: Denetleyici örneği önyükleme diskinin boyutu
  • controller_labels: Denetleyici örneğine eklenecek etiketler
  • controller_service_account: Denetleyici örneğinde kullanılacak hizmet hesabı
  • controller_scopes: Denetleyici örneğinin erişim kapsamı
  • cloudsql: Denetleyici örneğinde veritabanı barındırmak yerine Slurm veritabanı olarak kullanılacak Google CloudSQL sunucusu
  • server_ip: CloudSQL sunucu IP'si
  • user: CloudSQL kullanıcı adı
  • password: CloudSQL şifresi
  • db_name: CloudSQL veritabanı adı
  • controller_secondary_disk: NFS sunucusu depolama alanı için ikincil disk eklensin mi?
  • controller_secondary_disk_type: Denetleyici ikincil diskinin türü
  • controller_secondary_disk_size_gb: Denetleyici ikincil diskinin boyutu
  • controller_instance_template: Denetleyici örneği için kullanılacak GCP örnek şablonu. Belirtilen işlem alanları şablon özelliklerini geçersiz kılar. Ör. denetleyici_image değeri belirtilirse örnek şablonundaki resmin üzerine yazılır.
  • login_machine_type: Giriş (SSH-accessible) düğümü örnek türü
  • login_image: Slurm giriş örneğini oluşturmak için kullanılan GCP resmi
  • login_disk_type: Giriş örneği önyükleme diskinin türü
  • login_disk_size_gb: Giriş örneği önyükleme diskinin boyutu
  • login_labels: Giriş örneğine eklenecek etiketler
  • login_node_count: Oluşturulacak giriş düğümlerinin sayısı
  • login_node_service_account: Giriş örneklerinde kullanılacak hizmet hesabı
  • login_node_scopes: Giriş örneğinin erişim kapsamı
  • login_instance_template: Giriş örneği için kullanılacak GCP örnek şablonu. Belirtilen işlem alanları şablon özelliklerini geçersiz kılar. Ör. session_image değeri belirtilirse örnek şablonundaki resmin üzerine yazılır.
  • network_storage: Tüm düğümlere eklenecek ağ depolama alanı. Alanlar doğrudan fstab'e eklenir. Ek montajlar için tekrarlanabilir.
  • server_ip: Depolama sunucusu IP'si
  • remote_mount: Depolama alanı ekleme adı (dosya sistemi adı)
  • local_mount: Yerel ekleme dizini
  • fs_type: Dosya sistemi türü (NFS, CIFS, Lustre, GCSFuse otomatik olarak yüklenir)
  • mount_options: Ekleme seçenekleri (ör. Default,_netdev)
  • login_network_storage: Giriş ve denetleyici düğümlerine eklenecek ağ depolama alanı. NFS, CIFS, Lustre ve GCSFuse otomatik olarak yüklenir. Ek montajlar için tekrarlanabilir.
  • server_ip: Depolama sunucusu IP'si
  • remote_mount: Depolama alanı ekleme adı (dosya sistemi adı)
  • local_mount: Yerel ekleme dizini
  • fs_type: Dosya sistemi türü (NFS, CIFS, Lustre, GCSFuse otomatik olarak yüklenir)
  • mount_options: Ekleme seçenekleri (ör. Default,_netdev)
  • compute_node_service_account: İşlem örneklerinde kullanılacak hizmet hesabı
  • compute_node_scopes: İşlem örneklerinin erişim kapsamı
  • partitions: Slurm bölümü yapılandırması. Ek bölümler için tekrarlanabilir.
  • ad: Bölüm adı
  • machine_type: İşlem düğümlerinin örnek türü
  • static_node_count: Her zaman açık işlem düğümü sayısı
  • max_node_count: İzin verilen maksimum toplam işlem düğümü sayısı - maksimum 64.000
  • zone: Bu bölümün kaynaklarını içerecek Google Cloud alt bölgesi - Daha Fazla Bilgi
  • image: İşlem görüntü düğümü makine türü
  • image_hyperthreads: Örnekte hyperthreading'i etkinleştirin veya devre dışı bırakın
  • compute_disk_type: İşlem örneği önyükleme diski türü (pd-standard, pd-ssd)
  • compute_disk_size_gb: İşlem örneği önyükleme diskinin boyutu
  • compute_labels: Compute örneğine eklenecek etiketler
  • cpu_platform: Tüm işlem düğümleri için gereken minimum CPU platformu
  • gpu_count: Bölümdeki her bir örneğe eklenecek GPU sayısı
  • gpu_type: Bölümün örneklerine eklenecek GPU türü
  • network_storage: Bölümdeki tüm işlem düğümlerine eklenecek ağ depolama alanı. Alanlar doğrudan fstab'e eklenir. Ek montajlar için tekrarlanabilir.
  • server_ip: Depolama sunucusu IP'si
  • remote_mount: Depolama alanı ekleme adı (dosya sistemi adı)
  • local_mount: Yerel ekleme dizini
  • fs_type: Dosya sistemi türü (NFS, CIFS, Lustre, GCSFuse otomatik olarak yüklenir)
  • mount_options: Montaj seçeneği
  • preemptible_bursting: Örnekler öncelikli örnekler mi olacak?
  • vpc_subnet: Slurm bölümünü dağıtacağınız Sanal Özel Bulut alt ağı
  • hariç: Düğümlerin tamamını işlere ayırmak için Slurm'ü etkinleştirin
  • enable_placement: Örnekler arasında düşük ağ gecikmesi için örneklerin birbirine yakın konumlandırılacağı yerleşim politikalarını etkinleştirin.
  • regional_capacity: Bir örneğin kullanılabilirliğe göre bölgedeki herhangi bir alt bölgeye yerleştirilmesine izin verir
  • regional_policy: regional_capacity (bölgesel_kapasite) doğru değerine ayarlanırsa bu politika, hangi bölgenin kullanılacağını ve o bölgedeki kullanılmayacak alt bölgelerin belirlenmesini sağlar.
  • Instance_template: İşlem örnekleri için kullanılacak GCP örnek şablonu. Belirtilen işlem alanları şablon özelliklerini geçersiz kılar. Ör. resim belirtilirse örnek şablonundaki resmin üzerine yazılır.

Gelişmiş Yapılandırma

Dilerseniz küme dağıtım işleminin bir parçası olarak ek paketler ve yazılımlar yükleyebilirsiniz. Slurm kümenize yazılım yüklemek için "Compute Engine'de Slurm kümesine uygulama yükleme" başlıklı makalemizde açıklanan birkaç şekilde veya Slurm tarafından dağıtılan görüntüyü özelleştirerek yazılım yükleyebilirsiniz. Şu anda Slurm, SchedMD tarafından sağlanan ve Google Cloud HPC Sanal Makine Görüntüsü'nü temel alan bir sanal makine görüntüsünün üzerine Slurm dağıtmaktadır.

Kendi görüntünüzü kullanmak için tfvars dosyasında listelenen herkese açık SchedMD sanal makine görüntüsüne dayalı olarak kendi yapılandırmanıza sahip bir görüntü derleyin. Ardından, tfvars dosyasında belirtilen resim URI'sini kendi resminizle değiştirin ve değişikliği test edin.

Sorun giderme

Bu codelab boyunca lütfen Slurm-GCP deposunun ReadMe'nin Sorun Giderme bölümüne bakın.

Görülen en yaygın sorunlar, tfvars dosyasını yapılandırırken yapılan hatalar ve kota kısıtlamalarıdır. Bu codelab, yeni bir kullanıcının standart kota tahsisi ve yeni bir kullanıcının aldığı 300 ABD doları değerindeki ücretsiz kredi dahilinde çalışacak şekilde tasarlanmıştır. Sanal makine oluşturma denemesi başarısız olursa API hatalarını kontrol etmek için denetleyici düğümündeki /var/log/slurm/resume.log dosyasını kontrol edin.

4. Yapılandırmayı dağıtma ve doğrulama

Yapılandırmayı dağıtma

Cloud Shell oturumunda, slurm-gcp/tf/example klasöründen aşağıdaki komutu yürütün:

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

Ayarlanan yapılandırmalara bağlı olarak, açıklanan işlemleri kabul etmeniz istenir. "yes" değerini girin . "Terraform planı" çalıştırarak, dağıtılacak yapılandırmayı görüntüleyebilirsiniz.

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

İşlemin tamamlanması birkaç dakika sürebilir. Bu nedenle lütfen sabırlı olun.

Dağıtım tamamlandıktan sonra şuna benzer bir çıkış görürsünüz:

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

Outputs:

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

Sanal makine örneği oluşturmayı doğrulama

Gezinme menüsünü açıp Compute Engine'i seçin > Sanal Makine Örnekleri.

d5832bdd527794ed.png

Listede bir denetleyici ve giriş sanal makine örneği göreceksiniz:

7a1fc9603758d58d.png

Sanal makine örnekleri bölümünde, Terraform tarafından oluşturulan iki sanal makine örneğini inceleyin.

cluster_name alanını değiştirdiyseniz adlar farklı olur.

  • g1-denetleyici
  • g1-giriş0

5. Slurm Cluster'a giriş yapın

Slurm Kümesine erişme

Kod Düzenleyici/Cloud Shell sekmenize dönün. Örneğinize giriş yapmak için g1-login0 düğümünün alt bölgesini <ZONE> (us-central1-b olmalıdır) şeklinde değiştirerek aşağıdaki komutu çalıştırın:

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

Bu komut, g1-login0 sanal makinesinde oturum açmanızı sağlar.

Giriş düğümüne kolayca erişmenin diğer bir yolu da "SSH"yi tıklayıp g1-login0 sanal makinesinin yanındaki (Sanal Makine Örnekleri) düğmesini tıklayarak SSH bağlantısı olan yeni bir sekme açın.

8c373a87d13620f7.png

İlk kez Cloud Shell'i kullanıyorsanız, SSH anahtarı oluşturmanızı isteyen aşağıdaki gibi bir mesaj görebilirsiniz:

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)?

Öyleyse Y girin. Bir parola seçmeniz istenirse Enter tuşuna iki kez basarak parolayı boş bırakın.

Giriş yaptıktan sonra aşağıdaki mesajı görürseniz:

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

Bekleyin ve bu mesajı görene kadar laboratuvara devam etmeyin (yaklaşık 5 dakika):

*** Slurm login setup complete ***

Yukarıdaki mesajı gördükten sonra laboratuvara devam etmek için çıkış yapıp g1-login0 uygulamasına yeniden giriş yapmanız gerekir. Bunu yapmak için CTRL + C tuşlarına basarak görevi sonlandırın.

Ardından, örneğinizde "logout" komutunu çalıştırın:

exit

Şimdi giriş sanal makinenize yeniden bağlanın. Örneğinize giriş yapmak için <ZONE> yerine g1-login0 düğümünün alt bölgesini kullanarak aşağıdaki komutu çalıştırın:

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

Yukarıda olduğu gibi, bağlanmadan ve kurulumun tüm adımlarını tamamlamadan önce bir iki dakika beklemeniz gerekebilir.

Slurm CLI Araçları Turu

Kümenizin Slurm giriş düğümüne giriş yaptınız. Bu düğüm, kullanıcı/yönetici etkileşimi, Slurm işlerini planlama ve yönetim etkinlikleri için ayrılmış düğümdür.

Slurm komut satırını tanıtmak için birkaç komut çalıştıralım.

Kümemizin kaynaklarının durumunu görüntülemek için sinfo komutunu yürütün:

sinfo

Örnek sinfo çıkışı aşağıda gösterilmektedir. sinfo, kümedeki kullanılabilir düğümleri ve bu düğümlerin durumunu, ayrıca bölümlendirme, kullanılabilirlik ve bu düğümlere uygulanan zaman sınırlamaları gibi diğer bilgileri bildirir.

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

Hata ayıklama bölümünün "max_node_count" değeri ile belirtilen 10 düğümümüzü görebilirsiniz. /10 tanesi "boşta~" olarak işaretlenir (düğüm boşta ve ayrılmamış modda, hızlanmaya hazır).

Ardından, kümemizin sırasının durumunu görüntülemek için squeue komutunu yürütün:

squeue

Beklenen sıra çıkışı aşağıda gösterilmektedir. sıra, bir küme için sıranın durumunu bildirir. Bu bilgiler, kümede planlanan her bir işin iş kimliğini, işin atandığı bölümü, işin adını, işi başlatan kullanıcıyı, işin durumunu, işin çalıştırıldığı gerçek süreyi ve işin atandığı düğümleri içerir. Çalışmakta olan işimiz olmadığından bu komutun içeriği boş.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Slurm, "srun" komutu verir ve "sbatch" sıraya alınan işleri çalıştırmak için kullanılır. "kıvrılma" ve paralel işler çalıştırır ve mpirun için sarmalayıcı olarak kullanılabilir. "sbatch" hakaret etmek amacıyla bir toplu iş göndermek için kullanılır ve farklı yapılandırmalarda bir veya birçok kez srun olarak çağırabilir. "sbatch" toplu komut dosyaları alabilir veya işin tamamını komut satırından çalıştırmak için –sarma seçeneğiyle kullanılabilir.

Slurm'ün nasıl çalıştığını görmek ve sıramıza iş çıkarmak için bir iş yapalım.

6. Slurm İşi Çalıştırma ve Kümeyi Ölçeklendirme

Slurm İşi Çalıştırma ve Kümeyi Ölçeklendirme

Slurm kümemizi çalıştırdığımıza göre şimdi bir iş çalıştıralım ve kümemizi ölçeklendirelim.

"Çatal" komutu, Slurm toplu komutlarını ve komut dosyalarını çalıştırmak için kullanılır. "Ana makine adı"nı çalıştıracak basit bir taslak komut dosyası çalıştıralım. otomatik ölçeklendirilmiş sanal makinelerimizde

g1-login0'a giriş yapmış durumdayken aşağıdaki komutu çalıştırın:

sbatch -N2 --wrap="srun hostname"

Bu komut, Slurm toplu komutunu çalıştırır. Sbatch'in "-N" ile 2 düğüm çalıştıracağını belirtir seçeneğini belirleyin. Ayrıca, bu düğümlerin her birinin bir "srun ana makine adı" çalıştıracağını belirtir komutuna dahil etmek için seçeneğini belirleyin.

Varsayılan olarak sbatch, çıkışını "slurm-%j.out" değerine yazar. Komutun çalışma dizinindeki çalışmasında, komutun çalıştırıldığı kaynak, Slurm Dosya Adı Kalıplarına göre İş Kimliği %j'nin yerini alır. Örneğimizde, varsayılan olarak denetleyicide barındırılan NFS tabanlı bir paylaşılan dosya sistemi olan, kullanıcının /home klasöründen çalıştırılmaktadır. Böylece işlem düğümleri, istenirse giriş ve çıkış verilerini paylaşabilir. Üretim ortamında, küme işlemlerinde performansın etkilenmemesi için çalışan depolama alanı /home depolama alanından ayrı olmalıdır. Ayrı depolama alanı bağlantıları, "network_storage" öğesindeki tfvars dosyasında belirtilebilir. seçenekleri vardır.

Sbatch komut satırını kullanarak sbatch komut dosyasını yürüttükten sonra, planlanan iş için bir İş Kimliği döndürür. Örneğin:

Submitted batch job 2

İş yürütmeyi ve kaynakları izlemek ve yönetmek için sbatch komutu tarafından döndürülen İş Kimliğini kullanabiliriz. Slurm iş sırasını görüntülemek için aşağıdaki komutu çalıştırın:

squeue

Yürüttüğünüz işin aşağıdaki gibi listelendiğini görürsünüz:

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]

Sağlanmış işlem düğümümüz olmadığı için Slurm, iş gereksinimlerine göre otomatik olarak işlem örnekleri oluşturur. Bu işlemin otomatik olarak gerçekleşmesinin iki avantajı vardır. İlk olarak, HPC kümesini manuel olarak hazırlama, yazılımı yapılandırma, düğümü kümeye entegre etme ve işin dağıtılması gibi işlemler için gereken işleri ortadan kaldırır. İkinci olarak, boşta ve kullanılmayan düğümler, minimum sayıda düğüm çalışana kadar ölçeklendirildiğinden kullanıcıların paradan tasarruf etmesini sağlar.

sinfo komutunu çalıştırarak Slurm kümesini görüntüleyebilirsiniz:

sinfo

Bu, "alloc#" içinde bulunan sırada listelenen düğümleri gösterir. yani düğümlerin ayrıldığı anlamına gelir:

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]

Yeni sağlanan düğümleri görüntülemek için Google Cloud Console'daki sanal makine örnekleri bölümüne de göz atabilirsiniz. İş yeni ayrılan düğümlere atanmadan önce düğümleri başlatmak ve Slurm'ü çalıştırmak birkaç dakika sürer. Sanal makine örnekleri listeniz yakında aşağıdakine benzeyecek:

9997efff595f1e.png

Düğümler işi çalıştırdıktan sonra örnekler bir "alloc"a işlerin bir işe tahsis edildiği anlamına gelir:

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]

Bir iş tamamlandıktan sonra, artık sıra ve "alloc"da listelenmez sinfo'daki düğümler "boşta"ya geri döner durumu. "Squeue" komutunu çalıştır ve iş tamamlanana kadar, bir iki dakika sonra düzenli aralıklarla.

slurm-%j.out çıkış dosyası, NFS tarafından paylaşılan /home klasörünüze yazılmış olacaktır. Bu dosya ana makine adlarını içerir. Çıkış dosyasını açın veya açın (genellikle slurm-2.out). Çıkış dosyasının içeriği şunları içerir:

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

Tebrikler, bir iş yürüttünüz ve Slurm kümenizi büyüttünüz.

7. MPI İşi çalıştırma

Şimdi düğümlerimizde bir MPI işi çalıştıralım. g1-login0'a giriş yapmış durumdayken, C programlama dilinde yazılmış bir MPI programını indirmek için wget kullanın:

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

OpenMPI araçlarını kullanmak için şu komutu çalıştırarak OpenMPI modüllerini yüklemeniz gerekir:

module load openmpi

"mpicc"yi kullanacağız. aracını kullanın. Aşağıdaki komutu yürütün:

mpicc mpi_hello_world.c -o mpi_hello_world

Bu işlem, C kodumuzu makine kodunda derler. Böylece kodu Slurm aracılığıyla kümemizde çalıştırabiliriz.

Ardından, tercih ettiğiniz metin düzenleyicisini kullanarak "helloworld_batch" adlı özel bir komut dosyası oluşturun:

vi helloworld_batch

Vi ekleme moduna girmek için i yazın.

Basit bir sbatch komut dosyası oluşturmak için aşağıdaki metni dosyaya kopyalayıp yapıştırın:

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

srun mpi_hello_world

Escape tuşuna basıp ":wq" yazarak kod düzenleyiciyi kaydedin ve düzenleyiciden çıkın tırnak işareti kullanmayın.

Bu komut dosyası, Slurm toplu yürütme ortamını ve görevlerini tanımlar. Öncelikle, yürütme ortamı bash olarak tanımlanır. Ardından, komut dosyası önce Slurm seçeneklerini "#SBATCH" ile tanımlar. satırlarda ilerleyin. İş adı "hello_world" olarak tanımlanır.

Çıkış dosyası "hello_world_%j.out" olarak ayarlanmıştır. Burada %j, Slurm Dosya Adı Kalıplarına göre İş Kimliği'nin yerini alır. Bu çıkış dosyası, sbatch komut dosyasının çalıştırıldığı dizine yazılır. Örneğimizde bu, kullanıcının NFS tabanlı bir paylaşılan dosya sistemi olan /home klasörüdür. Böylece işlem düğümleri, istenirse giriş ve çıkış verilerini paylaşabilir. Üretim ortamında, küme işlemlerinde performansın etkilenmemesi için çalışan depolama alanı /home depolama alanından ayrı olmalıdır.

Son olarak, bu komut dosyasının üzerinde çalışması gereken düğüm sayısı 2 olarak tanımlanır.

Seçenekler tanımlandıktan sonra yürütülebilir komutlar sağlanır. Bu komut dosyası, mpirun komutunun yerine kullanılan srun komutunu kullanarak mpi_hello_world kodunu paralel olarak çalıştırır.

Ardından sbatch komut satırını kullanarak sbatch komut dosyasını yürütün:

sbatch helloworld_batch

Yığın çalıştırılması, planlanan iş için bir İş Kimliği döndürür. Örneğin:

Submitted batch job 3

Bu işlem, Hostname komutunu düğüm başına bir görev olacak şekilde 2 düğümde çalıştırır ve çıktıyı hello_world-3.out dosyasına yazdırır.

Temel hazırlığı önceden yapılmış 2 düğümümüz olduğu için bu iş hızlı bir şekilde çalışacaktır.

İş tamamlanıp artık listelenmeyene kadar sırayı izleyin:

squeue

hello_world-3.out dosyasını açın veya kapatın. Ardından dosyanın g1-compute-0-[0-1] üzerinde çalıştığını doğrulayın:

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

5 dakika boşta kaldıktan sonra (YAML'nin askıya alma zamanı alanı veya slurm.conf'un PendingTime alanıyla yapılandırılabilir) dinamik olarak sağlanan işlem düğümlerinin, kaynakları serbest bırakması için ayrılan bölümü ayrılır. Bunu, düzenli olarak sinfo çalıştırarak ve küme boyutunun 0'a düştüğünü gözlemleyerek doğrulayabilirsiniz:

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

Kümeyi dağıttığınız bölgede izin verilen Kotanızı aşmayacak şekilde daha fazla örnek hızlandırmayı ve farklı MPI uygulamaları çalıştırmayı deneyin.

8. Sonuç

Tebrikler. Google Cloud Platform'da bir Slurm kümesi oluşturdunuz ve iş yükü talebini karşılamak için kümenizi otomatik ölçeklendirmek amacıyla bu kümenin en yeni özelliklerini kullandınız. Bu modeli kullanarak çeşitli işleri çalıştırabilirsiniz. Model, yalnızca Slurm'daki düğümleri isteyerek yüzlerce örneğe ölçeklenir.

GCP'de Slurm'u kullanmayı öğrenmeye devam etmek istiyorsanız " Slurm ile Birleşik HPC Kümeleri Oluşturma" codelab'e göz atın. Bu codelab'de, şirket içinde veya bulutta çok kümeli federasyonları nasıl oluşturabileceğinizi göstermek için bulutta iki birleşik Slurm kümesi oluşturma konusunda size yol göstereceğiz.

Slurm'ün yeni GCP'ye özgü işlevini kullanarak etkileyici bir şey mi geliştiriyorsunuz? Sorularınız mı var? Özellik öneriniz mi var? Google Cloud'un Yüksek Performanslı Bilişim Çözümleri web sitesi üzerinden Google Cloud ekibine hemen ulaşın veya Google Cloud & Tartışma grubunu eleyin.

Terraform dağıtımını temizleme

Slurm düğümünden çıkış yapın:

exit

Dağıtımı silmeden önce otomatik ölçeklendirilmiş düğümlerin ölçeğini küçültün. Bu düğümleri manuel olarak silmek için "gcloud compute instances delete <Instance Name>" komutunu çalıştırın. ya da Console GUI'yi kullanarak birden çok düğüm seçip "Sil"i tıklayarak oluşturabilirsiniz.

Tamamlandıktan sonra g1-login0'dan çıkış yaptıktan sonra Google Cloud Shell'inizden aşağıdaki komutu çalıştırarak Terraform dağıtımını kolayca temizleyebilirsiniz:

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

Sorulduğunda devam etmek için yes yazın. Bu işlem birkaç dakika sürebilir. Lütfen sabırlı olun.

Projeyi silme

Temizlemek için projemizi silmemiz yeterlidir.

  • Gezinme menüsünden IAM & Yönetici Konsolu
  • Ardından alt menüde Ayarlar'ı tıklayın.
  • Üzerinde "Projeyi Sil" yazan çöp kutusu simgesini tıklayın
  • Talimatların talimatlarını uygulayın

İşlediğimiz konular

  • Terraform kullanarak GCP'de Slurm dağıtma
  • GCP'de Slurm kullanarak iş yürütme.
  • Slurm'da küme bilgilerini sorgulama ve çalışan işleri izleme.
  • Belirli iş parametrelerini ve gereksinimlerini karşılamak için GCP'de Slurm ile düğümleri otomatik ölçeklendirme.
  • GCP'deki Slurm'de MPI uygulamalarını derleyip çalıştırmayı öğrenin.

Slurm Desteğini Bulun

Bu entegrasyonları test veya üretim ortamlarında kullanma konusunda desteğe ihtiyacınız varsa lütfen şu adresteki iletişim sayfasını kullanarak doğrudan SchedMD ile iletişime geçin: https://www.schedmd.com/contact.php

Mevcut Sorun giderme kılavuzlarını da kullanabilirsiniz:

Son olarak, sorunuzu Google Cloud ve Slurm Tartışma Grubu şurada bulunabilir: https://groups.google.com/g/google-cloud-slurm-discuss

Daha Fazla Bilgi

Geri bildirim

Lütfen bu bağlantıyı kullanarak codelab ile ilgili geri bildirim gönderin. Geri bildirimin tamamlanması 5 dakikadan kısa sürer. Teşekkürler!