基于云上 Arm 架构赋能数值天气预报

基于云上 Arm 架构赋能数值天气预报
文章图片

基于云上 Arm 架构赋能数值天气预报
文章图片

风雨当前,万众一心。天气预测是科技界的难题,我们一直在努力尝试,用新的云科技来继续尝试。
背景介绍 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中国区开启气象的研究和预测。
基于云上 Arm 架构赋能数值天气预报
文章图片

想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的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架构图:
基于云上 Arm 架构赋能数值天气预报
文章图片

1.启动跳板机实例
打开Amazon管理控制台,选择EC2服务,点击【启动实例】启动一个新的实例。这台实例对应上图中的跳板机,用于ParallelCluster的集群配置和管理,对性能没有高要求,使用T2.micro或同类型的机型即可。
基于云上 Arm 架构赋能数值天气预报
文章图片

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),用于配置实例的访问权限。
基于云上 Arm 架构赋能数值天气预报
文章图片

回到控制实例中,配置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与子网设置等几个部分。重点关注以下几个参数:
  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的安装:
基于云上 Arm 架构赋能数值天气预报
文章图片

首先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...)。
基于云上 Arm 架构赋能数值天气预报
文章图片

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/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

  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...之间添加以下内容:
########################################################### #ARCHLinux 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): 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_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。其组成及各组成间的联系如图所示。
基于云上 Arm 架构赋能数值天气预报
文章图片

在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任务了,如下示意图:
基于云上 Arm 架构赋能数值天气预报
文章图片

  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=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...
基于云上 Arm 架构赋能数值天气预报
文章图片

任务提交后,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
本篇作者
基于云上 Arm 架构赋能数值天气预报
文章图片

杨志浩
亚马逊云科技解决方案架构师
负责基于亚马逊的云计算方案的咨询与架构设计,目前专注在新能源电力行业。致力于推广HPC,IoT技术领域在风电,光伏等新能源电力行业的应用。
基于云上 Arm 架构赋能数值天气预报
文章图片

吴金福
亚马逊云科技混合云方案架构师
负责基于亚马逊云科技的混合云方案架构的咨询和设计。在加入亚马逊云科技之前,就职于大型集团企业。负责私有云数据中心的方案设计和建设,在数据中心基础设施、虚拟化、高性能计算和混合云等领域有着多年的经验积累。
【基于云上 Arm 架构赋能数值天气预报】

    推荐阅读