Triển khai Cụm HPC Tự động mở rộng quy mô với Slurm

Chào mừng bạn đến với Google Codelab để chạy một cụm Slurm trên Google Cloud Platform! Khi kết thúc chương trình codelab này, bạn sẽ có hiểu biết vững chắc về sự dễ dàng của việc cung cấp và vận hành một cụm Slurm tự động mở rộng quy mô.

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ý khối lượng công việc Slurm trên Compute Engine dễ dàng hơn và mở rộng động cụm hiện có của bạn khi bạn cần thêm tài nguyên. Sự tích hợp này được xây dựng bởi các chuyên gia tại SchedMD theo các phương pháp hay nhất của Slurm .

Nếu bạn đang lên kế hoạch sử dụng tích hợp Slurm trên Google Cloud Platform hoặc nếu bạn có bất kỳ câu hỏi nào, vui lòng xem xét tham gia Nhóm thảo luận cộng đồng Google Cloud & Slurm của chúng tôi!

Về Slurm

a739730a41acff0a.png

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

Slurm là một trong những 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 lập kế hoạch công việc và quản lý khối lượng công việc mã nguồn mở, có khả năng chịu lỗi và có khả năng mở rộng cao cho các cụm Linux lớn và nhỏ. 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 khép kín. Là một người quản lý khối lượng công việc theo cụm, Slurm có ba 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 (các 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ó cung cấp một khuôn khổ để 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ử sự tranh giành tài nguyên bằng cách quản lý một hàng đợi công việc đang chờ xử lý.

Những gì bạn sẽ học

  • Cách thiết lập cụm Slurm bằng Terraform
  • Cách thực hiện công việc bằng SLURM
  • Cách truy vấn thông tin cụm và giám sát các công việc đang chạy trong SLURM
  • Cách sắp xếp tỷ lệ nút tự động để đáp ứng các yêu cầu và thông số công việc cụ thể
  • Tìm trợ giúp với Slurm ở đâu

Đ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 Linux cơ bản

Thiết lập môi trường theo nhịp độ tự

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 ) và 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. Hãy nhớ ID dự án (được đánh dấu màu đỏ trong ảnh chụp màn hình ở trên). ID dự án phải là một tên duy nhất trên tất cả các dự án Google Cloud. Nếu tên dự án của bạn không phải là duy nhất, Google Cloud sẽ tạo một ID 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 Bảng điều khiển dành cho nhà phát triển để sử dụng các tài nguyên của Google Cloud.

Việc chạy qua bảng mã này sẽ không khiến bạn tốn nhiều hơn vài đô la, nhưng có thể 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 để chúng 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ó sẵn tại đây .

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

Google Cloud Shell

Mặc dù Google Cloud có thể được vận hành từ xa từ máy tính xách tay của bạn, nhưng trong bảng mã này, chúng tôi sẽ sử dụng Google Cloud Shell , một môi trường dòng lệnh chạy trong Cloud.

Khởi chạy Google Cloud Shell

Từ 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 đó nhấp vào Bắt đầu Cloud Shell :

4e50db320508ac88.png

Chỉ mất vài phút để cung cấp và kết nối với môi trường:

20b0aa80492144d.png

Máy ảo này được tải với tất cả các công cụ phát triển bạn cần. Nó cung cấp một thư mục chính 5GB liên tục và chạy trên Google Cloud, nâng cao đáng kể hiệu suất mạng và đơn giản hóa việc xác thực. Phần lớn, nếu không phải 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 đơn giản bằng 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 bạn đã được xác thực và dự án đã được đặt thành PROJECT_ID của bạn:

$ 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 ID dự án không được đặt chính xác, bạn có thể đặt nó bằng lệnh sau:

$ gcloud config set project <PROJECT_ID>

Đầu ra lệnh:

Updated property [core/project].

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

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 có chứa tệp Slurm cho 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 hiện lệnh sau:

cd slurm-gcp

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

