یک خوشه HPC مقیاس پذیر خودکار با Slurm راه اندازی کنید

1. بررسی اجمالی

به Google Codelab برای اجرای یک خوشه Slurm در Google Cloud Platform خوش آمدید! در پایان این نرم افزار کد، باید درک کاملی از سهولت تهیه و راه اندازی یک خوشه Slurm مقیاس پذیر خودکار داشته باشید.

c16fa310c142ac6f.png

Google Cloud با SchedMD همکاری کرد تا مجموعه‌ای از ابزارها را منتشر کند که راه‌اندازی مدیریت بار کاری Slurm را در Compute Engine آسان‌تر می‌کند و در صورت نیاز به منابع اضافی، خوشه موجود شما را به صورت پویا گسترش می‌دهد. این ادغام توسط کارشناسان SchedMD مطابق با بهترین شیوه های Slurm ساخته شده است.

اگر قصد استفاده از Slurm در پلتفرم Google Cloud را دارید، یا اگر سؤالی دارید، لطفاً به گروه بحث انجمن Google Cloud & Slurm ما بپیوندید!

درباره Slurm

a739730a41acff0a.png

نمودار معماری پایه یک خوشه Slurm مستقل در Google Cloud Platform.

Slurm یکی از مدیران بار کاری پیشرو برای خوشه های HPC در سراسر جهان است. Slurm یک سیستم مدیریت حجم کار و زمانبندی کار منبع باز، قابل تحمل خطا و بسیار مقیاس پذیر برای خوشه های لینوکس کوچک و بزرگ ارائه می دهد. Slurm برای عملکرد خود نیازی به تغییرات هسته ندارد و نسبتاً مستقل است. Slurm به عنوان یک مدیر بار کاری کلاستر سه عملکرد کلیدی دارد:

  1. دسترسی انحصاری یا غیر انحصاری به منابع (گره های محاسباتی) را برای مدتی به کاربران اختصاص می دهد تا بتوانند کار را انجام دهند.
  2. چارچوبی برای شروع، اجرا و نظارت بر کار (معمولاً یک کار موازی) روی مجموعه گره‌های اختصاص داده شده ارائه می‌کند.
  3. آن را با مدیریت یک صف از کار معلق داوری می کند.

چیزی که یاد خواهید گرفت

  • نحوه راه اندازی یک خوشه Slurm با استفاده از Terraform
  • نحوه اجرای یک کار با استفاده از SLURM
  • نحوه پرس و جو کردن اطلاعات خوشه و نظارت بر کارهای در حال اجرا در SLURM
  • چگونگی مقیاس خودکار گره ها برای تطبیق با پارامترها و الزامات شغلی خاص
  • از کجا برای Slurm کمک پیدا کنیم

پیش نیازها

  • حساب Google Cloud Platform و یک پروژه با صورت‌حساب
  • تجربه پایه لینوکس

2. راه اندازی

تنظیم محیط خود به خود

یک پروژه ایجاد کنید

اگر قبلاً یک حساب Google (Gmail یا G Suite) ندارید، باید یک حساب ایجاد کنید . به کنسول Google Cloud Platform ( consol.cloud.google.com ) وارد شوید و صفحه مدیریت منابع را باز کنید:

359c06e07e6d699f.png

روی ایجاد پروژه کلیک کنید.

25c23d651abb837b.png

نام پروژه را وارد کنید شناسه پروژه (که در تصویر بالا با رنگ قرمز مشخص شده است) را به خاطر بسپارید . شناسه پروژه باید یک نام منحصر به فرد در تمام پروژه های Google Cloud باشد. اگر نام پروژه شما منحصر به فرد نباشد، Google Cloud یک شناسه پروژه تصادفی بر اساس نام پروژه ایجاد می کند.

در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورتحساب را در Developers Console فعال کنید .

اجرای این کد نباید بیش از چند دلار برای شما هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید ممکن است بیشتر باشد (به بخش "نتیجه گیری" در انتهای این سند مراجعه کنید). ماشین حساب قیمت Google Cloud Platform در اینجا موجود است.

کاربران جدید Google Cloud Platform واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.

Google Cloud Shell

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهیم کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

Google Cloud Shell را راه اندازی کنید

از کنسول GCP روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

dbad104cef962719.png

سپس روی Start Cloud Shell کلیک کنید:

4e50db320508ac88.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد:

