Triển khai cụm HPC tự động điều chỉnh tỷ lệ bằng Slurm

1. Tổng quan

Chào mừng bạn đến với Lớp học lập trình của Google về cách chạy một cụm Slurm trên Google Cloud Platform! Khi kết thúc lớp học lập trình này, bạn sẽ hiểu rõ về sự dễ dàng trong việc cung cấp và vận hành một cụm Slurm có khả năng tự động cấp tài nguyên bổ sung.

c16fa310c142ac6f.png

Google Cloud đã hợp tác với SchedMD để phát hành một bộ công cụ giúp bạn dễ dàng chạy trình quản lý tải Slurm trên Compute Engine và mở rộng cụm hiện có một cách linh động khi cần thêm tài nguyên. Nhóm chuyên gia tại SchedMD đã xây dựng quy trình tích hợp này theo các phương pháp hay nhất của Slurm.

Nếu bạn dự định sử dụng các tính năng tích hợp Slurm trên Google Cloud Platform hoặc nếu bạn có thắc mắc, vui lòng cân nhắc tham gia Nhóm thảo luận cộng đồng Google Cloud và Slurm của chúng tôi!

Giới thiệu về Slurm

a739730a41acff0a.png

Sơ đồ kiến trúc cơ bản của một Cụm Slurm độc lập trong Google Cloud Platform.

Slurm là một trong những trình quản lý khối lượng công việc hàng đầu cho các cụm HPC trên toàn thế giới. Slurm cung cấp một hệ thống quản lý tải công việc và lập lịch công việc kháng lỗi, có khả năng mở rộng cao và là nguồn mở cho các cụm Linux nhỏ và lớn. Slurm không yêu cầu sửa đổi kernel để hoạt động và tương đối độc lập. Là một trình quản lý khối lượng công việc của cụm, Slurm có 3 chức năng chính:

  1. Nó phân bổ quyền truy cập độc quyền hoặc không độc quyền vào tài nguyên (nút tính toán) cho người dùng trong một khoảng thời gian nhất định để họ có thể thực hiện công việc.
  2. Nền tảng này cung cấp một khung để bắt đầu, thực thi và giám sát công việc (thường là một công việc song song) trên tập hợp các nút được phân bổ.
  3. Nó phân xử tranh chấp về tài nguyên bằng cách quản lý một hàng đợi công việc đang chờ xử lý.

Kiến thức bạn sẽ học được

  • Cách thiết lập một cụm Slurm bằng Terraform
  • Cách chạy một công việc bằng SLURM
  • Cách truy vấn thông tin cụm và theo dõi các công việc đang chạy trong SLURM
  • Cách tự động mở rộng quy mô các nút để đáp ứng các yêu cầu và thông số cụ thể của công việc
  • Nơi tìm sự trợ giúp về Slurm

Điều kiện tiên quyết

  • Tài khoản Google Cloud Platform và một Dự án có tính năng Thanh toán
  • Trải nghiệm Linux cơ bản

2. Thiết lập

Thiết lập môi trường theo tốc độ của riêng bạn

Tạo một dự án

Nếu chưa có Tài khoản Google (Gmail hoặc G Suite), bạn phải tạo một tài khoản. Đăng nhập vào Bảng điều khiển Google Cloud Platform ( console.cloud.google.com) rồi mở trang Quản lý tài nguyên:

359c06e07e6d699f.png

Nhấp vào Tạo dự án.

25c23d651abb837b.png

Nhập tên dự án. Ghi nhớ mã dự án (được đánh dấu bằng màu đỏ trong ảnh chụp màn hình ở trên). Mã dự án phải là một tên riêng biệt trên tất cả các dự án trên Google Cloud. Nếu tên dự án của bạn không phải là tên duy nhất, Google Cloud sẽ tạo một mã dự án ngẫu nhiên dựa trên tên dự án.

Tiếp theo, bạn cần bật tính năng thanh toán trong Developers Console để sử dụng các tài nguyên của Google Cloud.

Việc thực hiện lớp học lập trình này sẽ không tốn của bạn quá vài đô la, nhưng có thể tốn nhiều hơn nếu bạn quyết định sử dụng nhiều tài nguyên hơn hoặc nếu bạn để các tài nguyên đó chạy (xem phần "Kết luận" ở cuối tài liệu này). Bạn có thể truy cập vào công cụ tính giá của Google Cloud Platform tại đây.

