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

1. 소개

미국 본토

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

빌드할 항목

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

학습할 내용

  • Google Cloud Platform에서 HPC 클러스터를 운영하기 위한 ID 및 액세스 관리 (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. terraform를 실행하는 make 명령어로 계획을 만듭니다.
make plan
  1. 클러스터를 배포합니다. 설치 및 설정 프로세스는 최대 2시간이 걸릴 수 있습니다. 배포 중에 WRF와 모든 종속 항목이 설치됩니다.
make apply
  1. 이전 단계에서 만든 로그인 노드에 SSH로 연결합니다. 이전 단계에서 이 노드를 확인할 수 있습니다 (아마 wrf-small-login0이라고 함). 콘솔 메뉴 항목 Compute Engine -> VM 인스턴스의 VM 인스턴스 목록 옆에 있는 SSH 버튼을 클릭하면 됩니다.

옵션: 다음 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 일괄 작업을 제출합니다. 이 벤치마크의 입력 덱은 wrf-gcp VM 이미지의 /apps/share/benchmarks/conus-12km에 포함되어 있습니다.

이 섹션에서는 클러스터의 로그인 노드에 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로 연결합니다. 이전 단계에서 이 노드를 확인할 수 있습니다 (이름은 wrf-large-login0일 수 있음). 콘솔 메뉴 항목 Compute Engine -> VM 인스턴스의 VM 인스턴스 목록 옆에 있는 SSH 버튼을 클릭하면 됩니다.

옵션: 다음 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 이미지에 포함되어 있습니다.

이 섹션에서는 클러스터의 로그인 노드에 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에서 기존 프로젝트를 사용한 경우 프로젝트를 삭제하면 프로젝트에서 수행한 다른 작업도 삭제됩니다.
  • 커스텀 프로젝트 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