স্লার্মের সাথে একটি অটো-স্কেলিং HPC ক্লাস্টার স্থাপন করুন

১. সংক্ষিপ্ত বিবরণ

গুগল ক্লাউড প্ল্যাটফর্মে স্লার্ম ক্লাস্টার চালানোর জন্য এই গুগল কোডল্যাবে আপনাকে স্বাগতম! এই কোডল্যাবটি শেষে, একটি অটো-স্কেলিং স্লার্ম ক্লাস্টার সহজে প্রোভিশনিং এবং পরিচালনা করার বিষয়ে আপনার একটি সুস্পষ্ট ধারণা তৈরি হবে।

c16fa310c142ac6f.png

গুগল ক্লাউড, SchedMD-এর সাথে মিলে এমন কিছু টুল প্রকাশ করেছে যা Compute Engine-এ Slurm ওয়ার্কলোড ম্যানেজার চালু করা এবং অতিরিক্ত রিসোর্সের প্রয়োজনে আপনার বিদ্যমান ক্লাস্টারকে ডায়নামিকভাবে প্রসারিত করা সহজ করে তোলে। এই ইন্টিগ্রেশনটি SchedMD- এর বিশেষজ্ঞরা Slurm-এর সেরা অনুশীলন অনুসারে তৈরি করেছেন।

আপনি যদি গুগল ক্লাউড প্ল্যাটফর্মে স্লার্ম ইন্টিগ্রেশনগুলো ব্যবহার করার পরিকল্পনা করে থাকেন, অথবা আপনার যদি কোনো প্রশ্ন থাকে, তাহলে অনুগ্রহ করে আমাদের গুগল ক্লাউড ও স্লার্ম কমিউনিটি আলোচনা গ্রুপে যোগ দেওয়ার কথা বিবেচনা করুন!

স্লার্ম সম্পর্কে

a739730a41acff0a.png

গুগল ক্লাউড প্ল্যাটফর্মে একটি স্বতন্ত্র স্লার্ম ক্লাস্টারের মৌলিক স্থাপত্য চিত্র।

স্লার্ম বিশ্বজুড়ে এইচপিসি ক্লাস্টারের জন্য অন্যতম প্রধান ওয়ার্কলোড ম্যানেজার। স্লার্ম ছোট এবং বড় লিনাক্স ক্লাস্টারের জন্য একটি ওপেন-সোর্স, ফল্ট-টলারেন্ট এবং অত্যন্ত স্কেলেবল ওয়ার্কলোড ম্যানেজমেন্ট ও জব শিডিউলিং সিস্টেম প্রদান করে। স্লার্ম পরিচালনার জন্য কোনো কার্নেল পরিবর্তনের প্রয়োজন হয় না এবং এটি তুলনামূলকভাবে স্বয়ংসম্পূর্ণ। একটি ক্লাস্টার ওয়ার্কলোড ম্যানেজার হিসেবে স্লার্মের তিনটি প্রধান কাজ রয়েছে:

  1. এটি ব্যবহারকারীদেরকে নির্দিষ্ট সময়ের জন্য রিসোর্স (কম্পিউট নোড)-এ একচেটিয়া বা অ-একচেটিয়া অ্যাক্সেস বরাদ্দ করে, যাতে তারা কাজ সম্পাদন করতে পারে।
  2. এটি বরাদ্দকৃত নোডগুলোর সেটে কোনো কাজ (সাধারণত একটি প্যারালাল জব) শুরু করা, সম্পাদন করা এবং পর্যবেক্ষণ করার জন্য একটি কাঠামো প্রদান করে।
  3. এটি অপেক্ষাধীন কাজের একটি সারি ব্যবস্থাপনার মাধ্যমে সম্পদের জন্য সৃষ্ট বিবাদের মধ্যস্থতা করে।

আপনি যা শিখবেন

  • টেরাফর্ম ব্যবহার করে কীভাবে একটি স্লার্ম ক্লাস্টার সেটআপ করবেন
  • SLURM ব্যবহার করে কীভাবে একটি জব চালানো যায়
  • SLURM-এ কীভাবে ক্লাস্টারের তথ্য কোয়েরি করবেন এবং চলমান জবগুলো মনিটর করবেন
  • নির্দিষ্ট কাজের প্যারামিটার এবং প্রয়োজনীয়তা মেটাতে কীভাবে নোডগুলিকে স্বয়ংক্রিয়ভাবে স্কেল করা যায়
  • স্লার্ম নিয়ে সাহায্য কোথায় পাবেন

পূর্বশর্ত

  • গুগল ক্লাউড প্ল্যাটফর্ম অ্যাকাউন্ট এবং বিলিং সহ একটি প্রজেক্ট
  • লিনাক্স সম্পর্কে প্রাথমিক অভিজ্ঞতা

২. সেটআপ

স্ব-গতিতে পরিবেশ সেটআপ

একটি প্রকল্প তৈরি করুন

আপনার যদি আগে থেকে কোনো গুগল অ্যাকাউন্ট (জিমেইল বা জি স্যুট) না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে। গুগল ক্লাউড প্ল্যাটফর্ম কনসোলে ( console.cloud.google.com ) সাইন-ইন করুন এবং ম্যানেজ রিসোর্সেস পৃষ্ঠাটি খুলুন:

359c06e07e6d699f.png

প্রজেক্ট তৈরি করুন-এ ক্লিক করুন।

25c23d651abb837b.png

একটি প্রজেক্টের নাম লিখুন । প্রজেক্ট আইডিটি মনে রাখবেন (উপরের স্ক্রিনশটে লাল রঙে চিহ্নিত)। সমস্ত গুগল ক্লাউড প্রজেক্টের মধ্যে প্রজেক্ট আইডিটি অবশ্যই একটি অনন্য নাম হতে হবে। যদি আপনার প্রজেক্টের নাম অনন্য না হয়, গুগল ক্লাউড প্রজেক্টের নামের উপর ভিত্তি করে একটি র‍্যান্ডম প্রজেক্ট আইডি তৈরি করবে।

এরপরে, গুগল ক্লাউড রিসোর্স ব্যবহার করার জন্য আপনাকে ডেভেলপার কনসোলে বিলিং চালু করতে হবে।

এই কোডল্যাবটি চালাতে আপনার কয়েক ডলারের বেশি খরচ হওয়ার কথা নয়, কিন্তু আপনি যদি আরও রিসোর্স ব্যবহার করার সিদ্ধান্ত নেন অথবা সেগুলোকে চালু রাখেন, তাহলে খরচ আরও বেশি হতে পারে (এই ডকুমেন্টের শেষে 'উপসংহার' অংশটি দেখুন)। গুগল ক্লাউড প্ল্যাটফর্মের প্রাইসিং ক্যালকুলেটরটি এখানে পাওয়া যাবে।

গুগল ক্লাউড প্ল্যাটফর্মের নতুন ব্যবহারকারীরা ৩০০ ডলারের একটি বিনামূল্যে ট্রায়ালের জন্য যোগ্য।

গুগল ক্লাউড শেল

যদিও গুগল ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালনা করা যায়, এই কোডল্যাবে আমরা গুগল ক্লাউড শেল ব্যবহার করব, যা ক্লাউডে চালিত একটি কমান্ড লাইন পরিবেশ।

গুগল ক্লাউড শেল চালু করুন

GCP কনসোল থেকে উপরের ডানদিকের টুলবারে থাকা ক্লাউড শেল আইকনে ক্লিক করুন:

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 for Google Cloud Platform Terraform ফাইলগুলো ধারণকারী Git রিপোজিটরিটি ক্লোন (ডাউনলোড) করতে নিম্নলিখিত কমান্ডটি চালান:

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