20b0aa80492144d.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این دایرکتوری اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد شبکه را تا حد زیادی بهبود می بخشد و احراز هویت را ساده می کند. بسیاری از کارهای شما، اگر نه همه، در این آزمایشگاه را می توان به سادگی با یک مرورگر وب یا Google Chromebook انجام داد.

پس از اتصال به پوسته ابری، باید ببینید که قبلاً احراز هویت شده اید و پروژه قبلاً روی PROJECT_ID شما تنظیم شده است:

$ gcloud auth list

خروجی فرمان:

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

خروجی فرمان:

[core]
project = <PROJECT_ID>

اگر ID پروژه به درستی تنظیم نشده باشد، می توانید آن را با این دستور تنظیم کنید:

$ gcloud config set project <PROJECT_ID>

خروجی فرمان:

Updated property [core/project].

3. پیکربندی Slurm Terraform را آماده و مرور کنید

پیکربندی Slurm Terraform را دانلود کنید

در جلسه Cloud Shell، دستور زیر را برای شبیه سازی (دانلود) مخزن Git که حاوی فایل های Slurm for Google Cloud Platform Terraform است، اجرا کنید:

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

با اجرای دستور زیر به دایرکتوری پیکربندی استقرار Slurm سوئیچ کنید:

cd slurm-gcp

Slurm Terraform tfvars را پیکربندی کنید

فایل basic.tfvars.example جزئیات پیکربندی استقرار، از جمله شبکه، نمونه‌ها و فضای ذخیره‌سازی برای استقرار را نشان می‌دهد. آن را در یک فایل جدید کپی کنید که آن را "فایل tfvars" می نامیم، سپس در صورت نیاز ویرایش کنید.

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

در جلسه Cloud Shell، فایل tfvars basic.tfvars را باز کنید . می توانید از ویرایشگر خط فرمان دلخواه خود (vi، nano، emacs و غیره) استفاده کنید یا از ویرایشگر کد کنسول Cloud برای مشاهده محتویات فایل استفاده کنید:

214f43bba6c917aa.png

محتویات فایل 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"
]

