Slurm을 통한 자동 확장 HPC Cluster 배포

1. 개요

Google Cloud Platform에서 Slurm 클러스터를 실행하는 Google Codelab에 오신 것을 환영합니다. 이 Codelab을 마치면 자동 확장 Slurm 클러스터를 손쉽게 프로비저닝하고 운영하는 방법을 확실하게 이해하게 됩니다.

c16fa310c142ac6f.png

Google Cloud는 SchedMD와 협력하여 Compute Engine에서 Slurm 워크로드 관리자를 더 쉽게 실행하고 추가 리소스가 필요할 때 기존 클러스터를 동적으로 확장할 수 있게 해주는 도구 모음을 출시했습니다. 이 통합은 Slurm 권장사항에 따라 SchedMD의 전문가가 빌드했습니다.

Google Cloud Platform에서 Slurm 통합을 사용할 계획이 있거나 궁금한 점이 있으면 Google Cloud 및 Slurm 커뮤니티 토론 그룹

Slurm 정보

a739730a41acff0a.png

Google Cloud Platform에 있는 독립형 Slurm 클러스터의 기본 아키텍처 다이어그램

Slurm은 전 세계 HPC 클러스터를 위한 선도적인 워크로드 관리자 중 하나입니다. Slurm은 크고 확장성이 뛰어난 오픈소스의 내결함성 워크로드 관리 및 작업 예약 시스템을 소규모 및 대규모 Linux 클러스터에 제공합니다. Slurm은 작업에 커널 수정이 필요하지 않으며 비교적 독립적입니다. 클러스터 워크로드 관리자인 Slurm에는 다음과 같은 세 가지 주요 기능이 있습니다.

  1. 사용자가 작업을 수행할 수 있도록 일정 기간 동안 리소스 (컴퓨팅 노드)에 대한 배타적이거나 비배타적인 액세스 권한을 사용자에게 할당합니다.
  2. 이는 할당된 노드 집합에서 작업 (일반적으로 병렬 작업)을 시작, 실행, 모니터링하기 위한 프레임워크를 제공합니다.
  3. 대기 중인 작업 큐를 관리하여 리소스 경합을 중재합니다.

학습할 내용

  • Terraform을 사용하여 Slurm 클러스터를 설정하는 방법
  • SLURM을 사용하여 작업을 실행하는 방법
  • SLURM에서 클러스터 정보를 쿼리하고 실행 중인 작업을 모니터링하는 방법
  • 특정 작업 매개변수 및 요구사항에 맞게 노드를 자동 확장하는 방법
  • Slurm 관련 지원 서비스 찾기

기본 요건

  • Google Cloud Platform 계정 및 결제가 포함된 프로젝트
  • 기본 Linux 환경

2. 설정

자습형 환경 설정

프로젝트 만들기

Google 계정 (Gmail 또는 G Suite)이 아직 없는 경우 계정을 만들어야 합니다. Google Cloud Platform 콘솔 ( console.cloud.google.com)에 로그인하고 리소스 관리 페이지를 엽니다.

359c06e07e6d699f.png

프로젝트 만들기를 클릭합니다.

25c23d651abb837b.png

프로젝트 이름을 입력합니다. 프로젝트 ID (위의 스크린샷에서 빨간색으로 강조 표시)를 기억하세요. 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유한 이름이어야 합니다. 프로젝트 이름이 고유하지 않은 경우 Google Cloud에서 프로젝트 이름을 기반으로 임의의 프로젝트 ID를 생성합니다.

다음으로 Google Cloud 리소스를 사용할 수 있도록 Developers Console에서 결제를 사용 설정해야 합니다.

이 Codelab을 실행하는 데는 몇 달러 이상의 비용이 들지 않지만 더 많은 리소스를 사용하기로 결정하거나 리소스를 실행 상태로 두는 경우에는 비용이 더 많이 들 수 있습니다 (이 문서 끝부분의 '결론' 섹션 참조). Google Cloud Platform 가격 계산기는 여기에서 사용할 수 있습니다.

Google Cloud Platform의 신규 사용자에게는 $300의 무료 체험판이 제공됩니다.

Google Cloud Shell

Google Cloud를 노트북에서 원격으로 실행할 수도 있지만 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

Google Cloud Shell 실행

GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.

dbad104cef962719.png

그런 다음 Cloud Shell 시작을 클릭합니다.

4e50db320508ac88.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다.

20b0aa80492144d.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능이 크게 향상되고 인증이 간소화됩니다. 이 실습에서 대부분의 작업은 웹브라우저나 Google Chromebook만으로 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 PROJECT_ID로 이미 설정된 것을 확인할 수 있습니다.

$ gcloud auth list

명령어 결과 출력:

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

명령어 결과 출력:

[core]
project = <PROJECT_ID>

프로젝트 ID가 올바르게 설정되지 않은 경우 다음 명령어로 설정할 수 있습니다.

