风雨以后,众志成城。天气预测是科技界的难题,咱们始终在致力尝试,用新的云科技来持续尝试。
背景介绍
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 configure
AWS Access Key ID [None]: ABCD***********
AWS Secret Access Key [None]: wJalrX********
Default region name [us-east-1]: cn-northwest-1
Default 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 = default
update_check = true
sanity_check = true
[cluster default]
key_name = lab-key
base_os = alinux2
vpc_settings = public
ebs_settings = myebs
fsx_settings = myfsx
master_instance_type = c6g.16xlarge
post_install = s3://YOUR_S3_BUCKET_NAME/pcluster_postinstall.sh
s3_read_write_resource = arn:aws-cn:s3:::YOUR_S3_BUCKET_NAME/*
scheduler = slurm
queue_settings = od-queue,spot-queue
[queue od-queue]
compute_resource_settings = c6g-od
compute_type = ondemand
placement_group = DYNAMIC
[compute_resource c6g-od]
instance_type = c6g.16xlarge
min_count = 0
max_count = 16
initial_count = 0
[queue spot-queue]
compute_resource_settings = c6g-spot
compute_type = spot
placement_group = DYNAMIC
[compute_resource c6g-spot]
instance_type = c6g.16xlarge
min_count = 0
max_count = 16
initial_count = 0
[vpc public]
vpc_id = ${VPC_ID}
master_subnet_id = ${SUBNET_ID}
[ebs myebs]
shared_dir = /shared
volume_type = gp2
volume_size = 20
[fsx myfsx]
shared_dir = /fsx
storage_capacity = 1200
deployment_type = SCRATCH_2
[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}
EOF
6. 编辑 parallelcluster 配置
应用以下命令查看或编辑 ParallelCluster 配置
$ view wrf-on-graviton2.ini
脚本分为区域、集群信息配置、主动扩大设置、共享数据卷设置、VPC 与子网设置等几个局部。重点关注以下几个参数:
- post_install 设置的是集群节点启动时运行的脚本地位,批改 YOUR_S3_BUCKET_NAME 为你本人的存储桶名称,因为 WRF 不能得益于超线程,因而这个脚本中会敞开 EC2 实例的超线程,依照物理核来运行。
- s3_read_write_resource 设置的是集群拜访的 S3 存储桶,批改 YOUR_S3_BUCKET_NAME 为你本人的存储桶名称。
- compute_instance_type 设置的是计算节点的类型,倡议尽可能应用较大的实例类型,在并行计算场景中进步更多的效率,此处设定为 c6g.16xlarge;默认新账户这个实例类型 limit 较少,倡议提前开 support case 进步 limit。
- master_instance_type 设置的是主节点的类型,主节点用于装置软件、下载数据,不参加并行计算,所以不须要太大,此处设定为 m5.xlarge。
- scheduler 设置的是批处理打算,此处应用 slurm。
- queue_settings 指定群集应用队列而不是同构计算队列,能够使得咱们应用不同的队列提交工作。仅在 scheduler 设置为 slurm 时可用。
- [queue]定义繁多队列的配置设置,在下面的配置文件中,我定义了按需和 Spot 的队列。
- placement_group 定义集群置放群组。
- fsx_settings 及 [fsx myfsx] 设置的 FSx for Lustre 并行文件系统,集群部署实现后 master 和 computer 节点会主动挂载 fsx。
- 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.env
export DOWNLOAD=/fsx/tools
export WRF_INSTALL=/fsx/wrf-arm
export WRF_DIR=${WRF_INSTALL}/WRF-4.2.2
export GCC_VERSION=10.2.0
export OPENMPI_VERSION=4.1.0
export PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/bin:$PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/lib64:$LD_LIBRARY_PATH
export CC=gcc
export CXX=g++
export FC=gfortran
export PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/bin:$PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/lib:$LD_LIBRARY_PATH
export CC=mpicc
export CXX=mpic++
export FC=mpifort
export F90=mpifort
export CXX=mpicxx
export FC=mpif90
export F77=mpif90
export F90=mpif90
export 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}/hdf5
export PNET=${WRF_INSTALL}/pnetcdf
export ZLIB=${WRF_INSTALL}/zlib
export 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}/netcdf
export 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}/hdf5
export NETCDF=${WRF_INSTALL}/netcdf
export PNETCDF=${WRF_INSTALL}/pnetcdf
export 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_PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/pnetcdf/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/hdf5/lib:$LD_LIBRARY_PATH
export WRFIO_NCD_LARGE_FILE_SUPPORT=1
export NETCDF_classic=1
export F77=mpifort
export FFLAGS="-g -fPIC"
export FCFLAGS="-g -fPIC"
export JASPERLIB=${WRF_INSTALL}/jasper/lib
export JASPERINC=${WRF_INSTALL}/jasper/include
- 装置 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): Aarch64
DMPARALLEL =
OMPCPP = -fopenmp
OMP = -fopenmp
OMPCC = -fopenmp
SFC = gfortran
SCC = gcc
CCOMP = gcc
DM_FC = mpif90
DM_CC = mpicc -DMPI2_SUPPORT
FC = CONFIGURE_FC
CC = CONFIGURE_CC
LD = $(FC)
RWORDSIZE = CONFIGURE_RWORDSIZE
PROMOTION =
ARCH_LOCAL =
CFLAGS_LOCAL = -w -O3 -c
LDFLAGS_LOCAL = -fopenmp
FCOPTIM = -Ofast -march=armv8.2-a+fp16+rcpc+dotprod+crypto -fopenmp -frecursive -funroll-loops
FCREDUCEDOPT = $(FCOPTIM)
FCNOOPT = -O0 -fopenmp -frecursive
FCDEBUG = -g $(FCNOOPT)
FORMAT_FIXED = -ffixed-form -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
FORMAT_FREE = -ffree-form -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
FCSUFFIX =
BYTESWAPIO = -fconvert=big-endian -frecord-marker=4
FCBASEOPTS = -w $(FORMAT_FREE) $(BYTESWAPIO)
MODULE_SRCH_FLAG= -I$(WRF_SRC_ROOT_DIR)/main
TRADFLAG = -traditional-cpp
CPP = /lib/cpp CONFIGURE_CPPFLAGS
AR = ar
ARFLAGS = ru
M4 = m4 -B 14000
RANLIB = ranlib
RLFLAGS =
CC_TOOLS = $(SCC)
8.3 编译选项
$ ./configure
编译选项抉择
8. (dm+sm) GCC (gfortran/gcc): Aarch64
Select 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_L
COMPRESSION_INC = CONFIGURE_COMP_I
FDEFS = CONFIGURE_FDEFS
SFC = gfortran
SCC = gcc
DM_FC = mpif90
DM_CC = mpicc
FC = CONFIGURE_FC
CC = CONFIGURE_CC
LD = $(FC)
FFLAGS = -ffree-form -O -fconvert=big-endian -frecord-marker=4 -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
F77FLAGS = -ffixed-form -O -fconvert=big-endian -frecord-marker=4 -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
FCSUFFIX =
FNGFLAGS = $(FFLAGS)
LDFLAGS =
CFLAGS =
CPP = /usr/bin/cpp -P -traditional
CPPFLAGS = -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL CONFIGURE_MPI
RANLIB = 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 = gfortran
FFLAGS = -ffree-form -O -fconvert=big-endian -frecord-marker=4 -ffixed-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
F77FLAGS = -ffixed-form -O -fconvert=big-endian -frecord-marker=4 -ffree-line-length-0 -fallow-argument-mismatch -fallow-invalid-boz
FNGFLAGS = $(FFLAGS)
LDFLAGS =
CC = gcc
CFLAGS =
CPP = /usr/bin/cpp -P -traditional
CPPFLAGS = -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 工作了,如下示意图:
- 下载动态天文数据
在 /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.wps
geog_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* 文件
- 复制数据到 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/
- 批改 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 unlimited
export OMP_STACKSIZE=12G
export OMP_NUM_THREADS=8
export KMP_AFFINITY=scatter,verbose
#WRF ENV
export WRF_INSTALL=/fsx/wrf-arm
export GCC_VERSION=10.2.0
export OPENMPI_VERSION=4.1.0
export PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/bin:$PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/gcc-${GCC_VERSION}/lib64:$LD_LIBRARY_PATH
export PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/bin:$PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/openmpi-${OPENMPI_VERSION}/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/netcdf/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=${WRF_INSTALL}/pnetcdf/lib:$LD_LIBRARY_PATH
export 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.out
echo nstasks=$SLURM_NTASKS
date -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 技术畛域在风电,光伏等新能源电力行业的利用。
吴金福
亚马逊云科技混合云计划架构师
负责基于亚马逊云科技的混合云计划架构的征询和设计。在退出亚马逊云科技之前,就任于大型团体企业。负责公有云数据中心的方案设计和建设,在数据中心基础设施、虚拟化、高性能计算和混合云等畛域有着多年的教训积攒。