نشر مجموعة HPC للتوسع التلقائي باستخدام Sلون

1. نظرة عامة

مرحبًا بك في درس الترميز من Google حول تشغيل مجموعة Slurm على Google Cloud Platform. في نهاية هذا الدرس التطبيقي حول الترميز، سيكون لديك فهم راسخ لسهولة توفير وتشغيل مجموعة Slurm قابلة للتوسيع التلقائي.

c16fa310c142ac6f.png

تعاونت Google Cloud مع SchedMD لإصدار مجموعة من الأدوات التي تسهّل تشغيل مدير عبء العمل Slurm على Compute Engine، وتوسيع مجموعتك الحالية ديناميكيًا عندما تحتاج إلى موارد إضافية. وقد أنشأ هذه الميزة خبراء في SchedMD وفقًا لأفضل ممارسات Slurm.

إذا كنت تخطّط لاستخدام عمليات الدمج Slurm على Google Cloud Platform، أو إذا كانت لديك أي أسئلة، يُرجى الانضمام إلى مجموعة مناقشة منتدى Google Cloud وSlurm.

لمحة عن Slurm

a739730a41acff0a.png

مخطّط هندسي أساسي لمجموعة Slurm مستقلة في Google Cloud Platform

‫Slurm هو أحد أبرز أدوات إدارة أحجام العمل لمجموعات الحوسبة عالية الأداء (HPC) في جميع أنحاء العالم. توفّر Slurm نظامًا مفتوح المصدر لتجاوز الأخطاء وإدارة مهام العمل وجدولة الوظائف قابل للتوسّع بشكل كبير، وذلك لمجموعات Linux الصغيرة والكبيرة. لا يتطلّب Slurm إجراء أي تعديلات على النواة لتشغيله، وهو مستقل نسبيًا. بصفته مدير أحمال عمل المجموعات، يقدّم Slurm ثلاث وظائف رئيسية:

  1. تتيح هذه الميزة للمستخدمين الوصول إلى الموارد (عُقد الحوسبة) بشكل حصري أو غير حصري لمدة زمنية معيّنة ليتمكّنوا من إنجاز أعمالهم.
  2. توفّر هذه السمة إطار عمل لبدء العمل وتنفيذه ورصده (عادةً ما تكون مهمة متوازية) على مجموعة العُقد المخصّصة.
  3. ويعمل على حلّ النزاعات بشأن الموارد من خلال إدارة قائمة بطلبات العمل المعلّقة.

أهداف الدورة التعليمية

  • كيفية إعداد مجموعة Slurm باستخدام Terraform
  • كيفية تنفيذ مهمة باستخدام SLURM
  • كيفية طلب معلومات المجموعة ومراقبة المهام الجارية في SLURM
  • كيفية توسيع نطاق العُقد تلقائيًا لاستيعاب مَعلمات ومتطلبات وظيفة معيّنة
  • كيفية الحصول على مساعدة بشأن Slurm

المتطلبات الأساسية

  • حساب Google Cloud Platform ومشروع يتضمّن الفوترة
  • تجربة Linux الأساسية

2. الإعداد

إعداد البيئة بالسرعة التي تناسبك

إنشاء "مشروع"

إذا لم يكن لديك حساب على Google (Gmail أو G Suite)، عليك إنشاء حساب. سجِّل الدخول إلى وحدة تحكّم Google Cloud Platform ( console.cloud.google.com) وافتح صفحة "إدارة الموارد":

359c06e07e6d699f.png

انقر على إنشاء مشروع.

25c23d651abb837b.png

أدخِل اسم مشروع. تذكَّر رقم تعريف المشروع (المميّز باللون الأحمر في لقطة الشاشة أعلاه). يجب أن يكون رقم تعريف المشروع اسمًا فريدًا في جميع مشاريع Google Cloud. إذا لم يكن اسم مشروعك فريدًا، ستنشئ Google Cloud رقم تعريف عشوائيًا للمشروع استنادًا إلى اسم المشروع.

بعد ذلك، عليك تفعيل الفوترة في Developers Console من أجل استخدام موارد Google Cloud.

لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز أكثر من بضعة دولارات، ولكن قد تكون التكلفة أعلى إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل (راجِع قسم "الخلاصة" في نهاية هذا المستند). تتوفّر حاسبة الأسعار في Google Cloud Platform هنا.

يمكن للمستخدمين الجدد في Google Cloud Platform الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.

Google Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، سنستخدم في هذا الدرس التطبيقي حول الترميز Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

تشغيل Google Cloud Shell

من وحدة تحكّم Google Cloud Platform، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:

dbad104cef962719.png

بعد ذلك، انقر على بدء 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>

إذا لم يتم ضبط رقم تعريف المشروع بشكل صحيح، يمكنك ضبطه باستخدام الأمر التالي:

$ 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 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
  • project: رقم تعريف مشروع Google Cloud الذي سيتم نشر الموارد فيه
  • المنطقة: منطقة 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: عنوان IP لخادم CloudSQL
  • user: اسم مستخدم CloudSQL
  • كلمة المرور: كلمة مرور CloudSQL
  • db_name: اسم قاعدة بيانات CloudSQL
  • controller_secondary_disk: هل تريد إضافة قرص ثانوي لتخزين خادم NFS؟
  • controller_secondary_disk_type: نوع القرص الثانوي لوحدة التحكّم
  • controller_secondary_disk_size_gb: حجم القرص الثانوي لوحدة التحكّم
  • controller_instance_template: نموذج مثيل Google Cloud Platform الذي سيتم استخدامه لمثيل وحدة التحكّم. ستتجاوز أي حقول حسابية محدّدة خصائص النموذج. على سبيل المثال، إذا تم تحديد controller_image، سيتم استبدال الصورة في نموذج الآلة الافتراضية.
  • استبدِل login_machine_type: بنوع مثيل عقدة تسجيل الدخول (التي يمكن الوصول إليها باستخدام بروتوكول SSH) instance type
  • login_image: صورة Google Cloud Platform المستخدَمة لإنشاء مثيل تسجيل الدخول إلى Slurm
  • استبدِل login_disk_type: بنوع قرص التمهيد الخاص بآلة تسجيل الدخول.
  • login_disk_size_gb: حجم قرص التشغيل الخاص بمثيل تسجيل الدخول
  • login_labels: التصنيفات التي سيتم إرفاقها بمثيل تسجيل الدخول
  • login_node_count: عدد عُقد تسجيل الدخول المطلوب إنشاؤها
  • login_node_service_account: حساب الخدمة الذي سيتم استخدامه على مثيلات تسجيل الدخول
  • login_node_scopes: نطاق الوصول لمثيل تسجيل الدخول
  • login_instance_template: نموذج مثيل Google Cloud Platform الذي سيتم استخدامه لمثيل تسجيل الدخول. ستتجاوز أي حقول حسابية محدّدة خصائص النموذج. على سبيل المثال، إذا تم تحديد login_image، سيتم استبدال الصورة في نموذج الجهاز الظاهري.
  • network_storage: مساحة التخزين على الشبكة التي سيتم ربطها بجميع العُقد ستتم إضافة الحقول مباشرةً إلى fstab. يمكن تكرار هذه الخطوة لعمليات ربط إضافية.
  • server_ip: عنوان IP لخادم التخزين
  • remote_mount: اسم تثبيت مساحة التخزين (اسم نظام الملفات)
  • local_mount: دليل التثبيت المحلي
  • fs_type: نوع نظام الملفات (NFS أو CIFS أو Lustre أو GCSFuse المثبَّت تلقائيًا)
  • mount_options: خيارات التثبيت (مثل defaults,_netdev)
  • login_network_storage: مساحة التخزين على الشبكة التي سيتم تثبيتها على عقد تسجيل الدخول وعقد التحكّم. سيتم تثبيت NFS وCIFS وLustre وGCSFuse تلقائيًا. يمكن تكرار هذه الخطوة لعمليات ربط إضافية.
  • server_ip: عنوان IP لخادم التخزين
  • remote_mount: اسم تثبيت مساحة التخزين (اسم نظام الملفات)
  • local_mount: دليل التثبيت المحلي
  • fs_type: نوع نظام الملفات (NFS أو CIFS أو Lustre أو GCSFuse المثبَّت تلقائيًا)
  • mount_options: خيارات التثبيت (مثل defaults,_netdev)
  • compute_node_service_account: حساب الخدمة الذي سيتم استخدامه على مثيلات الحوسبة
  • compute_node_scopes: نطاق الوصول إلى آلات الحوسبة الافتراضية
  • الأقسام: إعدادات أقسام Slurm. يمكن تكرار هذه العملية للأقسام الإضافية.
  • name: اسم القسم
  • machine_type: عقد الحوسبة نوع المثيل
  • static_node_count: عدد عُقد الحوسبة التي تعمل دائمًا
  • max_node_count: الحد الأقصى لعدد عُقد الحوسبة الإجمالي المسموح به، وهو 64 ألف كحد أقصى
  • المنطقة: منطقة Google Cloud التي ستتضمّن موارد هذا القسم - مزيد من المعلومات
  • الصورة: نوع الجهاز لعُقد صور Compute
  • image_hyperthreads: تفعيل أو إيقاف تعدد مؤشرات الترابط الفائق على الجهاز الظاهري
  • compute_disk_type: نوع قرص التمهيد لجهاز Compute (pd-standard أو pd-ssd)
  • compute_disk_size_gb: حجم قرص التمهيد لمثيل Compute
  • compute_labels: التصنيفات التي سيتم إرفاقها بالجهاز الظاهري
  • cpu_platform: الحد الأدنى لمنصة وحدة المعالجة المركزية المطلوبة لجميع عُقد الحوسبة
  • gpu_count: عدد وحدات معالجة الرسومات التي سيتم ربطها بكل آلة افتراضية في القسم
  • gpu_type:
  • network_storage: مساحة التخزين على الشبكة التي سيتم ربطها بجميع عُقد الحوسبة في القسم ستتم إضافة الحقول مباشرةً إلى fstab. يمكن تكرار هذه الخطوة لعمليات ربط إضافية.
  • server_ip: عنوان IP لخادم التخزين
  • remote_mount: اسم تثبيت مساحة التخزين (اسم نظام الملفات)
  • local_mount: دليل التثبيت المحلي
  • fs_type: نوع نظام الملفات (NFS أو CIFS أو Lustre أو GCSFuse المثبَّت تلقائيًا)
  • mount_options: خيار التثبيت
  • preemptible_bursting: هل ستكون الأجهزة الافتراضية استباقية؟
  • vpc_subnet: الشبكة الفرعية للسحابة الإلكترونية الافتراضية الخاصة التي سيتم نشر قسم Slurm فيها
  • exclusive: تتيح هذه السمة لـ Slurm تخصيص عُقد كاملة للمهام
  • استبدِل enable_placement: بـ "تفعيل سياسات المواضع" حيث سيتم وضع المثيلات بالقرب من بعضها البعض لتقليل وقت استجابة الشبكة بين المثيلات.
  • regional_capacity: للسماح بوضع آلة افتراضية في أي منطقة ضمن المنطقة استنادًا إلى مدى التوفّر
  • regional_policy: إذا كانت قيمة regional_capacity هي "صحيح"، تُستخدَم هذه السياسة لتحديد المنطقة التي سيتم استخدامها وأي مناطق في تلك المنطقة لا يجب استخدامها.
  • Instance_template: نموذج مثيل Google Cloud Platform الذي سيتم استخدامه لمثيلات الحوسبة. ستتجاوز أي حقول حسابية محدّدة خصائص النموذج. على سبيل المثال، إذا تم تحديد صورة، سيتم استبدال الصورة في نموذج الجهاز الافتراضي.

