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 để chạy cụm Slurm trên Google Cloud Platform! Kết thúc lớp học lập trình này, bạn đã hiểu rõ về việc dễ dàng cung cấp và vận hành cụm Slurm 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 khởi chạy trình quản lý tải công việc Slurm trên Compute Engine một cách dễ dàng hơn, cũng như linh hoạt mở rộng cụm hiện có khi bạn cần thêm tài nguyên. Quy trình tích hợp này do các chuyên gia tại SchedMD xây dựng theo các phương pháp hay nhất của Slurm.

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

Giới thiệu về Slurm

a739730a41acff0a.png

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

  1. Giao thức này phân bổ quyền truy cập độc quyền hoặc không độc quyền vào các tài nguyên (tính các nút) cho người dùng trong một khoảng thời gian để họ có thể thực hiện công việc.
  2. Thư viện 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à công việc song song) trên tập hợp các nút được phân bổ.
  3. Phân xử tranh chấp về tài nguyên bằng cách quản lý 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 cụm Slurm bằng Terraform
  • Cách chạy công việc bằng SLURM
  • Cách truy vấn thông tin về cụm và giám sát các công việc đang chạy trong SLURM
  • Cách tự động điều chỉnh tỷ lệ cho các nút để phù hợp với các thông số và yêu cầu cụ thể về công việc
  • Nơi tìm 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ó thanh toán
  • Trải nghiệm cơ bản với Linux

2. Thiết lập

