次の方法で共有


Azure で HPC Pack Linux クラスターを使用して WRF を実行する

WRFは、気象予測のための数値計算ソフトウェアです。 並列コンピューティングを強力にサポートしています。 DM (Distributed-Memory 並列処理) モードでビルドする場合、基本的には MPI プログラムです。 実際には、人々はクラスターで WRF を実行します。

この記事では、Linux クラスターの作成、WPS (WRF のデータ前処理モジュール)、WRF とその依存ライブラリの構築、WRF ジョブの実行など、HPC Pack を使用して WRF を実行する方法について説明します。 HPC Pack のノード管理機能とジョブ管理機能は、プロセスを簡素化し、効率を高めるのに役立ちます。

前提 条件

  • Linux コンピューティング ノードを準備します。 ARM テンプレートを使用して新しい Linux クラスターをデプロイすることも、既存のクラスターのクラスター マネージャーに Linux ノードを追加することもできます。 ワークロードで RDMA ネットワークが必要な場合は、VM が同じ仮想マシン スケール セットまたは可用性セットにデプロイされていることを確認し、VM が RDMA 対応になるように、 がサフィックス が H シリーズ 配置されている必要があることに注意してください。

    • オプション 1: Linux ワークロード の単一ヘッド ノード クラスターを使用して、新しい Linux クラスターをデプロイします。

      ARM テンプレート の

    • オプション 2: 既存のクラスターのクラスター マネージャーで、新しい IaaS ノード テンプレートを追加し、テンプレートを使用して新しいノードを追加します。 クラスターには、Windows ワークロードまたは Linux ワークロード用のクラスターを使用できます。

      IaaS ノードの tempate を追加する

      新しいノード を追加する

    ノードをデプロイした後、ノード用の特定のグループを作成する必要があります。 これは、次のセクションの clusrun コマンドで、WRF 関連のノードではなくコマンドが実行されないようにするのに役立ちます。 ここでは、新しく追加されたノードの WRFNodes を作成します。

    ノード グループ を追加する

  • システム環境を準備します。システムに gfortran コンパイラと、gcc と cppする必要があります。 CSH、perlsh スクリプト言語も必要です。WRF ビルド システムでは、これらの言語で記述されたスクリプトがユーザー インターフェイスの最上位レベルとして使用されるためです。 WRFの公式 ウェブサイト は、コンパイラが互いに互換性があり、スクリプト言語がシステム上で適切に動作していることを検証するためのテストを提供します。

    ホーム ディレクトリの下 WRFModel/Tests 新しいフォルダーを作成し、テスト ファイルをダウンロードし、clusrun を使用してテストを実行します。

    clusrun /nodegroup:WRFNodes "wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/Fortran_C_tests.tar; mkdir -p ~/WRFModel/Tests; tar -xf Fortran_C_tests.tar -C ~/WRFModel/Tests;"&&clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Tests;gfortran TEST_1_fortran_only_fixed.f;./a.out;gfortran TEST_2_fortran_only_free.f90;./a.out;gcc TEST_3_c_only.c;./a.out;gcc -c -m64 TEST_4_fortran+c_c.c;gfortran -c -m64 TEST_4_fortran+c_f.f90;gfortran -m64 TEST_4_fortran+c_f.o TEST_4_fortran+c_c.o;./a.out;./TEST_csh.csh;./TEST_perl.pl;./TEST_sh.sh;"
    

WRF をダウンロードしてビルドする