Tệp basic.tfvars.example nêu chi tiết cấu hình của việc triển khai, bao gồm mạng, các phiên bản và bộ nhớ để triển khai. Sao chép nó vào một tệp mới, mà chúng tôi 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 basic.tfvars . Bạn có thể sử dụng trình chỉnh sửa dòng lệnh ưa thích của mình (vi, nano, emacs, v.v.) hoặc sử dụng Trình chỉnh sửa mã bảng điều khiển đám mây để xem nội dung tệp:

214f43bba6c917aa.png

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 phải được cấu hình là dự án . Tất cả các cấu hình khác trong ví dụ này có thể được sử dụng như hiện tại, nhưng hãy sửa đổi chúng theo yêu cầu cho tình huống của bạn. Để có mô tả chi tiết hơn về các tùy chọn cấu hình, hãy xem tại đây .

  • cluster_name: Tên của cụm Slurm
  • dự án: Google Cloud Project ID cho nơi tài nguyên sẽ được triển khai
  • vùng: Vùng Google Cloud sẽ chứa bộ điều khiển và các trường hợp đăng nhập của cụm này - Thông tin thêm
  • network_name: Mạng đám mây riêng ảo để 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 được chia sẻ để triển khai cụm Slurm vào
  • disable_controller_public_ips: Gán IP bên ngoài cho bộ điều khiển Slurm?
  • disable_login_public_ips: Gán IP bên ngoài cho nút đăng nhập Slurm?
  • disable_compute_login_ips: Gán IP bên ngoài cho nút đăng nhập Slurm?
  • Susan_time: Thời gian chờ sau khi nút không hoạt động trước khi tạm ngừng nút
  • controller_machine_type: Loại phiên bản nút điều khiển
  • controller_image: Hình ảnh GCP được sử dụng để tạo phiên bản trình điều khiển Slurm
  • controller_disk_type: Loại đĩa khởi động phiên bản điều khiển
  • controller_disk_size_gb: Kích thước của đĩa khởi động phiên bản điều khiển
  • controller_labels: (Các) nhãn để đính kèm vào phiên bản controller
  • controller_service_account: Tài khoản dịch vụ được sử dụng trên phiên bản controller
  • controller_scope: Phạm vi truy cập của phiên bản controller
  • cloudql: 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 phiên bản bộ điều khiển
  • server_ip: IP máy chủ CloudSQL
  • người dùng: tên người dùng CloudSQL
  • mật khẩu: Mật khẩu CloudSQL
  • db_name: Tên cơ sở dữ liệu CloudSQL
  • controller_secondary_disk: Thêm một đĩ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 thứ cấp của bộ điều khiển
  • controller_instance_template: Mẫu bản sao GCP để sử dụng cho bản sao bộ điều khiển. Bất kỳ trường tính toán nào được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ. nếu controller_image được chỉ định, nó sẽ ghi đè lên hình ảnh trong mẫu instance.
  • login_machine_type: Loại phiên bản nút đăng nhập (có thể truy cập SSH)
  • login_image: Hình ảnh GCP được sử dụng để tạo phiên bản đăng nhập Slurm
  • login_disk_type: Loại đĩa khởi động phiên bản đăng nhập
  • login_disk_size_gb: Kích thước của đĩa khởi động phiên bản đăng nhập
  • login_labels: (Các) nhãn để đính kèm vào phiên bản đăng nhập
  • login_node_count: Số lượng nút đăng nhập để tạo
  • login_node_service_account: Tài khoản dịch vụ được sử dụng trên (các) trường hợp đăng nhập
  • login_node_scope: Phạm vi truy cập của phiên bản đăng nhập
  • login_instance_template: Mẫu phiên bản GCP để sử dụng cho phiên bản đăng nhập. Bất kỳ trường tính toán nào được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ. nếu login_image được chỉ định, nó sẽ ghi đè lên hình ảnh trong mẫu 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 fstab. Có thể được lặp lại cho các ngàm bổ sung.
  • server_ip: IP máy chủ lưu trữ
  • remote_mount: Tên 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, Luster, GCSFuse được cài đặt tự động)
  • mount_options: Các tùy chọn gắn kết (tức là mặc định, _netdev)
  • login_network_storage: Bộ nhớ mạng để gắn vào các nút đăng nhập và bộ điều khiển. NFS, CIFS, Luster và GCSFuse sẽ được cài đặt tự động. Có thể được lặp lại cho các ngàm bổ sung.
  • server_ip: IP máy chủ lưu trữ
  • remote_mount: Tên 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, Luster, GCSFuse được cài đặt tự động)
  • mount_options: Các tùy chọn gắn kết (tức là mặc định, _netdev)
  • compute_node_service_account: Tài khoản dịch vụ được sử dụng trên (các) phiên bản máy tính
  • compute_node_scope: Phạm vi truy cập của các phiên bản máy tính
  • phân vùng: Cấu hình phân vùng Slurm. Có thể được lặp lại cho các phân vùng bổ sung.
  • name: Tên phân vùng
  • machine_type: Loại phiên bản của (các) nút tính toá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 tổng số nút tính toán được phép - tối đa 64 nghìn
  • vùng: 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
  • hình ảnh: Máy tính loại nút hình ảnh
  • image_hyperthreads: Bật hoặc tắt siêu phân luồng trên phiên bản
  • compute_disk_type : Loại đĩa khởi động phiên bản máy tính (pd-standard, pd-ssd)
  • compute_disk_size_gb: Kích thước của đĩa khởi động phiên bản máy tính
  • compute_labels: (Các) nhãn để đính kèm vào phiên bản compute
  • 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 phiên bản trong phân vùng
  • gpu_type: Loại GPU để gắn vào các phiên bản của phân vùng
  • network_storage: Bộ nhớ mạng để gắn kết trên tất cả các nút máy tính trong phân vùng. Các trường sẽ được thêm trực tiếp vào fstab. Có thể được lặp lại để gắn thêm.
  • server_ip: IP máy chủ lưu trữ
  • remote_mount: Tên 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, Luster, GCSFuse được cài đặt tự động)
  • mount_options: Tùy chọn gắn kết
  • preemptible_dowting: Các trường hợp có phải là các trường hợp được trả trước không?
  • vpc_subnet: Mạng con Virtual Private Cloud để triển khai phân vùng Slurm vào
  • độc quyền: Cho phép Slurm phân bổ toàn bộ các nút cho các công việc
  • enable_placement: Bậtchính sách vị trí trong đó các phiên bản sẽ được đặt gần nhau để có độ trễ mạng thấp giữa các phiên bản.
  • region_capacity: Cho phép đặt một phiên bản vào bất kỳ khu vực nào trong khu vực dựa trên tính khả dụng
  • region_policy: Nếu region_capacity là đúng, thì chính sách này sẽ xác định khu vực nào sẽ sử dụng và bất kỳ khu vực nào trong khu vực đó không được sử dụng
  • Instance_template: Mẫu phiên bản GCP để sử dụng cho các phiên bản máy tính. Bất kỳ trường tính toán nào được chỉ định sẽ ghi đè các thuộc tính mẫu. Ví dụ. nếu hình ảnh được chỉ định, nó sẽ ghi đè lên hình ảnh trong mẫu 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 như một phần của quá trình triển khai cụm. Bạn có thể cài đặt phần mềm trên cụm slurm của mình theo nhiều cách được nêu trong "Cài đặt ứng dụng trong cụm Slurm trên Compute Engine" của chúng tôi hoặc bằng cách tùy chỉnh hình ảnh do Slurm triển khai. Hiện tại Slurm 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 , với Slurm được cài đặt trên đó.

