유동적인 숫자로 WRF 기상 예측 모델 실행' Slurm-GCP

1. 소개

미국 본토

최종 업데이트: 2021년 5월 5일

빌드할 항목

이 Codelab에서는 Slurm 작업 스케줄러를 사용하여 Google Cloud에 자동 확장되는 고성능 컴퓨팅 (HPC) 클러스터를 배포합니다. Spack을 통해 설치된 WRF®와 함께 이 클러스터를 배포하는 예시 Terraform 배포를 사용합니다. 그런 다음 이 인프라를 사용하여 CONUS 2.5km 벤치마크 또는 CONUS 12km 벤치마크를 실행합니다.

학습할 내용

  • Google Cloud Platform에서 HPC 클러스터를 운영하기 위해 Identity and Access Management (IAM) 정책을 구성하는 방법
  • Slurm 작업 스케줄러를 사용하여 클라우드 기반 HPC 클러스터를 배포하는 방법
  • Slurm 일괄 작업을 사용하여 Google Cloud에서 WRF®를 동시에 실행하는 방법

필요한 항목

2. 구성

Google Cloud API 사용 설정

Google Cloud 리소스를 만들고 사용하려면 API를 사용 설정해야 합니다.

gcloud services enable compute.googleapis.com 

IAM 정책 설정

HPC에서는 시스템 관리자와 시스템 사용자가 명확하게 구분됩니다. 시스템 관리자는 일반적으로 "루트 액세스" 권한이 있습니다. 컴퓨팅 리소스를 관리하고 운영할 수 있습니다 시스템 사용자는 일반적으로 연구원, 과학자, 애플리케이션 엔지니어로, 작업 실행에만 리소스를 사용하면 됩니다.

Google Cloud에서 OS Login API는 Google Workspace, Cloud ID, Gmail 계정에서 POSIX 사용자 정보를 프로비저닝합니다. 또한 OS 로그인은 GCP의 Identity and Access Management (IAM) 시스템과 통합되어 사용자가 Linux 시스템에서 권한을 에스컬레이션할 수 있는지 여부를 결정합니다.

이 가이드에서는 사용자가 시스템 관리자 역할과 Compute Engine 관리자 역할을 입력한다고 가정합니다. 다음 작업을 수행하는 데 충분한 권한을 제공하도록 IAM 정책을 구성합니다.

  • Google Compute Engine (GCE) VM 인스턴스 만들기/삭제
  • GCE VM 인스턴스에 SSH로 연결

57883cb8acc09653.png

이 튜토리얼을 완료하는 데 필요한 IAM 역할을 부여하려면 Google Cloud 콘솔에서 다음을 수행합니다.

  1. IAM으로 이동하여 관리 > 제품 및 서비스 메뉴의 IAM
  2. '+추가'를 클릭합니다. 있습니다.
  3. '새 구성원' 아래에 Google Workspace 계정, Cloud ID 계정 또는 Gmail 계정을 입력합니다.
  4. Compute 관리자, Compute OS 로그인, 서비스 계정 사용자 역할을 추가합니다.
  5. ‘저장’을 클릭합니다.

이제 로그인에 HPC 클러스터 생성을 시작하는 데 필요한 권한이 있습니다.

올바른 역할을 할당했는지 확인하려면 Cloud Shell을 열고 다음 명령어를 실행합니다. 이때 YOUR_PROJECTEMAIL_ADDRESS을 내 프로젝트와 이메일 주소로 바꿉니다.

$ gcloud projects get-iam-policy YOUR_PROJECT --flatten="bindings[].members" --format='table(bindings.role)' --filter="bindings.members=user:EMAIL_ADDRESS"

이 명령어는 다음과 같이 출력을 생성합니다.

ROLE
roles/compute.osLogin
roles/iam.serviceAccountUser
roles/compute.admin

3. 할당량 부족: Terraform으로 자동 확장 HPC 클러스터 배포