Người dùng mới của Google Cloud Platform đủ điều kiện dùng thử miễn phí trị giá 300 USD.

Google Cloud Shell

Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, chúng ta sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trên đám mây.

Khởi chạy Google Cloud Shell

Trên Bảng điều khiển GCP, hãy nhấp vào biểu tượng Cloud Shell trên thanh công cụ ở trên cùng bên phải:

dbad104cef962719.png

Sau đó, hãy nhấp vào Start Cloud Shell (Bắt đầu Cloud Shell):

4e50db320508ac88.png

Quá trình cung cấp và kết nối với môi trường chỉ mất vài phút:

20b0aa80492144d.png

Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trên Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và đơn giản hoá quy trình xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong phòng thí nghiệm này chỉ bằng một trình duyệt web hoặc Google Chromebook.

Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành PROJECT_ID:

$ gcloud auth list

Đầu ra của lệnh:

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

Đầu ra của lệnh:

[core]
project = <PROJECT_ID>

Nếu mã dự án chưa được đặt chính xác, bạn có thể đặt mã dự án bằng lệnh sau:

$ gcloud config set project <PROJECT_ID>

Đầu ra của lệnh:

Updated property [core/project].

3. Chuẩn bị và xem xét cấu hình Slurm Terraform

Tải Cấu hình Terraform của Slurm xuống

Trong phiên Cloud Shell, hãy thực thi lệnh sau để sao chép (tải xuống) kho lưu trữ Git chứa các tệp Terraform của Slurm cho Google Cloud Platform:

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

Chuyển sang thư mục cấu hình triển khai Slurm bằng cách thực thi lệnh sau:

cd slurm-gcp

Định cấu hình tfvars Terraform của Slurm

Tệp basic.tfvars.example nêu chi tiết cấu hình của quá trình triển khai, bao gồm cả mạng, các phiên bản và bộ nhớ cần triển khai. Sao chép tệp này vào một tệp mới (chúng ta sẽ gọi là "tệp tfvars"), sau đó chỉnh sửa nếu cần.

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

Trong phiên Cloud Shell, hãy mở tệp tfvars basic.tfvars. Bạn có thể sử dụng trình chỉnh sửa dòng lệnh mà mình muốn (vi, nano, emacs, v.v.) hoặc sử dụng Trình chỉnh sửa mã của Cloud Console để xem nội dung tệp:

214f43bba6c917aa.png

Xem nội dung của tệp 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"
]