$ gcloud config set project <PROJECT_ID>

명령어 결과 출력:

Updated property [core/project].

3. Slurm Terraform 구성 준비 및 검토

Slurm Terraform 구성 다운로드

Cloud Shell 세션에서 다음 명령어를 실행하여 Google Cloud Platform Terraform용 Slurm 파일이 포함된 Git 저장소를 클론 (다운로드)합니다.

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

다음 명령어를 실행하여 Slurm 배포 구성 디렉터리로 전환합니다.

cd slurm-gcp

Slurm Terraform tfvars 구성

Basic.tfvars.example 파일은 배포할 네트워크, 인스턴스, 스토리지를 비롯한 배포 구성을 자세히 설명합니다. 'tfvars 파일'이라고 부르는 새 파일에 복사한 다음 필요에 따라 수정합니다.

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

Cloud Shell 세션에서 tfvars 파일 basic.tfvars엽니다. 선호하는 명령줄 편집기 (vi, nano, emacs 등)를 사용하거나 Cloud 콘솔 코드 편집기를 사용하여 파일 콘텐츠를 볼 수 있습니다.

214f43bba6c917aa.png

tfvars 파일의 콘텐츠를 검토합니다.

cluster_name = "g1"
project      = "<project>"
zone         = "us-west1-b"

# network_name            = "<existing network name>"
# subnetwork_name         = "<existing subnetwork name>"
# shared_vpc_host_project = "<vpc host project>"

# disable_controller_public_ips = true
# disable_login_public_ips      = true
# disable_compute_public_ips    = true

# suspend_time  = 300

controller_machine_type = "n1-standard-2"
controller_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
controller_disk_type    = "pd-standard"
controller_disk_size_gb = 50
# controller_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# controller_service_account = "default"
# controller_scopes          = ["https://www.googleapis.com/auth/cloud-platform"]
# cloudsql = {
#   server_ip = "<cloudsql ip>"
#   user      = "slurm"
#   password  = "verysecure"
#   db_name   = "slurm_accounting"
# }
# controller_secondary_disk      = false
# controller_secondary_disk_size = 100
# controller_secondary_disk_type = "pd-ssd"
#
# When specifying an instance template, specified controller fields will
# override the template properites.
# controller_instance_template = null

login_machine_type = "n1-standard-2"
login_image        = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
login_disk_type    = "pd-standard"
login_disk_size_gb = 20
# login_labels = {
#   key1 = "val1"
#   key2 = "val2"
# }
# login_node_count = 1
# login_node_service_account = "default"
# login_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]
#
# When specifying an instance template, specified login fields will
# override the template properties.
# login_instance_template = null

# Optional network storage fields
# network_storage is mounted on all instances
# login_network_storage is mounted on controller and login instances
# network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/home"
#   local_mount   = "/home"
#   fs_type       = "nfs"
#   mount_options = null
# }]
#
# login_network_storage = [{
#   server_ip     = "<storage host>"
#   remote_mount  = "/net_storage"
#   local_mount   = "/shared"
#   fs_type       = "nfs"
#   mount_options = null
# }]

# compute_node_service_account = "default"
# compute_node_scopes          = [
#   "https://www.googleapis.com/auth/monitoring.write",
#   "https://www.googleapis.com/auth/logging.write"
# ]

partitions = [
  { name                 = "debug"
    machine_type         = "n1-standard-2"
    static_node_count    = 0
    max_node_count       = 10
    zone                 = "us-west1-b"
    image                ="projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
    image_hyperthreads   = false
    compute_disk_type    = "pd-standard"
    compute_disk_size_gb = 20
    compute_labels       = {}
    cpu_platform         = null
    gpu_count            = 0
    gpu_type             = null
    network_storage      = []
    preemptible_bursting = false
    vpc_subnet           = null
    exclusive            = false
    enable_placement     = false
    regional_capacity    = false
    regional_policy      = {}
    instance_template    = null
  },
  #  { name                 = "partition2"
  #    machine_type         = "n1-standard-16"
  #    static_node_count    = 0
  #    max_node_count       = 20
  #    zone                 = "us-west1-b"
  #    image                = "projects/schedmd-slurm-public/global/images/family/schedmd-slurm-20-11-4-hpc-centos-7"
  #    image_hyperthreads   = false
  #
  #    compute_disk_type    = "pd-ssd"
  #    compute_disk_size_gb = 20
  #    compute_labels       = {
  #      key1 = "val1"
  #      key2 = "val2"
  #    }
  #    cpu_platform         = "Intel Skylake"
  #    gpu_count            = 8
  #    gpu_type             = "nvidia-tesla-v100"
  #    network_storage      = [{
  #      server_ip     = "none"
  #      remote_mount  = "<gcs bucket name>"
  #      local_mount   = "/data"
  #      fs_type       = "gcsfuse"
  #      mount_options = "file_mode=664,dir_mode=775,allow_other"
  #    }]
  #    preemptible_bursting = true
  #    vpc_subnet           = null
  #    exclusive            = false
  #    enable_placement     = false
  #
  #    ### NOTE ####
  #    # regional_capacity is under development. You may see slowness in
  #    # deleting lots of instances.
  #    #
  #    # With regional_capacity : True, the region can be specified in the zone.
  #    # Otherwise the region will be inferred from the zone.
  #    zone = "us-west1"
  #    regional_capacity    = True
  #    # Optional
  #    regional_policy      = {
  #        locations = {
  #            "zones/us-west1-a" = {
  #                preference = "DENY"
  #            }
  #        }
  #    }
  #
  #    When specifying an instance template, specified compute fields will
  #    override the template properties.
  #    instance_template = "my-template"
]