ক্লাউড শেল সেশনে, basic.tfvars ফাইলটি খুলুন । ফাইলটির বিষয়বস্তু দেখার জন্য আপনি আপনার পছন্দের কমান্ড লাইন এডিটর (vi, nano, emacs, ইত্যাদি) অথবা ক্লাউড কনসোল কোড এডিটর ব্যবহার করতে পারেন।

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 ফাইলের মধ্যে কনফিগার করার জন্য বেশ কয়েকটি ফিল্ড রয়েছে। একমাত্র যে ফিল্ডটি অবশ্যই কনফিগার করতে হবে তা হলো ' project' । উদাহরণে দেওয়া অন্য সব কনফিগারেশন যেমন আছে তেমনই ব্যবহার করা যেতে পারে, তবে আপনার পরিস্থিতি অনুযায়ী প্রয়োজনমতো সেগুলো পরিবর্তন করে নিন। কনফিগারেশন অপশনগুলোর আরও বিস্তারিত বিবরণের জন্য, এখানে দেখুন।

  • cluster_name: স্লার্ম ক্লাস্টারের নাম
  • প্রজেক্ট: গুগল ক্লাউড প্রজেক্ট আইডি, যেখানে রিসোর্সগুলো স্থাপন করা হবে
  • জোন: গুগল ক্লাউড জোন যেখানে এই ক্লাস্টারের কন্ট্রোলার এবং লগইন ইনস্ট্যান্সগুলো থাকবে - আরও তথ্য
  • network_name: ভার্চুয়াল প্রাইভেট ক্লাউড নেটওয়ার্ক যেখানে স্লার্ম ক্লাস্টার স্থাপন করা হবে
  • subnetwork_name: ভার্চুয়াল প্রাইভেট ক্লাউড সাবনেটওয়ার্ক যেখানে স্লার্ম ক্লাস্টার স্থাপন করা হবে
  • shared_vpc_host_project: Slurm ক্লাস্টার স্থাপন করার জন্য শেয়ার্ড VPC নেটওয়ার্ক
  • disable_controller_public_ips: Slurm কন্ট্রোলারে এক্সটার্নাল আইপি অ্যাসাইন করবেন?
  • disable_login_public_ips: স্লার্ম লগইন নোডে বাহ্যিক আইপি বরাদ্দ করবেন?
  • disable_compute_login_ips: Slurm লগইন নোডে বাহ্যিক আইপি বরাদ্দ করবেন?
  • suspend_time: একটি নোড নিষ্ক্রিয় থাকার পর সেটিকে সাসপেন্ড করার আগে যে সময়টুকু অপেক্ষা করতে হবে।
  • controller_machine_type: কন্ট্রোলার নোড ইনস্ট্যান্স টাইপ
  • controller_image: Slurm কন্ট্রোলার ইনস্ট্যান্স তৈরি করতে ব্যবহৃত GCP ইমেজ
  • controller_disk_type: কন্ট্রোলার ইনস্ট্যান্সের বুট ডিস্কের ধরণ
  • controller_disk_size_gb: একটি কন্ট্রোলার ইনস্ট্যান্সের বুট ডিস্কের আকার
  • controller_labels: কন্ট্রোলার ইনস্ট্যান্সের সাথে সংযুক্ত করার জন্য লেবেল(গুলি)।
  • controller_service_account: কন্ট্রোলার ইনস্ট্যান্সে ব্যবহার করার জন্য সার্ভিস অ্যাকাউন্ট।
  • controller_scopes: কন্ট্রোলার ইনস্ট্যান্সের অ্যাক্সেস স্কোপ
  • cloudsql: কন্ট্রোলার ইনস্ট্যান্সে ডেটাবেস হোস্ট করার পরিবর্তে স্লার্ম ডেটাবেস হিসেবে ব্যবহার করার জন্য গুগল ক্লাউডএসকিউএল সার্ভার।
  • সার্ভার_আইপি: ক্লাউডএসকিউএল সার্ভারের আইপি
  • ব্যবহারকারী: ক্লাউডএসকিউএল ব্যবহারকারীর নাম
  • পাসওয়ার্ড: ক্লাউডএসকিউএল পাসওয়ার্ড
  • db_name: ক্লাউডএসকিউএল ডাটাবেসের নাম
  • 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: Slurm লগইন ইনস্ট্যান্স তৈরি করতে ব্যবহৃত GCP ইমেজ
  • 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-এ যোগ করা হবে। অতিরিক্ত মাউন্টের জন্য এটির পুনরাবৃত্তি করা যেতে পারে।
  • সার্ভার_আইপি: স্টোরেজ সার্ভারের আইপি
  • remote_mount: স্টোরেজ মাউন্টের নাম (ফাইলসিস্টেমের নাম)
  • local_mount: স্থানীয় মাউন্ট ডিরেক্টরি
  • fs_type: ফাইলসিস্টেমের ধরন (NFS, CIFS, Lustre, GCSFuse স্বয়ংক্রিয়ভাবে ইনস্টল হয়)
  • মাউন্ট_অপশন: মাউন্ট অপশন (যেমন ডিফল্ট, _netdev)
  • login_network_storage: লগইন এবং কন্ট্রোলার নোডে মাউন্ট করার জন্য নেটওয়ার্ক স্টোরেজ। NFS, CIFS, Lustre, এবং GCSFuse স্বয়ংক্রিয়ভাবে ইনস্টল হয়ে যাবে। অতিরিক্ত মাউন্টের জন্য এটি পুনরাবৃত্তি করা যেতে পারে।
  • সার্ভার_আইপি: স্টোরেজ সার্ভারের আইপি
  • remote_mount: স্টোরেজ মাউন্টের নাম (ফাইলসিস্টেমের নাম)
  • local_mount: স্থানীয় মাউন্ট ডিরেক্টরি
  • fs_type: ফাইলসিস্টেমের ধরন (NFS, CIFS, Lustre, GCSFuse স্বয়ংক্রিয়ভাবে ইনস্টল হয়)
  • মাউন্ট_অপশন: মাউন্ট অপশন (যেমন ডিফল্ট, _netdev)
  • compute_node_service_account: কম্পিউট ইনস্ট্যান্স(গুলি)তে ব্যবহার করার জন্য পরিষেবা অ্যাকাউন্ট
  • compute_node_scopes: কম্পিউট ইনস্ট্যান্সগুলোর অ্যাক্সেস স্কোপ
  • পার্টিশনসমূহ: স্লার্ম পার্টিশন কনফিগারেশন। অতিরিক্ত পার্টিশনের জন্য এটির পুনরাবৃত্তি করা যেতে পারে।
  • নাম: পার্টিশনের নাম
  • machine_type: কম্পিউট নোড(গুলি) ইনস্ট্যান্সের ধরণ
  • static_node_count: সর্বদা-সক্রিয় কম্পিউট নোডের সংখ্যা
  • max_node_count: অনুমোদিত মোট কম্পিউট নোডের সর্বোচ্চ সংখ্যা - সর্বোচ্চ ৬৪ হাজার।
  • জোন: গুগল ক্লাউড জোন যেখানে এই পার্টিশনের রিসোর্সগুলো থাকবে - আরও তথ্য
  • ইমেজ: ইমেজ নোড মেশিন টাইপ গণনা করুন
  • image_hyperthreads: ইনস্ট্যান্সটিতে হাইপারথ্রেডিং চালু বা বন্ধ করুন।
  • compute_disk_type : কম্পিউট ইনস্ট্যান্স বুট ডিস্কের ধরণ (pd-standard, pd-ssd)
  • compute_disk_size_gb: একটি কম্পিউট ইনস্ট্যান্স বুট ডিস্কের আকার
  • compute_labels: কম্পিউট ইনস্ট্যান্সের সাথে সংযুক্ত করার জন্য লেবেল(গুলি)।
  • cpu_platform: সকল কম্পিউট নোডের জন্য প্রয়োজনীয় ন্যূনতম সিপিইউ প্ল্যাটফর্ম
  • gpu_count: পার্টিশনের প্রতিটি ইনস্ট্যান্সে সংযুক্ত করার জন্য GPU-এর সংখ্যা
  • gpu_type: পার্টিশনের ইনস্ট্যান্সগুলোর সাথে সংযুক্ত করার জন্য GPU-এর ধরন
  • network_storage: পার্টিশনের সমস্ত কম্পিউট নোডে মাউন্ট করার জন্য নেটওয়ার্ক স্টোরেজ। ফিল্ডগুলি সরাসরি fstab-এ যোগ করা হবে। অতিরিক্ত মাউন্টের জন্য এটির পুনরাবৃত্তি করা যেতে পারে।
  • সার্ভার_আইপি: স্টোরেজ সার্ভারের আইপি
  • remote_mount: স্টোরেজ মাউন্টের নাম (ফাইলসিস্টেমের নাম)
  • local_mount: স্থানীয় মাউন্ট ডিরেক্টরি
  • fs_type: ফাইলসিস্টেমের ধরন (NFS, CIFS, Lustre, GCSFuse স্বয়ংক্রিয়ভাবে ইনস্টল হয়)
  • মাউন্ট_অপশন: মাউন্ট অপশন
  • preemptible_bursting: ইনস্ট্যান্সগুলো কি প্রিএম্পটিবল ইনস্ট্যান্স হবে?
  • vpc_subnet: ভার্চুয়াল প্রাইভেট ক্লাউড সাবনেটওয়ার্ক যেখানে স্লার্ম পার্টিশন স্থাপন করা হবে
  • এক্সক্লুসিভ: জবগুলির জন্য সম্পূর্ণ নোড বরাদ্দ করতে স্লার্মকে সক্ষম করুন।
  • enable_placement: এমন প্লেসমেন্ট পলিসি সক্রিয় করুন যেখানে ইনস্ট্যান্সগুলো একে অপরের কাছাকাছি অবস্থিত হবে, যার ফলে ইনস্ট্যান্সগুলোর মধ্যে নেটওয়ার্ক ল্যাটেন্সি কম থাকবে।
  • regional_capacity: প্রাপ্যতার উপর ভিত্তি করে একটি ইনস্ট্যান্সকে অঞ্চলের যেকোনো জোনে স্থাপন করার অনুমতি দেয়।
  • regional_policy: যদি regional_capacity true হয়, তাহলে এই পলিসিটি নির্ধারণ করবে কোন অঞ্চল ব্যবহার করা হবে এবং সেই অঞ্চলের কোনো জোন ব্যবহার করা হবে না।
  • ইনস্ট্যান্স_টেমপ্লেট: কম্পিউট ইনস্ট্যান্সের জন্য ব্যবহৃত GCP ইনস্ট্যান্স টেমপ্লেট । নির্দিষ্ট করা যেকোনো কম্পিউট ফিল্ড টেমপ্লেটের প্রোপার্টিগুলোকে ওভাররাইড করবে। যেমন, যদি 'image' নির্দিষ্ট করা হয়, তবে এটি ইনস্ট্যান্স টেমপ্লেটের ইমেজটিকে ওভাররাইট করবে।

