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

۱. مرور کلی

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

c16fa310c142ac6f.png

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

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

درباره اسلورم

a739730a41acff0a.png

نمودار معماری پایه یک خوشه مستقل Slurm در پلتفرم ابری گوگل.

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

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

آنچه یاد خواهید گرفت

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

پیش‌نیازها

  • حساب کاربری پلتفرم گوگل کلود و یک پروژه با قابلیت پرداخت
  • تجربه اولیه لینوکس

۲. راه‌اندازی

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

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

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

۳۵۹c۰۶e۰۷e۶d۶۹۹f.png

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

25c23d651abb837b.png

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

در مرحله بعد، برای استفاده از منابع گوگل کلود، باید پرداخت را در کنسول توسعه‌دهندگان فعال کنید .

اجرای این آزمایشگاه کد نباید بیش از چند دلار برای شما هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتر بگیرید یا اگر آنها را در حال اجرا رها کنید، می‌تواند بیشتر هم بشود (به بخش «نتیجه‌گیری» در انتهای این سند مراجعه کنید). محاسبه‌گر قیمت پلتفرم ابری گوگل اینجا موجود است.

کاربران جدید پلتفرم ابری گوگل واجد شرایط دریافت یک دوره آزمایشی رایگان ۳۰۰ دلاری هستند.

پوسته ابری گوگل

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

راه‌اندازی پوسته ابری گوگل

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

dbad104cef962719.png

سپس روی شروع پوسته ابری کلیک کنید:

4e50db320508ac88.png

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

20b0aa80492144d.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز شماست. این ماشین یک دایرکتوری خانگی دائمی ۵ گیگابایتی ارائه می‌دهد و روی فضای ابری گوگل اجرا می‌شود که عملکرد شبکه را تا حد زیادی افزایش داده و احراز هویت را ساده می‌کند. بخش عمده‌ای از کار شما در این آزمایشگاه، اگر نگوییم همه، را می‌توان به سادگی با یک مرورگر وب یا یک کروم‌بوک گوگل انجام داد.

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

$ gcloud auth list

خروجی دستور:

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

خروجی دستور:

[core]
project = <PROJECT_ID>

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

$ gcloud config set project <PROJECT_ID>

خروجی دستور:

Updated property [core/project].

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

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

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

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

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

cd slurm-gcp

پیکربندی tfvar های Slurm Terraform

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

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

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

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 که شامل کنترلر و نمونه‌های ورود به سیستم این خوشه خواهد بود - اطلاعات بیشتر
  • network_name: شبکه‌ی ابر خصوصی مجازی برای استقرار خوشه‌ی Slurm در
  • subnetwork_name: زیرشبکه‌ی ابر خصوصی مجازی برای استقرار خوشه‌ی 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: آی‌پی سرور 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: آی‌پی سرور ذخیره‌سازی
  • remote_mount: نام محل نصب حافظه (نام سیستم فایل)
  • local_mount: دایرکتوری mount محلی
  • fs_type: نوع سیستم فایل (NFS، CIFS، Lustre، GCSFuse که به صورت خودکار نصب شده‌اند)
  • mount_options: گزینه‌های mount (یعنی پیش‌فرض‌ها، _netdev)
  • login_network_storage: فضای ذخیره‌سازی شبکه برای نصب روی گره‌های ورود و کنترل‌کننده. NFS، CIFS، Lustre و GCSFuse به صورت خودکار نصب می‌شوند. می‌توان این فرآیند را برای نصب‌های اضافی تکرار کرد.
  • server_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: حداکثر تعداد کل گره‌های محاسباتی مجاز - حداکثر ۶۴ هزار
  • منطقه: منطقه ابری گوگل که شامل منابع این پارتیشن خواهد بود - اطلاعات بیشتر
  • تصویر: محاسبه نوع ماشین گره تصویر
  • 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: آی‌پی سرور ذخیره‌سازی
  • remote_mount: نام محل نصب حافظه (نام سیستم فایل)
  • local_mount: دایرکتوری mount محلی
  • fs_type: نوع سیستم فایل (NFS، CIFS، Lustre، GCSFuse که به صورت خودکار نصب شده‌اند)
  • mount_options: گزینه‌ی mount
  • preemptible_bursting: آیا نمونه‌ها، نمونه‌های preemptible خواهند بود؟
  • vpc_subnet: زیرشبکه‌ی ابر خصوصی مجازی برای استقرار پارتیشن Slurm در
  • انحصاری: Slurm را فعال کنید تا کل گره‌ها را به کارها اختصاص دهد
  • enable_placement: سیاست‌های جایگذاری را فعال می‌کند که در آن‌ها نمونه‌ها نزدیک به یکدیگر قرار می‌گیرند تا تأخیر شبکه بین نمونه‌ها کم باشد.
  • regional_capacity: اجازه می‌دهد یک نمونه بر اساس در دسترس بودن، در هر منطقه‌ای در منطقه قرار گیرد.
  • regional_policy: اگر regional_capacity مقدار true داشته باشد، این سیاست تعیین می‌کند که از کدام منطقه استفاده شود و از کدام مناطق در آن منطقه استفاده نشود.
  • Instance_template: الگوی نمونه GCP برای استفاده برای نمونه‌های محاسباتی. هر فیلد محاسباتی مشخص شده، ویژگی‌های الگو را لغو می‌کند. به عنوان مثال، اگر تصویر مشخص شده باشد، تصویر را در الگوی نمونه بازنویسی می‌کند.

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

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

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