إعدادات متقدّمة

إذا أردت، يمكنك اختيار تثبيت حِزم وبرامج إضافية كجزء من عملية نشر المجموعة. يمكنك تثبيت البرامج على مجموعة slurm بعدة طرق موضّحة في مقالة "تثبيت التطبيقات في مجموعة Slurm على Compute Engine"، أو من خلال تخصيص الصورة التي تنشرها Slurm. في الوقت الحالي، تنشر Slurm صورة جهاز افتراضي مقدَّمة من SchedMD تستند إلى صورة الجهاز الافتراضي للحوسبة العالية الأداء (HPC) على Google Cloud، مع تثبيت Slurm فوقها.

لاستخدام صورتك الخاصة، أنشئ صورة باستخدام الإعدادات الخاصة بك استنادًا إلى صورة الجهاز الافتراضي العامة من SchedMD المدرَجة في ملف tfvars. بعد ذلك، استبدِل معرّف الموارد المنتظم الخاص بالصورة المحدّد في ملف tfvars بصورتك، واختبِر التغيير.

تحديد المشاكل وحلّها

خلال هذا الدرس التطبيقي حول الترميز، يُرجى الرجوع إلى قسم تحديد المشاكل وحلّها في ملف ReadMe لمستودع Slurm-GCP.