در این فایل tfvars چندین فیلد برای پیکربندی وجود دارد. تنها فیلدی که باید پیکربندی شود پروژه است. همه پیکربندی های دیگر در مثال را می توان همانطور که هست مورد استفاده قرار داد، اما آنها را در صورت نیاز برای موقعیت خود تغییر دهید. برای توضیح دقیق تر گزینه های پیکربندی، اینجا را ببینید.

  • cluster_name: نام خوشه Slurm
  • پروژه: شناسه پروژه Google Cloud برای محل استقرار منابع
  • zone: منطقه Google Cloud که شامل کنترلر و نمونه های ورود به سیستم این خوشه است - اطلاعات بیشتر
  • network_name: شبکه ابر خصوصی مجازی برای استقرار خوشه Slurm در آن
  • subnetwork_name: زیرشبکه مجازی خصوصی Cloud برای استقرار خوشه Slurm در
  • shared_vpc_host_project: شبکه VPC اشتراکی برای استقرار خوشه Slurm در
  • disable_controller_public_ips: آیا IP خارجی به کنترلر Slurm اختصاص داده می شود؟
  • disable_login_public_ips: آیا IP خارجی به گره ورود Slurm اختصاص داده می شود؟
  • disable_compute_login_ips: IP خارجی را به گره ورود Slurm اختصاص دهیم؟
  • suspend_time: زمان انتظار بعد از بیکار بودن یک گره قبل از تعلیق گره است
  • controller_machine_type: نوع نمونه گره کنترلر
  • controller_image: تصویر GCP برای ایجاد نمونه کنترلر Slurm استفاده می شود
  • controller_disk_type: نوع دیسک بوت نمونه کنترلر
  • controller_disk_size_gb: اندازه دیسک بوت نمونه کنترلر
  • controller_labels: برچسب(هایی) برای چسباندن به نمونه کنترلر
  • controller_service_account: حساب سرویس برای استفاده در نمونه کنترلر
  • controller_scopes: محدوده دسترسی به نمونه کنترلر
  • cloudsql: سرور Google CloudSQL برای استفاده به عنوان پایگاه داده Slurm به جای میزبانی پایگاه داده در نمونه کنترلر
  • server_ip: IP سرور CloudSQL
  • کاربر: نام کاربری CloudSQL
  • رمز عبور: رمز عبور CloudSQL
  • db_name: نام پایگاه داده CloudSQL
  • controller_secondary_disk: یک دیسک ثانویه برای ذخیره سازی سرور NFS اضافه شود؟
  • controller_secondary_disk_type: نوع دیسک ثانویه کنترلر
  • controller_secondary_disk_size_gb: اندازه دیسک ثانویه کنترلر
  • controller_instance_template: الگوی نمونه GCP برای استفاده برای نمونه کنترلر. هر فیلد محاسباتی مشخص شده، ویژگی‌های الگو را لغو می‌کند. به عنوان مثال اگر controller_image مشخص شده باشد، تصویر را در قالب نمونه بازنویسی می کند.
  • login_machine_type: نوع نمونه گره ورود (قابل دسترسی SSH).
  • login_image: تصویر GCP برای ایجاد نمونه ورود Slurm استفاده می شود
  • login_disk_type: نوع دیسک بوت نمونه ورود
  • login_disk_size_gb: اندازه دیسک بوت نمونه ورود
  • login_labels: برچسب(هایی) برای پیوست کردن به نمونه ورود
  • login_node_count: تعداد گره های ورود برای ایجاد
  • login_node_service_account: حساب سرویس برای استفاده در نمونه(های) ورود به سیستم
  • login_node_scopes: محدوده دسترسی به نمونه ورود
  • login_instance_template: الگوی نمونه GCP برای استفاده برای نمونه ورود. هر فیلد محاسباتی مشخص شده، ویژگی‌های الگو را لغو می‌کند. به عنوان مثال اگر login_image مشخص شده باشد، تصویر را در قالب نمونه بازنویسی می کند.
  • network_storage: ذخیره سازی شبکه برای نصب بر روی همه گره ها. فیلدها مستقیماً به fstab اضافه خواهند شد. می توان برای نصب های اضافی تکرار کرد.
  • server_ip: IP سرور ذخیره سازی
  • remote_mount: نام پایه ذخیره‌سازی (نام فایل سیستم)
  • local_mount: دایرکتوری mount محلی
  • fs_type: نوع فایل سیستم (NFS، CIFS، Lustre، GCSFuse به طور خودکار نصب می شود)
  • mount_options: گزینه های Mount (به عنوان مثال پیش فرض،_netdev)
  • login_network_storage: ذخیره سازی شبکه برای نصب بر روی گره های ورود و کنترل. NFS، CIFS، Lustre و GCSFuse به صورت خودکار نصب خواهند شد. می توان برای نصب های اضافی تکرار کرد.
  • server_ip: IP سرور ذخیره سازی
  • remote_mount: نام پایه ذخیره‌سازی (نام فایل سیستم)
  • local_mount: دایرکتوری mount محلی
  • fs_type: نوع فایل سیستم (NFS، CIFS، Lustre، GCSFuse به طور خودکار نصب می شود)
  • mount_options: گزینه های Mount (به عنوان مثال پیش فرض،_netdev)
  • compute_node_service_account: حساب سرویس برای استفاده در نمونه(های) محاسباتی
  • compute_node_scopes: به محدوده دسترسی به نمونه های محاسباتی
  • پارتیشن ها: پیکربندی پارتیشن Slurm. می توان برای پارتیشن های اضافی تکرار کرد.
  • نام: نام پارتیشن
  • machine_type: نوع نمونه گره(های) را محاسبه کنید
  • static_node_count: تعداد گره های محاسباتی همیشه روشن
  • max_node_count: حداکثر تعداد کل گره های محاسباتی مجاز - حداکثر 64K
  • zone: منطقه Google Cloud که حاوی منابع این پارتیشن خواهد بود - اطلاعات بیشتر
  • تصویر: نوع ماشین گره تصویر را محاسبه کنید
  • image_hyperthreads: Hyperthreading را روی نمونه روشن یا خاموش کنید
  • compute_disk_type : نوع دیسک بوت نمونه محاسباتی (pd-standard، pd-ssd)
  • compute_disk_size_gb: اندازه یک دیسک بوت نمونه محاسباتی
  • compute_labels: برچسب(هایی) برای پیوست کردن به نمونه محاسبه
  • cpu_platform: حداقل پلت فرم CPU مورد نیاز برای همه گره های محاسباتی
  • gpu_count: تعداد GPUهایی که باید به هر نمونه در پارتیشن متصل شوند
  • gpu_type: نوع GPU برای اتصال به نمونه های پارتیشن
  • network_storage: ذخیره سازی شبکه برای نصب بر روی تمام گره های محاسباتی در پارتیشن. فیلدها مستقیماً به fstab اضافه خواهند شد. می توان برای نصب های اضافی تکرار کرد.
  • server_ip: IP سرور ذخیره سازی
  • remote_mount: نام پایه ذخیره‌سازی (نام فایل سیستم)
  • local_mount: دایرکتوری mount محلی
  • fs_type: نوع فایل سیستم (NFS، CIFS، Lustre، GCSFuse به طور خودکار نصب می شود)
  • mount_options: گزینه mount
  • preemptible_bursting: آیا نمونه‌ها نمونه‌های preemptible خواهند بود؟
  • vpc_subnet: زیرشبکه مجازی خصوصی Cloud برای استقرار پارتیشن Slurm در
  • انحصاری: Slurm را برای تخصیص کل گره ها به کارها فعال کنید
  • enable_placement: خط‌مشی‌های قرارگیری را فعال کنید که در آن نمونه‌ها در نزدیکی یکدیگر قرار می‌گیرند تا تأخیر کم شبکه بین نمونه‌ها.
  • regional_capacity: بر اساس در دسترس بودن به یک نمونه اجازه می دهد در هر منطقه در منطقه قرار گیرد
  • regional_policy: اگر regional_capacity درست باشد، این خط مشی برای تعیین منطقه ای است که باید استفاده کرد و مناطقی در آن منطقه نباید استفاده کرد.
  • Instance_template: الگوی نمونه GCP برای استفاده برای نمونه های محاسباتی. هر فیلد محاسباتی مشخص شده، ویژگی‌های الگو را لغو می‌کند. به عنوان مثال اگر تصویر مشخص شده باشد، تصویر را در الگوی نمونه بازنویسی می کند.