이 섹션에서는 Slurm 작업 스케줄러를 포함한 자동 확장 HPC 클러스터를 배포합니다. 이 옵션은 사용되는 머신 유형 및 vCPU 수가 더 적다는 점을 제외하면 많은 할당량 옵션과 동일합니다.

  1. GCP에서 Cloud Shell을 엽니다.
  2. FluidNumerics/slurm-gcp 저장소 클론
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. WRF 디렉터리로 변경합니다.
cd  ~/slurm-gcp/tf/examples/wrf
  1. Terraform 계획을 만들고 검토합니다. WRF_NAME, WRF_PROJECT, WRF_ZONE 환경 변수를 설정하여 클러스터 이름, GCP 프로젝트, 배포할 영역을 지정합니다.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME="wrf-small"
  1. terraform을 처음 실행할 때는 init 명령어를 실행해야 합니다.
terraform init
  1. make 명령어로 계획을 만듭니다. 이 명령어는 terraform를 실행합니다.
make plan
  1. 클러스터를 배포합니다. 설치 및 설정 프로세스에는 최대 2시간이 소요될 수 있습니다. 배포 중에 WRF와 모든 종속 항목이 설치됩니다.
make apply
  1. SSH를 통해 이전 단계에서 만든 login 노드에 연결합니다. 이전 단계에서 이 노드를 볼 수 있습니다 (wrf-small-login0이라고 함). 콘솔 메뉴 항목 Compute Engine -> VM 인스턴스입니다

옵션: 다음 gcloud 명령어 쌍이 로그인 노드 이름을 파악하고 SSH를 통해 연결합니다.

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

  1. 로그인 노드에 연결되면 클러스터 설정을 확인하기 위해 wrf 모듈을 사용할 수 있는지 확인합니다.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. /apps/share/conus-12km에 아래 나열된 콘텐츠가 있는지 확인합니다.
$  ls -1 /apps/share/conus-12km/
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

4. CONUS 12km 벤치마크 실행

CONUS 12km 벤치마크를 실행하려면 Slurm 일괄 작업을 제출합니다. 이 벤치마크의 입력 자료는 /apps/share/benchmarks/conus-12km의 wrf-gcp VM 이미지에 포함되어 있습니다.

이 섹션에서는 클러스터의 login 노드에 SSH로 연결되어 있어야 합니다.

  1. /apps/share에서 wrf-conus.sh 배치 파일 예시 복사
cp /apps/share/wrf-conus12.sh ~/
  1. 텍스트 편집기에서 wrf-conus.sh를 열어 --partition--ntasks가 올바르게 설정되었는지 확인합니다. 태스크 수는 작업을 시작하는 데 사용할 MPI 랭크 수로 설정해야 합니다. 이 데모의 경우 태스크 수는 작업에 사용된 vCPU 수와 동일하며 사용 가능한 할당량을 초과해서는 안 됩니다.
#!/bin/bash
#SBATCH --partition=wrf
#SBATCH --ntasks=24
#SBATCH --ntasks-per-node=8
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-12km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. sbatch를 사용하여 일괄 작업을 제출합니다.
sbatch wrf-conus12.sh
  1. 작업이 완료될 때까지 기다립니다. 이 벤치마크는 6시간 예측을 실행하도록 구성되었으며, 24개 순위를 완료하는 데 약 3시간이 걸립니다. squeue로 작업 상태를 모니터링할 수 있습니다.
  2. 작업이 완료되면 rsl.out.0000의 콘텐츠를 확인하여 'wrf: SUCCESS COMPLETE WRF'라는 문구가 표시되는지 확인합니다. 작업을 두 번 이상 실행한 경우 숫자 서픽스가 달라집니다(예: 구성 설정이 잘못되어 다시 실행해야 함).
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

5. 높은 할당량: Terraform으로 자동 확장 HPC 클러스터 배포

이 섹션에서는 GCP에 Slurm 작업 스케줄러를 포함한 자동 확장 HPC 클러스터를 배포합니다.

  1. GCP에서 Cloud Shell을 엽니다.
  2. FluidNumerics/slurm-gcp 저장소 클론
cd ~
git clone https://github.com/FluidNumerics/slurm-gcp.git
  1. WRF 디렉터리로 변경합니다.
cd  ~/slurm-gcp/tf/examples/wrf
  1. Terraform 계획을 만들고 검토합니다. WRF_NAME, WRF_PROJECT, WRF_ZONE, WRF_MAX_NODE, WRF_MACHINE_TYPE 환경 변수를 설정하여 클러스터 이름, GCP 프로젝트, 배포하려는 영역, 최대 노드 수, 머신 유형을 지정합니다. CONUS 2.5km 벤치마크의 경우 480 MPI 랭크로 실행 가능한 노드 8개 이상의 사용 가능한 c2-standard-60 인스턴스를 사용하는 것이 좋습니다.