عیب‌یابی

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

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

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

پیکربندی را مستقر کنید

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

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

از شما خواسته می‌شود که اقدامات شرح داده شده را بر اساس پیکربندی‌های انجام شده بپذیرید. برای شروع استقرار، « بله » را وارد کنید. همچنین می‌توانید با اجرای «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

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

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

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

Outputs:

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

تأیید ایجاد نمونه ماشین مجازی

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

d5832bdd527794ed.png

شما باید یک کنترلر و یک نمونه ماشین مجازی لاگین را در لیست ببینید:

7a1fc9603758d58d.png

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

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

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

۵. وارد کلاستر Slurm شوید

دسترسی به خوشه Slurm

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

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

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

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

8c373a87d13620f7.png

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

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

*** Slurm login setup complete ***

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

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

exit

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

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

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

مروری بر ابزارهای رابط خط فرمان Slurm

اکنون به گره ورود به سیستم 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" کارهای موازی را اجرا می‌کند و می‌تواند به عنوان یک wrapper برای mpirun استفاده شود. "sbatch" برای ارسال یک کار دسته‌ای به slurm استفاده می‌شود و می‌تواند srun را یک یا چند بار در پیکربندی‌های مختلف فراخوانی کند. "sbatch" می‌تواند اسکریپت‌های دسته‌ای را دریافت کند، یا می‌تواند با گزینه –wrap برای اجرای کل کار از خط فرمان استفاده شود.

بیایید یک کار (job) اجرا کنیم تا بتوانیم Slurm را در عمل ببینیم و یک کار در صف انتظار خود داشته باشیم!

۶. اجرای یک کار Slurm و مقیاس‌بندی کلاستر

اجرای یک کار Slurm و مقیاس‌بندی کلاستر

حالا که کلاستر Slurm ما در حال اجرا است، بیایید یک کار (job) اجرا کنیم و کلاستر خود را مقیاس‌بندی کنیم.

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

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

sbatch -N2 --wrap="srun hostname"

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

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

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

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 شامل آماده‌سازی دستی گره‌ها، پیکربندی نرم‌افزار، ادغام گره در خوشه و سپس استقرار کار مورد نیاز است، حذف می‌کند. دوم، به کاربران این امکان را می‌دهد که در هزینه‌ها صرفه‌جویی کنند زیرا گره‌های بیکار و بلااستفاده تا زمانی که حداقل تعداد گره‌ها در حال اجرا باشند، کوچک می‌شوند.

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

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]

همچنین می‌توانید بخش نمونه‌های ماشین مجازی را در کنسول ابری گوگل بررسی کنید تا گره‌های تازه تأمین‌شده را مشاهده کنید. راه‌اندازی گره‌ها و اجرای Slurm قبل از تخصیص کار به گره‌های تازه تخصیص‌یافته، چند دقیقه طول خواهد کشید. فهرست نمونه‌های ماشین مجازی شما به‌زودی شبیه به موارد زیر خواهد شد:

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 به حالت "idle" برمی‌گردند. دستور "squeue" را به صورت دوره‌ای اجرا کنید تا کار، پس از یک یا دو دقیقه، تکمیل شود.

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

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

عالی بود، شما یک کار (job) را اجرا کردید و کلاستر Slurm خود را گسترش دادید!

۷. یک کار 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 در سراسر کلاستر خود اجرا کنیم.

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

vi helloworld_batch

برای ورود به حالت درج متن در vi، حرف i را تایپ کنید.

متن زیر را در فایل کپی و جایگذاری کنید تا یک اسکریپت ساده‌ی sbat ایجاد شود:

#!/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 جایگزین شناسه کار (Job ID) طبق الگوهای نام فایل Slurm می‌شود. این فایل خروجی در دایرکتوری که اسکریپت sbatch از آن اجرا می‌شود، نوشته می‌شود. در مثال ما، این دایرکتوری، پوشه /home کاربر است که یک سیستم فایل مشترک مبتنی بر NFS است. این به گره‌های محاسباتی اجازه می‌دهد تا در صورت تمایل، داده‌های ورودی و خروجی را به اشتراک بگذارند. در یک محیط عملیاتی، فضای ذخیره‌سازی کاری باید از فضای ذخیره‌سازی /home جدا باشد تا از تأثیر عملکرد بر عملیات خوشه جلوگیری شود.

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

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

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

sbatch helloworld_batch

اجرای sbatch یک شناسه کار برای کار زمان‌بندی شده برمی‌گرداند، برای مثال:

Submitted batch job 3

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

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

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

squeue

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

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

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

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

۸. نتیجه‌گیری

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

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

آیا با استفاده از قابلیت جدید GCP-native در 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 را انتخاب کنید.
  • سپس در زیرمنو روی تنظیمات کلیک کنید
  • روی آیکون سطل زباله با متن «حذف پروژه» کلیک کنید
  • دستورالعمل‌های راهنما را دنبال کنید

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

  • نحوه‌ی استقرار 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

اطلاعات بیشتر

بازخورد

لطفا نظرات خود را در مورد این آزمایشگاه کد با استفاده از این لینک ارسال کنید. ارسال نظرات کمتر از ۵ دقیقه طول می‌کشد. متشکرم!