Trong tệp tfvars này, có một số trường để định cấu hình. Trường duy nhất bạn phải định cấu hình là project (dự án). Bạn có thể sử dụng tất cả các cấu hình khác trong ví dụ này mà không cần chỉnh sửa, nhưng hãy sửa đổi chúng nếu cần cho phù hợp với tình huống của bạn. Để biết nội dung mô tả chi tiết hơn về các lựa chọn cấu hình, hãy xem tại đây.

  • cluster_name: Tên của cụm Slurm
  • project: Mã dự án trên Google Cloud cho nơi các tài nguyên sẽ được triển khai
  • zone: Vùng Google Cloud sẽ chứa bộ điều khiển và các phiên bản đăng nhập của cụm này – Thông tin khác
  • network_name: Mạng Virtual Private Cloud để triển khai cụm Slurm vào
  • subnetwork_name: Mạng con Virtual Private Cloud để triển khai cụm Slurm vào
  • shared_vpc_host_project: Mạng VPC dùng chung để triển khai cụm Slurm vào
  • disable_controller_public_ips: Chỉ định IP ngoài cho bộ điều khiển Slurm?
  • disable_login_public_ips: Chỉ định IP ngoài cho nút đăng nhập Slurm?
  • disable_compute_login_ips: Chỉ định IP ngoài cho nút đăng nhập Slurm?
  • suspend_time: Thời gian chờ sau khi một nút ở trạng thái rảnh trước khi tạm ngưng nút
  • controller_machine_type: Nút bộ điều khiển loại phiên bản
  • controller_image: Hình ảnh GCP dùng để tạo thực thể bộ điều khiển Slurm
  • controller_disk_type: Loại ổ đĩa khởi động của thực thể bộ điều khiển
  • controller_disk_size_gb: Kích thước của ổ đĩa khởi động phiên bản bộ điều khiển
  • controller_labels:(Các) nhãn cần đính kèm vào thực thể bộ điều khiển
  • controller_service_account: Tài khoản dịch vụ sẽ được dùng trên phiên bản bộ điều khiển
  • controller_scopes: Phạm vi truy cập của thực thể bộ điều khiển
  • cloudsql: Máy chủ Google CloudSQL sẽ dùng làm cơ sở dữ liệu Slurm thay vì lưu trữ cơ sở dữ liệu trên thực thể bộ điều khiển
  • server_ip: IP máy chủ CloudSQL
  • user: Tên người dùng CloudSQL
  • password: Mật khẩu CloudSQL
  • db_name: Tên cơ sở dữ liệu CloudSQL
  • controller_secondary_disk: Thêm một ổ đĩa phụ cho bộ nhớ máy chủ NFS?
  • controller_secondary_disk_type: Loại ổ đĩa phụ của bộ điều khiển
  • controller_secondary_disk_size_gb: Kích thước của ổ đĩa phụ của bộ điều khiển
  • controller_instance_template: Mẫu thực thể GCP để dùng cho thực thể bộ điều khiển. Mọi trường tính toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu bạn chỉ định controller_image, thì giá trị này sẽ ghi đè hình ảnh trong mẫu phiên bản.
  • login_machine_type: Nút đăng nhập (có thể truy cập bằng SSH) loại máy
  • login_image: Hình ảnh GCP dùng để tạo thực thể đăng nhập Slurm
  • login_disk_type: Loại ổ đĩa khởi động của thực thể đăng nhập
  • login_disk_size_gb: Kích thước của ổ đĩa khởi động thực thể đăng nhập
  • login_labels:(Các) nhãn cần đính kèm vào thực thể đăng nhập
  • login_node_count: Số lượng nút đăng nhập cần tạo
  • login_node_service_account: Tài khoản dịch vụ sẽ được dùng trên(các) thực thể đăng nhập
  • login_node_scopes: Phạm vi truy cập của thực thể đăng nhập
  • login_instance_template: Mẫu thực thể GCP để sử dụng cho thực thể đăng nhập. Mọi trường tính toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu bạn chỉ định login_image, thì giá trị này sẽ ghi đè hình ảnh trong mẫu phiên bản.
  • network_storage: Bộ nhớ mạng để gắn trên tất cả các nút. Các trường sẽ được thêm trực tiếp vào fstab. Có thể lặp lại cho các điểm gắn kết khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên điểm gắn kết bộ nhớ (tên hệ thống tệp)
  • local_mount: Thư mục gắn kết cục bộ
  • fs_type: Loại hệ thống tệp (NFS, CIFS, Lustre, GCSFuse được cài đặt tự động)
  • mount_options: Các lựa chọn gắn (ví dụ: defaults,_netdev)
  • login_network_storage: Bộ nhớ mạng để gắn trên các nút đăng nhập và nút bộ điều khiển. NFS, CIFS, Lustre và GCSFuse sẽ được cài đặt tự động. Có thể lặp lại cho các điểm gắn kết khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên điểm gắn kết bộ nhớ (tên hệ thống tệp)
  • local_mount: Thư mục gắn kết cục bộ
  • fs_type: Loại hệ thống tệp (NFS, CIFS, Lustre, GCSFuse được cài đặt tự động)
  • mount_options: Các lựa chọn gắn (ví dụ: defaults,_netdev)
  • compute_node_service_account: Tài khoản dịch vụ sẽ được dùng trên(các) phiên bản điện toán
  • compute_node_scopes: Phạm vi truy cập của các phiên bản điện toán
  • phân vùng: Cấu hình phân vùng Slurm. Bạn có thể lặp lại bước này để thêm các phân vùng khác.
  • name: Tên phân vùng
  • machine_type:(Các) nút tính toán loại phiên bản
  • static_node_count: Số lượng nút tính toán luôn bật
  • max_node_count: Số lượng tối đa của tổng số nút tính toán được phép – tối đa 64.000
  • zone: Vùng Google Cloud sẽ chứa các tài nguyên của phân vùng này – Thông tin khác
  • image: Loại máy nút hình ảnh điện toán
  • image_hyperthreads: Bật hoặc tắt tính năng siêu phân luồng trên thực thể
  • compute_disk_type: Loại ổ đĩa khởi động của thực thể điện toán (pd-standard, pd-ssd)
  • compute_disk_size_gb: Kích thước của ổ đĩa khởi động của một thực thể điện toán
  • compute_labels:(Các) nhãn cần đính kèm vào thực thể điện toán
  • cpu_platform: Nền tảng CPU tối thiểu cần thiết cho tất cả các nút tính toán
  • gpu_count: Số lượng GPU cần đính kèm vào mỗi thực thể trong phân vùng
  • gpu_type: Loại GPU để đính kèm vào các phiên bản của phân vùng
  • network_storage: Bộ nhớ mạng để gắn trên tất cả các nút tính toán trong phân vùng. Các trường sẽ được thêm trực tiếp vào fstab. Có thể lặp lại cho các điểm gắn kết khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên điểm gắn kết bộ nhớ (tên hệ thống tệp)
  • local_mount: Thư mục gắn kết cục bộ
  • fs_type: Loại hệ thống tệp (NFS, CIFS, Lustre, GCSFuse được cài đặt tự động)
  • mount_options: Lựa chọn gắn
  • preemptible_bursting: Các phiên bản có phải là phiên bản có thể bị ưu tiên không?
  • vpc_subnet: Mạng con Virtual Private Cloud để triển khai phân vùng Slurm vào
  • exclusive: Cho phép Slurm phân bổ toàn bộ các nút cho công việc
  • enable_placement: Bật chính sách vị trí để các phiên bản sẽ nằm gần nhau nhằm giảm độ trễ mạng giữa các phiên bản.
  • regional_capacity: Cho phép đặt một thực thể ở bất kỳ vùng nào trong khu vực dựa trên tình trạng còn chỗ
  • regional_policy: Nếu regional_capacity là true, thì chính sách này sẽ xác định khu vực cần sử dụng và những khu vực không được sử dụng trong khu vực đó
  • Instance_template: Mẫu thực thể GCP để sử dụng cho các thực thể điện toán. Mọi trường tính toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu bạn chỉ định hình ảnh, thì hình ảnh đó sẽ ghi đè hình ảnh trong mẫu phiên bản.