تتضمّن المشاكل الأكثر شيوعًا أخطاء في إعداد ملف tfvars وقيود الحصة. تم تصميم هذا الدرس التطبيقي حول الترميز ليتم تنفيذه ضمن تخصيص الحصة القياسية للمستخدم الجديد وضمن الرصيد المجاني البالغ 300 دولار أمريكي الذي يحصل عليه المستخدم الجديد. في حال تعذُّر إنشاء أجهزة افتراضية، تحقَّق من ملف /var/log/slurm/resume.log على عقدة وحدة التحكّم للبحث عن أخطاء في واجهة برمجة التطبيقات.

4. تفعيل الإعدادات والتحقّق منها

تفعيل الإعداد

في جلسة Cloud Shell، نفِّذ الأمر التالي من المجلد slurm-gcp/tf/example:

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

سيُطلب منك قبول الإجراءات الموضّحة، استنادًا إلى الإعدادات التي تم ضبطها. أدخِل "yes" لبدء عملية النشر. يمكنك أيضًا عرض الإعدادات التي سيتم نشرها من خلال تنفيذ الأمر "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 > مثيلات الأجهزة الافتراضية.

d5832bdd527794ed.png

من المفترض أن يظهر لك جهاز تحكّم ومثيل جهاز افتراضي لتسجيل الدخول على النحو التالي:

7a1fc9603758d58d.png

ضمن مثيلات الأجهزة الافتراضية، راجِع مثيلَي الجهازَين الافتراضيين اللذين تم إنشاؤهما باستخدام Terraform.

ستختلف الأسماء إذا عدّلت الحقل cluster_name.

  • g1-controller
  • g1-login0

5- تسجيل الدخول إلى مجموعة Slurm

الوصول إلى مجموعة Slurm

ارجع إلى علامة التبويب "أداة تعديل الرموز البرمجية" أو Cloud Shell. نفِّذ الأمر التالي لتسجيل الدخول إلى الجهاز الظاهري، مع استبدال <ZONE> بمنطقة عقدة g1-login0 (يجب أن تكون us-central1-b):

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

سيؤدي هذا الأمر إلى تسجيل دخولك إلى الجهاز الافتراضي g1-login0.

هناك طريقة أخرى للوصول بسهولة إلى عقدة تسجيل الدخول، وهي النقر على الزر "SSH" بجانب الجهاز الافتراضي g1-login0 في صفحة "أجهزة VM" لفتح علامة تبويب جديدة تتضمّن اتصال 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.

يُرجى الانتظار وعدم متابعة الدرس التطبيقي إلى أن تظهر لك هذه الرسالة (حوالي 5 دقائق):

*** Slurm login setup complete ***

بعد ظهور الرسالة أعلاه، عليك تسجيل الخروج ثم إعادة تسجيل الدخول إلى g1-login0 لمتابعة الدرس العملي. لإجراء ذلك، اضغط على CTRL + C لإنهاء المهمة.

بعد ذلك، نفِّذ الأمر التالي لتسجيل الخروج من مثيلك:

exit

الآن، أعِد الاتصال بالجهاز الافتراضي الذي تستخدمه لتسجيل الدخول. نفِّذ الأمر التالي لتسجيل الدخول إلى الجهاز الظاهري، مع استبدال <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" مهامًا متوازية، ويمكن استخدامها كبرنامج تضمين لأداة mpirun. يتم استخدام "sbatch" لإرسال مهمة مجمّعة إلى slurm، ويمكن استدعاء srun مرة واحدة أو عدة مرات في إعدادات مختلفة. يمكن أن يقبل الأمر "sbatch" نصوصًا برمجية مجمّعة، أو يمكن استخدامه مع الخيار ‎–wrap لتشغيل المهمة بأكملها من سطر الأوامر.