이 tfvars 파일 내에는 구성할 여러 필드가 있습니다. 유일하게 구성해야 하는 필드는 project입니다. 예시에 있는 다른 모든 구성은 그대로 사용할 수 있지만 상황에 맞게 수정하세요. 구성 옵션에 관한 자세한 설명은 여기를 참고하세요.

  • cluster_name: Slurm 클러스터의 이름
  • 프로젝트: 리소스가 배포될 Google Cloud 프로젝트 ID
  • zone: 이 클러스터의 컨트롤러 및 로그인 인스턴스가 포함될 Google Cloud 영역입니다. - 추가 정보
  • network_name: Slurm 클러스터를 배포할 Virtual Private Cloud 네트워크
  • subnetwork_name: Slurm 클러스터를 배포할 가상 프라이빗 클라우드 서브네트워크입니다.
  • shared_vpc_host_project: Slurm 클러스터를 배포할 공유 VPC 네트워크
  • disable_controller_public_ips: Slurm 컨트롤러에 외부 IP를 할당하시겠습니까?
  • disable_login_public_ips: Slurm 로그인 노드에 외부 IP를 할당하시겠어요?
  • disable_compute_login_ips: Slurm 로그인 노드에 외부 IP를 할당하시겠어요?
  • suspend_time: 노드가 유휴 상태가 된 후 노드를 정지하기 전에 기다리는 시간입니다.
  • controller_machine_type: 컨트롤러 노드 인스턴스 유형
  • controller_image: Slurm 컨트롤러 인스턴스를 만드는 데 사용되는 GCP 이미지
  • controller_disk_type: 컨트롤러 인스턴스 부팅 디스크의 유형입니다.
  • controller_disk_size_gb: 컨트롤러 인스턴스 부팅 디스크의 크기입니다.
  • controller_labels: 컨트롤러 인스턴스에 연결할 라벨
  • controller_service_account: 컨트롤러 인스턴스에서 사용할 서비스 계정입니다.
  • controller_scopes: 컨트롤러 인스턴스의 액세스 범위입니다.
  • cloudsql: 컨트롤러 인스턴스에서 데이터베이스를 호스팅하는 대신 Slurm 데이터베이스로 사용할 Google CloudSQL 서버
  • server_ip: Cloud SQL 서버 IP
  • user: Cloud SQL 사용자 이름
  • password: Cloud SQL 비밀번호
  • db_name: Cloud SQL 데이터베이스 이름
  • controller_secondary_disk: NFS 서버 스토리지용 보조 디스크를 추가하시겠습니까?
  • controller_secondary_disk_type: 컨트롤러 보조 디스크의 유형
  • controller_secondary_disk_size_gb: 컨트롤러 보조 디스크의 크기
  • controller_instance_template: 컨트롤러 인스턴스에 사용할 GCP 인스턴스 템플릿입니다. 지정된 모든 컴퓨팅 필드가 템플릿 속성을 재정의합니다. 예: Controller_image가 지정된 경우 인스턴스 템플릿의 이미지를 덮어씁니다.
  • login_machine_type: 로그인 (SSH 액세스 가능) 노드 인스턴스 유형
  • login_image: Slurm 로그인 인스턴스를 만드는 데 사용되는 GCP 이미지
  • login_disk_type: 로그인 인스턴스 부팅 디스크의 유형입니다.
  • login_disk_size_gb: 로그인 인스턴스 부팅 디스크의 크기입니다.
  • login_labels: 로그인 인스턴스에 연결할 라벨입니다.
  • login_node_count: 만들 로그인 노드의 수
  • login_node_service_account: 로그인 인스턴스에서 사용할 서비스 계정입니다.
  • login_node_scopes: 로그인 인스턴스의 액세스 범위입니다.
  • login_instance_template: 로그인 인스턴스에 사용할 GCP 인스턴스 템플릿입니다. 지정된 모든 컴퓨팅 필드가 템플릿 속성을 재정의합니다. 예: login_image가 지정되면 인스턴스 템플릿의 이미지를 덮어씁니다.
  • network_storage: 모든 노드에 마운트할 네트워크 스토리지입니다. 필드가 fstab에 직접 추가됩니다. 추가 마운트에 반복할 수 있습니다.
  • server_ip: 스토리지 서버 IP
  • remote_mount: 저장소 마운트 이름 (파일 시스템 이름)
  • local_mount: 로컬 마운트 디렉터리
  • fs_type: 파일 시스템 유형 (NFS, CIFS, Lustre, GCSFuse 자동 설치)
  • mount_options: 마운트 옵션 (예: 기본값,_netdev)
  • login_network_storage: 로그인 및 컨트롤러 노드에 마운트할 네트워크 스토리지입니다. NFS, CIFS, Lustre, GCSFuse가 자동으로 설치됩니다. 추가 마운트에 반복할 수 있습니다.
  • server_ip: 스토리지 서버 IP
  • remote_mount: 저장소 마운트 이름 (파일 시스템 이름)
  • local_mount: 로컬 마운트 디렉터리
  • fs_type: 파일 시스템 유형 (NFS, CIFS, Lustre, GCSFuse 자동 설치)
  • mount_options: 마운트 옵션 (예: 기본값,_netdev)
  • compute_node_service_account: 컴퓨팅 인스턴스에 사용할 서비스 계정입니다.
  • compute_node_scopes: 컴퓨팅 인스턴스의 액세스 범위입니다.
  • partitions: Slurm 파티션 구성입니다. 추가 파티션에 대해 반복할 수 있습니다.
  • name: 파티션 이름
  • machine_type: 컴퓨팅 노드 인스턴스 유형
  • static_node_count: 상시 사용 설정 컴퓨팅 노드 수
  • max_node_count: 허용되는 최대 총 컴퓨팅 노드 수 - 최대 64,000개
  • zone: 이 파티션의 리소스가 포함될 Google Cloud 영역 - 추가 정보
  • image: 컴퓨팅 이미지 노드 머신 유형
  • image_hyperthreads: 인스턴스에서 하이퍼스레딩을 사용 설정 또는 중지합니다.
  • compute_disk_type: 컴퓨팅 인스턴스 부팅 디스크의 유형 (pd-standard, pd-ssd)입니다.
  • compute_disk_size_gb: 컴퓨팅 인스턴스 부팅 디스크의 크기입니다.
  • compute_labels: Compute 인스턴스에 연결할 라벨
  • cpu_platform: 모든 컴퓨팅 노드에 필요한 최소 CPU 플랫폼
  • gpu_count: 파티션의 각 인스턴스에 연결할 GPU 수
  • gpu_type: 파티션의 인스턴스에 연결할 GPU 유형
  • network_storage: 파티션의 모든 컴퓨팅 노드에 마운트할 네트워크 스토리지입니다. 필드가 fstab에 직접 추가됩니다. 추가 마운트에 반복할 수 있습니다.
  • server_ip: 스토리지 서버 IP
  • remote_mount: 저장소 마운트 이름 (파일 시스템 이름)
  • local_mount: 로컬 마운트 디렉터리
  • fs_type: 파일 시스템 유형 (NFS, CIFS, Lustre, GCSFuse 자동 설치)
  • mount_options: 마운트 옵션
  • preemptible_bursting: 인스턴스가 선점형 인스턴스인가요?
  • vpc_subnet: Slurm 파티션을 배포할 가상 프라이빗 클라우드 서브네트워크입니다.
  • 제외: Slurm을 사용 설정하여 전체 노드를 작업에 할당
  • enable_placement: 인스턴스 간의 네트워크 지연 시간을 줄이기 위해 인스턴스가 서로 가까이 위치하게 되는 배치 정책을 사용 설정합니다.
  • regional_capacity: 가용성에 따라 리전의 모든 영역에 인스턴스를 배치할 수 있도록 허용합니다.
  • regional_policy: region_capacity가 true인 경우 이 정책은 사용할 리전과 사용하지 않을 리전의 영역을 결정합니다.
  • Instance_template: 컴퓨팅 인스턴스에 사용할 GCP 인스턴스 템플릿입니다. 지정된 모든 컴퓨팅 필드가 템플릿 속성을 재정의합니다. 예: 이미지를 지정하면 인스턴스 템플릿의 이미지를 덮어씁니다.