پیکربندی پیشرفته

در صورت تمایل می توانید بسته ها و نرم افزارهای اضافی را به عنوان بخشی از فرآیند استقرار خوشه نصب کنید. می‌توانید به روش‌های مختلفی که در «نصب برنامه‌ها در یک خوشه Slurm در موتور محاسباتی» آمده است ، یا با سفارشی‌سازی تصویر مستقر شده توسط Slurm، نرم‌افزاری را روی خوشه اسلرم خود نصب کنید. در حال حاضر Slurm یک تصویر VM ارائه شده توسط SchedMD که بر اساس تصویر Google Cloud HPC VM است، با Slurm در بالای آن نصب شده است.

برای استفاده از تصویر خود، بر اساس تصویر عمومی SchedMD VM موجود در فایل tfvars، یک تصویر با پیکربندی خود بسازید. سپس URI تصویر مشخص شده در فایل tfvars را با تصویر خود جایگزین کنید و تغییر را آزمایش کنید.

عیب یابی

در سراسر این کد، لطفاً به بخش عیب‌یابی ReadMe مخزن Slurm-GCP مراجعه کنید.

رایج ترین مشکلاتی که مشاهده می شود، اشتباهات انجام شده در پیکربندی فایل tfvars و محدودیت های سهمیه است. این کد لبه برای اجرای سهمیه استاندارد یک کاربر جدید و اعتبار رایگان 300 دلاری که کاربر جدید دریافت می کند طراحی شده است. اگر تلاش برای ایجاد VM با شکست مواجه شد، فایل /var/log/slurm/resume.log را در گره کنترلر بررسی کنید تا خطاهای API را بررسی کنید.

4. استقرار و تأیید پیکربندی

پیکربندی را اجرا کنید

در جلسه Cloud Shell، دستور زیر را از پوشه slurm-gcp/tf/example اجرا کنید :

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

از شما خواسته می شود که اقدامات شرح داده شده را بر اساس تنظیمات تنظیم شده بپذیرید. برای شروع استقرار " yes " را وارد کنید. همچنین می‌توانید با اجرای «طرح terraform» پیکربندی را مشاهده کنید.

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

عمل ممکن است چند دقیقه طول بکشد، بنابراین لطفا صبور باشید .

پس از تکمیل استقرار، خروجی مشابه زیر را خواهید دید:

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

Outputs:

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

ایجاد نمونه VM را تأیید کنید

منوی پیمایش را باز کنید و Compute Engine > VM Instances را انتخاب کنید.

d5832bdd527794ed.png

شما باید یک کنترلر و یک نمونه VM ورود به سیستم را مشاهده کنید:

7a1fc9603758d58d.png

تحت نمونه های VM، دو نمونه ماشین مجازی که توسط Terraform ایجاد شده اند را بررسی کنید.

اگر قسمت cluster_name را تغییر دهید، نام‌ها متفاوت خواهند بود.

  • کنترلر g1
  • g1-login0