উন্নত কনফিগারেশন

ইচ্ছা করলে, ক্লাস্টার ডেপ্লয়মেন্ট প্রক্রিয়ার অংশ হিসেবে আপনি অতিরিক্ত প্যাকেজ এবং সফটওয়্যার ইনস্টল করতে পারেন। আমাদের "কম্পিউট ইঞ্জিনে একটি স্লার্ম ক্লাস্টারে অ্যাপ ইনস্টল করা" অংশে বর্ণিত বিভিন্ন উপায়ে , অথবা স্লার্ম দ্বারা ডেপ্লয় করা ইমেজটি কাস্টমাইজ করে আপনি আপনার স্লার্ম ক্লাস্টারে সফটওয়্যার ইনস্টল করতে পারেন। বর্তমানে স্লার্ম একটি SchedMD-প্রদত্ত ভিএম ইমেজ ডেপ্লয় করে, যা গুগল ক্লাউড এইচপিসি ভিএম ইমেজের উপর ভিত্তি করে তৈরি এবং এর উপরে স্লার্ম ইনস্টল করা থাকে।

আপনার নিজের ইমেজ ব্যবহার করার জন্য, tfvars ফাইলে তালিকাভুক্ত পাবলিক SchedMD VM ইমেজের উপর ভিত্তি করে আপনার নিজস্ব কনফিগারেশন দিয়ে একটি ইমেজ তৈরি করুন। এরপর, tfvars ফাইলে নির্দিষ্ট করা ইমেজ URI-টি আপনার নিজের ইমেজ দিয়ে প্রতিস্থাপন করুন এবং পরিবর্তনটি পরীক্ষা করে দেখুন।