Cấu hình nâng cao

Nếu muốn, bạn có thể chọn cài đặt các gói và phần mềm bổ sung trong quá trình triển khai cụm. Bạn có thể cài đặt phần mềm trên cụm slurm theo nhiều cách được nêu trong bài viết "Cài đặt ứng dụng trong một cụm Slurm trên Compute Engine" hoặc bằng cách tuỳ chỉnh hình ảnh do Slurm triển khai. Hiện tại, Slurm triển khai một Hình ảnh máy ảo do SchedMD cung cấp dựa trên Hình ảnh máy ảo HPC của Google Cloud, với Slurm được cài đặt trên đó.

Để sử dụng hình ảnh của riêng bạn, hãy tạo một hình ảnh có cấu hình riêng dựa trên Hình ảnh máy ảo SchedMD công khai có trong tệp tfvars. Tiếp theo, hãy thay thế URI hình ảnh được chỉ định trong tệp tfvars bằng hình ảnh của riêng bạn và kiểm thử thay đổi này.

Khắc phục sự cố

Trong suốt lớp học lập trình này, vui lòng tham khảo phần Khắc phục sự cố trong tệp ReadMe của kho lưu trữ Slurm-GCP.

Các vấn đề thường gặp nhất là lỗi khi định cấu hình tệp tfvars và hạn mức. Lớp học lập trình này được thiết kế để chạy trong hạn mức phân bổ tiêu chuẩn của người dùng mới và trong khoản tín dụng miễn phí trị giá 300 USD mà người dùng mới nhận được. Nếu không tạo được máy ảo, hãy kiểm tra tệp /var/log/slurm/resume.log trên nút bộ điều khiển để kiểm tra lỗi API.

4. Triển khai và xác minh cấu hình

Triển khai cấu hình

Trong phiên Cloud Shell, hãy thực thi lệnh sau đây từ thư mục slurm-gcp/tf/example:

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

Bạn sẽ được nhắc chấp nhận các hành động được mô tả, dựa trên cấu hình đã được thiết lập. Nhập "yes" để bắt đầu triển khai. Bạn cũng có thể xem cấu hình sẽ được triển khai bằng cách chạy "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

Thao tác này có thể mất vài phút để hoàn tất, vì vậy vui lòng kiên nhẫn.

Sau khi quá trình triển khai hoàn tất, bạn sẽ thấy kết quả tương tự như sau:

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

Outputs:

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

Xác minh việc tạo thực thể máy ảo

Mở trình đơn điều hướng rồi chọn Compute Engine > Phiên bản máy ảo.