5. وارد Slurm Cluster شوید

به خوشه Slurm دسترسی پیدا کنید

به برگه ویرایشگر کد/Cloud Shell خود بازگردید. دستور زیر را برای ورود به نمونه خود اجرا کنید و <ZONE> را جایگزین ناحیه گره g1-login0 کنید (باید us-central1-b باشد):

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

این دستور شما را وارد ماشین مجازی g1-login0 می کند.

روش دیگر برای دسترسی آسان به گره ورود، با کلیک بر روی دکمه "SSH" در کنار g1-login0 VM در صفحه موارد VM برای باز کردن یک تب جدید با اتصال SSH است.

8c373a87d13620f7.png

اگر این اولین باری است که از پوسته ابری استفاده می کنید، ممکن است پیامی مانند تصویر زیر مشاهده کنید که از شما می خواهد یک کلید 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)?

اگر چنین است، Y را وارد کنید. در صورت درخواست برای انتخاب یک عبارت عبور، آن را با دو بار فشار دادن Enter خالی بگذارید.

اگر هنگام ورود پیام زیر ظاهر شود:

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

صبر کنید و تا زمانی که این پیام را مشاهده نکردید (تقریباً 5 دقیقه) به آزمایشگاه ادامه ندهید :

*** Slurm login setup complete ***

پس از مشاهده پیام بالا، باید از سیستم خارج شوید و دوباره وارد g1-login0 شوید تا به آزمایشگاه ادامه دهید. برای انجام این کار، CTRL + C را فشار دهید تا کار پایان یابد.

سپس دستور زیر را از خروجی نمونه خود اجرا کنید:

exit

اکنون دوباره به VM لاگین خود متصل شوید. دستور زیر را برای ورود به نمونه خود اجرا کنید و <ZONE> به جای ناحیه گره g1-login0 جایگزین کنید:

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

مانند بالا، ممکن است لازم باشد یک یا دو دقیقه صبر کنید تا بتوانید متصل شوید و تمام جنبه های تنظیم کامل شود.

گشت و گذار در ابزارهای Slurm CLI

اکنون به گره ورود Slurm خوشه خود وارد شده اید. این گره ای است که به تعامل کاربر/مدیر، زمان بندی مشاغل Slurm و فعالیت های اداری اختصاص داده شده است.

بیایید چند دستور را اجرا کنیم تا شما را با خط فرمان Slurm آشنا کنیم.

برای مشاهده وضعیت منابع خوشه ما دستور sinfo را اجرا کنید:

sinfo

نمونه خروجی sinfo در زیر ظاهر می شود. sinfo گره های موجود در خوشه، وضعیت آن گره ها و سایر اطلاعات مانند پارتیشن، در دسترس بودن و هرگونه محدودیت زمانی اعمال شده بر آن گره ها را گزارش می دهد.

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

می‌توانید ببینید که 10 گره ما که توسط «max_node_count» 10 پارتیشن اشکال زدایی دیکته شده‌اند، به‌عنوان «idle~» علامت‌گذاری شده‌اند (گره در حالت غیرفعال و غیر تخصیص‌یافته، آماده چرخش است).

سپس دستور squeue را برای مشاهده وضعیت صف خوشه خود اجرا کنید:

squeue

خروجی مورد انتظار از squeue در زیر ظاهر می شود. squeue وضعیت صف را برای یک خوشه گزارش می کند. این شامل شناسه شغلی هر کار برنامه ریزی شده در خوشه، پارتیشنی که کار به آن اختصاص داده شده است، نام کار، کاربری که کار را راه اندازی کرده است، وضعیت کار، ساعت دیواری زمان اجرای کار است. ، و گره هایی که کار به آنها اختصاص داده شده است. ما هیچ کار در حال اجرا نداریم، بنابراین محتوای این دستور خالی است.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

دستورات Slurm "srun" و "sbatch" برای اجرای کارهایی که در صف قرار می گیرند استفاده می شود. "srun" کارهای موازی را اجرا می کند و می تواند به عنوان یک لفاف برای mpirun استفاده شود. "sbatch" برای ارسال یک کار دسته‌ای به slurm استفاده می‌شود و می‌تواند یک یا چند بار srun را در پیکربندی‌های مختلف فراخوانی کند. «sbatch» می‌تواند اسکریپت‌های دسته‌ای را بگیرد یا می‌تواند با گزینه –wrap برای اجرای کل کار از خط فرمان استفاده شود.

