风雨以后,众志成城。天气预测是科技界的难题,咱们始终在致力尝试,用新的云科技来持续尝试。

背景介绍

Weather Research and Forecasting Model(WRF)被誉为是次世代的中尺度天气预报模式,很多气象机构都应用WRF来做气象方面的钻研与预测。因为地理信息与实时气象数据量宏大,以及计算逻辑简单,须要高性能的计算集群作为基础设施。Amazon能够提供丰盛的、弹性扩大的高性能计算资源,如64位Arm Neoverse内核定制而成,为在Amazon EC2中运行的云工作负载提供更高的性价比的Graviton2实例。

Amazon Graviton2与第一代Amazon Graviton处理器相比,Amazon Graviton2处理器不论在性能还是性能上都实现了微小的飞跃。它们都反对Amazon EC2 T4g、M6g、C6g和R6g实例,及其具备本地基于NVMe的SSD存储的变体,而且与以后这一代基于x86的实例1相比,这些实例为各种工作负载(包含应用程序服务器、微服务、高性能计算、电子设计自动化、游戏、开源数据库和内存中的缓存)提供高达40%的性价比晋升

充分利用私有云的弹性,能够使得气象钻研和预测既高效、又经济,并能够以更灵便的形式提供给客户。

本文将具体向您介绍在Amazon上应用Amazon Graviton2实例搭建Amazon ParallelCluster集群、构建WRF、并介绍如何通过WRF并行计算做气象预测的整个流程,让您更轻松地在Amazon中国区开启气象的钻研和预测。

 想要理解更多亚马逊云科技最新技术公布和实际翻新,敬请关注在上海、北京、深圳三地举办的2021亚马逊云科技中国峰会!上海站第一天曾经圆满闭幕,今天还有更多嘉宾带来精彩分享,敬请期待~

构建Amazon ParallelCluster集群

Amazon ParallelCluster是一个Amazon反对的开源集群管理工具,它在开源 CfnCluster 我的项目上构建,依据您提交的工作主动设置和治理计算资源和共享文件系统。在Amazon ParallelCluster v2.8.0或更高的版本上,ParallelCluster启用了Ubuntu 18.04和Amazon Linux 2上的Arm实例反对,使得咱们能够实现更高性价比的高性能计算(HPC)。

此外,Amazon ParallelCluster反对各种批处理打算程序,如Amazon Batch、SGE、Torque 和 Slurm,本文将应用Slurm作为批处理程序,ParallelCluster还反对自动化集成Amazon FSx for Lustre并行文件系统和DCV远程桌面。以下是ParallelCluster架构图:

1.启动跳板机实例

关上Amazon治理控制台,抉择EC2服务,点击【启动实例】启动一个新的实例。这台实例对应上图中的跳板机,用于ParallelCluster的集群配置和治理,对性能没有高要求,应用T2.micro或同类型的机型即可。

2.装置Amazon CLI与ParallelCluster

通过ssh登录到跳板机内,装置awscli和parallelcluster命令。

$ pip3 install awscli -U --user$ pip3 install aws-parallelcluster -U --user

在装置之前能够用pip—version查看是否曾经装置pip,如果没有装置能够应用以下命令装置,参见:

https://pip.pypa.io/en/stable...

3.配置IAM凭证

关上Amazon控制台,抉择IAM服务,抉择一个有足够权限的IAM用户(如Administrator权限),创立新的拜访密钥,并记录创立的拜访密钥的ID与公有拜访密钥(Access Key与Secret Key),用于配置实例的拜访权限。

回到管制实例中,配置IAM Credentials,Access Key ID与Secret Access Key别离填写之前生成的密钥ID与公有拜访密钥。

$ aws configureAWS Access Key ID [None]: ABCD***********AWS Secret Access Key [None]: wJalrX********Default region name [us-east-1]: cn-northwest-1Default output format [None]: json

4.初始化ParallelCluster

通常,要配置ParallelCluster集群,您能够应用命令pcluster configure,而后提供申请的信息,例如 Region、Scheduler和EC2实例类型,最初生成~/.parallelcluster/config 配置文件。

此外,您也能够通过创立一个根本配置文件,而后定制该文件以蕴含ParallelCluster特定选项来实现疾速配置。

上面的命令生成一个新的密钥对,查问跳板机实例的元数据以取得子网ID、VPC ID,最初生成配置文件。此外,您也能够间接编辑这个配置文件来增加和更改配置选项。

设置默认区域Amazon_DEFAULT_REGION

$ export AWS_DEFAULT_REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//')

生成一个新的密钥对