고급 구성

원하는 경우 클러스터 배포 프로세스의 일부로 추가 패키지 및 소프트웨어를 설치할 수 있습니다. 'Compute Engine의 Slurm 클러스터에 앱 설치하기'에 설명된 여러 방법 또는 Slurm에서 배포한 이미지를 맞춤설정하여 slurm 클러스터에 소프트웨어를 설치할 수 있습니다. 현재 Slurm은 Google Cloud HPC VM 이미지를 기반으로 하는 SchedMD 제공 VM 이미지를 배포하고 그 위에 Slurm을 설치합니다.

자체 이미지를 사용하려면 tfvars 파일에 나열된 공개 SchedMD VM 이미지를 기반으로 자체 구성으로 이미지를 빌드합니다. 다음으로 tfvars 파일에 지정된 이미지 URI를 자체 이미지로 바꾸고 변경사항을 테스트합니다.

문제 해결

이 Codelab 전반에서 Slurm-GCP 저장소 ReadMe의 문제 해결 섹션을 참조하세요.

가장 일반적인 문제는 tfvars 파일 구성 시 발생하는 실수와 할당량 제한입니다. 이 Codelab은 신규 사용자의 표준 할당량 할당량과 신규 사용자가 받는 무료 크레딧 $300 내에서 실행되도록 설계되었습니다. VM 생성 시도가 실패하면 컨트롤러 노드의 /var/log/slurm/Resume.log 파일에서 API 오류를 확인합니다.