بیایید یک کار را اجرا کنیم تا بتوانیم Slurm را در عمل ببینیم و در صف خود کار پیدا کنیم!

6. یک Slurm Job را اجرا کنید و خوشه را مقیاس کنید

یک Slurm Job را اجرا کنید و خوشه را مقیاس کنید

اکنون که خوشه Slurm خود را در حال اجرا داریم، بیایید یک کار را اجرا کنیم و خوشه خود را افزایش دهیم.

دستور "sbatch" برای اجرای دستورات و اسکریپت های دسته ای Slurm استفاده می شود. بیایید یک اسکریپت ساده را اجرا کنیم که «نام میزبان» را روی ماشین‌های مجازی با مقیاس خودکار اجرا می‌کند.

هنگام ورود به g1-login0، دستور زیر را اجرا کنید:

sbatch -N2 --wrap="srun hostname"

این دستور دستور دسته ای Slurm را اجرا می کند. مشخص می کند که sbatch 2 گره را با گزینه "-N" اجرا می کند. همچنین مشخص می‌کند که هر یک از آن گره‌ها یک فرمان «srun hostname» را در گزینه «–wrap» اجرا خواهند کرد.

به‌طور پیش‌فرض، sbatch خروجی خود را روی «slurm-%j.out» در دایرکتوری کاری که دستور از آن اجرا می‌شود، می‌نویسد، جایی که %j با توجه به الگوهای نام فایل Slurm جایگزین شناسه شغلی می‌شود. در مثال ما sbatch از پوشه /home کاربر اجرا می شود که یک سیستم فایل مشترک مبتنی بر NFS است که به طور پیش فرض روی کنترلر میزبانی می شود. این به گره های محاسباتی اجازه می دهد تا در صورت تمایل، داده های ورودی و خروجی را به اشتراک بگذارند. در یک محیط تولید، ذخیره‌سازی کار باید از ذخیره‌گاه /home جدا باشد تا از تأثیرات عملکرد بر عملیات خوشه جلوگیری شود. مانت های ذخیره سازی جداگانه را می توان در فایل tfvars در گزینه های "network_storage" مشخص کرد.

پس از اجرای اسکریپت sbatch با استفاده از خط فرمان sbatch، یک Job ID برای کار برنامه ریزی شده برمی گرداند، به عنوان مثال:

Submitted batch job 2

ما می توانیم از Job ID که توسط دستور sbatch برگردانده شده است برای ردیابی و مدیریت اجرای کار و منابع استفاده کنیم. برای مشاهده صف شغل Slurm دستور زیر را اجرا کنید :

squeue

احتمالاً کاری را که اجرا کرده اید در لیست زیر مشاهده خواهید کرد:

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]

از آنجایی که ما هیچ گره محاسباتی ارائه نکرده ایم، Slurm به طور خودکار نمونه های محاسباتی را مطابق با الزامات شغلی ایجاد می کند. ماهیت خودکار این فرآیند دو مزیت دارد. ابتدا، کارهایی را که معمولاً در یک خوشه HPC از ارائه دستی گره‌ها، پیکربندی نرم‌افزار، ادغام گره در خوشه، و سپس استقرار کار مورد نیاز است، حذف می‌کند. دوم، به کاربران اجازه می دهد در هزینه خود صرفه جویی کنند زیرا گره های بیکار و استفاده نشده تا زمانی که حداقل تعداد گره ها اجرا شود، کاهش می یابد.

برای مشاهده چرخش خوشه Slurm می توانید دستور sinfo را اجرا کنید:

sinfo

این گره های لیست شده در صف را در وضعیت "alloc#" نشان می دهد، به این معنی که گره ها در حال تخصیص هستند:

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]

همچنین می توانید برای مشاهده گره های جدید ارائه شده، بخش نمونه های VM را در Google Cloud Console بررسی کنید. چند دقیقه طول می کشد تا گره ها بچرخند و Slurm اجرا شود قبل از اینکه کار به گره های تازه تخصیص داده شده تخصیص داده شود. لیست نمونه های VM شما به زودی شبیه موارد زیر می شود:

9997efff595f1e.png

هنگامی که گره‌ها کار را اجرا می‌کنند، نمونه‌ها به حالت «تخصیص» می‌روند، به این معنی که کارها به یک کار تخصیص داده می‌شوند:

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]