Để sử dụng hình ảnh của riêng bạn, hãy xây dựng một hình ảnh với cấu hình của riêng bạn dựa trên Hình ảnh SchedMD VM công khai được liệt kê trong tệp tfvars. Tiếp theo, 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.

Xử lý sự cố

Trong suốt chương trình codelab này, vui lòng tham khảo phần Khắc phục sự cố của ReadMe của kho lưu trữ Slurm-GCP.

Các vấn đề phổ biến nhất được thấy là sai lầm khi định cấu hình tệp tfvars và các hạn chế về hạn ngạch. Bộ mã này được thiết kế để chạy trong phân bổ hạn ngạch tiêu chuẩn của người dùng mới và trong khoản tín dụng miễn phí 300 đô la mà người dùng mới nhận được. Nếu nỗ lực tạo VM không thành công, 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.

Triển khai cấu hình

Trong phiên Cloud Shell, thực hiện lệnh sau 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 đặt. Nhập " " để 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 "kế hoạch địa hình".

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 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 đầu ra tương tự như:

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 phiên bản VM

Mở menu điều hướng và chọn Compute Engine > VM Instances.

d5832bdd527794ed.png

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

7a1fc9603758d58d.png

Trong phiên bản VM, hãy xem lại hai phiên bản máy ảo đã được tạo bởi Terraform.

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

  • g1-bộ điều khiển
  • g1-login0