সমস্যা সমাধান

এই কোডল্যাবটি জুড়ে, অনুগ্রহ করে Slurm-GCP রিপোজিটরির ReadMe-এর ট্রাবলশুটিং অংশটি দেখুন।

সবচেয়ে সাধারণ সমস্যাগুলো হলো tfvars ফাইল কনফিগার করার সময় করা ভুল এবং কোটার সীমাবদ্ধতা। এই কোডল্যাবটি একজন নতুন ব্যবহারকারীর স্ট্যান্ডার্ড কোটা বরাদ্দ এবং তার প্রাপ্ত $300 ফ্রি ক্রেডিটের মধ্যে চালানোর জন্য ডিজাইন করা হয়েছে। যদি VM তৈরি করার প্রচেষ্টা ব্যর্থ হয়, তাহলে API ত্রুটি পরীক্ষা করার জন্য কন্ট্রোলার নোডের /var/log/slurm/resume.log ফাইলটি দেখুন।

৪. কনফিগারেশন স্থাপন এবং যাচাই করা

কনফিগারেশনটি স্থাপন করুন

ক্লাউড শেল সেশনে, 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 > VM Instances নির্বাচন করুন।

d5832bdd527794ed.png

আপনি একটি কন্ট্রোলার এবং একটি লগইন ভিএম ইনস্ট্যান্স তালিকাভুক্ত দেখতে পাবেন:

7a1fc9603758d58d.png

ভিএম ইনস্ট্যান্সের অধীনে, টেরাফর্ম দ্বারা তৈরি করা দুটি ভার্চুয়াল মেশিন ইনস্ট্যান্স পর্যালোচনা করুন।

আপনি `cluster_name` ফিল্ডটি পরিবর্তন করলে নামগুলো ভিন্ন হবে।

  • জি১-কন্ট্রোলার
  • g1-লগইন0

৫. স্লার্ম ক্লাস্টারে লগইন করুন

স্লার্ম ক্লাস্টারে প্রবেশ করুন

আপনার কোড এডিটর/ক্লাউড শেল ট্যাবে ফিরে যান। আপনার ইনস্ট্যান্সে লগইন করার জন্য নিম্নলিখিত কমান্ডটি চালান, এখানে <ZONE> এর পরিবর্তে g1-login0 নোডের জোনটি বসান (এটি us-central1-b হওয়া উচিত):

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

এই কমান্ডটি আপনাকে g1-login0 ভার্চুয়াল মেশিনে লগ ইন করাবে।

লগইন নোডে সহজে প্রবেশ করার আরেকটি পদ্ধতি হলো, ভিএম ইনস্ট্যান্সেস পৃষ্ঠায় থাকা g1-login0 ভিএম-এর পাশে থাকা "SSH" বোতামটিতে ক্লিক করে একটি 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 চাপুন। যদি পাসফ্রেজ বেছে নিতে বলা হয়, তবে দুইবার এন্টার চেপে জায়গাটি খালি রাখুন।

লগইন করার সময় যদি নিম্নলিখিত বার্তাটি প্রদর্শিত হয়:

*** 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

এখন, আপনার লগইন ভিএম-এ পুনরায় সংযোগ করুন। আপনার ইনস্ট্যান্সে লগইন করতে নিম্নলিখিত কমান্ডটি চালান, যেখানে <ZONE> এর পরিবর্তে g1-login0 নোডের জোনটি বসান:

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

পূর্বের মতোই, সংযোগ স্থাপন করতে এবং সেটআপের সমস্ত প্রক্রিয়া সম্পূর্ণ হতে আপনাকে এক বা দুই মিনিট অপেক্ষা করতে হতে পারে।

স্লার্ম সিএলআই টুলস পরিভ্রমণ

আপনি এখন আপনার ক্লাস্টারের স্লার্ম লগইন নোডে লগ ইন করেছেন। এই নোডটি ব্যবহারকারী/অ্যাডমিনের পারস্পরিক যোগাযোগ, স্লার্ম জব শিডিউল করা এবং প্রশাসনিক কার্যকলাপের জন্য নির্দিষ্ট।

আপনাকে স্লার্ম কমান্ড লাইনের সাথে পরিচয় করিয়ে দেওয়ার জন্য চলুন কয়েকটি কমান্ড চালানো যাক।

আমাদের ক্লাস্টারের রিসোর্সগুলোর অবস্থা দেখতে sinfo কমান্ডটি চালান:

sinfo

sinfo-এর নমুনা আউটপুট নিচে দেওয়া হলো। sinfo ক্লাস্টারে উপলব্ধ নোডগুলো, সেগুলোর অবস্থা এবং পার্টিশন, প্রাপ্যতা ও নোডগুলোর ওপর আরোপিত কোনো সময়সীমার মতো অন্যান্য তথ্য রিপোর্ট করে।

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

আপনি দেখতে পাচ্ছেন যে, ডিবাগ পার্টিশনের "max_node_count" ১০ দ্বারা নির্ধারিত আমাদের ১০টি নোড "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 জব চালান এবং ক্লাস্টারটি স্কেল করুন