4. 구성 배포 및 확인

구성 배포

Cloud Shell 세션의 slurm-gcp/tf/example 폴더에서 다음 명령어를 실행합니다.

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

설정된 구성에 따라 설명된 작업을 수락하라는 메시지가 표시됩니다. 'yes'를 입력합니다. 배포를 시작합니다 'terraform plan'을 실행하여 배포할 구성을 확인할 수도 있습니다.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

작업을 완료하는 데 몇 분 정도 걸릴 수 있으므로 기다려 주세요.

배포가 완료되면 다음과 비슷한 출력이 표시됩니다.

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

Outputs:

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

VM 인스턴스 생성 확인

탐색 메뉴를 열고 Compute Engine > VM 인스턴스.

d5832bdd527794ed.png

그러면 컨트롤러와 로그인 VM 인스턴스가 나열됩니다.

7a1fc9603758d58d.png

VM 인스턴스에서 Terraform에서 생성한 두 개의 가상 머신 인스턴스를 검토합니다.

cluster_name 필드를 수정한 경우에는 이름이 달라집니다.

  • g1-컨트롤러
  • G1-로그인0

5. Slurm 클러스터에 로그인합니다.

Slurm 클러스터에 액세스

코드 편집기/Cloud Shell 탭으로 돌아갑니다. 다음 명령어를 실행하여 인스턴스에 로그인합니다. 이때 <ZONE>을 g1-login0 노드의 영역 (us-central1-b여야 함)으로 바꿉니다.

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

이 명령어를 사용하면 g1-login0 가상 머신에 로그인할 수 있습니다.

로그인 노드에 쉽게 액세스하는 또 다른 방법은 'SSH' SSH 연결을 사용하여 새 탭을 열려면 VM 인스턴스 페이지의 g1-login0 VM 옆에 있는 버튼을 클릭합니다.

8c373a87d13620f7.png

Cloud Shell을 처음 사용하는 경우에는 아래와 같이 SSH 키를 생성하라는 메시지가 표시될 수 있습니다.

WARNING: The public SSH key file for gcloud does not exist.
WARNING: The private SSH key file for gcloud does not exist.
WARNING: You do not have an SSH key for gcloud.
WARNING: SSH keygen will be executed to generate a key.
This tool needs to create the directory [/home/user/.ssh] before being
 able to generate SSH keys.

Do you want to continue (Y/n)?

그렇다면 Y를 입력합니다. 암호를 선택하라는 메시지가 표시되면 Enter를 두 번 눌러 비워 둡니다.

로그인 시 다음 메시지가 표시되는 경우:

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

이 메시지가 표시될 때까지 기다렸다가 실습을 진행하지 마세요 (약 5분).

*** Slurm login setup complete ***

위의 메시지가 표시되면 로그아웃한 후 g1-login0에 다시 로그인해야 실습을 계속 진행할 수 있습니다. 그러려면 CTRL + C를 눌러 작업을 종료합니다.

그런 다음 인스턴스에서 다음 명령어를 실행하여 로그아웃합니다.

exit

이제 로그인 VM에 다시 연결합니다. 다음 명령어를 실행하여 인스턴스에 로그인하고 <ZONE>을 g1-login0 노드의 영역으로 바꿉니다.

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

위와 마찬가지로 1~2분 정도 기다려야 연결할 수 있고 모든 설정이 완료될 수 있습니다.

Slurm CLI 도구 둘러보기

이제 클러스터의 Slurm 로그인 노드에 로그인되었습니다. 사용자/관리자 상호작용, Slurm 작업 예약, 관리 활동 전용 노드입니다.

Slurm 명령줄을 소개하기 위해 몇 가지 명령어를 실행해 보겠습니다.

sinfo 명령어를 실행하여 클러스터 리소스의 상태를 확인합니다.

sinfo