環境変数を設定する

  • WRF またはライブラリをコンパイルする前に、これらのメイクファイル コンパイラ オプションを設定する必要があります。

    名前 価値
    CC gcc
    CXX g++
    FC gfortran
    FCFLAGS -m64
    F77 gfortran
    FFLAGS -m64
  • ホーム ディレクトリの下 WRFModel/Build_WRF/Libraries 新しいフォルダーを作成し、別のライブラリがインストールされる場所を含む親ディレクトリとして使用します。 その値を環境変数として DIR設定します。

  • 上記のすべてを達成するには、clusrun を使用します。

    clusrun /nodegroup:WRFNodes "mkdir -p ~/WRFModel/Build_WRF/LIBRARIES;sed -i '$a export DIR=~/WRFModel/Build_WRF/LIBRARIES \nexport CC=gcc \nexport CXX=g++ \nexport FC=gfortran \nexport FCFLAGS=-m64 \nexport F77=gfortran \nexport FFLAGS=-m64' ~/.profile;source ~/.profile"
    

MPICH をダウンロードしてコンパイルする

  • 原則として、MPI-2 標準の実装は、WRF の分散メモリ並列処理モードで動作する必要があります。 しかし、MPICHはWRFの公式 ウェブサイト 推奨しています。 MPICH をダウンロードしてビルドし、MPICH の bin フォルダーを PATHに追加する必要があります。

    上記のすべてを達成するには、clusrun を使用します。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF/LIBRARIES;wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/mpich-3.0.4.tar.gz; tar xzvf mpich-3.0.4.tar.gz;cd mpich-3.0.4;./configure --prefix=`echo $(dirname $PWD)`/mpich;make;make install;sed -i '$a export PATH=$DIR/mpich/bin:$PATH' ~/.profile;source ~/.profile"
    

ライブラリのダウンロードとコンパイル

  • WRF をコンパイルする前に、インストールする必要があるさまざまな依存ライブラリがあります。 NetCDF は、配列計算の基礎として使用されます。 zliblibpng、および Jasper は、GRIB2 機能を使用して WPS をコンパイルするために必要な圧縮ライブラリです。

  • NetCDFをダウンロードしてコンパイルします。 次に、その bin フォルダーを PATHに追加し、環境変数を NETCDF追加します。 これらを実現するには、clusrun を使用します。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF/LIBRARIES;wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/netcdf-4.1.3.tar.gz; tar zxvf netcdf-4.1.3.tar.gz;cd netcdf-4.1.3;./configure --prefix=`echo $(dirname $PWD)`/netcdf --disable-dap --disable-netcdf-4 --disable-shared;make;make install;sed -i '$a export PATH=$DIR/netcdf/bin:$PATH \nexport NETCDF=$DIR/netcdf' ~/.profile;source ~/.profile"
    
  • zlibをダウンロードしてコンパイルします。 次に、メイクファイル コンパイラ オプション LDFLAGS および CPPFLAGSを設定します。 これらを実現するには、clusrun を使用します。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF/LIBRARIES;wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/zlib-1.2.11.tar.gz; tar xzvf zlib-1.2.11.tar.gz;cd zlib-1.2.11;./configure --prefix=`echo $(dirname $PWD)`/grib2;make;make install;sed -i '$a export LDFLAGS=-L$DIR/grib2/lib \nexport CPPFLAGS=-I$DIR/grib2/include \nexport LD_LIBRARY_PATH=$DIR/grib2/lib:$LD_LIBRARY_PATH ' ~/.profile;source ~/.profile"
    
  • clusrun を使用して libpng をダウンロードしてコンパイルします。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF/LIBRARIES;wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/libpng-1.2.50.tar.gz; tar xzvf libpng-1.2.50.tar.gz;cd libpng-1.2.50;./configure --prefix=`echo $(dirname $PWD)`/grib2;make;make install;"
    
  • Jasperをダウンロードしてコンパイルします。 次に、環境変数 JASPERLIB 追加し、それに対応して JASPERINC= します。 これらを実現するには、clusrun を使用します。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF/LIBRARIES;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;cd jasper-1.900.1;./configure --prefix=`echo $(dirname $PWD)`/grib2;make;make install;sed -i '$a export JASPERLIB=$DIR/grib2/lib \nexport JASPERINC=$DIR/grib2/include' ~/.profile;source ~/.profile"
    
  • ライブラリが構築されたら、WPS および WRF ビルドに使用するコンパイラでライブラリが動作できることを確認する必要があります。 WRFの ウェブサイトによって提供されるテストを使用してください.

    clusrun /nodegroup:WRFNodes "wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/Fortran_C_NETCDF_MPI_tests.tar; tar -xf Fortran_C_NETCDF_MPI_tests.tar -C ~/WRFModel/Tests;"&&clusrun /nodegroup:WRFNodes "source ~/.profile;cd ~/WRFModel/Tests;cp ~/WRFModel/Build_WRF/LIBRARIES/netcdf/include/netcdf.inc .;gfortran -c 01_fortran+c+netcdf_f.f;gcc -c 01_fortran+c+netcdf_c.c;gfortran 01_fortran+c+netcdf_f.o 01_fortran+c+netcdf_c.o -L ~/WRFModel/Build_WRF/LIBRARIES/netcdf/lib -lnetcdff -lnetcdf;./a.out;mpif90 -c 02_fortran+c+netcdf+mpi_f.f;mpicc -c 02_fortran+c+netcdf+mpi_c.c;mpif90 02_fortran+c+netcdf+mpi_f.o 02_fortran+c+netcdf+mpi_c.o -L ~/WRFModel/Build_WRF/LIBRARIES/netcdf/lib -lnetcdff -lnetcdf;mpirun ./a.out"
    