d5832bdd527794ed.png

Bạn sẽ thấy một bộ điều khiển và một thực thể VM đăng nhập được liệt kê:

7a1fc9603758d58d.png

Trong phần VM instances (Các thực thể máy ảo), hãy xem xét 2 thực thể máy ảo mà Terraform đã tạo.

Tên sẽ khác nhau nếu bạn sửa đổi trường cluster_name.

  • g1-controller
  • g1-login0

5. Đăng nhập vào Cụm Slurm

Truy cập vào Cụm Slurm

Quay lại thẻ Trình chỉnh sửa mã/Cloud Shell. Chạy lệnh sau để đăng nhập vào phiên bản của bạn, thay thế <ZONE> bằng vùng của nút g1-login0 (phải là us-central1-b):

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

Lệnh này sẽ đăng nhập bạn vào máy ảo g1-login0.

Một phương pháp khác để dễ dàng truy cập vào nút đăng nhập là nhấp vào nút "SSH" bên cạnh máy ảo g1-login0 trên trang Thực thể máy ảo để mở một thẻ mới có kết nối SSH.

8c373a87d13620f7.png

Nếu đây là lần đầu tiên sử dụng Cloud Shell, bạn có thể thấy một thông báo như thông báo bên dưới yêu cầu bạn tạo khoá 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)?

Nếu có, hãy nhập Y. Nếu được yêu cầu chọn một cụm mật khẩu, hãy để trống bằng cách nhấn Enter hai lần.

Nếu thông báo sau xuất hiện khi bạn đăng nhập:

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

Đợi và không tiếp tục thực hiện bài thực hành cho đến khi bạn thấy thông báo này (khoảng 5 phút):

*** Slurm login setup complete ***

Sau khi thấy thông báo trên, bạn sẽ phải đăng xuất rồi đăng nhập lại vào g1-login0 để tiếp tục thực hành. Để làm như vậy, hãy nhấn tổ hợp phím CTRL + C để kết thúc tác vụ.

Sau đó, hãy thực thi lệnh sau để đăng xuất khỏi phiên bản của bạn:

exit

Bây giờ, hãy kết nối lại với VM đăng nhập. Chạy lệnh sau để đăng nhập vào phiên bản của bạn, thay thế <ZONE> bằng vùng của nút g1-login0:

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

Tương tự như trên, bạn có thể phải đợi một hoặc hai phút trước khi có thể kết nối và hoàn tất mọi khía cạnh của quá trình thiết lập.

Giới thiệu về các công cụ CLI của Slurm

Bạn hiện đã đăng nhập vào nút đăng nhập Slurm của cụm. Đây là nút dành riêng cho hoạt động tương tác của người dùng/quản trị viên, lập lịch cho các công việc Slurm và hoạt động quản trị.

Hãy chạy một vài lệnh để giới thiệu cho bạn về dòng lệnh Slurm.

Thực thi lệnh sinfo để xem trạng thái của các tài nguyên trong cụm:

sinfo

Kết quả mẫu của sinfo xuất hiện bên dưới. sinfo báo cáo các nút có trong cụm, trạng thái của các nút đó và những thông tin khác như phân vùng, khả năng sử dụng và mọi giới hạn thời gian áp dụng cho các nút đó.

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

Bạn có thể thấy 10 nút của chúng tôi, được xác định bởi "max_node_count" (số nút tối đa) là 10 của phân vùng gỡ lỗi, được đánh dấu là "idle~" (nút ở chế độ không hoạt động và chưa được phân bổ, sẵn sàng được khởi động).

Tiếp theo, hãy thực thi lệnh squeue để xem trạng thái của hàng đợi trong cụm:

squeue

Đầu ra dự kiến của squeue xuất hiện bên dưới. squeue báo cáo trạng thái của hàng đợi cho một cụm. Thông tin này bao gồm ID công việc của từng công việc được lên lịch trên cụm, phân vùng được chỉ định cho công việc, tên của công việc, người dùng đã chạy công việc, trạng thái của công việc, thời gian thực mà công việc đã chạy và các nút được phân bổ cho công việc. Chúng tôi không có công việc nào đang chạy, vì vậy nội dung của lệnh này là trống.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