Thiết lập môi trường theo tiến độ riêng

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 Create Project (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 trong 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 riêng biệ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 tài nguyên của Google Cloud.

Bạn sẽ không mất quá vài đô la khi chạy lớp học lập trình này, nhưng có thể sẽ cao 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 để tài nguyên đó chạy (xem phần "Kết luận" ở cuối tài liệu này). Công cụ tính giá của Google Cloud Platform có tại đây.

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

Google Cloud Shell

Mặc dù bạn 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 trong Đám mây.

Chạy Google Cloud Shell

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

dbad104cef962719.png

Sau đó, hãy nhấp vào Start Cloud Shell:

4e50db320508ac88.pngS

Sẽ chỉ mất một chút thời gian để cấp phép và kết nối với môi trường:

20b0aa80492144d.png.

Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc có dung lượng ổn định 5 GB và chạy trên Google Cloud, giúp nâng cao đáng kể hiệu suất mạng và đơn giản hoá quá trình xác thực. Đa số, nếu không phải là tất cả, công việc của bạn trong phòng thí nghiệm này có thể được thực hiện chỉ bằng một trình duyệt web hoặc một chiếc Chromebook của Google.

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 lệnh:

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

Đầu ra lệnh:

[core]
project = <PROJECT_ID>

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

$ gcloud config set project <PROJECT_ID>

Đầu ra 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 Slurm Terraform 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 Slurm dành cho các tệp Google Cloud Platform Terraform:

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 Slurm Terraform tfvar

Tệp basic.tfvars.example nêu chi tiết cấu hình triển khai, bao gồm cả mạng, phiên bản và bộ nhớ sẽ triển khai. Sao chép tệp này vào một tệp mới, chúng ta sẽ gọi tệp này 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 soạn thảo mã của Cloud Console để xem nội dung tệp:

214f43bba6c917aa.pngS

Xem lại 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. Bạn có thể sử dụng nguyên trạng tất cả các cấu hình khác trong ví dụ này, nhưng sửa đổi các cấu hình đó theo yêu cầu cho trường hợp của mình. Để biết nội dung mô tả chi tiết hơn về các loại 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 của nơi triển khai tài nguyên
  • 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 chi tiết
  • network_name: Mạng đám mây riêng tư ảo để triển khai cụm Slurm
  • subnetwork_name: Mạng con đám mây riêng tư ảo để 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 bên ngoài cho bộ điều khiển Slurm?
  • disable_login_public_ips: Chỉ định IP bên ngoài cho nút đăng nhập của Slurm?
  • disable_compute_login_ips: Chỉ định IP bên 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: Loại thực thể của nút điều khiển
  • controller_image::Hình ảnh GCP dùng để tạo phiên bản bộ điều khiển Slurm
  • controller_disk_type: Loại đĩa khởi động của thực thể tay điều khiển
  • controller_disk_size_gb: Kích thước của ổ đĩa khởi động của thực thể bộ điều khiển
  • controller_labels:(Các) nhãn cần đính kèm vào phiên bản bộ điều khiển
  • controller_service_account: Tài khoản dịch vụ được sử dụng trên thực thể đơn vị điều khiển
  • controller_scopes: Phạm vi truy cập của thực thể tay điều khiển
  • cloudsql: Máy chủ Google CloudSQL để 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ể tay điều khiển
  • server_ip: IP máy chủ CloudSQL
  • người dùng: Tên người dùng CloudSQL
  • password (mật khẩu) của CloudSQL
  • db_name: Tên cơ sở dữ liệu CloudSQL
  • controller_secondary_disk: Thêm ổ đĩa phụ để lưu trữ 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 để sử dụng cho phiên bản bộ điều khiển. Mọi trường điện toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu bạn chỉ định filter_image, hình ảnh đó sẽ ghi đè lên hình ảnh trong mẫu thực thể.
  • login_machine_type: Nút đăng nhập (có thể truy cập bằng SSH) loại thực thể
  • login_image: Hình ảnh GCP dùng để tạo phiên bản đă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 của thực thể đăng nhập
  • login_labels:(Các) nhãn cần đính kèm vào phiên bản đăng nhập
  • login_node_count: Số nút đăng nhập cần tạo
  • login_node_service_account: Tài khoản dịch vụ được sử 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 phiên bản GCP để sử dụng cho phiên bản đăng nhập. Mọi trường điện toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu chỉ định hình ảnh_đăng nhập, hình ảnh đó sẽ ghi đè hình ảnh trong mẫu thực thể.
  • network_storage: Bộ nhớ mạng để gắn kết trên tất cả các nút. Các trường sẽ được thêm trực tiếp vào thẻ fstab. Có thể lặp lại cho các giá đỡ khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên thiết bị 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 kết (ví dụ: mặc định,_netdev)
  • login_network_storage: Bộ nhớ mạng sẽ gắn trên nút đăng nhập và nút đ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 giá đỡ khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên thiết bị 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 kết (ví dụ: mặc định,_netdev)
  • compute_node_service_account: Tài khoản dịch vụ được sử dụng trên(các) thực thể điện toán
  • compute_node_scopes: Phạm vi truy cập của các thực thể điện toán
  • phân vùng: Cấu hình phân vùng Slurm. Có thể lặp lại để phân vùng bổ sung.
  • name: Tên phân vùng
  • machine_type: Loại thực thể của(các) nút điện toán
  • static_node_count: Số nút điện toán luôn bật
  • max_node_count: Tổng số nút điện toán tối đa được phép – tối đa 64 nghìn nút
  • 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: Tính toán loại máy nút hình ảnh
  • 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 thực thể điện toán
  • compute_labels:(Các) nhãn cần đính kèm vào phiên bản điện toán
  • cpu_platform: Cần có nền tảng CPU tối thiểu cho tất cả các nút điện toán
  • gpu_count: Số 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 thực thể của phân vùng
  • network_storage: Bộ nhớ mạng sẽ được gắn trên tất cả các nút điện toán trong phân vùng. Các trường sẽ được thêm trực tiếp vào thẻ fstab. Có thể lặp lại cho các giá đỡ khác.
  • server_ip: IP của máy chủ lưu trữ
  • remote_mount: Tên thiết bị 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 thực thể này có phải là thực thể có thể giành trước không?
  • vpc_subnet: Mạng con đám mây riêng tư ảo để triển khai phân vùng Slurm vào
  • độc quyền: Bật tính năng Slurm để phân bổ toàn bộ các nút cho các công việc
  • enable_placement::Bật chính sách vị trí, trong đó các thực thể sẽ được đặt gần nhau để giảm độ trễ mạng giữa các thực thể.
  • 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 hàng
  • regional_policy::Nếu thuộc tính khu vực có dung lượng là đúng, thì chính sách này sẽ xác định những khu vực nên sử dụng và những khu vực không được sử dụng ở khu vực đó
  • Instance_template::Mẫu thực thể GCP để dùng cho các thực thể điện toán. Mọi trường điện toán được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ: nếu được chỉ định, hình ảnh sẽ thay thế hình ảnh trong mẫu thực thể.

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 phần "Cài đặt ứng dụng trong một cụm Slurm trên Compute Engine" hoặc tuỳ chỉnh hình ảnh do Slurm triển khai. Hiện tại, Slurm đang triển khai 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, trong đó 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 liệt kê 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 tra sự thay đổi.

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 mục Khắc phục sự cố trong ReadMe của kho lưu trữ Slurm-GCP.

Các vấn đề thường gặp nhất là mắc lỗi khi định cấu hình tệp tfvars và các hạn chế đối với 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 dành cho người dùng mới và trong khoản tín dụng miễn phí trị giá 300 đô la Mỹ mà người dùng mới nhận được. Nếu bạn không thể tạo máy ảo, hãy kiểm tra tệp /var/log/slurm/Tiếp tục.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 trong 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 thao tác được mô tả, dựa trên cấu hình đã 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 có thể mất vài phút để hoàn thành, vì vậy hãy 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 > (Công cụ tính toán) > Thực thể máy ảo.

d5832bdd527794ed.png

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

7a1fc9603758d58d.png.

Trong phần Phiên bản máy ảo, hãy xem hai phiên bản máy ảo do Terraform tạo.

Các tên này sẽ khác nếu bạn sửa đổi trường cluster_name.

  • bộ điều khiển g1
  • 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 soạn thảo mã/Cloud Shell. Chạy lệnh sau để đăng nhập vào phiên bản của bạn, thay <ZONE> cho 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ẽ giúp bạn đăng nhập vào máy ảo g1-login0.

Một phương pháp khác để dễ dàng truy cập 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 Phiên bản máy ảo để mở thẻ mới có kết nối SSH.

8c373a87d13620f7.pngS

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 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 đăng nhập:

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

Chờ và không tiếp tục với phòng thí nghiệm cho đến khi bạn thấy thông báo này (khoảng 5 phút):

*** Slurm login setup complete ***

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 phòng thí nghiệm. Để làm việc này, hãy nhấn Ctrl + C để kết thúc việc cần làm.

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

exit

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

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

Giống 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à mọi bước thiết lập đều hoàn tất.

Tham quan các công cụ Slurm CLI

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ên lịch công việc trong 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 dòng lệnh Slurm.

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

sinfo

Kết quả mẫu về sinfo xuất hiện bên dưới. sinfo báo cáo các nút có sẵn trong cụm, trạng thái của các nút đó và các 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 chỉ định bởi "max_node_count" của phân vùng gỡ lỗi 10, được đánh dấu là "không hoạt động~" (nút này đang ở chế độ rảnh và không phân bổ, sẵn sàng để vận hành).

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

squeue

Kết quả dự kiến của hàng đợi sẽ xuất hiện bên dưới. hàng đợi 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 từng mã 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ông việc được giao, tên công việc, người dùng bắt đầu công việc, trạng thái công việc, thời gian thực hiện công việc theo đồng hồ treo tường và các nút được phân bổ 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 trống.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

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

Hãy chạy một công việc để chúng ta có thể xem Slurm hoạt động và nhận một công việc trong hàng đợi của chúng ta!

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

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

Bây giờ, chúng ta đã chạy cụm Slurm, hãy chạy một công việc và mở rộng cụm.

"Gói" dùng để chạy tập lệnh và lệnh theo lô Slurm. Hãy chạy một tập lệnh lô đơn giản sẽ chạy "tên máy chủ" trên các máy ảo được tự động điều chỉnh tỷ lệ.

Sau 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 lô Slurm. Phương thức này chỉ định rằng sbatch sẽ chạy 2 nút có giá trị "-N" . Đoạn mã này cũng chỉ định rằng mỗi nút trong số đó sẽ chạy một "chạy tên máy chủ" trong lệnh "–wrap" .

Theo mặc định, sbatch sẽ ghi đầu ra vào "slurm-%j.out" trong thư mục đang hoạt động, lệnh sẽ chạy từ đó, trong đó %j được thay thế cho ID công việc theo Mẫu tên tệp Slurm. Trong ví dụ này, sbatch đang được 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 điện 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ớ đang hoạt động 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 của cụm. Bạn có thể chỉ định các giá đỡ bộ nhớ riêng trong tệp tfvars thuộc "network_storage" .

Sau khi thực thi tập lệnh sBatch bằng dòng lệnh sbatch, tập lệnh sẽ trả về Mã công việc cho công việc đã lên lịch, 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ư 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ư dưới đây:

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 cung cấp nút điện toán nào, nên Slurm sẽ tự động tạo các phiên bản điện toán theo yêu cầu công việc. Bản chất tự động của quy trình này mang lại hai lợi ích. Đầu tiên, tính năng này loại bỏ công việc thường phải thực hiện trong cụm HPC gồm các nút cấp phép 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 lệnh. Thứ hai, giải pháp này cho phép người dùng tiết kiệm tiền vì các nút ở trạng thái rảnh, không sử dụng được thu nhỏ cho đến khi số nút tối thiểu được chạy.

Bạn có thể thực thi lệnh sinfo để xem cụm Slurm xuất hiện:

sinfo

Thao tác này sẽ hiển thị các nút được liệt kê trong hàng đợi trong "alloc#" trạng thái, nghĩa 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 Google Cloud Console để xem các nút mới được cấp phép. Sẽ mất vài phút để xoay vò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 thực thể máy ảo của bạn sẽ sớm có dạng như sau:

9997efff595f1e.png.

Khi các nút đang chạy công việc, các thực thể sẽ di chuyển sang một "phân bổ" trạng thái, 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 được liệt kê trong hàng đợi và cột "phân bổ" các nút trong sinfo sẽ trở về trạng thái "idle" trạng thái. Chạy "hàng đợi" đị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 NFS-shared /home của bạn và sẽ chứa tên máy chủ. Mở hoặc kiểm tra 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 cụm Slurm của mình!

7. Chạy tác vụ MPI

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

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 tôi sẽ dùng "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 thành mã máy để chúng ta có thể chạy mã trên cụm thông qua Slurm.

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

vi helloworld_batch

Nhập i để vào chế độ chèn vi.

Sao chép và dán văn bản sau đây vào tệp để tạo một tập lệnh lô đơ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 khỏi trình soạn thảo mã bằng cách nhấn phím Escape rồi nhập ":wq" mà không có dấu ngoặc kép.

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

Tệp đầu ra được đặt là "hello_world_%j.out" trong đó %j được thay thế cho 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 lô đang chạy. Trong ví dụ này, đây là 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. Điều này cho phép các nút điện 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ớ đang hoạt động 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 của cụm.

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

Sau khi các tuỳ chọn được xác định, các lệnh có thể thực thi sẽ được cung cấp. Tập lệnh này sẽ chạy mã mpi_hello_world theo cách song song bằng cách sử dụng lệnh srun. Lệnh này thay thế cho lệnh mpirun.

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

sbatch helloworld_batch

Việc chạy sLô sẽ trả về Mã công việc cho công việc đã lên lịch, 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 kết quả ra tệp hello_world-3.out.

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

Theo dõi hàng đợi cho đến khi công việc hoàn tất và không còn xuất hiện:

squeue

Sau khi hoàn tất, mở hoặc quét tệp hello_world-3.out và xác nhận tệp đã 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 khi không hoạt động trong 5 phút (có thể định cấu hình bằng trườngSuspend_time của YAML hoặc trường SuspendTime của slurm.conf), các nút điện toán được cấp phép động sẽ bị 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 về 0:

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

Hãy thử tạo thêm nhiều thực thể, tối đa là Hạn mức cho phép tại khu vực bạn triển khai cụm, cũng như chạy nhiều ứng dụng MPI.

8. Kết luận

Xin 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 để tự động điều chỉnh cụm nhằm đáp ứng nhu cầu về tải công việc! Bạn có thể sử dụng mô hình này để chạy mọi công việc khác nhau và nó có thể mở rộng thành hàng trăm thực thể chỉ trong vài phút chỉ bằng cách 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 " Xây dựng cụm HPC liên kết bằng Slurm" lớp học lập trình này. Lớp học lập trình này sẽ hướng dẫn bạn thiết lập 2 cụm Slurm liên kết trên đám mây để thể hiện cách bạn có thể liên kết nhiều cụm, dù là tại cơ sở riêng hay trên đám mây.

Bạn có đang xây dựng một tính năng thú vị bằng chức năng mới có trong GCP không? Bạn có câu hỏi? 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 về 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 tại Google Cloud và Nhóm thảo luận Slurm!

Dọn dẹp việc triển khai Terraform

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

exit

Cho phép mọi nút tự động điều chỉnh tỷ lệ thu nhỏ trước khi xoá phiên bản 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 Computeinstance xoá <Instance Name>" cho từng phiên bản hoặc bằng cách sử dụng GUI 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 quy trình triển khai Terraform sau khi chúng ta hoàn tất bằng cách thực thi lệnh sau từ 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, xin hãy kiên nhẫn.

Xoá dự án

Để dọn dẹp, chúng ta chỉ cần xoá dự án của mình.

  • Trong trình đơn điều hướng, hãy chọn IAM và Bảng điều khiển dành cho quản trị viên
  • Sau đó nhấp vào cài đặt trong trình đơn phụ
  • Nhấp vào biểu tượng thùng rác có nội dung "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 công việc bằng Slurm trên GCP.
  • Cách truy vấn thông tin về cụm và giám sát các công việc đang chạy trong Slurm.
  • Cách tự động điều chỉnh tỷ lệ cho các nút bằng Slurm trên GCP để phù hợp với các thông số và yêu cầu cụ thể về công việc.
  • Cách biên dịch và chạy ứng dụng MPI trên Slurm trên GCP.

Tìm hỗ trợ về cụm từ Slurm

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

Bạn cũng có thể tham khảo các 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 lên Google Cloud và Nhóm thảo luận Slurm có 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 thông qua đường liên kết này. Bạn sẽ mất chưa tới 5 phút để hoàn tất quá trình phản hồi. Xin cảm ơn!