هنگامی که یک کار کامل شد، دیگر در صف فهرست نمی شود و گره های "alloc" در sinfo به حالت "بیکار" باز می گردند. اجرای "squeue" به صورت دوره ای تا زمانی که کار کامل شود، پس از یک یا دو دقیقه.

فایل خروجی slurm-%j.out در پوشه /home اشتراک‌گذاری شده با NFS شما نوشته می‌شود و حاوی نام‌های میزبان خواهد بود. فایل خروجی (معمولاً slurm-2.out) را باز یا cat کنید، محتویات فایل خروجی شامل موارد زیر خواهد بود:

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

کار عالی است، شما یک کار را اجرا کرده اید و خوشه Slurm خود را افزایش داده اید!

7. یک کار MPI را اجرا کنید

حالا بیایید یک کار MPI را در گره های خود اجرا کنیم. هنگامی که وارد g1-login0 هستید، از wget برای دانلود یک برنامه MPI نوشته شده به زبان برنامه نویسی C استفاده کنید:

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

برای استفاده از ابزارهای OpenMPI باید ماژول های OpenMPI را با اجرای این دستور بارگذاری کنید:

module load openmpi

ما از ابزار "mpicc" برای کامپایل کد MPI C استفاده خواهیم کرد. دستور زیر را اجرا کنید:

mpicc mpi_hello_world.c -o mpi_hello_world

این کد C ما را به کد ماشین کامپایل می کند تا بتوانیم کد را از طریق Slurm در سراسر خوشه خود اجرا کنیم.

در مرحله بعد، از ویرایشگر متن دلخواه خود برای ایجاد یک اسکریپت sbatch به نام " helloworld_batch " استفاده کنید:

vi helloworld_batch

i را تایپ کنید تا وارد حالت vi insert شوید.

متن زیر را کپی و در فایل پیست کنید تا یک اسکریپت sbatch ساده ایجاد کنید:

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

srun mpi_hello_world

با فشار دادن escape و تایپ کردن ":wq" بدون نقل قول، ویرایشگر کد را ذخیره کرده و از آن خارج شوید.

این اسکریپت محیط و وظایف اجرای دسته ای Slurm را تعریف می کند. ابتدا محیط اجرا به صورت bash تعریف می شود. در مرحله بعد، اسکریپت ابتدا گزینه های Slurm را با خطوط "#SBATCH" تعریف می کند. نام شغل به عنوان "hello_world" تعریف شده است.

فایل خروجی به‌عنوان «hello_world_%j.out» تنظیم می‌شود که در آن %j با توجه به الگوهای نام فایل Slurm جایگزین شناسه شغلی می‌شود. این فایل خروجی در دایرکتوری که اسکریپت sbatch از آن اجرا می شود، نوشته می شود. در مثال ما این پوشه /home کاربر است که یک سیستم فایل مشترک مبتنی بر NFS است. این به گره های محاسباتی اجازه می دهد تا در صورت تمایل، داده های ورودی و خروجی را به اشتراک بگذارند. در یک محیط تولید، ذخیره‌سازی کار باید از ذخیره‌گاه /home جدا باشد تا از تأثیرات عملکرد بر عملیات خوشه جلوگیری شود.

در نهایت، تعداد گره‌هایی که این اسکریپت باید روی آن‌ها اجرا شود، 2 تعریف می‌شود.

پس از تعریف گزینه ها دستورات اجرایی ارائه می شود. این اسکریپت کد mpi_hello_world را به صورت موازی با استفاده از دستور srun اجرا می کند که جایگزینی برای دستور mpirun است.

سپس اسکریپت sbatch را با استفاده از خط فرمان sbatch اجرا کنید:

sbatch helloworld_batch

sbatch در حال اجرا یک شناسه شغلی را برای کار برنامه ریزی شده برمی گرداند، به عنوان مثال:

Submitted batch job 3

این دستور نام میزبان را در 2 گره، با یک کار در هر گره اجرا می کند، و همچنین خروجی را در فایل hello_world-3.out چاپ می کند.

از آنجایی که ما قبلاً 2 گره داشتیم، این کار به سرعت اجرا می شود.

تا زمانی که کار تکمیل شود و دیگر فهرست نشده باشد، روی صف نظارت کنید:

squeue

پس از تکمیل، فایل hello_world-3.out را باز کنید یا آن را انتخاب کنید و تأیید کنید که در 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

پس از 5 دقیقه بیکار ماندن (قابل تنظیم با فیلد suspend_time YAML یا فیلد SuspendTime slurm.conf) گره های محاسباتی ارائه شده به صورت پویا برای انتشار منابع از بین می روند. می‌توانید با اجرای دوره‌ای sinfo و مشاهده کاهش اندازه خوشه به 0 این مورد را تأیید کنید:

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

