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

Google Cloud는 SchedMD와 협력하여 Compute Engine에서 Slurm 워크로드 관리자를 더 쉽게 실행하고 추가 리소스가 필요할 때 기존 클러스터를 동적으로 확장할 수 있는 도구 세트를 출시했습니다. 이 통합은 Slurm 권장사항에 따라 SchedMD의 전문가가 빌드했습니다.
Google Cloud Platform의 Slurm 통합을 사용할 계획이거나 궁금한 점이 있는 경우 Google Cloud 및 Slurm 커뮤니티 토론 그룹에 가입해 보세요.
Slurm 정보

Google Cloud Platform의 독립형 Slurm 클러스터의 기본 아키텍처 다이어그램
Slurm은 전 세계 HPC 클러스터의 선도적인 워크로드 관리자 중 하나입니다. Slurm은 소규모 및 대규모 Linux 클러스터를 위한 내결함성이 있고 확장성이 뛰어난 오픈소스 워크로드 관리 및 작업 스케줄링 시스템을 제공합니다. Slurm은 작동에 커널 수정이 필요하지 않으며 비교적 자체적으로 포함되어 있습니다. 클러스터 워크로드 관리자로서 Slurm에는 세 가지 주요 기능이 있습니다.
- 사용자가 작업을 수행할 수 있도록 일정 기간 동안 리소스 (컴퓨팅 노드)에 대한 독점 또는 비독점 액세스 권한을 사용자에게 할당합니다.
- 할당된 노드 집합에서 작업 (일반적으로 병렬 작업)을 시작, 실행, 모니터링하기 위한 프레임워크를 제공합니다.
- 대기 중인 작업의 큐를 관리하여 리소스 경합을 중재합니다.
학습할 내용
- Terraform을 사용하여 Slurm 클러스터를 설정하는 방법
- SLURM을 사용하여 작업을 실행하는 방법
- SLURM에서 클러스터 정보를 쿼리하고 실행 중인 작업을 모니터링하는 방법
- 특정 작업 매개변수 및 요구사항을 수용하도록 노드를 자동 확장하는 방법
- Slurm 관련 도움을 받을 수 있는 곳
기본 요건
- 결제가 포함된 Google Cloud Platform 계정 및 프로젝트
- 기본 Linux 경험
2. 설정
자습형 환경 설정
프로젝트 만들기
아직 Google 계정 (Gmail 또는 G Suite)이 없으면 계정을 만들어야 합니다. Google Cloud Platform Console ( console.cloud.google.com)에 로그인하고 리소스 관리 페이지를 엽니다.

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