$ aws ec2 create-key-pair --key-name lab-key --query KeyMaterial --output text > ~/.ssh/lab-key$ chmod 600 ~/.ssh/lab-key

获取Amazon网络信息(ParallelCluster集群将会部署在该VPC内)

$ IFACE=$(curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/)$ SUBNET_ID=$(curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/${IFACE}/subnet-id)$ VPC_ID=$(curl --silent http://169.254.169.254/latest/meta-data/network/interfaces/macs/${IFACE}/vpc-id)$ REGION=$(curl --silent http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//')

5.创立一个初始Amazon ParallelCluster配置文件

$ cat > wrf-on-graviton2.ini << EOF[aws]aws_region_name = ${REGION}[global]cluster_template = defaultupdate_check = truesanity_check = true[cluster default]key_name = lab-keybase_os = alinux2vpc_settings = publicebs_settings = myebsfsx_settings = myfsxmaster_instance_type = c6g.16xlargepost_install = s3://YOUR_S3_BUCKET_NAME/pcluster_postinstall.shs3_read_write_resource = arn:aws-cn:s3:::YOUR_S3_BUCKET_NAME/*scheduler = slurmqueue_settings = od-queue,spot-queue[queue od-queue]compute_resource_settings = c6g-odcompute_type = ondemandplacement_group = DYNAMIC[compute_resource c6g-od]instance_type = c6g.16xlargemin_count = 0max_count = 16initial_count = 0[queue spot-queue]compute_resource_settings = c6g-spotcompute_type = spotplacement_group = DYNAMIC[compute_resource c6g-spot]instance_type = c6g.16xlargemin_count = 0max_count = 16initial_count = 0[vpc public]vpc_id = ${VPC_ID}master_subnet_id = ${SUBNET_ID}[ebs myebs]shared_dir = /sharedvolume_type = gp2volume_size = 20[fsx myfsx]shared_dir = /fsxstorage_capacity = 1200deployment_type = SCRATCH_2[aliases]ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}EOF

6.编辑parallelcluster配置

应用以下命令查看或编辑ParallelCluster配置

$ view wrf-on-graviton2.ini

脚本分为区域、集群信息配置、主动扩大设置、共享数据卷设置、VPC与子网设置等几个局部。重点关注以下几个参数:

  1. post_install设置的是集群节点启动时运行的脚本地位,批改YOUR_S3_BUCKET_NAME为你本人的存储桶名称,因为WRF不能得益于超线程,因而这个脚本中会敞开EC2实例的超线程,依照物理核来运行。
  2. s3_read_write_resource设置的是集群拜访的S3存储桶,批改YOUR_S3_BUCKET_NAME为你本人的存储桶名称。
  3. compute_instance_type设置的是计算节点的类型,倡议尽可能应用较大的实例类型,在并行计算场景中进步更多的效率,此处设定为c6g.16xlarge;默认新账户这个实例类型limit较少,倡议提前开support case进步limit。
  4. master_instance_type设置的是主节点的类型,主节点用于装置软件、下载数据,不参加并行计算,所以不须要太大,此处设定为m5.xlarge。
  5. scheduler设置的是批处理打算,此处应用slurm。
  6. queue_settings指定群集应用队列而不是同构计算队列,能够使得咱们应用不同的队列提交工作。仅在scheduler设置为slurm时可用。
  7. [queue]定义繁多队列的配置设置,在下面的配置文件中,我定义了按需和Spot的队列。
  8. placement_group定义集群置放群组。
  9. fsx_settings及[fsx myfsx]设置的FSx for Lustre并行文件系统,集群部署实现后master和computer节点会主动挂载fsx。
  10. master_subnet_id指定要在其中预置主节点的现有子网的ID。计算节点默认应用主节点的子网。

应用单可用区部署,并应用置放群组能够升高集群节点间通信的提早,进步并行计算效率,在此脚本中均可设置。

7.创立ParallelCluster集群

$ pcluster create wrf-on-graviton2 -c wrf-on-graviton2.ini

应用命令创立集群,并期待集群创立实现。如果集群创立失败,请查看相应Region的EC2限度是否小于设定的集群最大节点数,如果受限于EC2 limit,能够开support case进步limit,或者批改设置升高最大节点数。

装置WRF模式零碎相干组件

以下流程图能够看出,WRF模式零碎次要蕴含的组件有:

  • WRF Preprocessing System(WPS)
  • OBSGRID
  • WRF-DA
  • ARW Solver(WRF计算主程序)
  • 后处理和可视化

以下步骤蕴含了对WRF主程序,WPS,WRFDA,OBSGRID的装置:

首先WRF依赖于gfortan编译器和gcc、cpp的库,在此基础之上依赖于根本库NetCDF和用于并行计算的库MPICH,在运行WRF工作之前,还须要通过WPS(WRF Pre-processing System)做数据的预处理。

所以在WRF的装置过程中,首先要更新依赖的编译器和库,而后装置NetCDF和MPICH,而后装置和编译WRF,设定好目录后装置和编译WPS。

在本次试验中,为了取得更好的性能,咱们将会应用GCC 10.2进行编译。GCC 10蕴含了大量的新架构个性,相比GCC 旧版本,性能更好。下图是 GCC 8/9/10绝对GCC7的性能晋升。(数据来自:https://community.arm.com/dev...)。

1.登录主节点

关上Amazon Web Service控制台,抉择EC2服务,找到集群主节点(默认标签为Master),ssh登录。登录后,能够看到Amazon FSx for Lustre高性能文件系统曾经挂载在/fsx。该试验会将软件的源码下载/fsx/tools,编译后的二进制文件则寄存在/fsx/wrf-arm。创立相干目录

$ mkdir /fsx/wrf-arm$ mkdir /fsx/tools

为了装置不便,咱们将装置过程中的相干变量写在文件/fsx/wrf-arm/wrf-install.env里

$ view /fsx/wrf-arm/wrf-install.envexport DOWNLOAD=/fsx/toolsexport WRF_INSTALL=/fsx/wrf-armexport WRF_DIR=${WRF_INSTALL}/WRF-4.2.2export GCC_VERSION=10.2.0export OPENMPI_VERSION=4.1.0export PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/bin:$PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/lib64:$LD_LIBRARY_PATHexport CC=gccexport CXX=g++export FC=gfortranexport PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/bin:$PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/lib:$LD_LIBRARY_PATHexport CC=mpiccexport CXX=mpic++export FC=mpifortexport F90=mpifortexport CXX=mpicxxexport FC=mpif90export F77=mpif90export F90=mpif90export CFLAGS="-g -O2 -fPIC"export CXXFLAGS="-g -O2 -fPIC"export FFLAGS="-g -fPIC -fallow-argument-mismatch"export FCFLAGS="-g -fPIC -fallow-argument-mismatch"export FLDFLAGS="-fPIC"export F90LDFLAGS="-fPIC"export LDFLAGS="-fPIC"export HDF5=${WRF_INSTALL}/hdf5export PNET=${WRF_INSTALL}/pnetcdfexport ZLIB=${WRF_INSTALL}/zlibexport CPPFLAGS="-I$HDF5/include -I${PNET}/include"export CFLAGS="-I$HDF5/include -I${PNET}/include"export CXXFLAGS="-I$HDF5/include -I${PNET}/include"export FCFLAGS="-I$HDF5/include -I${PNET}/include"export FFLAGS="-I$HDF5/include -I${PNET}/include"export LDFLAGS="-I$HDF5/include -I${PNET}/include -L$ZLIB/lib -L$HDF5/lib -L${PNET}/lib"export NCDIR=${WRF_INSTALL}/netcdfexport LD_LIBRARY_PATH=${NCDIR}/lib:${LD_LIBRARY_PATH}export CPPFLAGS="-I$HDF5/include -I$NCDIR/include"export CFLAGS="-I$HDF5/include -I$NCDIR/include"export CXXFLAGS="-I$HDF5/include -I$NCDIR/include"export FCFLAGS="-I$HDF5/include -I$NCDIR/include"export FFLAGS="-I$HDF5/include -I$NCDIR/include"export LDFLAGS="-L$HDF5/lib -L$NCDIR/lib"export PHDF5=${WRF_INSTALL}/hdf5export NETCDF=${WRF_INSTALL}/netcdfexport PNETCDF=${WRF_INSTALL}/pnetcdfexport PATH=${WRF_INSTALL}/netcdf/bin:${PATH}export PATH=${WRF_INSTALL}/pnetcdf/bin:${PATH}export PATH=${WRF_INSTALL}/hdf5/bin:${PATH}export LD_LIBRARY_PATH=${WRF_INSTALL}/netcdf/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/pnetcdf/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/hdf5/lib:$LD_LIBRARY_PATHexport WRFIO_NCD_LARGE_FILE_SUPPORT=1export NETCDF_classic=1export F77=mpifortexport FFLAGS="-g -fPIC"export FCFLAGS="-g -fPIC"export JASPERLIB=${WRF_INSTALL}/jasper/libexport JASPERINC=${WRF_INSTALL}/jasper/include
  1. 装置GCC 10.2
$ source /fsx/wrf-arm/wrf-install.env$ wget https://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz$ tar -xzvf gcc-${GCC_VERSION}.tar.gz$ cd gcc-${GCC_VERSION}$ ./contrib/download_prerequisites$ mkdir obj.gcc-${GCC_VERSION}$ cd obj.gcc-${GCC_VERSION}$ ../configure --disable-multilib --enable-languages=c,c++,fortran --prefix=${WRF_INSTALL}/gcc-${GCC_VERSION}$ make -j $(nproc) && make install

编译过程大略须要30分钟。

3.装置OpenMPI

浏览器关上:https://www.open-mpi.org/

查看最新版本的open-mpi源码的下载地址,以下命令下载并编译OpenMPI4.1.0

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ wget -N https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.0.tar.gz$ tar -xzvf openmpi-4.1.0.tar.gz$ cd openmpi-4.1.0$ mkdir build$ cd build$ ../configure --prefix=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION} --enable-mpirun-prefix-by-default$ make -j$(nproc) && make install

4.装置ZLIB

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ wget -N http://www.zlib.net/zlib-1.2.11.tar.gz$ tar -xzvf zlib-1.2.11.tar.gz$ cd zlib-1.2.11$ ./configure --prefix=${WRF_INSTALL}/zlib$ make check && make install

5.装置HDF5

浏览器关上:https://www.hdfgroup.org/down...

查看最新版本的HDF5源码的下载地址

例如hdf5-1.12.0的下载地址为:https://www.hdfgroup.org/pack...

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ curl -o hdf5-1.12.0.tar.gz -J -L https://www.hdfgroup.org/package/hdf5-1-12-0-tar-gz/?wpdmdl=14582$ tar -xzvf hdf5-1.12.0.tar.gz$ cd hdf5-1.12.0$ ./configure --prefix=${WRF_INSTALL}/hdf5 --with-zlib=${WRF_INSTALL}/zlib --enable-parallel --enable-shared --enable-hl --enable-fortran$ make -j$(nproc) && make install

6.装置Parallel-NETCDF

Parallel-NETCDF可在官网:

https://parallel-netcdf.githu...

下载最新版本。

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ wget -N https://parallel-netcdf.github.io/Release/pnetcdf-1.12.2.tar.gz$ tar -xzvf pnetcdf-1.12.2.tar.gz$ cd pnetcdf-1.12.2$ ./configure --prefix=${WRF_INSTALL}/pnetcdf --enable-fortran --enable-large-file-test --enable-shared$ make -j$(nproc) && make install

7.装置NETCDF

NETCDF可在官网:https://www.unidata.ucar.edu/...

下载最新版本。

7.1装置NetCDF-C

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ wget -N https://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-c-4.7.4.tar.gz$ tar -xzvf netcdf-c-4.7.4.tar.gz$ cd netcdf-c-4.7.4$ ./configure --prefix=$NCDIR CPPFLAGS="-I$HDF5/include -I$PNET/include" CFLAGS="-DHAVE_STRDUP -O3 -march=armv8.2-a+crypto+fp16+rcpc+dotprod" LDFLAGS="-L$HDF5/lib -L$PNET/lib" --enable-pnetcdf --enable-large-file-tests --enable-largefile  --enable-parallel-tests --enable-shared --enable-netcdf-4  --with-pic --disable-doxygen --disable-dap$ make -j$(nproc) && make install

7.2装置NetCDF-F

$ source /fsx/wrf-arm/wrf-install.env$ wget -N https://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-fortran-4.5.3.tar.gz$ tar -xzvf netcdf-fortran-4.5.3.tar.gz$ cd netcdf-fortran-4.5.3$ ./configure --prefix=$NCDIR --disable-static --enable-shared --with-pic --enable-parallel-tests --enable-large-file-tests --enable-largefile$ make -j$(nproc) && make install

8.装置WRF

8.1下载WRF

WRF能够在Github上下载:

https://github.com/wrf-model/...

$ source /fsx/wrf-arm/wrf-install.env$ cd ${WRF_INSTALL}$ curl -o WRF-v4.2.2.zip -J -L https://github.com/wrf-model/WRF/archive/v4.2.2.zip$ unzip WRF-v4.2.2.zip$ cd WRF-4.2.2

8.2 编译配置文件

应用你相熟的编辑器,例如view编辑文件arch/configure.defaults在行#insert new stanza here与#ARCH Fujitsu FX10/FX100...之间增加以下内容:

############################################################ARCH    Linux aarch64, GCC compiler OpenMPI # serial smpar dmpar dm+sm#DESCRIPTION     =      GCC ($SFC/$SCC): Aarch64DMPARALLEL      =OMPCPP          =      -fopenmpOMP             =      -fopenmpOMPCC           =      -fopenmpSFC             =      gfortranSCC             =      gccCCOMP           =      gccDM_FC           =      mpif90DM_CC           =      mpicc -DMPI2_SUPPORTFC              =      CONFIGURE_FCCC              =      CONFIGURE_CCLD              =      $(FC)RWORDSIZE       =      CONFIGURE_RWORDSIZEPROMOTION       =ARCH_LOCAL      =CFLAGS_LOCAL    =      -w -O3 -cLDFLAGS_LOCAL   =      -fopenmpFCOPTIM         =      -Ofast -march=armv8.2-a+fp16+rcpc+dotprod+crypto -fopenmp -frecursive -funroll-loopsFCREDUCEDOPT    =      $(FCOPTIM)FCNOOPT         =      -O0 -fopenmp -frecursiveFCDEBUG         =      -g $(FCNOOPT)FORMAT_FIXED    =      -ffixed-form -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozFORMAT_FREE     =      -ffree-form -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozFCSUFFIX        =BYTESWAPIO      =      -fconvert=big-endian -frecord-marker=4FCBASEOPTS      =      -w $(FORMAT_FREE) $(BYTESWAPIO)MODULE_SRCH_FLAG=      -I$(WRF_SRC_ROOT_DIR)/mainTRADFLAG        =      -traditional-cppCPP             =      /lib/cpp CONFIGURE_CPPFLAGSAR              =      arARFLAGS         =      ruM4              =      m4 -B 14000RANLIB          =      ranlibRLFLAGS         =CC_TOOLS        =      $(SCC)

8.3编译选项

$ ./configure编译选项抉择8. (dm+sm) GCC (gfortran/gcc): Aarch64Select Option 1 -Compile for nesting? (1=basic, 2=preset moves, 3=vortex following) [default 1]:8.4 执行编译

8.4 执行编译

$ ./compile -j $(nproc) em_real 2>&1 | tee compile_wrf.out

编译胜利后,你能够在main目录下WRF-4.2.2/main找到WRF的EXE文件:

main/ndown.exe

main/real.exe

main/tc.exe

main/wrf.exe

9.装置WPS 4.2

9.1装置Jasper

下载Jasper

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/jasper-1.900.1.tar.gz$ tar -xzvf jasper-1.900.1.tar.gz

在编译之前,咱们须要从http://git.savannah.gnu.org/g...;a=blob_plain;f=config.guess;hb=HEAD下载config.guess文件并笼罩目录jasper-1.900.1下的acaux/config.guess执行以下命令进行下载并笼罩原config.guess文件

$ cd $DOWNLOAD/jasper-1.900.1$ wget -N -O acaux/config.guess "http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD"

装置Jasper

$ cd $DOWNLOAD/jasper-1.900.1$ ./configure --prefix=${WRF_INSTALL}/jasper$ make -j$(nproc) install

9.2装置WPS

下载最新版本的WPShttps://github.com/wrf-model/...

以下示例下载并装置4.2版本

$ source /fsx/wrf-arm/wrf-install.env$ cd $DOWNLOAD$ curl -o WPS-v4.2.tar.gz -J -L https://github.com/wrf-model/WPS/archive/refs/tags/v4.2.tar.gz$ tar -xzvf WPS-v4.2.tar.gz -C ${WRF_INSTALL}$ cd ${WRF_INSTALL}/WPS-4.2

应用文本编辑器在文件arch/configure.defaults顶部增加以下内容

#########################################################################################################################ARCH Linux aarch64, Arm compiler OpenMPI # serial smpar dmpar dm+sm#COMPRESSION_LIBS    = CONFIGURE_COMP_LCOMPRESSION_INC     = CONFIGURE_COMP_IFDEFS               = CONFIGURE_FDEFSSFC                 = gfortranSCC                 = gccDM_FC               = mpif90DM_CC               = mpiccFC                  = CONFIGURE_FCCC                  = CONFIGURE_CCLD                  = $(FC)FFLAGS              = -ffree-form -O -fconvert=big-endian -frecord-marker=4 -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozF77FLAGS            = -ffixed-form -O -fconvert=big-endian -frecord-marker=4 -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozFCSUFFIX            =FNGFLAGS            = $(FFLAGS)LDFLAGS             =CFLAGS              =CPP                 = /usr/bin/cpp -P -traditionalCPPFLAGS            = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL CONFIGURE_MPIRANLIB              = ranlib

编译装置

$ ./configure

编译选项抉择

Linux aarch64, Arm compiler OpenMPI (dmpar)

若遇到如下的输入提醒,疏忽即可。

Your versions of Fortran and NETCDF are not consistent.

编译之前, 咱们还须要批改WPS-4.2目录下的文件configure.wps中的 WRF_LIB值,将-L$(NETCDF)/lib -lnetcdf更改成-L$(NETCDF)/lib -lnetcdff -lnetcdf -lgomp

如下所示:

WRF_LIB = -L$(WRF_DIR)/external/io_grib1 -lio_grib1 \-L$(WRF_DIR)/external/io_grib_share -lio_grib_share \-L$(WRF_DIR)/external/io_int -lwrfio_int \-L$(WRF_DIR)/external/io_netcdf -lwrfio_nf \-L$(NETCDF)/lib -lnetcdff -lnetcdf -lgomp

执行编译

$ ./compile | tee compile_wps.out

编译胜利后,能够在当前目录下看到3个可执行文件:

geogrid.exe→geogrid/src/geogrid.exe

ungrib.exe→ungrib/src/ungrib.exe

metgrid.exe→metgrid/src/metgrid.exe

10.装置WRFDA

WRFDA是一个对立的模型空间数据异化零碎,能够寰球或区域,多模型,3/4D-Var。其组成及各组成间的分割如图所示。

在4.0之后的版本,WRFDA的编译装置能够在WRF源码上进行。

解压WRF到目录WRFDA-4.2.2

$ source /fsx/wrf-arm/wrf-install.env$ cd ${WRF_INSTALL}$ unzip -d /tmp WRF-v4.2.2.zip$ mv /tmp/WRF-4.2.2 ${WRF_INSTALL}/WRFDA-4.2.2$ cd ${WRF_INSTALL}/WRFDA-4.2.2

编译 

$ ./configure wrfda

编译选项抉择

3.(dmpar)

执行编译

$ ./compile all_wrfvar 2>&1 | tee compile_wrfda.out

编译胜利后,你能够在${WRF_INSTALL}/WRFDA-4.2.2/var/build/目录下找到WRFDA的EXE文件da_wrfvar.exe

11.装置OBSGRID

下载OBSGRID

OBSGRID能够在Github下载:

https://github.com/wrf-model/...

$ source /fsx/wrf-arm/wrf-install.env$ cd ${WRF_INSTALL}$ git clone https://github.com/wrf-model/OBSGRID$ cd ${WRF_INSTALL}/OBSGRID

编译配置文件应用你相熟的编辑器,例如view编辑文件arch/configure.defaults,在顶部增加以下内容:

############################################################ARCH Linux aarch64,  gfortran compiler#FC              =       gfortranFFLAGS          = -ffree-form -O -fconvert=big-endian -frecord-marker=4 -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozF77FLAGS        = -ffixed-form -O -fconvert=big-endian -frecord-marker=4 -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-bozFNGFLAGS        =       $(FFLAGS)LDFLAGS         =CC              =       gccCFLAGS          =CPP             =       /usr/bin/cpp -P -traditionalCPPFLAGS        = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL

编译

$ ./configure

抉择

Select 1. Linux aarch64, gfortran compiler

批改文件configure.oa中NETCDF_LIBS的值

NETCDF_LIBS = -L${NETCDF}/lib -lnetcdff -lnetcdf

执行编译

$ ./compile 2>&1 | tee -a compile_oa.out

目前不足NCAR Graphics Library,所以编译plot的程序时会收到失败的信息(但不影响OBSGRID的编译)

gfortran-o plot_soundings.exe plot_soundings.o module_mapinfo.o module_report.o module_skewt.o date_pack_module.o -L/lib -lncarg -lncarg_gks -lncarg_c -lX11 -lm -lcairo -L/fsx/wrf-arm/netcdf/lib -lnetcdff -lnetcdf -I/fsx/wrf-arm/netcdf/include/usr/bin/ld:cannot find-lncarg/usr/bin/ld:cannot find-lncarg_gks/usr/bin/ld:cannot find-lncarg_c/usr/bin/ld:cannot find-lcairocollect2:error:ld returned 1 exit status

编译胜利后,你能够在OBSGRID当前目录下${WRF_INSTALL}/OBSGRID找到OBSGRID的EXE文件obsgrid.exe

WPS数据前解决与WRF并行计算

WRF工作运行之前,须要筹备数据并进行预处理,数据包含动态天文数据和实时气象数据,都能够从NCEP的官网获取;之后别离用WPS的geogrid、ungrib和metgrid进行数据预处理,产生相应的文件,之后就能够执行WRF工作了,如下示意图:

  1. 下载动态天文数据

在/fsx目录下新建文件夹data,下载到其中,可从官方网站获取:http://www2.mmm.ucar.edu/wrf/...

$ cd /fsx$ mkdir data$ cd data$  wget https://www2.mmm.ucar.edu/wrf/src/wps_files/geog_high_res_mandatory.tar.gz

而后解压缩动态天文数据,并勾销tar文件,2.6G的文件最终会成为29G的文件。文件较大,须要期待一段时间。解压缩后的文件j夹名称为WPS_GEOG

$ gunzip geog_high_res_mandatory.tar.gz$ tar -xf geog_high_res_mandatory.tar

而后批改namelist.wps文件中的&geogrid局部,将动态文件目录提供给geogrid程序。

$ cd /fsx/wrf-arm/WPS-4.2$ view namelist.wpsgeog_data_path ='/fsx/data/WPS_GEOG/'

2.下载实时气象数据

实时气象数据可从官方网站获取:ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod

在/fsx/data目录下创立一个目录weather_data,将实时数据下载到weather_data中。本例中下载2021年6月22日的f000、f006、f012三个数据作为测试数据,您能够依据本人的需要抉择其余实时数据用于测试。

$ cd /fsx/data$ mkdir weather_data$ cd weather_data$ wget ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.20210622/00/atmos/gfs.t00z.pgrb2.0p25.f000$ mv gfs.t00z.pgrb2.0p25.f000 GFS_00h$ wget ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.20210622/00/atmos/gfs.t00z.pgrb2.0p25.f006$ mv gfs.t00z.pgrb2.0p25.f006 GFS_06h$ wget ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.20210622/00/atmos/gfs.t00z.pgrb2.0p25.f012$ mv gfs.t00z.pgrb2.0p25.f012 GFS_12h

3.运行geogrid

转到WPS目录中,运行geogrid

$ cd /fsx/wrf-arm/WPS-4.2$ ./geogrid.exe>&log.geogrid

这一步运行胜利的标记是创立了geo_em.*文件,在本例中为 geo_em.d01.nc 和geo_em.d02.nc

4.运行ungrib

运行ungrib,首先批改链接到GFS和Vtables的正确地位

$ ./link_grib.csh /fsx/data/weather_data/$ ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable

而后批改namelist.wps文件的start_date和end_date,与实时数据相符合

start_date = '2021-06-22_00:00:00','2021-06-22_00:00:00',end_date   = '2021-06-22_12:00:00','2021-06-22_12:00:00'

而后运行ungrib

$ ./ungrib.exe

这一步运行胜利的标记是创立了FILE:*文件,在本例中为FILE:2021-06-22_00、FILE:2021-06-22_06、FILE:2021-06-22_12

5.运行metgrid

$ ./metgrid.exe>&log.metgrid

这一步运行胜利的标记是创立了met_em*文件

  1. 复制数据到WRF工作目录

进入WRF目录,将met_em.*文件复制到工作目录

$ cd ${WRF_INSTALL}/WRF-4.2.2$ cp ${WRF_INSTALL}/WPS-4.2/met_em* ${WRF_INSTALL}/WRF-4.2.2/run/
  1. 批改namelist.input文件

批改namelist.input文件中的开始和完结工夫,每一行三项设置为雷同工夫,开始和完结工夫与实时数据相符合;批改num_metgrid_levels参数为34,与实时数据相符合。

start_year                          = 2021, 2021, 2021,start_month                         = 06,   06,   06,start_day                           = 22,   22,   22,start_hour                          = 00,   00,   00,end_year                            = 2021, 2021, 2021,end_month                           = 06,   06,   06,end_day                             = 22,   22,   22,end_hour                            = 12,   12,   12,num_metgrid_levels                  = 34,

8.运行初始化程序real

$ mpirun -np 1 ./real.exe

查看输入文件以确保运行胜利,运行胜利后会看到每个域的wrfbdy_d01和wrfinput_d0* 文件。如果有谬误,依据文件中的提醒批改namelist.input文件中的参数。

$ tail rsl.error.0000

9.运行WRF

可自行批改np参数,但要小于主节点实例的物理核数。

$ mpirun -np 8 ./wrf.exe

运行胜利的标记是rsl.out.0000文件中有SUCCESS结尾,并生成wrfout*文件。

提交WRF并行计算工作

1.下载测试数据集

$ cd /fsx/data$ wget https://dcn1tgfn79vvj.cloudfront.net/conus_2.5km_v4.tar.gz$ tar -xzvf conus_2.5km_v4.tar.gz

为不便执行wrf.exe测试,将wrf.exe软链接到数据目录下

$ ln -s ${WRF_INSTALL}/WRF-4.2.2/main/wrf.exe /fsx/data/conus_2.5km_v4/wrf.exe

2.编写并保留测试脚本

$ vi wrf.sbatch#!/bin/bash#SBATCH --wait-all-nodes=1#SBATCH --ntasks-per-node=8#SBATCH --cpus-per-task=8#SBATCH --nodes=2#SBATCH --ntasks-per-core=1#SBATCH --export=ALL#SBATCH --partition=od-queue#SBATCH --exclusive#SBATCH -o /fsx/slurm.out#ENV VARIABLES##---------------------Run-time env-----------------------------------------ulimit -s unlimitedexport OMP_STACKSIZE=12Gexport OMP_NUM_THREADS=8export KMP_AFFINITY=scatter,verbose#WRF ENVexport WRF_INSTALL=/fsx/wrf-armexport GCC_VERSION=10.2.0export OPENMPI_VERSION=4.1.0export PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/bin:$PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/lib64:$LD_LIBRARY_PATHexport PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/bin:$PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/netcdf/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/pnetcdf/lib:$LD_LIBRARY_PATHexport LD_LIBRARY_PATH=${WRF_INSTALL}/hdf5/lib:$LD_LIBRARY_PATH#--------------------------------------------------------------------------echo "Running WRF on $(date)"cd /fsx/data/conus_2.5km_v4/mpirun --report-bindings ./wrf.exe &>> wrf.outecho nstasks=$SLURM_NTASKSdate -u +%Y-%m-%d_%H:%M:%S >> wrf.times

3.提交作业

在主节点上应用以下命令提交您的作业:

$ sbatch wrf.sbatch

应用命令squeue查看队列的状态。作业将首先标记为pending(PD状态),因为正在创立资源(或处于down/drained状态)。如果您查看EC2仪表板,您应该会看到节点正在启动。

$ squeue

您还能够应用sinfo命令查看集群中可用节点的数量。

$ sinfo

您还能够应用scontrol命令查看具体作业信息。

$ scontrol show jobid -dd

WRF计算结果默认保留在目录数据集目录/fsx/data/conus_2.5km_v4。

4.查看WRF运行过程和输入后果

$ cd /fsx/data/conus_2.5km_v4/$ tail -f rsl.out.0000

运行实现后,查看输入后果文件:

1$ ls -lh wrfout*-rw-rw-r-- 1 ec2-user ec2-user 2.1G Apr 1 14:01 wrfout_d01_2018-06-17_00:00:00

采纳ncview或者Panoply等软件查看后果文件的输入变量和可视化化展现,以下是模仿三小时后的10m风速的图形:

  • ncview

https://cirrus.ucsd.edu/ncview/

  • Panoply

https://www.giss.nasa.gov/too...

工作提交后,ParallelCluster会依据工作需要主动启动计算实例,增加到集群中,并行执行工作;工作实现后,一段时间内如果没有工作运行在计算节点,ParallelCluster会将计算节点终止,节约老本。

总结

综上所述,WRF模式零碎全流程组件都能够在基于Amazon Graviton2的Arm架构实例上运行,同时应用ParallelCluster的灵便治理,使得WRF工作的运行既高效,又经济。在云上应用WRF做气象剖析和预测不仅能够使您的效率大大提高,老本灵便可控,也使得成绩的展现和应用更加便捷。

参考资料

1.Amazon Graviton官网:

https://aws.amazon.com/cn/ec2...

2.Amazon ParallelCluster:

https://docs.Amazon.amazon.co...

3.WRF用户手册:

https://www2.mmm.ucar.edu/wrf...

4.WRF官网天文数据下载:

http://www2.mmm.ucar.edu/wrf/...

5.NCEP气象实时数据下载:

ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod

本篇作者

杨志浩

亚马逊云科技解决方案架构师

负责基于亚马逊的云计算计划的征询与架构设计,目前专一在新能源电力行业。致力于推广HPC,IoT技术畛域在风电,光伏等新能源电力行业的利用。

吴金福

亚马逊云科技混合云计划架构师

负责基于亚马逊云科技的混合云计划架构的征询和设计。在退出亚马逊云科技之前,就任于大型团体企业。负责公有云数据中心的方案设计和建设,在数据中心基础设施、虚拟化、高性能计算和混合云等畛域有着多年的教训积攒。