export WRF_PROJECT=<PROJECT ID>
export WRF_ZONE=<ZONE>
export WRF_NAME=wrf-large
export WRF_MAX_NODE=5
export WRF_MACHINE_TYPE="c2-standard-60"
  1. 위에서 실행하지 않은 경우 terraform init를 실행하여 terraform을 시작해야 합니다.
terraform init
  1. make 명령어로 계획을 만듭니다.
make plan
  1. 클러스터를 배포합니다. 설치 및 설정 프로세스에는 최대 2시간이 소요될 수 있습니다. 배포 중에 WRF와 모든 종속 항목이 설치됩니다.
make apply
  1. SSH를 통해 이전 단계에서 만든 login 노드에 연결합니다. 이전 단계에서 이 노드를 볼 수 있습니다 (wrf-large-login0이라고 함). 콘솔 메뉴 항목 Compute Engine -> VM 인스턴스입니다

옵션: 다음 gcloud 명령어 쌍이 로그인 노드 이름을 파악하고 SSH를 통해 연결합니다.

export CLUSTER_LOGIN_NODE=$(gcloud compute instances list --zones ${WRF_ZONE} --filter="name ~ .*login" --format="value(name)" | head -n1)

gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone ${WRF_ZONE}

두 번째 명령어를 실행하면 Slurm 로그인 노드에 연결됩니다.

  1. 로그인 노드에 연결되면 클러스터 설정을 확인하기 위해 wrf 모듈을 사용할 수 있는지 확인합니다.
$ module load gcc && module load openmpi && module avail
-------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/openmpi/4.0.5-eagetxh/gcc/9.2.0 --------------------------------------
   hdf5/1.10.7    netcdf-c/4.7.4    netcdf-fortran/4.5.3    parallel-netcdf/1.12.1    wrf/4.2

------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/gcc/9.2.0 -------------------------------------------------
   hwloc/2.2.0      libiconv/1.16          libpng/1.6.37     nasm/2.15.05            openmpi/4.0.5 (L,D)    time/1.9              zlib/1.2.11
   jasper/2.0.16    libjpeg-turbo/2.0.4    libtirpc/1.2.6    ncurses/5.9.20130511    perl/5.16.3            util-macros/1.19.1
   krb5/1.15.1      libpciaccess/0.16      libxml2/2.9.10    numactl/2.0.14          tcsh/6.22.02           xz/5.2.2

--------------------------------------------------- /apps/spack/share/spack/lmod/linux-centos7-x86_64/Core ----------------------------------------------------
   gcc/9.2.0 (L)

---------------------------------------------------------------------- /apps/modulefiles ----------------------------------------------------------------------
   openmpi/v4.1.x
  1. /apps/share/conus-2.5km에 아래 나열된 콘텐츠가 있는지 확인합니다.
$ ls -1 /apps/share/conus-2.5km
FILE:2018-06-17_00
FILE:2018-06-17_03
FILE:2018-06-17_06
FILE:2018-06-17_09
FILE:2018-06-17_12
geo_em.d01.nc
geogrid.log
gfs.0p25.2018061700.f000.grib2
gfs.0p25.2018061700.f003.grib2
gfs.0p25.2018061700.f006.grib2
gfs.0p25.2018061700.f009.grib2
gfs.0p25.2018061700.f012.grib2
met_em.d01.2018-06-17_00:00:00.nc
met_em.d01.2018-06-17_03:00:00.nc
met_em.d01.2018-06-17_06:00:00.nc
met_em.d01.2018-06-17_09:00:00.nc
met_em.d01.2018-06-17_12:00:00.nc
metgrid.log
namelist.input
namelist.wps
ungrib.log
wrfbdy_d01
wrfinput_d01

6. CONUS 2.5km 벤치마크 실행

CONUS 2.5km 벤치마크를 실행하려면 Slurm 일괄 작업을 제출합니다. 이 벤치마크의 입력 자료는 /apps/share/benchmarks/conus-2.5km의 wrf-gcp VM 이미지에 포함되어 있습니다.