نمونه‌های بیشتری را تا حد مجاز در منطقه‌ای که خوشه را در آن مستقر کرده‌اید، بچرخانید و برنامه‌های مختلف MPI را اجرا کنید.

8. نتیجه گیری

تبریک می‌گوییم، شما یک خوشه Slurm در Google Cloud Platform ایجاد کرده‌اید و از جدیدترین ویژگی‌های آن برای مقیاس‌بندی خودکار خوشه خود برای برآورده کردن تقاضای حجم کاری استفاده کرده‌اید! شما می توانید از این مدل برای اجرای هر نوع کار استفاده کنید، و تنها با درخواست گره ها در Slurm، در عرض چند دقیقه به صدها نمونه تبدیل می شود.

اگر می‌خواهید به یادگیری استفاده از Slurm در GCP ادامه دهید، حتماً با آزمایشگاه کد « ساخت خوشه‌های فدرال HPC با Slurm » ادامه دهید. این کد لبه شما را از طریق راه‌اندازی دو خوشه Slurm فدرال در فضای ابری راهنمایی می‌کند تا نشان دهد چگونه می‌توانید به یک فدراسیون چند خوشه‌ای دست پیدا کنید، چه در محل یا در فضای ابری.

آیا با استفاده از عملکرد بومی GCP جدید Slurm چیز جالبی می سازید؟ سوالی دارید؟ پیشنهاد ویژگی دارید؟ امروز از طریق وب‌سایت راه‌حل‌های محاسباتی با کارایی بالا Google Cloud با تیم Google Cloud تماس بگیرید یا در گروه بحث Google Cloud & Slurm با ما گپ بزنید!

استقرار Terraform را پاک کنید

خروج از گره slurm:

exit

قبل از حذف استقرار، اجازه دهید هر گره با مقیاس خودکار کوچک شود. همچنین می‌توانید با اجرای «gcloud compute instances delete <Instance Name>» برای هر نمونه، یا با استفاده از رابط کاربری گرافیکی کنسول برای انتخاب چندین گره و کلیک کردن روی «حذف»، این گره‌ها را به صورت دستی حذف کنید.

پس از اتمام کار، می‌توانید با اجرای دستور زیر از Google Cloud Shell، پس از خروج از g1-login0، استقرار Terraform را به راحتی پاکسازی کنید:

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

وقتی از شما خواسته شد، برای ادامه، بله را تایپ کنید. این عمل ممکن است چند دقیقه طول بکشد، لطفا صبور باشید.

پروژه را حذف کنید

برای پاکسازی، ما به سادگی پروژه خود را حذف می کنیم.

  • در منوی پیمایش IAM & Admin را انتخاب کنید
  • سپس در زیر منو روی تنظیمات کلیک کنید
  • روی نماد سطل زباله با متن "حذف پروژه" کلیک کنید.
  • دستورالعمل های فرمان را دنبال کنید

آنچه را پوشش داده ایم

  • نحوه استفاده از Deploy Slurm در GCP با استفاده از Terraform.
  • نحوه اجرای یک کار با استفاده از Slurm در GCP.
  • نحوه پرس و جو کردن اطلاعات خوشه و نظارت بر کارهای در حال اجرا در Slurm.
  • نحوه مقیاس خودکار گره ها با Slurm در GCP برای تطبیق با پارامترها و الزامات شغلی خاص.
  • نحوه کامپایل و اجرای برنامه های MPI در Slurm در GCP.

پشتیبانی Slurm را پیدا کنید

اگر با استفاده از این ادغام ها در محیط های آزمایشی یا تولیدی به پشتیبانی نیاز دارید، لطفاً مستقیماً با SchedMD با استفاده از صفحه تماس آنها در اینجا تماس بگیرید: https://www.schedmd.com/contact.php

همچنین می توانید از راهنماهای عیب یابی موجود استفاده کنید:

در نهایت، می‌توانید سؤال خود را به گروه بحث و گفتگوی Google Cloud & Slurm که در اینجا یافت می‌شود ارسال کنید: https://groups.google.com/g/google-cloud-slurm-discuss

بیشتر بدانید

بازخورد

لطفاً با استفاده از این پیوند بازخورد خود را درباره این کد لبه ارسال کنید. تکمیل بازخورد کمتر از 5 دقیقه طول می کشد. متشکرم