WRF と WPS をダウンロードしてコンパイルする

  • Build_WRFで、Github から WRF と WPS のソース コードを複製します。

    clusrun /nodegroup:WRFNodes "cd ~/WRFModel/Build_WRF;git clone https://github.com/wrf-model/WRF;git clone https://github.com/wrf-model/WPS"
    
  • WRF をコンパイルします。 コンパイルする前に、使用するコンパイラと WRF の構築方法を構成する必要があります。 WRF は DM モードでビルドするため、オプション 34 (gcc(dmpar) を使用する gfortran コンパイラ) を選択し、入れ子のオプションは "basic" にする必要があります。

    WRF は構成で対話型モードを採用しているため、SSH (クラスター マネージャー -> リソース管理 -> ノード アクション -> リモート デスクトップ/SSH) 経由でノードにログインし、構成プログラムを手動で実行してコンパイルします。

    source ~/.profile;
    cd ~/WRFModel/Build_WRF/WRF;
    ./configure #Here, you choose the compile option you want
    ./compile em_real >& log.compile #The compilation should take about 20-30 minutes
    

    ls -ls main/*.exeを実行してコンパイルが成功したかどうかを確認します。次の内容が表示されます。

    wrf.exe 
    real.exe  
    ndown.exe 
    tc.exe  
    
  • WPS をコンパイルします。 ここでも、コンパイラを構成する必要があります。 オプション1 (シリアル、WRF公式ウェブサイトが推奨)を選択してください。 WPS は CPU 負荷が少なく、1 つのプロセッサ ジョブとして実行できます。

    SSH 経由でノードにログインし、構成プログラムを実行してコンパイルします。

    source ~/.profile;
    cd ~/WRFModel/Build_WRF/WPS;
    ./configure #Here, you choose the compile option you want
    ./compile >& log.compile #The compilation should take a few minutes
    

    コンパイルが成功した場合は、WPS 最上位ディレクトリに 3 つの実行可能ファイルが存在する必要があります。

    geogrid.exe -> geogrid/src/geogrid.exe
    ngrib.exe -> ungrib/src/ungrib.exe
    metgrid.exe -> metgrid/src/metgrid.exe
    

WRF ワークロードを実行する

WRF ジョブのサンプル データを準備する

この記事では、ハリケーン マシューの単一ドメイン ケースを使用します。 背景の詳細については、この リンクを参照してください。

  • 静的地理データ をダウンロードし、リアルタイム データを します。 clusrunして各ノードのサンプル データをダウンロードできますが、ネットワーク帯域幅を節約するには、1 つのノードでのみダウンロードを実行し、NFS クラスターを構成し、NFS サービスを介してデータを共有することをお勧めします。

    • サーバー側:

      データのダウンロード:

      mkdir -p ~/WRFModel/Build_WRF/DATA;
      cd ~/WRFModel/Build_WRF/DATA;
      wget https://www2.mmm.ucar.edu/wrf/src/wps_files/geog_high_res_mandatory.tar.gz; #Static geography data
      tar -xzvf geog_high_res_mandatory.tar.gz
      wget https://www2.mmm.ucar.edu/wrf/TUTORIAL_DATA/matthew_1deg.tar.gz #Real time data
      tar -xf matthew_1deg.tar.gz
      

      sudo apt install nfs-kernel-server を実行して nfs サーバーをインストールします。 次に、sudo systemctl status nfs-serverしてサービスの状態を確認します。 サービスがアクティブな場合は、/etc/exports を変更して、DATA共有フォルダーへのアクセスを許可するクライアントを構成します。

      /home/hpcadmin/WRFModel/Build_WRF/DATA [client hostname1](rw,sync,no_subtree_check)
      ...
      /home/hpcadmin/WRFModel/Build_WRF/DATA [client hostnamen](rw,sync,no_subtree_check)
      

      sudo exportfs -arv を実行して変更を有効にし、showmount -e してエクスポートリストを確認します。

    • クライアント側:

      nfs クライアントをインストールし、共有フォルダーをマウントし、Linux システムの起動時に共有フォルダーを自動的にマウントする行を /etc/fstab に追加します。 ノードの WRF-NFSClients ノード グループを作成し、clusrun を使用してすべてを実現します。

      clusrun /nodegroup:WRF-NFSClients "sudo apt install nfs-common -y;mkdir -p ~/WRFModel/Build_WRF/DATA;cd ~/WRFModel/Build_WRF;sudo mount [server hostname]:/home/hpcadmin/WRFModel/Build_WRF/DATA DATA;sudo sed -i '$a [server hostname]:/home/hpcadmin/WRFModel/Build_WRF/DATA /home/hpcadmin/WRFModel/Build_WRF/DATA  nfs defaults,_netdev 0 0' /etc/fstab"
      

    手記

    1. 静的な地理データには、Windows の予約ファイル名の 1 つである "CON" という名前のサブフォルダーが含まれるため、WRF ワークロードでは SMB 共有ディレクトリを使用しないでください。
    2. このデモでは、データを 1 つのノード DATA ディレクトリにダウンロードします。これは、WPS ディレクトリと WRF ディレクトリと同じレベルです。 作業のために、ニーズに基づいて適切な NFS サーバー ノードとディレクトリを選択し、ディレクトリの下に十分な空き領域があることを確認してください。 静的地理データのサイズは 29G です。 HBv2 シリーズの OS ディスクは 64G で、一時 データ ディスク サイズは 480 + 960G です。 OS ディスクにデータをダウンロードする必要がある場合は、Windows 仮想マシンに接続されている仮想ハード ディスクを展開
  • clusrun を使用して、データ ディレクトリの環境変数 WRFDATADIR を設定します。

    clusrun /nodegroup:WRFNodes "sed -i '$a export WRFDATADIR=~/WRFModel/Build_WRF/DATA' ~/.profile;source ~/.profile"
    

設定ファイルの編集

WPS と WRF では、さまざまな変数を使用して、データ形式、計算の時間と空間のスコープなどを定義します。すべての変数の詳細な説明については、次のリンクを参照してください: WPS, WRF.

次の表に、WPS の設定ファイル namelist.wps を変更して、ケース スタディに合わせる方法を示します。 複数の値を持つ変数の場合、最初の値のみを変更できることに注意してください。これは、単一ドメインの場合は最初のドメインのみを考慮するためです。

変数名 既定値 新しい値
max_dom 2 1
start_date '2019-09-04_12:00:00','2019-09-04_12:00:00' '2016-10-06_00:00:00'
end_date '2019-09-06_12:00:00','2019-09-04_12:00:00' '2016-10-08_00:00:00'
interval_seconds 10800 21600
e_we 150,220 91
e_sn 130,214 100
dx 15000 27000
dy 15000 27000
map_proj 'lambert' 'mercator'
ref_lat 33.00 28.00
ref_lon -79.00 -75.00
stand_lon -79.00 -75.00
geog_data_path '/glade/work/wrfhelp/WPS_GEOG/' '$WRFDATADIR/WPS_GEOG'

clusrun を使用して変更を行います。 独自の設定ファイルをアップロードしてノードにダウンロードし、既定の設定ファイルを置き換えることもできます。

clusrun /nodegroup:WRFNodes "source ~/.profile;sed -i -e 's/max_dom = 2/max_dom = 1/g' -e 's/2019-09-04_12:00:00/2016-10-06_00:00:00/g' -e 's/2019-09-06_00:00:00/2016-10-08_00:00:00/g' -e 's/interval_seconds = 10800/interval_seconds = 21600/g' -e 's/e_we              =  150, 220/e_we              =  91/g' -e 's/e_sn              =  130, 214/e_sn              =  100/g' -e 's/dx = 15000/dx = 27000/g' -e 's/dy = 15000/dy = 27000/g' -e """s/map_proj = 'lambert'/map_proj = 'mercator'/g""" -e 's/ref_lat   =  33.00/ref_lat   =  28.00/g' -e 's/ref_lon   = -79.00/ref_lon   = -75.00/g' -e 's/stand_lon = -79.0/stand_lon = -75.0/g' -e """s#/glade/work/wrfhelp/WPS_GEOG/#$WRFDATADIR/WPS_GEOG#g""" ~/WRFModel/Build_WRF/WPS/namelist.wps;"

次の表に、WRF の設定ファイル namelist.input を変更して、ケース スタディに合わせる方法を示します。 複数の値を持つ変数の場合、最初の値のみを変更できることに注意してください。これは、単一ドメインの場合は最初のドメインのみを考慮するためです。

変数名 既定値 新しい値
run_hours 36 48
start_year 2019,2019 2016
start_month 09,09 10
start_day 04,04 06
start_hour 12,12 00
end_year 2019,2019 2016
end_month 09,09 10
end_day 06,06 08
interval_seconds 10800 21600
history_interval 60,60 180
restart_interval 7200 1440
time_step 90 150
max_dom 2 1
e_we 150,220 91
e_sn 130,214 100
num_metgrid_levels 34 32
dx 15000 27000
dy 15000 27000

clusrun を使用して変更を行います。 独自の設定ファイルをアップロードしてノードにダウンロードし、既定の設定ファイルを置き換えることもできます。

clusrun /nodegroup:WRFNodes "sed -i -e 's/max_dom                             = 2/max_dom                             = 1/g' -e 's/run_hours                           = 36/run_hours                           = 48/g' -e 's/start_year                          = 2019, 2019/start_year                          = 2016/g' -e 's/start_month                         = 09,   09/start_month                         = 10/g' -e 's/start_day                           = 04,   04/start_day                           = 06/g' -e 's/start_hour                          = 12,   12/start_hour                          = 00/g' -e 's/end_year                            = 2019, 2019/end_year                            = 2016/g' -e 's/end_month                           = 09,   09/end_month                           = 10/g' -e 's/end_day                             = 06,   06/end_day                             = 08/g' -e 's/interval_seconds                    = 10800/interval_seconds                    = 21600/g' -e 's/history_interval                    = 60,  60/history_interval                    = 180/g' -e 's/restart_interval                    = 7200/restart_interval                    = 1440/g' -e 's/time_step                           = 90/time_step                           = 150/g' -e 's/max_dom                             = 2/max_dom                             = 1/g' -e 's/e_we                                = 150,    220/e_we                                = 91/g' -e 's/e_sn                                = 130,    214/e_sn                                = 100/g' -e 's/num_metgrid_levels                  = 34/num_metgrid_levels                  = 32/g' -e 's/dx                                  = 15000/dx                                  = 27000/g' -e 's/dy                                  = 15000/dy                                  = 27000/g' ~/WRFModel/Build_WRF/WRF/test/em_real/namelist.input"

シミュレーションを実行するジョブを作成する

ジョブを作成し、依存する 2 つのタスクを追加します。

タスク ID タスク名 種類 ノード コア Workdir 命令
1 wps NodePrep なし なし source ~/.profile;
ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable;
./link_grib.csh $WRFDATADIR/matthew/fnl;
./ungrib.exe;
./geogrid.exe;
./metgrid.exe
~/WRFModel/Build_WRF/WPS /name:wps
2 wrf 基本的な 4 64 source ~/.profile;
ln -sf ../../../WPS/met_em.d01.2016-10* .;
mpirun -iface ib0 -np %CORE_NUMBER% -f $CCP_MPI_HOSTFILE ./real.exe;
mpirun -iface ib0 -np %CORE_NUMBER% -f $CCP_MPI_HOSTFILE ./wrf.exe;
mkdir -p $WRFDATADIR/results/matthew;
cp wrfout_d01_2016-10-0* $WRFDATADIR/results/matthew;
cp wrfrst_d01_2016-10-0* $WRFDATADIR/results/matthew;
~/WRFModel/Build_WRF/WRF/test/em_real
  • タスク 1 では、WPS の 3 つのサブモジュール (ungrib、geogrid、metgrid) を実行して、データの前処理タスクを処理します。 前処理結果は WRF シミュレーションの入力であるため、WRF ジョブに参加している各ノードに存在する必要があります。 そのため、タスクをノード準備タスクとして追加して、各ノードで実行します。

    ノード準備タスク を追加する

  • タスク 2 では、MPI プログラムの real.exe と wrf.exe を実行して並列計算を実行し、出力ファイルを共有フォルダーの下の results/matthew フォルダー DATA コピーします。 mpirun コマンドで

    -iface は、プロセス間の通信に使用するネットワーク インターフェイスを指定します。

    -np では、mamy が MPI プログラムの実行を処理する方法を指定します。 このデモでは、必要なノードのすべてのコアである 64 のプロセスを使用します。

    -f ノード リストを含むファイル名を指定します。 の詳細については、この を参照してください。

コマンドを使用して上記のすべてを実現します。

set NODE_NUMBER=4
set CORE_NUMBER=64
job new /numnodes:%NODE_NUMBER%
job add !! /workdir:~/WRFModel/Build_WRF/WPS /name:wps /type:NodePrep "source ~/.profile; ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable; ./link_grib.csh ../DATA/matthew/fnl; ./ungrib.exe; ./geogrid.exe; ./metgrid.exe"
job add !! /workdir:~/WRFModel/Build_WRF/WRF/test/em_real /name:wrf /numnodes:%NODE_NUMBER% /requirednodes:[nodelist] "source ~/.profile; ln -sf ../../../WPS/met_em.d01.2016-10* .; mpirun -iface ib0 -np %CORE_NUMBER% -f $CCP_MPI_HOSTFILE ./real.exe; mpirun -iface ib0 -np %CORE_NUMBER% -f $CCP_MPI_HOSTFILE ./wrf.exe; mkdir -p $WRFDATADIR/results/matthew; cp wrfout_d01_2016-10-0* $WRFDATADIR/results/matthew"
job submit /id:!! /jobname:WRF

結果を取得する

  • HPC Pack 2019 クラスター マネージャーでジョブの結果を確認する

    WRF タスクの完了

  • シミュレーション結果は、/home/hpcadmin/WRFModel/Build_WRF/DATA/results/matthewの下に "wrfout" ファイルとして生成され、NCL または Python で視覚化できます。 同じフォルダの下には、シミュレーションの再起動に使用できる"wrfrst"ファイルがあります。シミュレーションの再起動の詳細については、この参照してください。