이 섹션에서는 클러스터의 login 노드에 SSH로 연결되어 있어야 합니다.

  1. /apps/share에서 wrf-conus.sh 배치 파일 예시 복사
cp /apps/share/wrf-conus2p5.sh ~/
  1. 텍스트 편집기에서 wrf-conus.sh를 열어 --partition--ntasks가 올바르게 설정되었는지 확인합니다. 파티션은 c2-60으로 설정해야 합니다. 태스크 수는 작업을 시작하는 데 사용할 MPI 랭크 수로 설정해야 합니다. 이 데모의 경우 태스크 수는 작업에 사용된 vCPU 수와 동일하며 사용 가능한 할당량을 초과하면 안 됩니다.
#!/bin/bash
#SBATCH --partition=c2-60
#SBATCH --ntasks=480
#SBATCH --ntasks-per-node=60
#SBATCH --mem-per-cpu=2g
#SBATCH --cpus-per-task=1
#SBATCH --account=default
#
# /////////////////////////////////////////////// #

WORK_PATH=${HOME}/wrf-benchmark/
SRUN_FLAGS="-n $SLURM_NTASKS --cpu-bind=threads"

. /apps/share/spack.sh
module load gcc/9.2.0
module load openmpi
module load hdf5 netcdf-c netcdf-fortran wrf

mkdir -p ${WORK_PATH}
cd ${WORK_PATH}
ln -s ${INSTALL_ROOT}/share/conus-2.5km/* .
ln -s $(spack location -i wrf)/run/* .

srun $MPI_FLAGS ./wrf.exe
  1. sbatch를 사용하여 일괄 작업을 제출합니다.
sbatch wrf-conus2p5.sh
  1. 작업이 완료될 때까지 기다립니다. 이 벤치마크는 6시간의 예측을 실행하도록 구성되었으며, 480개 순위로 완료되는 데 약 1시간이 걸립니다. squeue로 작업 상태를 모니터링할 수 있습니다.
  2. 작업이 완료되면 rsl.out.0000의 콘텐츠를 확인하여 'wrf: SUCCESS COMPLETE WRF'라는 문구가 표시되는지 확인합니다. 작업을 두 번 이상 실행한 경우 숫자 서픽스가 달라집니다(예: 구성 설정이 잘못되어 다시 실행해야 함).
$ tail -n1 ${HOME}/wrf-benchmark/rsl.out.0000
d01 2018-06-17_06:00:00 wrf: SUCCESS COMPLETE WRF

7. 축하합니다

이 Codelab에서는 자동 확장되는 클라우드 기반 HPC 클러스터를 만들고 Google Cloud Platform에서 병렬 WRF® 시뮬레이션을 실행했습니다.

삭제

이 Codelab에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하는 방법은 다음과 같습니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 Codelab용으로 만든 프로젝트를 삭제하는 것입니다.

주의: 프로젝트를 삭제하면 다음과 같은 효과가 발생합니다.

  • 프로젝트의 모든 항목이 삭제됩니다. 이 Codelab에서 기존 프로젝트를 사용한 경우 프로젝트를 삭제하면 프로젝트에서 실행한 다른 작업도 삭제됩니다.
  • 커스텀 프로젝트 ID가 손실됩니다. 이 프로젝트를 만들 때 앞으로 사용할 커스텀 프로젝트 ID를 만들었을 수 있습니다. appspot.com URL과 같이 프로젝트 ID를 사용하는 URL을 보존하려면 전체 프로젝트를 삭제하는 대신 프로젝트 내의 선택된 리소스만 삭제하세요.

여러 Codelab과 빠른 시작을 살펴보려는 경우 프로젝트를 재사용하면 프로젝트 할당량 한도 초과를 방지할 수 있습니다.

  1. Cloud 콘솔에서 리소스 관리 페이지로 이동합니다. 리소스 관리 페이지로 이동
  2. 프로젝트 목록에서 삭제할 프로젝트를 선택한 다음 삭제 dc096e8341a05fec.png를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

개별 리소스 삭제

  1. Cloud Shell을 열고 wrf 예시 디렉터리로 이동합니다.
cd  ~/slurm-gcp/tf/examples/wrf
  1. make destroy를 실행하여 모든 리소스를 삭제합니다.
make destroy