لننفّذ مهمة حتى نتمكّن من رؤية Slurm أثناء العمل والحصول على مهمة في قائمة الانتظار.

6. تشغيل مهمة Slurm وتوسيع نطاق المجموعة

تشغيل مهمة Slurm وتوسيع نطاق المجموعة

بعد أن أصبح لدينا مجموعة Slurm قيد التشغيل، لننفّذ مهمة ونوسّع نطاق مجموعتنا.

يُستخدم الأمر "sbatch" لتنفيذ أوامر ونصوص Slurm المجمّعة. لننفّذ نصًا برمجيًا بسيطًا من sbatch سيشغّل "اسم المضيف" على الأجهزة الافتراضية التي يتم توسيع نطاقها تلقائيًا.

أثناء تسجيل الدخول إلى g1-login0، شغِّل الأمر التالي:

sbatch -N2 --wrap="srun hostname"

يشغّل هذا الأمر أمر مجموعة Slurm. يحدّد هذا الخيار أنّ الأمر sbatch سيشغّل عقدتَين باستخدام الخيار "-N". ويحدّد أيضًا أنّ كل عقدة من هذه العُقد ستنفّذ الأمر "srun hostname" في الخيار "–wrap".

تلقائيًا، ستكتب أداة sbatch نتائجها في الملف "slurm-%j.out" في دليل العمل الذي يتم تشغيل الأمر منه، حيث يتم استبدال %j بمعرّف الوظيفة وفقًا لأنماط أسماء ملفات Slurm. في مثالنا، يتم تشغيل sbatch من مجلد /home الخاص بالمستخدم، وهو نظام ملفات مشترك مستند إلى NFS ومستضاف على وحدة التحكّم تلقائيًا. يتيح ذلك لعُقد الحوسبة مشاركة بيانات الإدخال والإخراج إذا أردت ذلك. في بيئة الإنتاج، يجب أن تكون مساحة التخزين العاملة منفصلة عن مساحة التخزين /home لتجنُّب التأثير في أداء عمليات المجموعة. يمكن تحديد عمليات ربط التخزين المنفصلة في ملف tfvars في خيارات "network_storage".

بعد تنفيذ نص sbatch البرمجي باستخدام سطر أوامر sbatch، سيتم عرض معرّف الوظيفة للمهمة المجدوَلة، على سبيل المثال:

Submitted batch job 2

يمكننا استخدام معرف الوظيفة الذي يعرضه الأمر 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

سيؤدي ذلك إلى عرض العُقد المُدرَجة في squeue بالحالة "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]

يمكنك أيضًا التحقّق من قسم "مثيلات الجهاز الافتراضي" في Google Cloud Console لعرض العُقد التي تم توفيرها حديثًا. سيستغرق إعداد العُقد وتشغيل Slurm بضع دقائق قبل تخصيص المهمة للعُقد التي تم تخصيصها حديثًا. ستبدو قائمة مثيلات الأجهزة الافتراضية قريبًا على النحو التالي:

9997efff595f1e.png

بعد أن تبدأ العُقد في تنفيذ المهمة، ستنتقل المثيلات إلى الحالة "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]

بعد اكتمال مهمة، لن يتم إدراجها في squeue، وستعود عُقد "alloc" في sinfo إلى الحالة "idle". نفِّذ الأمر "squeue" بشكل دوري إلى أن تكتمل المهمة، وذلك بعد دقيقة أو دقيقتَين.

سيتم كتابة ملف الإخراج slurm-%j.out في مجلد /home المشترَك عبر نظام NFS، وسيتضمّن أسماء المضيفين. افتح ملف الإخراج أو اعرض محتواه (عادةً slurm-2.out)، وسيحتوي على ما يلي:

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.

انسخ النص التالي وألصِقه في الملف لإنشاء نص برمجي بسيط من 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