Truy cập Cụm Slurm

Quay lại tab Code Editor / Cloud Shell của bạn. Chạy lệnh sau để đăng nhập vào phiên bản của bạn, thay thế <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ẽ đă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 Phiên bản máy ảo để mở một tab mới có kết nối SSH.

8c373a87d13620f7.png

Nếu đây là lần đầu tiên bạn sử dụng cloud shell, bạn có thể thấy thông báo như thông báo bên dưới yêu cầu bạn tạo khóa 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 vậy, 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 bạn thấy thông báo trên, bạn sẽ phải đăng xuất và đăng nhập lại vào g1-login0 để tiếp tục lab. Để làm như vậy, hãy nhấn CTRL + C để kết thúc tác vụ.

Sau đó thực hiện đăng xuất lệnh sau đối với phiên bản của bạn:

exit

Bây giờ, hãy kết nối lại với máy ảo đăng nhập của bạn. Chạy lệnh sau để đăng nhập vào phiên bản của bạn, thay thế <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à tất cả các khía cạnh của thiết lập đã hoàn tất.

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

Bây giờ bạn đã đăng nhập vào nút đăng nhập Slurm của cụm của bạn. Đây là nút dành riêng cho tương tác người dùng / quản trị viên, lên lịch 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 tài nguyên của cụm của chúng tôi:

sinfo

Đầu ra mẫu của 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, tính khả dụng và bất kỳ giới hạn thời gian nào được á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" của phân vùng gỡ lỗi là 10, được đánh dấu là "nhàn rỗi ~" (nút đang ở chế độ nhàn rỗi và không được phân bổ, sẵn sàng được quay).

Tiếp theo, thực hiện lệnh squeue để xem trạng thái của hàng đợi trong cụm của chúng tôi:

squeue

Đầu ra mong đợi của tiếng kêu 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. Điều này bao gồm từng 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 mà công việc được chỉ định, tên của công việc, người dùng đã khởi chạy công việc, trạng thái của công việc, đồng hồ treo tường thời gian công việc đang chạy và các nút mà công việc được phân bổ. Chúng tôi không có bất kỳ 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)

Các lệnh Slurm "srun" và "sbatch" được sử 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 sử dụng như một trình bao bọc cho mpirun. "sbatch" được sử dụng để gửi một công việc hàng loạt để slurm và có thể gọi srun một lần 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ể được sử dụng với tùy 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ể thấy Slurm đang hoạt động và có được một công việc trong hàng đợi của chúng ta!

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 của chúng ta.