다음은 sinfo의 샘플 출력입니다. sinfo는 클러스터에서 사용 가능한 노드, 해당 노드의 상태, 그리고 해당 노드에 적용되는 파티션, 가용성 및 시간 제한과 같은 기타 정보를 보고합니다.

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

디버그 파티션의 'max_node_count'로 명시된 10개의 노드를 확인할 수 있습니다. 10개이면 'idle~'로 표시됩니다. (노드가 유휴 상태이고 할당되지 않은 모드이며 가동할 준비가 됨).

그런 다음 squeue 명령어를 실행하여 클러스터 대기열의 상태를 확인합니다.

squeue

다음은 squeue의 예상 출력입니다. squeue는 클러스터의 대기열 상태를 보고합니다. 여기에는 클러스터에 예약된 각 작업의 각 작업 ID, 작업이 할당된 파티션, 작업 이름, 작업을 시작한 사용자, 작업 상태, 작업이 실행된 벽시계 시간, 작업이 할당된 노드 등이 포함됩니다. 실행 중인 작업이 없으므로 이 명령어의 내용이 비어 있습니다.

JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

'srun'을 명령하는 Slurm 'sbatch' 큐에 넣은 작업을 실행하는 데 사용됩니다. "srun" 병렬 작업을 실행하며 mpirun을 위한 래퍼로 사용할 수 있습니다. 'sbatch' 일괄 작업을 제출하는 데 사용되며 다양한 구성으로 srun을 한 번 또는 여러 번 호출할 수 있습니다. 'sbatch' 일괄 스크립트를 사용하거나 –wrap 옵션과 함께 사용하여 명령줄에서 전체 작업을 실행할 수 있습니다.

Slurm이 실제로 작동하는 것을 확인하고 큐에 작업을 가져올 수 있도록 작업을 실행해 보겠습니다.

6. Slurm 작업 실행 및 클러스터 확장

Slurm 작업 실행 및 클러스터 확장

이제 Slurm 클러스터를 실행했으므로 작업을 실행하고 클러스터를 확장해 보겠습니다.

'sbatch' 명령어는 Slurm 일괄 명령어 및 스크립트를 실행하는 데 사용됩니다. 'hostname'을 실행하는 간단한 sbatch 스크립트를 실행해 보겠습니다. 사용할 수 있습니다

g1-login0에 로그인한 상태에서 다음 명령어를 실행합니다.

sbatch -N2 --wrap="srun hostname"

이 명령어는 Slurm 일괄 명령어를 실행합니다. 이는 sbatch가 '-N'이 있는 노드 2개를 실행하도록 지정합니다. 옵션을 선택합니다. 또한 이러한 각 노드가 'srun 호스트 이름'을 실행하도록 지정합니다. 명령어를 '–wrap'으로 옵션을 선택합니다.

기본적으로 sbatch는 출력을 'slurm-%j.out'에 씁니다. 명령어가 실행되는 작업 디렉터리에서 %j가 Slurm 파일 이름 패턴에 따라 작업 ID로 대체됩니다. 이 예에서 sbatch는 기본적으로 컨트롤러에 호스팅되는 NFS 기반 공유 파일 시스템인 사용자의 /home 폴더에서 실행됩니다. 이를 통해 원하는 경우 컴퓨팅 노드가 입력 및 출력 데이터를 공유할 수 있습니다. 프로덕션 환경에서는 클러스터 작업에 대한 성능이 영향을 받지 않도록 작업 스토리지를 /home 스토리지와 분리해야 합니다. 별도의 스토리지 마운트는 'network_storage'의 tfvars 파일에서 지정할 수 있습니다. 있습니다.

sbatch 명령줄을 사용하여 sbatch 스크립트를 실행하면 예약된 작업의 작업 ID가 반환됩니다. 예를 들면 다음과 같습니다.

Submitted batch job 2

sbatch 명령어가 반환한 작업 ID를 사용하여 작업 실행 및 리소스를 추적하고 관리할 수 있습니다. 다음 명령어를 실행하여 Slurm 작업 큐를 확인합니다.

squeue

실행한 작업이 아래와 같이 나열됩니다.

JOBID PARTITION               NAME     USER ST       TIME  NODES   NODELIST(REASON)
    2     debug g1-compute-0-[0-1] username  R       0:10      2 g1-compute-0-[0-1]

컴퓨팅 노드가 프로비저닝되지 않았으므로 Slurm은 작업 요구사항에 따라 컴퓨팅 인스턴스를 자동으로 만듭니다. 이 프로세스는 자동으로 수행되므로 두 가지 이점이 있습니다. 첫째, 수동으로 노드를 프로비저닝하고, 소프트웨어를 구성하고, 노드를 클러스터에 통합한 다음, 작업을 배포하는 HPC 클러스터에서 일반적으로 요구되는 작업이 사라집니다. 둘째, 유휴 상태이고 사용되지 않는 노드는 최소 노드 수가 실행될 때까지 축소되므로 비용을 절감할 수 있습니다.