프로젝트 이름을 입력합니다. 프로젝트 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 아이콘을 클릭합니다.

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

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

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 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용 Slurm Terraform 파일이 포함된 Git 저장소를 클론 (다운로드)합니다.
git clone https://github.com/SchedMD/slurm-gcp.git
다음 명령어를 실행하여 Slurm 배포 구성 디렉터리로 전환합니다.
cd slurm-gcp
Slurm Terraform tfvars 구성
basic.tfvars.example 파일에는 배포할 네트워크, 인스턴스, 스토리지를 비롯한 배포 구성이 자세히 설명되어 있습니다. 'tfvars 파일'이라는 새 파일에 복사한 다음 필요에 따라 수정합니다.
cd tf/example/basic cp basic.tfvars.example basic.tfvars
Cloud Shell 세션에서 tfvars 파일 basic.tfvars을 엽니다. 원하는 명령줄 편집기 (vi, nano, emacs 등)를 사용하거나 Cloud Console 코드 편집기를 사용하여 파일 콘텐츠를 볼 수 있습니다.

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 클러스터의 이름
- project: 리소스가 배포될 Google Cloud 프로젝트 ID
- zone: 이 클러스터의 컨트롤러 및 로그인 인스턴스가 포함될 Google Cloud 영역입니다. 자세히 알아보기
- Slurm 클러스터를 배포할 Virtual Private Cloud 네트워크의 network_name:
- subnetwork_name: Slurm 클러스터를 배포할 Virtual Private Cloud 서브네트워크
- 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: CloudSQL 서버 IP
- user: CloudSQL 사용자 이름
- password: CloudSQL 비밀번호
- db_name: CloudSQL 데이터베이스 이름
- 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: 마운트 옵션 (예: defaults,_netdev)
- login_network_storage: 로그인 및 컨트롤러 노드에 마운트할 네트워크 스토리지입니다. NFS, CIFS, Lustre, GCSFuse가 자동으로 설치됩니다. 추가 마운트를 위해 반복할 수 있습니다.
- server_ip: 스토리지 서버 IP
- remote_mount: 스토리지 마운트 이름 (파일 시스템 이름)
- local_mount: 로컬 마운트 디렉터리
- fs_type: 파일 시스템 유형 (NFS, CIFS, Lustre, GCSFuse가 자동으로 설치됨)
- mount_options: 마운트 옵션 (예: defaults,_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: Compute 이미지 노드 머신 유형
- image_hyperthreads: 인스턴스에서 하이퍼스레딩을 사용 설정 또는 사용 중지합니다.
- compute_disk_type: 컴퓨팅 인스턴스 부팅 디스크의 유형 (pd-standard, pd-ssd)
- compute_disk_size_gb: 컴퓨팅 인스턴스 부팅 디스크의 크기
- compute_labels: 컴퓨팅 인스턴스에 연결할 라벨
- 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: 인스턴스가 선점형 인스턴스인가요?
- Slurm 파티션을 배포할 vpc_subnet: 가상 프라이빗 클라우드 서브네트워크
- exclusive: Slurm이 전체 노드를 작업에 할당하도록 사용 설정
- enable_placement: 인스턴스 간 네트워크 지연 시간을 줄이기 위해 인스턴스를 서로 가까이 두는 배치 정책을 사용 설정합니다.
- regional_capacity: 가용성에 따라 인스턴스를 리전의 모든 영역에 배치할 수 있습니다.
- regional_policy: regional_capacity가 true인 경우 이 정책은 사용할 리전과 해당 리전에서 사용하지 않을 영역을 결정합니다.
- Instance_template: 컴퓨팅 인스턴스에 사용할 GCP 인스턴스 템플릿입니다. 지정된 모든 계산 필드는 템플릿 속성을 재정의합니다. 예를 들어 이미지를 지정하면 인스턴스 템플릿의 이미지가 덮어쓰여집니다.
고급 구성
원하는 경우 클러스터 배포 프로세스의 일부로 추가 패키지와 소프트웨어를 설치할 수 있습니다. 'Compute Engine에서 Slurm 클러스터에 앱 설치'에 설명된 여러 방법으로 또는 Slurm에서 배포한 이미지를 맞춤설정하여 Slurm 클러스터에 소프트웨어를 설치할 수 있습니다. 현재 Slurm은 Google Cloud HPC VM 이미지를 기반으로 하고 그 위에 Slurm이 설치된 SchedMD 제공 VM 이미지를 배포합니다.
자체 이미지를 사용하려면 tfvars 파일에 나열된 공개 SchedMD VM 이미지를 기반으로 자체 구성으로 이미지를 빌드하세요. 그런 다음 tfvars 파일에 지정된 이미지 URI를 자체 이미지로 바꾸고 변경사항을 테스트합니다.
문제 해결
이 Codelab을 진행하는 동안 Slurm-GCP 저장소의 문제 해결 섹션을 참고하세요.
가장 흔한 문제는 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 인스턴스를 선택합니다.

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

VM 인스턴스에서 Terraform으로 생성된 두 개의 가상 머신 인스턴스를 검토합니다.
cluster_name 필드를 수정한 경우 이름이 다릅니다.
- g1-controller
- g1-login0
5. Slurm 클러스터에 로그인
Slurm 클러스터 액세스
코드 편집기/Cloud Shell 탭으로 돌아갑니다. 다음 명령어를 실행하여 인스턴스에 로그인합니다. g1-login0 노드의 영역 (us-central1-b이어야 함)을 <ZONE>로 대체합니다.
gcloud compute ssh g1-login0 --zone=<ZONE>
이 명령어를 사용하면 g1-login0 가상 머신에 로그인됩니다.
VM 인스턴스 페이지에서 g1-login0 VM 옆에 있는 'SSH' 버튼을 클릭하여 SSH 연결이 있는 새 탭을 열면 로그인 노드에 쉽게 액세스할 수 있습니다.

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에 다시 연결합니다. 다음 명령어를 실행하여 인스턴스에 로그인합니다. 이때 g1-login0 노드의 영역을 <ZONE>로 대체합니다.
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)
Slurm 명령어 'srun'과 'sbatch'는 대기열에 배치된 작업을 실행하는 데 사용됩니다. 'srun'은 병렬 작업을 실행하며 mpirun의 래퍼로 사용할 수 있습니다. 'sbatch'는 일괄 작업을 Slurm에 제출하는 데 사용되며, 다양한 구성에서 srun을 한 번 또는 여러 번 호출할 수 있습니다. 'sbatch'는 일괄 스크립트를 가져올 수 있으며, –wrap 옵션과 함께 사용하여 명령줄에서 전체 작업을 실행할 수도 있습니다.
Slurm이 작동하는 것을 확인하고 대기열에 작업을 추가하기 위해 작업을 실행해 보겠습니다.
6. Slurm 작업 실행 및 클러스터 확장
Slurm 작업 실행 및 클러스터 확장
이제 Slurm 클러스터가 실행되었으므로 작업을 실행하고 클러스터를 확장해 보겠습니다.
'sbatch' 명령어는 Slurm 일괄 명령어와 스크립트를 실행하는 데 사용됩니다. 자동 확장 VM에서 'hostname'을 실행하는 간단한 sbatch 스크립트를 실행해 보겠습니다.
g1-login0에 로그인한 상태에서 다음 명령어를 실행합니다.
sbatch -N2 --wrap="srun hostname"
이 명령어는 Slurm 일괄 명령어를 실행합니다. '-N' 옵션으로 sbatch가 노드 2개를 실행하도록 지정합니다. 또한 이러한 각 노드가 '–wrap' 옵션에서 'srun hostname' 명령어를 실행한다고 지정합니다.
기본적으로 sbatch는 명령어가 실행되는 작업 디렉터리의 'slurm-%j.out'에 출력을 씁니다. 여기서 %j는 Slurm 파일 이름 패턴에 따라 작업 ID로 대체됩니다. 이 예에서는 sbatch가 사용자의 /home 폴더에서 실행됩니다. 이 폴더는 기본적으로 컨트롤러에서 호스팅되는 NFS 기반 공유 파일 시스템입니다. 이를 통해 원하는 경우 컴퓨팅 노드가 입력 및 출력 데이터를 공유할 수 있습니다. 프로덕션 환경에서는 클러스터 작업의 성능 영향을 방지하기 위해 작업 저장소가 /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
이렇게 하면 squeue에 나열된 노드가 '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]
Google Cloud 콘솔의 VM 인스턴스 섹션에서 새로 프로비저닝된 노드를 확인할 수도 있습니다. 작업이 새로 할당된 노드에 할당되기 전에 노드를 가동하고 Slurm을 실행하는 데 몇 분 정도 걸립니다. VM 인스턴스 목록은 곧 다음과 같이 표시됩니다.