Lệnh "sbatch" được sử dụng để chạy các lệnh và tập lệnh hàng loạt Slurm. Hãy chạy một tập lệnh sbatch đơn giản sẽ chạy "tên máy chủ" trên các máy ảo được điều chỉnh tỷ lệ tự động của chúng tôi.

Trong 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. Nó chỉ định rằng sbatch sẽ chạy 2 nút với tùy chọn "-N". Nó cũng chỉ định rằng mỗi nút đó sẽ chạy lệnh "srun hostname" trong tùy chọn "–wrap".

Theo mặc định, sbatch sẽ ghi đầu ra của nó vào "slurm-% j.out" trong thư mục làm việc mà lệnh được 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ụ của chúng tôi, sbatch đang được chạy từ thư mục của người dùng / home, là hệ thống tệp chia sẻ 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 máy tính 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ộ lưu trữ làm việc nên tách biệt với bộ lưu trữ / tại nhà để tránh ảnh hưởng hiệu suất đến các hoạt động của cụm. Các giá đỡ bộ nhớ riêng có thể được chỉ định trong tệp tfvars trong các tùy chọn "network_storage".

Sau khi thực thi tập lệnh sbatch bằng dòng lệnh sbatch, nó sẽ trả về ID 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 được trả về bởi lệnh sbatch để theo dõi và quản lý việc thực hiện công việc và 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 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 có bất kỳ nút máy tính nào được cung cấp, Slurm sẽ tự động tạo các phiên bản máy tính theo yêu cầu công việc. Bản chất tự động của quá trình này có hai lợi ích. Đầu tiên, nó loại bỏ công việc thường được yêu cầu trong một cụm HPC gồm các nút cung cấp thủ công, định cấu hình phần mềm, tích hợp nút vào cụm và sau đó triển khai công việc. Thứ hai, nó cho phép người dùng tiết kiệm tiền vì các nút nhàn rỗi, không sử dụng được thu nhỏ lại cho đến khi số lượng nút tối thiểu đang chạy.

Bạn có thể thực hiện lệnh sinfo để xem cụm Slurm đang quay lên:

sinfo

Điều này sẽ hiển thị các nút được liệt kê trong squeue ở trạng thái "phân bổ #", có nghĩa là các nút đang được cấp phát:

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 VM trong Google Cloud Console để xem các nút mới được cấp phép. Sẽ mất vài phút để xoay các nút và bắt Slurm chạy 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 các phiên bản máy ảo của bạn sẽ sớm giống như sau:

9997efff595f1e.png

Khi các nút đang chạy công việc, các thể hiện sẽ chuyển sang trạng thái "cấp phát", có 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]

Khi một công việc hoàn tất, nó sẽ không còn được liệt kê trong squeue nữa và các nút "phân bổ" trong sinfo sẽ trở lại trạng thái "nhàn rỗi". Chạy "tiếng kêu" theo định kỳ cho đến khi hoàn thành công việc, 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 mở 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 đã điều hành một công việc và nhân rộng cụm Slurm của mình!

Bây giờ chúng ta hãy chạy một công việc MPI trên các nút của chúng ta. Trong 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ẽ sử dụng công cụ "mpicc" để biên dịch mã MPI C. Thực hiện lệnh sau:

mpicc mpi_hello_world.c -o mpi_hello_world

Điều này biên dịch mã C của chúng tôi thành mã máy để chúng tôi có thể chạy mã trên toàn bộ cụm của mình thông qua Slurm.

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

vi helloworld_batch

i để vào 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 khỏi trình soạn thảo mã bằng cách nhấn phím thoát và 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. Đầu 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 tùy chọn Slurm trước bằng các dòng "#SBATCH". 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 sbatch được chạy từ đó. 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 được chia sẻ dựa trên NFS. Điều này cho phép các nút máy tính 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ộ lưu trữ làm việc nên tách biệt với bộ lưu trữ / tại nhà để tránh ảnh hưởng hiệu suất đến 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 được xác định là 2.

Sau khi các tùy chọn được xác định, các lệnh thực thi đượ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, đây là lệnh 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