sinfo 명령어를 실행하여 가동 중인 Slurm 클러스터를 볼 수 있습니다.

sinfo

그러면 'alloc#'의 squeue에 나열된 노드가 표시됩니다. 노드 할당 상태를 나타냅니다.

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2 alloc#  g1-compute-0-[0-1]

Google Cloud 콘솔의 VM 인스턴스 섹션에서도 새로 프로비저닝된 노드를 확인할 수 있습니다. 새로 할당된 노드에 작업이 할당되기 전에 노드를 가동하고 Slurm을 실행하는 데 몇 분 정도 걸립니다. VM 인스턴스 목록이 다음과 유사하게 표시됩니다.

9997efff595f1e.png

노드가 작업을 실행하면 인스턴스는 'alloc'으로 이동합니다. 상태를 나타냅니다. 이 상태는 작업이 작업에 할당됩니다.

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug*       up   infinite      8  idle~ g1-compute-0-[2-9]
debug*       up   infinite      2  alloc g1-compute-0-[0-1]

작업이 완료되면 더 이상 squeue에 나열되지 않고 'alloc'이 sinfo의 노드는 'idle' 있습니다. 'squeue' 실행 작업이 완료될 때까지(1~2분 후) 주기적으로 확인합니다.

출력 파일 slurm-%j.out가 NFS 공유 /home 폴더에 작성되고 호스트 이름이 포함됩니다. 출력 파일 (일반적으로 slurm-2.out)을 열거나 cat으로 반환하면 출력 파일의 콘텐츠에 다음이 포함됩니다.

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

수고하셨습니다. 작업을 실행하고 Slurm 클러스터를 확장했습니다.

7. MPI 작업 실행

이제 노드 전반에서 MPI 작업을 실행해 보겠습니다. g1-login0에 로그인한 상태에서 wget을 사용하여 C 프로그래밍 언어로 작성된 MPI 프로그램을 다운로드합니다.

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

OpenMPI 도구를 사용하려면 다음 명령어를 실행하여 OpenMPI 모듈을 로드해야 합니다.

module load openmpi

'mpicc'라는 단어를 도구를 사용하여 MPI C 코드를 컴파일할 수 있습니다. 다음 명령어를 실행합니다.

mpicc mpi_hello_world.c -o mpi_hello_world

그러면 C 코드가 기계어 코드로 컴파일되어 Slurm을 통해 클러스터 전체에서 코드를 실행할 수 있습니다.

그런 다음 원하는 텍스트 편집기를 사용하여 'helloworld_batch'라는 sbatch 스크립트를 만듭니다.

vi helloworld_batch

i를 입력하여 vi 삽입 모드로 전환합니다.

다음 텍스트를 복사하여 파일에 붙여넣어 간단한 sbatch 스크립트를 만듭니다.

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

srun mpi_hello_world

Esc 키를 누르고 ':wq'를 입력하여 코드 편집기를 저장하고 종료합니다. 를 입력합니다.

이 스크립트는 Slurm 일괄 실행 환경 및 작업을 정의합니다. 먼저 실행 환경은 bash로 정의됩니다. 다음으로 스크립트는 '#SBATCH'를 사용하여 먼저 Slurm 옵션을 정의합니다. 있습니다. 작업 이름은 'hello_world'로 정의됩니다.

출력 파일이 'hello_world_%j.out'으로 설정됩니다. 여기서 %j는 Slurm 파일 이름 패턴에 따라 작업 ID로 대체됩니다. 이 출력 파일은 sbatch 스크립트가 실행되는 디렉터리에 작성됩니다. 이 예에서는 사용자의 /home 폴더이며, 이는 NFS 기반 공유 파일 시스템입니다. 이를 통해 원하는 경우 컴퓨팅 노드가 입력 및 출력 데이터를 공유할 수 있습니다. 프로덕션 환경에서는 클러스터 작업에 대한 성능이 영향을 받지 않도록 작업 스토리지를 /home 스토리지와 분리해야 합니다.

마지막으로, 이 스크립트를 실행해야 하는 노드 수는 2로 정의됩니다.

옵션이 정의되면 실행 가능한 명령어가 제공됩니다. 이 스크립트는 mpirun 명령어의 삽입형 대체 명령어인 srun 명령어를 사용하여 mpi_hello_world 코드를 병렬로 실행합니다.

그런 다음 sbatch 명령줄을 사용하여 sbatch 스크립트를 실행합니다.

sbatch helloworld_batch

sbatch를 실행하면 예약된 작업의 작업 ID가 반환됩니다. 예를 들면 다음과 같습니다.

Submitted batch job 3

이렇게 하면 노드당 하나의 작업으로 hostname 명령어가 노드 2개에서 실행되며 hello_world-3.out 파일에 출력이 인쇄됩니다.