Các lệnh Slurm "srun" và "sbatch" được dùng để chạy các công việc được đưa vào hàng đợi. "srun" chạy các công việc song song và có thể được dùng làm trình bao bọc cho mpirun. "sbatch" được dùng để gửi một lô công việc đến slurm và có thể gọi srun một hoặc nhiều lần trong các cấu hình khác nhau. "sbatch" có thể nhận các tập lệnh hàng loạt hoặc có thể dùng với tuỳ chọn –wrap để chạy toàn bộ công việc qua dòng lệnh.

Hãy chạy một công việc để xem Slurm hoạt động và đưa một công việc vào hàng đợi của chúng ta!

6. Chạy một công việc Slurm và mở rộng quy mô Cụm

Chạy một công việc Slurm và mở rộng quy mô Cụm

Giờ đây, khi cụm Slurm của chúng ta đang chạy, hãy chạy một công việc và mở rộng quy mô cụm.

Lệnh "sbatch" được dùng để chạy các lệnh và tập lệnh hàng loạt của Slurm. Hãy chạy một tập lệnh sbatch đơn giản để chạy "hostname" trên các VM được tự động mở rộng quy mô.

Khi đăng nhập vào g1-login0, hãy chạy lệnh sau:

sbatch -N2 --wrap="srun hostname"

Lệnh này chạy lệnh hàng loạt Slurm. Lệnh này chỉ định rằng sbatch sẽ chạy 2 nút bằng tuỳ chọn "-N". Nó cũng chỉ định rằng mỗi nút trong số đó sẽ chạy lệnh "srun hostname" trong lựa chọn "–wrap".

Theo mặc định, sbatch sẽ ghi đầu ra vào "slurm-%j.out" trong thư mục đang hoạt động mà lệnh được chạy, trong đó %j được thay thế bằng ID công việc theo Mẫu tên tệp Slurm. Trong ví dụ của chúng tôi, sbatch đang chạy từ thư mục /home của người dùng. Đây là một hệ thống tệp dùng chung dựa trên NFS được lưu trữ trên bộ điều khiển theo mặc định. Điều này cho phép các nút tính toán chia sẻ dữ liệu đầu vào và đầu ra nếu muốn. Trong môi trường sản xuất, bộ nhớ làm việc phải tách biệt với bộ nhớ /home để tránh ảnh hưởng đến hiệu suất của các hoạt động trong cụm. Bạn có thể chỉ định các điểm gắn kết bộ nhớ riêng biệt trong tệp tfvars trong các lựa chọn "network_storage".

Sau khi thực thi tập lệnh sbatch bằng dòng lệnh sbatch, tập lệnh này sẽ trả về một ID công việc cho lệnh theo lịch biểu, ví dụ:

Submitted batch job 2

Chúng ta có thể sử dụng ID công việc do lệnh sbatch trả về để theo dõi và quản lý việc thực thi công việc cũng như các tài nguyên. Thực thi lệnh sau để xem hàng đợi công việc Slurm:

squeue

Bạn có thể sẽ thấy công việc mà bạn đã thực hiện được liệt kê như bên dưới:

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]

Vì chúng tôi không có nút tính toán nào được cung cấp, nên Slurm sẽ tự động tạo các phiên bản tính toán theo yêu cầu của công việc. Tính chất tự động của quy trình này mang lại 2 lợi ích. Trước tiên, nó loại bỏ công việc thường cần thiết trong một cụm HPC là cung cấp các nút theo cách thủ công, định cấu hình phần mềm, tích hợp nút vào cụm, sau đó triển khai công việc. Thứ hai, tính năng này giúp người dùng tiết kiệm tiền vì các nút không hoạt động, không dùng đến sẽ được giảm quy mô cho đến khi chạy số lượng nút tối thiểu.

Bạn có thể thực thi lệnh sinfo để xem cụm Slurm đang khởi động:

sinfo

Thao tác này sẽ cho thấy các nút được liệt kê trong squeue ở trạng thái "alloc#", tức là các nút đang được phân bổ:

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]

Bạn cũng có thể kiểm tra phần phiên bản máy ảo trong Bảng điều khiển Google Cloud để xem các nút mới được cung cấp. Sẽ mất vài phút để khởi động các nút và chạy Slurm trước khi công việc được phân bổ cho các nút mới được phân bổ. Danh sách phiên bản VM của bạn sẽ sớm có dạng như sau:

9997efff595f1e.png

Sau khi các nút chạy công việc, các phiên bản sẽ chuyển sang trạng thái "alloc", nghĩa là các công việc được phân bổ cho một công việc:

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]