سيؤدي ذلك إلى تنفيذ الأمر hostname على عقدتَين، مع مهمة واحدة لكل عقدة، بالإضافة إلى طباعة الناتج في الملف hello_world-3.out.

بما أنّنا وفّرنا عقدتَين من قبل، سيتم تنفيذ هذه المهمة بسرعة.

راقِب squeue إلى أن تكتمل المهمة ولا تعود مدرَجة:

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 على Google Cloud، احرص على متابعة درس تطبيقي حول الترميز بعنوان " إنشاء مجموعات حوسبة عالية الأداء موحّدة باستخدام Slurm". سيرشدك هذا الدرس التطبيقي حول الترميز إلى كيفية إعداد مجموعتَين من مجموعات Slurm الموحّدة في السحابة الإلكترونية، لتوضيح كيفية تحقيق اتحاد متعدد المجموعات، سواء كان ذلك في الموقع أو في السحابة الإلكترونية.

هل تعمل على إنشاء شيء رائع باستخدام وظائف Slurm الجديدة المتوافقة مع Google Cloud؟ هل لديك أسئلة؟ هل لديك اقتراح بشأن ميزة؟ يمكنك التواصل مع فريق Google Cloud اليوم من خلال الموقع الإلكتروني الخاص بحلول الحوسبة العالية الأداء من Google Cloud، أو الدردشة معنا في مجموعة مناقشة Google Cloud وSlurm.

تنظيف عملية نشر Terraform

تسجيل الخروج من عقدة Slurm:

exit

السماح لأي عقد تم توسيع نطاقها تلقائيًا بتقليل نطاقها قبل حذف عملية النشر يمكنك أيضًا حذف هذه العُقد يدويًا من خلال تنفيذ الأمر "gcloud compute instances delete <Instance Name>" لكل آلة افتراضية، أو باستخدام واجهة المستخدم الرسومية في "وحدة التحكّم" لاختيار عُقد متعددة والنقر على "حذف".

يمكنك بسهولة إيقاف عملية نشر Terraform بعد الانتهاء من خلال تنفيذ الأمر التالي من Google Cloud Shell بعد تسجيل الخروج من g1-login0:

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

عندما يُطلب منك ذلك، اكتب yes لمواصلة العملية. قد تستغرق هذه العملية عدة دقائق، لذا يُرجى الانتظار.

حذف المشروع

لإجراء عملية التنظيف، ما عليك سوى حذف مشروعك.

  • في قائمة التنقّل، اختَر "إدارة الهوية وإمكانية الوصول والمشرف"
  • ثم انقر على "الإعدادات" في القائمة الفرعية.
  • انقر على رمز سلة المهملات الذي يتضمّن النص "حذف المشروع".
  • اتّبِع التعليمات الظاهرة على الشاشة

المواضيع التي تناولناها

  • كيفية نشر Slurm على Google Cloud Platform باستخدام Terraform
  • كيفية تشغيل مهمة باستخدام Slurm على Google Cloud
  • كيفية طلب معلومات عن المجموعات ومراقبة المهام قيد التشغيل في Slurm
  • كيفية توسيع نطاق العُقد تلقائيًا باستخدام Slurm على Google Cloud Platform لاستيعاب مَعلمات ومتطلبات مهام معيّنة
  • كيفية تجميع تطبيقات MPI وتشغيلها على Slurm على Google Cloud

العثور على دعم Slurm

إذا كنت بحاجة إلى دعم لاستخدام عمليات الدمج هذه في بيئات الاختبار أو الإنتاج، يُرجى التواصل مع SchedMD مباشرةً باستخدام صفحة التواصل هنا: https://www.schedmd.com/contact.php

يمكنك أيضًا استخدام أدلة تحديد المشاكل وحلّها المتوفّرة:

أخيرًا، يمكنك أيضًا نشر سؤالك في "مجموعة مناقشة Google Cloud وSlurm" على الرابط التالي: https://groups.google.com/g/google-cloud-slurm-discuss

مزيد من المعلومات

الملاحظات

يُرجى إرسال ملاحظاتك حول هذا الدرس التطبيقي حول الترميز باستخدام هذا الرابط. يستغرق تقديم الملاحظات أقل من 5 دقائق. شكرًا