এখন যেহেতু আমাদের স্লার্ম ক্লাস্টারটি চালু হয়ে গেছে, চলুন একটি জব চালিয়ে আমাদের ক্লাস্টারটিকে স্কেল আপ করি।

"sbatch" কমান্ডটি Slurm ব্যাচ কমান্ড এবং স্ক্রিপ্ট চালানোর জন্য ব্যবহৃত হয়। চলুন একটি সাধারণ sbatch স্ক্রিপ্ট চালানো যাক যা আমাদের অটো-স্কেলড VM-গুলোতে "hostname" চালাবে।

g1-login0-এ লগ ইন থাকা অবস্থায়, নিম্নলিখিত কমান্ডটি চালান:

sbatch -N2 --wrap="srun hostname"

এই কমান্ডটি স্লার্ম ব্যাচ কমান্ডটি চালায়। এটি নির্দিষ্ট করে যে "-N" অপশন ব্যবহার করে sbatch দুটি নোড চালাবে। এটি আরও নির্দিষ্ট করে যে, ঐ নোডগুলোর প্রতিটি "–wrap" অপশনে একটি "srun hostname" কমান্ড চালাবে।

ডিফল্টরূপে, 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]

যেহেতু আমাদের কোনো কম্পিউট নোড প্রোভিশন করা ছিল না, তাই স্লার্ম কাজের প্রয়োজনীয়তা অনুযায়ী স্বয়ংক্রিয়ভাবে কম্পিউট ইনস্ট্যান্স তৈরি করবে। এই প্রক্রিয়ার স্বয়ংক্রিয়তার দুটি সুবিধা রয়েছে। প্রথমত, এটি একটি এইচপিসি ক্লাস্টারে সাধারণত প্রয়োজনীয় কাজগুলো দূর করে, যেমন—ম্যানুয়ালি নোড প্রোভিশন করা, সফটওয়্যার কনফিগার করা, ক্লাস্টারে নোডটিকে ইন্টিগ্রেট করা এবং তারপর কাজটি ডেপ্লয় করা। দ্বিতীয়ত, এটি ব্যবহারকারীদের অর্থ সাশ্রয় করতে সাহায্য করে, কারণ নিষ্ক্রিয় ও অব্যবহৃত নোডগুলোকে ধীরে ধীরে স্কেল ডাউন করা হয় যতক্ষণ না পর্যন্ত ন্যূনতম সংখ্যক নোড চালু থাকে।

স্লার্ম ক্লাস্টারটি চালু হচ্ছে কিনা তা দেখতে আপনি 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]