Sau khi hoàn tất, công việc sẽ không còn xuất hiện trong squeue nữa và các nút "alloc" trong sinfo sẽ trở về trạng thái "idle". Chạy "squeue" định kỳ cho đến khi công việc hoàn tất, sau một hoặc hai phút.

Tệp đầu ra slurm-%j.out sẽ được ghi vào thư mục /home dùng chung trên NFS và sẽ chứa tên máy chủ. Mở hoặc cat tệp đầu ra (thường là slurm-2.out), nội dung của tệp đầu ra sẽ chứa:

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

Tuyệt vời! Bạn đã chạy một công việc và mở rộng quy mô cụm Slurm!

7. Chạy lệnh MPI

Bây giờ, hãy chạy một tác vụ MPI trên các nút của chúng ta. Khi đăng nhập vào g1-login0, hãy dùng wget để tải một chương trình MPI được viết bằng ngôn ngữ lập trình C xuống:

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

Để sử dụng các công cụ OpenMPI, bạn cần tải các mô-đun OpenMPI bằng cách chạy lệnh sau:

module load openmpi

Chúng ta sẽ sử dụng công cụ "mpicc" để biên dịch mã MPI C. Thực thi lệnh sau:

mpicc mpi_hello_world.c -o mpi_hello_world

Thao tác này sẽ biên dịch mã C của chúng ta thành mã máy để chúng ta có thể chạy mã trên cụm thông qua Slurm.

Tiếp theo, hãy sử dụng trình chỉnh sửa văn bản mà bạn muốn để tạo một tập lệnh sbatch có tên là "helloworld_batch":

vi helloworld_batch

Nhập i để chuyển sang chế độ chèn vi.

Sao chép và dán văn bản sau vào tệp để tạo một tập lệnh sbatch đơn giản:

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

srun mpi_hello_world

Lưu và thoát trình soạn thảo mã bằng cách nhấn phím thoát rồi nhập ":wq" (không có dấu ngoặc kép).

Tập lệnh này xác định môi trường và các tác vụ thực thi hàng loạt Slurm. Trước tiên, môi trường thực thi được xác định là bash. Tiếp theo, tập lệnh sẽ xác định các lựa chọn Slurm trước bằng các dòng "#SBATCH". Tên của lệnh là "hello_world".

Tệp đầu ra được đặt là "hello_world_%j.out" trong đó %j được thay thế bằng ID công việc theo Mẫu tên tệp Slurm. Tệp đầu ra này được ghi vào thư mục mà tập lệnh sbatch chạy. Trong ví dụ của chúng tôi, đây là thư mục /home của người dùng, là một hệ thống tệp dùng chung dựa trên NFS. Điều này cho phép các nút tính toán chia sẻ dữ liệu đầu vào và đầu ra nếu muốn. Trong môi trường sản xuất, bộ nhớ làm việc phải tách biệt với bộ nhớ /home để tránh ảnh hưởng đến hiệu suất của các hoạt động trong cụm.

Cuối cùng, số lượng nút mà tập lệnh này sẽ chạy được xác định là 2.

Sau khi xác định các lựa chọn, các lệnh thực thi sẽ được cung cấp. Tập lệnh này sẽ chạy mã mpi_hello_world song song bằng lệnh srun (một lệnh thay thế cho lệnh mpirun).

Sau đó, hãy thực thi tập lệnh sbatch bằng dòng lệnh sbatch:

sbatch helloworld_batch

Việc chạy sbatch sẽ trả về một ID công việc cho lệnh theo lịch biểu, ví dụ:

Submitted batch job 3

Thao tác này sẽ chạy lệnh hostname trên 2 nút, với một tác vụ cho mỗi nút, cũng như in đầu ra vào tệp hello_world-3.out.

Vì chúng ta đã cung cấp 2 nút nên công việc này sẽ chạy nhanh.

Theo dõi squeue cho đến khi tác vụ hoàn tất và không còn xuất hiện trong danh sách:

squeue

Sau khi hoàn tất, hãy mở hoặc cat tệp hello_world-3.out và xác nhận rằng tệp này đã chạy trên 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

Sau 5 phút không hoạt động (có thể định cấu hình bằng trường suspend_time của YAML hoặc trường SuspendTime của slurm.conf), các nút tính toán được cấp phát động sẽ được huỷ phân bổ để giải phóng tài nguyên. Bạn có thể xác thực điều này bằng cách chạy sinfo theo định kỳ và quan sát kích thước cụm giảm xuống 0:

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