이미 2개의 노드를 프로비저닝했으므로 이 작업이 빠르게 실행됩니다.

작업이 완료되고 더 이상 나열되지 않을 때까지 squeue를 모니터링합니다.

squeue

완료되면 hello_world-3.out 파일을 열거나 cat으로 만들고 g1-compute-0-[0-1]에서 실행되었는지 확인합니다.

Hello world from processor g1-compute-0-0, rank 0 out of 2 processors
Hello world from processor g1-compute-0-1, rank 1 out of 2 processors

5분 동안 유휴 상태가 되면 (YAML의 suspend_time 필드 또는 slurm.conf의 SuspendTime 필드로 구성 가능) 동적으로 프로비저닝된 컴퓨팅 노드가 리소스 해제에 할당 해제됩니다. sinfo를 주기적으로 실행하고 클러스터 크기가 0으로 되돌아가는 것을 관찰하여 이를 확인할 수 있습니다.

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

클러스터를 배포한 리전에서 허용되는 할당량까지 인스턴스를 더 가동하고 다양한 MPI 애플리케이션을 실행해 보세요.

8. 결론

수고하셨습니다. Google Cloud Platform에서 Slurm 클러스터를 만들고 최신 기능을 사용하여 워크로드 수요에 맞게 클러스터를 자동 확장했습니다. 이 모델을 사용하여 다양한 작업을 실행할 수 있으며 Slurm에 노드를 요청하기만 하면 몇 분 만에 수백 개의 인스턴스로 확장됩니다.

GCP에서 Slurm을 사용하는 방법을 계속 배우려면 ' Building Federated HPC Clusters with Slurm(Slurm으로 제휴 HPC 클러스터 빌드) Codelab을 참고하세요 이 Codelab에서는 클라우드에서 페더레이션된 Slurm 클러스터 두 개를 설정하는 방법을 안내하여 온프레미스 또는 클라우드에서 멀티 클러스터 페더레이션을 달성하는 방법을 설명합니다.

Slurm의 새로운 GCP 기반 기능을 사용하여 멋진 제품을 빌드하고 있나요? 궁금한 점이 있으신가요? 기능 제안이 있으신가요? 지금 Google Cloud의 고성능 컴퓨팅 솔루션 웹사이트를 통해 Google Cloud팀에 문의하거나 Google Cloud 및 Slurm 토론 그룹

Terraform 배포 정리

slurm 노드에서 로그아웃합니다.

exit

배포를 삭제하기 전에 자동 확장된 노드가 축소되도록 하세요. 또한 'gcloud compute instances delete <Instance Name>'을 실행하여 이러한 노드를 수동으로 삭제할 수도 있습니다. 또는 콘솔 GUI를 사용하여 여러 노드를 선택하고 "삭제"를 클릭하여 수행할 수 있습니다.

완료되면 g1-login0에서 로그아웃한 후 Google Cloud Shell에서 다음 명령어를 실행하여 Terraform 배포를 쉽게 삭제할 수 있습니다.

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

메시지가 표시되면 yes를 입력하여 계속 진행합니다. 이 작업은 몇 분 정도 걸릴 수 있습니다. 잠시 기다려 주세요.

프로젝트 삭제

정리하려면 프로젝트를 삭제하기만 하면 됩니다.

  • 탐색 메뉴에서 'IAM 및 관리
  • 그런 다음 하위 메뉴에서 설정을 클릭하고
  • "프로젝트 삭제"라는 텍스트가 있는 휴지통 아이콘을 클릭합니다.
  • 표시되는 안내를 따릅니다.

학습한 내용

  • Terraform을 사용하여 GCP에 Slurm 배포를 사용하는 방법을 알아봅니다.
  • GCP에서 Slurm을 사용하여 작업을 실행하는 방법
  • Slurm에서 클러스터 정보를 쿼리하고 실행 중인 작업을 모니터링하는 방법
  • GCP에서 Slurm을 통해 노드를 자동 확장하여 특정 작업 매개변수 및 요구사항을 충족하는 방법
  • GCP의 Slurm에서 MPI 애플리케이션을 컴파일하고 실행하는 방법

Slurm 지원 서비스 찾기

테스트 또는 프로덕션 환경에서 이러한 통합을 사용하는 데 지원이 필요한 경우 연락처 페이지(https://www.schedmd.com/contact.php)를 사용하여 SchedMD에 직접 문의하시기 바랍니다.

제공되는 문제 해결 가이드를 사용할 수도 있습니다.

마지막으로 Google Cloud 및 Slurm 토론 그룹: https://groups.google.com/g/google-cloud-slurm-discuss

자세히 알아보기

의견

이 링크를 사용하여 이 Codelab에 관한 의견을 제출해 주세요. 의견을 완료하는 데 5분도 걸리지 않습니다. 감사합니다.