Chạy sbatch sẽ trả về ID 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 tên máy chủ 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 tôi đã 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 tiếng kêu cho đến khi công việc hoàn thành và không còn được liệt kê:

squeue

Sau khi hoàn thành, hãy mở hoặc mở tệp hello_world-3.out và xác nhận rằng 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 với trường SuspendTtime của YAML hoặc trường SuspendTime của slurm.conf), các nút tính toán được cung cấp động sẽ được hủy phân bổ để giải phóng tài nguyên. Bạn có thể xác nhận điều này bằng cách chạy sinfo định kỳ và quan sát kích thước cụm trở về 0:

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

Hãy thử tạo ra nhiều phiên bản hơn, lên đến Hạn ngạch cho phép của bạn trong khu vực bạn đã triển khai cụm và chạy các ứng dụng MPI khác nhau.

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 của nó để tự động mở rộng cụm của bạn nhằm đáp ứng nhu cầu khối lượng công việc! Bạn có thể sử dụng mô hình này để chạy bất kỳ công việc nào và nó mở rộng thành hàng trăm trường hợp 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 học cách sử dụng Slurm trên GCP, hãy đảm bảo tiếp tục với chương trình codelab " Xây dựng các cụm HPC liên kết với Slurm". Bộ mã này sẽ hướng dẫn bạn cách thiết lập hai cụm Slurm được liên kết trên đám mây, để trình bày cách bạn có thể đạt được liên kết nhiều cụm, cho dù tại chỗ hay trên đám mây.

Bạn có đang xây dựng thứ gì đó thú vị bằng chức năng GCP-gốc mới của Slurm không? Có một vài câu hỏi? Có một đề xuất tính năng? Liên hệ với nhóm Google Cloud ngay hôm nay thông qua trang web Giải pháp máy tính 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 Google Cloud & Slurm !

Dọn dẹp triển khai Terraform

Đăng xuất của nút slurm:

exit

Hãy để mọi nút tự động thu nhỏ quy mô trước khi xóa triển khai. Bạn cũng có thể xóa các nút này theo cách thủ công bằng cách chạy "gcloud compute instance delete <Instance Name>" cho mỗi phiên bản hoặc bằng cách sử dụng Console GUI để chọn nhiều nút và nhấp vào "Delete".

Bạn có thể dễ dàng dọn dẹp việc triển khai Terraform sau khi chúng tôi hoàn tất bằng cách thực hiện lệnh sau từ Google Cloud Shell của bạn, 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 để tiếp tục. Thao tác này có thể mất vài phút, hãy kiên nhẫn.

Xóa dự án

Để dọn dẹp, chúng tôi chỉ cần xóa dự án của mình.

  • Trong menu điều hướng, chọn IAM & Admin
  • Sau đó nhấp vào cài đặt trong menu con
  • Nhấp vào biểu tượng thùng rác có dòng chữ "Xóa dự án"
  • Làm theo hướng dẫn lời nhắc

Những gì chúng tôi đã đề cập

  • Cách sử dụng triển khai Slurm trên GCP bằng Terraform.
  • Cách thực hiện công việc bằng Slurm trên GCP.
  • Cách truy vấn thông tin cụm và giám sát các công việc đang chạy trong Slurm.
  • Cách tự động phân tỷ lệ các nút với Slurm trên GCP để phù hợp với các thông số và yêu cầu công việc cụ thể.
  • Cách biên dịch và chạy các ứng dụng MPI trên Slurm trên GCP.

Tìm hỗ trợ Slurm

Nếu bạn cần hỗ trợ bằng cách sử dụng cá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 bằng cách sử dụng 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 các hướng dẫn Khắc phục sự cố có sẵn:

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 Google Cloud & 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 phản hồi về codelab này bằng cách sử dụng liên kết này . Phản hồi mất chưa đầy 5 phút để hoàn thành. Cảm ơn bạn!