Hãy thử tạo thêm các phiên bản, tối đa theo Hạn mức được phép trong vùng mà bạn triển khai cụm và chạy các ứng dụng MPI khác nhau.

8. Kết luận

Chúc mừng bạn đã tạo một cụm Slurm trên Google Cloud Platform và sử dụng các tính năng mới nhất của cụm này để tự động mở rộng quy mô cụm nhằm đáp ứng nhu cầu về khối lượng công việc! Bạn có thể sử dụng mô hình này để chạy nhiều loại công việc và mô hình này có thể mở rộng quy mô lên hàng trăm phiên bản trong vài phút bằng cách chỉ cần yêu cầu các nút trong Slurm.

Nếu bạn muốn tiếp tục tìm hiểu cách sử dụng Slurm trên GCP, hãy nhớ tiếp tục với lớp học lập trình " Xây dựng các cụm HPC liên kết bằng Slurm". Lớp học lập trình này sẽ hướng dẫn bạn cách thiết lập 2 cụm Slurm liên kết trên đám mây để minh hoạ cách bạn có thể đạt được một liên kết nhiều cụm, cho dù là tại chỗ hay trên đám mây.

Bạn có đang xây dựng một thứ gì đó thú vị bằng cách sử dụng chức năng mới của Slurm trên GCP không? Bạn có thắc mắc? Bạn có đề xuất về tính năng? Hãy liên hệ với nhóm Google Cloud ngay hôm nay thông qua trang web Giải pháp điện toán hiệu suất cao của Google Cloud hoặc trò chuyện với chúng tôi trong Nhóm thảo luận về Google Cloud và Slurm!

Dọn dẹp quá trình triển khai Terraform

Đăng xuất khỏi nút slurm:

exit

Cho phép mọi nút được mở rộng tự động giảm quy mô trước khi xoá việc triển khai. Bạn cũng có thể xoá các nút này theo cách thủ công bằng cách chạy "gcloud compute instances delete <Instance Name>" cho từng phiên bản hoặc bằng cách sử dụng GUI của Bảng điều khiển để chọn nhiều nút rồi nhấp vào "Xoá".

Bạn có thể dễ dàng dọn dẹp việc triển khai Terraform sau khi hoàn tất bằng cách thực thi lệnh sau trong Google Cloud Shell, sau khi đăng xuất khỏi g1-login0:

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

Khi được nhắc, hãy nhập yes để tiếp tục. Thao tác này có thể mất vài phút, vui lòng kiên nhẫn chờ đợi.

Xoá dự án

Để dọn dẹp, chúng ta chỉ cần xoá dự án.

  • Trong trình đơn điều hướng, hãy chọn Quản trị và quản lý danh tính và quyền truy cập (IAM)
  • Sau đó, nhấp vào biểu tượng cài đặt trong trình đơn phụ
  • Nhấp vào biểu tượng thùng rác có văn bản "Xoá dự án"
  • Làm theo hướng dẫn trong lời nhắc

Nội dung đã đề cập

  • Cách triển khai Slurm trên GCP bằng Terraform.
  • Cách chạy một công việc bằng Slurm trên GCP.
  • Cách truy vấn thông tin cụm và theo dõi các công việc đang chạy trong Slurm.
  • Cách tự động mở rộng quy mô các nút bằng Slurm trên GCP để đáp ứng các yêu cầu và thông số cụ thể của công việc.
  • Cách biên dịch và chạy các ứng dụng MPI trên Slurm trên GCP.

Tìm thông tin hỗ trợ về Slurm

Nếu bạn cần được hỗ trợ khi sử dụng các tính năng tích hợp này trong môi trường thử nghiệm hoặc môi trường phát hành công khai, vui lòng liên hệ trực tiếp với SchedMD thông qua trang liên hệ của họ tại đây: https://www.schedmd.com/contact.php

Bạn cũng có thể sử dụng Hướng dẫn khắc phục sự cố hiện có:

Cuối cùng, bạn cũng có thể đăng câu hỏi của mình lên Nhóm thảo luận về Google Cloud và Slurm tại đây: https://groups.google.com/g/google-cloud-slurm-discuss

Tìm hiểu thêm

Phản hồi

Vui lòng gửi ý kiến phản hồi về lớp học lập trình này qua đường liên kết này. Bạn chỉ mất chưa đến 5 phút để hoàn thành việc gửi ý kiến phản hồi. Cảm ơn bạn!