노드에서 작업을 실행하면 인스턴스가 'alloc' 상태로 이동합니다. 즉, 작업이 작업에 할당됩니다.
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 8 idle~ g1-compute-0-[2-9] debug* up infinite 2 alloc g1-compute-0-[0-1]
작업이 완료되면 squeue에 더 이상 표시되지 않으며 sinfo의 'alloc' 노드가 'idle' 상태로 돌아갑니다. 1~2분 후 작업이 완료될 때까지 주기적으로 'squeue'를 실행합니다.
출력 파일 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
이렇게 하면 Slurm을 통해 클러스터에서 코드를 실행할 수 있도록 C 코드가 기계어 코드로 컴파일됩니다.
다음으로 원하는 텍스트 편집기를 사용하여 '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'로 정의됩니다.
출력 파일은 Slurm 파일 이름 패턴에 따라 작업 ID로 대체되는 'hello_world_%j.out'으로 설정됩니다. 이 출력 파일은 sbatch 스크립트가 실행되는 디렉터리에 작성됩니다. 이 예에서는 NFS 기반 공유 파일 시스템인 사용자의 /home 폴더입니다. 이를 통해 원하는 경우 컴퓨팅 노드가 입력 및 출력 데이터를 공유할 수 있습니다. 프로덕션 환경에서는 클러스터 작업의 성능 영향을 방지하기 위해 작업 저장소가 /home 저장소와 분리되어야 합니다.
마지막으로 이 스크립트가 실행되어야 하는 노드 수는 2로 정의됩니다.
옵션이 정의되면 실행 가능한 명령어가 제공됩니다. 이 스크립트는 mpirun 명령어의 대체 명령어인 srun 명령어를 사용하여 mpi_hello_world 코드를 병렬 방식으로 실행합니다.
그런 다음 sbatch 명령줄을 사용하여 sbatch 스크립트를 실행합니다.
sbatch helloworld_batch
sbatch를 실행하면 예약된 작업의 작업 ID가 반환됩니다(예:
Submitted batch job 3
이렇게 하면 노드당 하나의 작업으로 2개 노드에서 hostname 명령어가 실행되고 출력이 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 사용에 대해 계속 알아보려면 'Slurm을 통한 제휴 HPC 클러스터 빌드' Codelab을 계속 진행하세요. 이 Codelab에서는 온프레미스든 클라우드든 멀티 클러스터 연합을 달성하는 방법을 나타내기 위해 클라우드에서 두 개의 연합 Slurm 클러스터를 설정하는 방법을 안내합니다.
Slurm의 새로운 GCP 네이티브 기능을 사용하여 멋진 것을 빌드하고 있나요? 궁금한 점이 있으신가요? 기능 제안이 있으신가요? 지금 Google Cloud의 고성능 컴퓨팅 솔루션 웹사이트를 통해 Google Cloud 팀에 문의하거나 Google Cloud 및 Slurm 토론 그룹에서 채팅하세요.
Terraform 배포 정리
Slurm 노드에서 로그아웃합니다.
exit
배포를 삭제하기 전에 자동 확장된 노드가 축소되도록 합니다. 각 인스턴스에 대해 'gcloud compute instances delete <인스턴스 이름>'을 실행하거나 콘솔 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에 직접 문의하세요.
다음 문제 해결 가이드를 사용할 수도 있습니다.
- GCP 기반 Slurm 문제 해결 가이드: https://github.com/SchedMD/slurm-gcp#troubleshooting
- SchedMD 문제 해결 가이드: https://slurm.schedmd.com/troubleshoot.html
마지막으로 https://groups.google.com/g/google-cloud-slurm-discuss에서 Google Cloud 및 Slurm 토론 그룹에 질문을 게시할 수도 있습니다.
자세히 알아보기
의견
이 링크를 사용하여 이 Codelab에 관한 의견을 제출해 주세요. 의견을 제출하는 데 5분도 걸리지 않습니다. 감사합니다.