写点什么

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

  • 2022 年 1 月 14 日
  • 本文字数:15187 字

    阅读完需:约 50 分钟

基于云上 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 中国区开启气象的研究和预测。



📢 想要了解更多亚马逊云科技最新技术发布和实践创新,敬请关注在上海、北京、深圳三地举办的 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/installing


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/developer/tools-software/tools/b/tools-software-ides-blog/posts/gcc-10-better-and-faster)。



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/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
复制代码


2. 安装 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/downloads/hdf5/source-code/

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


例如 hdf5-1.12.0 的下载地址为:https://www.hdfgroup.org/package/hdf5-1-12-0-tar-gz/?wpdmdl=14582


$ 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.github.io/wiki/Download.html

下载最新版本。


$ 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/downloads/netcdf/

下载最新版本。


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/WRF/tree/master


$ 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): 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/gitweb/?p=config.git;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/WPS/releases/

以下示例下载并安装 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/OBSGRID


$ 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/users/download/get_sources_wps_geog.html


$ 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*文件


6. 复制数据到 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/
复制代码


7. 修改 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=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/tools/panoply/



任务提交后,ParallelCluster 会根据任务需求自动启动计算实例,添加到集群中,并行执行任务;任务完成后,一段时间内如果没有任务运行在计算节点,ParallelCluster 会将计算节点终止,节约成本。


总结


综上所述,WRF 模式系统全流程组件都可以在基于 Amazon Graviton2 的 Arm 架构实例上运行,同时使用 ParallelCluster 的灵活管理,使得 WRF 任务的运行既高效,又经济。在云上使用 WRF 做气象分析和预测不仅可以使您的效率大大提高,成本灵活可控,也使得成果的展示和使用更加便捷。


参考资料


1.Amazon Graviton 官网:

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

2.Amazon ParallelCluster:

https://docs.Amazon.amazon.com/zh_cn/parallelcluster/latest/ug/what-is-Amazon-parallelcluster.html

3.WRF 用户手册:

https://www2.mmm.ucar.edu/wrf/users/docs/user_guide_v4/v4.2/contents.html

4.WRF 官网地理数据下载:

http://www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html

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

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

本篇作者


杨志浩

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

负责基于亚马逊的云计算方案的咨询与架构设计,目前专注在新能源电力行业。致力于推广 HPC,IoT 技术领域在风电,光伏等新能源电力行业的应用。


吴金福

亚马逊云科技混合云方案架构师

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


用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
基于云上 Arm 架构赋能数值天气预报