নতুন প্রোভিশন করা নোডগুলো দেখতে আপনি গুগল ক্লাউড কনসোলের ভিএম ইনস্ট্যান্সেস সেকশনটিও দেখতে পারেন। নতুন বরাদ্দ করা নোডগুলোতে জবটি বরাদ্দ হওয়ার আগে, নোডগুলো চালু হতে এবং স্লার্ম (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-তে তালিকাভুক্ত থাকবে না এবং sinfo-এর "alloc" নোডগুলি "idle" অবস্থায় ফিরে আসবে। এক বা দুই মিনিট পর পর, কাজটি সম্পূর্ণ না হওয়া পর্যন্ত পর্যায়ক্রমে "squeue" চালান।

আউটপুট ফাইল slurm-%j.out আপনার NFS-শেয়ার করা /home ফোল্ডারে লেখা হবে এবং এতে হোস্টনেমগুলো থাকবে। আউটপুট ফাইলটি (সাধারণত slurm-2.out) খুলুন বা cat করুন, আউটপুট ফাইলের বিষয়বস্তুতে থাকবে:

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

চমৎকার কাজ, আপনি একটি জব চালিয়েছেন এবং আপনার স্লার্ম ক্লাস্টারকে স্কেল আপ করেছেন!

৭. একটি MPI জব চালান

এখন চলুন আমাদের নোডগুলোতে একটি MPI জব চালাই। g1-login0-তে লগ ইন থাকা অবস্থায়, wget ব্যবহার করে C প্রোগ্রামিং ভাষায় লেখা একটি MPI প্রোগ্রাম ডাউনলোড করুন:

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

OpenMPI টুলস ব্যবহার করার জন্য আপনাকে এই কমান্ডটি চালিয়ে OpenMPI মডিউলগুলো লোড করতে হবে:

module load openmpi

আমরা MPI C কোড কম্পাইল করার জন্য 'mpicc' টুলটি ব্যবহার করব। নিম্নলিখিত কমান্ডটি চালান:

mpicc mpi_hello_world.c -o mpi_hello_world

এটি আমাদের C কোডকে মেশিন কোডে কম্পাইল করে, যাতে আমরা Slurm-এর মাধ্যমে আমাদের ক্লাস্টার জুড়ে কোডটি চালাতে পারি।

এরপর, আপনার পছন্দের টেক্সট এডিটর ব্যবহার করে " helloworld_batch " নামে একটি sbatch স্ক্রিপ্ট তৈরি করুন:

vi helloworld_batch

vi ইনসার্ট মোডে প্রবেশ করতে i টাইপ করুন।

একটি সাধারণ এস-ব্যাচ স্ক্রিপ্ট তৈরি করতে, নিচের লেখাটি ফাইলটিতে কপি ও পেস্ট করুন :

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

srun mpi_hello_world

কোড এডিটর সংরক্ষণ ও প্রস্থান করতে, এস্কেপ চাপুন এবং উদ্ধৃতি চিহ্ন ছাড়া ':wq' টাইপ করুন।

এই স্ক্রিপ্টটি স্লার্ম ব্যাচ এক্সিকিউশন এনভায়রনমেন্ট এবং টাস্কগুলো নির্ধারণ করে। প্রথমে, এক্সিকিউশন এনভায়রনমেন্ট হিসেবে ব্যাশ (bash) নির্ধারণ করা হয়। এরপর, স্ক্রিপ্টটি "#SBATCH" লাইনগুলোর মাধ্যমে স্লার্ম অপশনগুলো নির্ধারণ করে। জবের নাম "hello_world" হিসেবে নির্ধারণ করা হয়েছে।

আউটপুট ফাইলটি "hello_world_%j.out" হিসাবে সেট করা হয়, যেখানে Slurm ফাইলের নামের প্যাটার্ন অনুযায়ী %j-এর জায়গায় জব আইডি বসানো হয়। এই আউটপুট ফাইলটি সেই ডিরেক্টরিতে লেখা হয় যেখান থেকে sbatch স্ক্রিপ্টটি চালানো হয়। আমাদের উদাহরণে, এটি হলো ব্যবহারকারীর /home ফোল্ডার, যা একটি NFS-ভিত্তিক শেয়ার্ড ফাইল সিস্টেম। এটি কম্পিউট নোডগুলোকে প্রয়োজন অনুযায়ী ইনপুট এবং আউটপুট ডেটা শেয়ার করার সুযোগ দেয়। প্রোডাকশন পরিবেশে, ক্লাস্টার অপারেশনের পারফরম্যান্সে প্রভাব এড়ানোর জন্য ওয়ার্কিং স্টোরেজ /home স্টোরেজ থেকে আলাদা হওয়া উচিত।

অবশেষে, এই স্ক্রিপ্টটি যতগুলো নোডে চলবে তার সংখ্যা ২ হিসেবে নির্ধারণ করা হয়েছে।

অপশনগুলো নির্ধারণ করার পর এক্সিকিউটেবল কমান্ডগুলো প্রদান করা হয়। এই স্ক্রিপ্টটি srun কমান্ড ব্যবহার করে mpi_hello_world কোডটি সমান্তরালভাবে চালাবে, যা mpirun কমান্ডের একটি সরাসরি প্রতিস্থাপন।

এরপর sbatch কমান্ড লাইন ব্যবহার করে sbatch স্ক্রিপ্টটি চালান:

sbatch helloworld_batch

sbatch চালালে নির্ধারিত কাজের জন্য একটি জব আইডি পাওয়া যাবে, উদাহরণস্বরূপ:

Submitted batch job 3

এটি দুটি নোড জুড়ে হোস্টনেম কমান্ডটি চালাবে, প্রতিটি নোডে একটি করে টাস্ক চলবে এবং এর আউটপুট 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

৫ মিনিট নিষ্ক্রিয় থাকার পর (যা YAML-এর suspend_time ফিল্ড অথবা slurm.conf-এর SuspendTime ফিল্ড দ্বারা কনফিগার করা যায়), রিসোর্স মুক্ত করার জন্য ডাইনামিকভাবে প্রোভিশন করা কম্পিউট নোডগুলো ডি-অ্যালোকেট করা হবে। আপনি পর্যায়ক্রমে sinfo চালিয়ে এবং ক্লাস্টারের আকার ০-তে নেমে আসতে দেখে এটি যাচাই করতে পারেন।

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

আপনি যে অঞ্চলে ক্লাস্টারটি স্থাপন করেছেন, সেই অঞ্চলের জন্য অনুমোদিত কোটা পর্যন্ত আরও ইনস্ট্যান্স চালু করে বিভিন্ন MPI অ্যাপ্লিকেশন চালানোর চেষ্টা করুন।

৮. উপসংহার

অভিনন্দন, আপনি গুগল ক্লাউড প্ল্যাটফর্মে একটি স্লার্ম ক্লাস্টার তৈরি করেছেন এবং ওয়ার্কলোডের চাহিদা মেটাতে আপনার ক্লাস্টারকে অটো-স্কেল করার জন্য এর সর্বশেষ ফিচারগুলো ব্যবহার করেছেন! আপনি এই মডেলটি ব্যবহার করে যেকোনো ধরনের জব চালাতে পারেন, এবং স্লার্মে নোডগুলোর জন্য শুধু অনুরোধ করার মাধ্যমেই এটি মিনিটের মধ্যে শত শত ইনস্ট্যান্সে স্কেল করতে পারে।

আপনি যদি GCP-তে Slurm ব্যবহার করা শেখা চালিয়ে যেতে চান, তাহলে অবশ্যই " Building Federated HPC Clusters with Slurm " কোডল্যাবটি অনুসরণ করুন। এই কোডল্যাবটি আপনাকে ক্লাউডে দুটি ফেডারেটেড Slurm ক্লাস্টার সেট আপ করার প্রক্রিয়াটি দেখিয়ে দেবে, যা অন-প্রেমিস বা ক্লাউডে একটি মাল্টি-ক্লাস্টার ফেডারেশন কীভাবে অর্জন করা যেতে পারে তার একটি উদাহরণ।

আপনি কি স্লার্মের নতুন জিসিপি-নেটিভ কার্যকারিতা ব্যবহার করে চমৎকার কিছু তৈরি করছেন? কোনো প্রশ্ন আছে? কোনো ফিচারের পরামর্শ দিতে চান? আজই গুগল ক্লাউডের হাই পারফরম্যান্স কম্পিউটিং সলিউশনস ওয়েবসাইটের মাধ্যমে গুগল ক্লাউড টিমের সাথে যোগাযোগ করুন, অথবা আমাদের গুগল ক্লাউড ও স্লার্ম ডিসকাশন গ্রুপে চ্যাট করুন!

টেরাফর্ম ডিপ্লয়মেন্ট পরিষ্কার করুন

স্লার্ম নোড থেকে লগআউট করুন:

exit

ডিপ্লয়মেন্টটি ডিলিট করার আগে অটো-স্কেল হওয়া নোডগুলোকে স্কেল ডাউন হতে দিন। এছাড়াও, আপনি প্রতিটি ইনস্ট্যান্সের জন্য 'gcloud compute instances delete <Instance Name>' কমান্ডটি চালিয়ে, অথবা কনসোল GUI ব্যবহার করে একাধিক নোড সিলেক্ট করে এবং 'Delete' বাটনে ক্লিক করে এই নোডগুলো ম্যানুয়ালি ডিলিট করতে পারেন।

আমাদের কাজ শেষ হয়ে গেলে, g1-login0 থেকে লগ আউট করার পর আপনার Google Cloud Shell থেকে নিম্নলিখিত কমান্ডটি চালিয়ে আপনি সহজেই Terraform deployment-টি পরিষ্কার করে নিতে পারেন:

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

নির্দেশনা দেওয়া হলে, চালিয়ে যাওয়ার জন্য 'yes' টাইপ করুন। এই প্রক্রিয়াটিতে কয়েক মিনিট সময় লাগতে পারে, অনুগ্রহ করে ধৈর্য ধরুন।

প্রকল্পটি মুছে ফেলুন

পরিষ্কার করার জন্য, আমরা কেবল আমাদের প্রজেক্টটি মুছে ফেলি।

  • নেভিগেশন মেনু থেকে IAM ও অ্যাডমিন নির্বাচন করুন।
  • তারপর সাবমেনুতে থাকা সেটিংসে ক্লিক করুন।
  • "ডিলিট প্রজেক্ট" লেখা ট্র্যাশক্যান আইকনটিতে ক্লিক করুন।
  • নির্দেশনাগুলো অনুসরণ করুন।

আমরা যা আলোচনা করেছি

  • টেরাফর্ম ব্যবহার করে জিসিপিতে স্লার্ম কীভাবে ডিপ্লয় করবেন।
  • GCP-তে Slurm ব্যবহার করে কীভাবে একটি জব চালানো যায়।
  • Slurm-এ কীভাবে ক্লাস্টারের তথ্য কোয়েরি করবেন এবং চলমান জবগুলো মনিটর করবেন।
  • নির্দিষ্ট কাজের প্যারামিটার এবং প্রয়োজনীয়তা মেটাতে GCP-তে Slurm ব্যবহার করে কীভাবে নোডগুলিকে অটোস্কেল করা যায়।
  • GCP-তে Slurm ব্যবহার করে কীভাবে MPI অ্যাপ্লিকেশন কম্পাইল এবং রান করতে হয়

স্লার্ম সাপোর্ট খুঁজুন

টেস্টিং বা প্রোডাকশন পরিবেশে এই ইন্টিগ্রেশনগুলি ব্যবহার করার জন্য যদি আপনার সহায়তার প্রয়োজন হয়, তাহলে অনুগ্রহ করে এখানে দেওয়া SchedMD-এর যোগাযোগ পৃষ্ঠার মাধ্যমে সরাসরি তাদের সাথে যোগাযোগ করুন: https://www.schedmd.com/contact.php

আপনি উপলব্ধ সমস্যা সমাধান নির্দেশিকাগুলোও ব্যবহার করতে পারেন:

অবশেষে, আপনি আপনার প্রশ্নটি এখানে পাওয়া Google Cloud & Slurm Discussion Group-এও পোস্ট করতে পারেন: https://groups.google.com/g/google-cloud-slurm-discuss

আরও জানুন

প্রতিক্রিয়া

এই লিঙ্কের মাধ্যমে কোডল্যাবটি সম্পর্কে আপনার মতামত জমা দিন। মতামত জানাতে ৫ মিনিটেরও কম সময় লাগে। ধন্যবাদ!