Link Search Menu Expand Document

將預報系統移轉到國網

Table of contents

背景

  • 將系統移轉到國網似乎是個不能避免的趨勢與抉擇,國網與本地超微工作站的比較考量如下:
項目國網超微說明
供電及網路穩定性後者受到大樓內外主客觀因素干擾
軟硬體維護專人負責自行負責前者含在費用之中
費用負擔按使用收費批次採購後者折舊分攤沈重
儲存裝置不提供自行備份自行備份前者增加傳輸困難
運維人力需求前者只需自行負責專案部分
  • 統移轉到國網遭遇到的困難與解決方案考量
    • pnetcdf格式相容性問題:
    • 磁碟機使用上限
      • wrf執行需要近80G、cmaq執行一個domain也會需要近200G。
      • 目前以手動方式一面執行、一面清理方式進行。如果要自動連續執行,需有外部磁碟機連線(如aws s3)或其他方案才行。
    • crontab的替代
      • 國網並未開放crontab的使用
      • 目前似乎還沒有好的替代方案,或許只能手動啟動、tmux + while true方案。

ICBC

  • 因東亞domain ICBC的準備主要是下載、檔案轉換,這些方面國網的表現也不差。因未涉及大量的計算,並未使用到slurm

CAMS數據之下載

  • 檔案下載會需要使用到cdsapi1模組、需另行下載。
  • 國網的作法
    • 裝置Anaconda環境:module load pkg/Anaconda3
    • 開始一個空的conda環境:conda env create gribby
    • 裝置cdsapi:pip install cdsapi
    • 國網python套件是裝置在個人的家目錄下(~/.conda),因此執行上須以對應之python($pyt)來啟動程式,無法以執行檔直接執行方式來執行。
pyt=/home/sinotec2/.conda/envs/gribby/bin/python
...
   $pyt get_All.py y $dt $hr $i >& /dev/null
...
  • 因CAMS採會員制,會員帳密訊息必須儲存在個人的家目錄(~/.cdsapirc)以供程式讀取,因此如果要由不同使用者執行下載工作,每個人都會需要自己的帳密檔。

NCO 程式

  • 國網並沒有提供NCO程式。此處將其重新編譯放一份在$BIN=/work/sinotec2/opt/cmaq_recommend/bin/下。
  • 一般的NCO程式並不包括ncl_convert2nc,此為ncl_stable套件內容,可以直接裝置ncl 6套件(module load rcec/ncl/6.6.2),或由conda安裝在家目錄(詳anaconda)。

初始檔案

  • 只修正目錄系統
  • 因未有特殊的模組,可以用rcec/python/wrfpost環境下的python
sinotec2@lgn303 /work/sinotec2/CAMS
$ diff grb2icon.py ~/bin/grb2icon.py
1c1
< #!/opt/ohpc/pkg/rcec/pkg/python/wrfpost/bin/python
---
> #!/opt/anaconda3/envs/py37/bin/python
72c72
< fname='/work/sinotec2/cmaqruns/forecast/grid45/mcip/DENS/METCRO3D.'+bdate.strftime('%Y%m%d')
---
> fname='/u01/cmaqruns/2022fcst/grid45/mcip/DENS/METCRO3D.'+bdate.strftime('%Y%m%d')
79c79
< targ='/work/sinotec2/cmaqruns/forecast/grid45/icon/'
---
> targ='/u01/cmaqruns/2022fcst/grid45/icon/'

邊界條件

  • 修正相應之目錄系統
  • 密度因不會太敏感,原來沒有讀取確切的逐日模擬結果。此處恢復讀取。
$ diff grb2bcon.py ~/bin/grb2bcon.py
1c1
< #!/opt/ohpc/pkg/rcec/pkg/python/wrfpost/bin/python
---
> #!/opt/anaconda3/envs/py37/bin/python
92d91
< targ='/work/sinotec2/cmaqruns/forecast/grid45/bcon/'
94,95c93
< adate=sys.argv[1].replace('-','')
< fname=targ.replace('bcon','mcip')+'/DENS/METCRO3D.'+adate
---
> fname='METCRO3D.nc'
116a115
> targ='/u01/cmaqruns/2022fcst/grid45/bcon/'

風場之準備

  • 這部分有很大的差異,主要是real(ndown)及wrf需要平行計算,國網在此表顯非常優秀。除此之外,WPS及後處理則沒有使用slurm
  • wrfout檔案格式轉換序列版mcip包裝在一起,放在背景執行,不影響程序的進行。

gfs數據下載與處理

  • 國網下載很快,不需要平行運作,依序進行即可。為方便執行,另建一個批次檔get_gfs.cs。
#sinotec2@lgn303 /work/sinotec2/WRF4/WRF4.2.1
#$ cat  $gfs/get_gfs.cs
wget=/usr/bin/wget
root=https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.
BH=00
dir=$begdp/$BH/atmos/

cd $gfs

for ((i=0;i <= 312; i+=3));do
  iii=$(printf "%03d" $i)
  file=gfs.t${BH}z.pgrb2.1p00.f$iii
  if [ -e $file ];then rm $file;fi
  $wget --no-check-certificate -q --retry-connrefused --waitretry=3 --random-wait \
        --read-timeout=20 --timeout=15 -t 10 --continue $root$dir$file
done
  • 序列處理,因此置換日期是全段模擬的起迄日,不必再每個timeframe分開做(參[])。
./link_grib.csh gfs*
hh=00
cp namelist.wps_loop namelist.wps
for cmd in 's/BEGD/'$BEGD'/g' 's/ENDD/'$ENDD'/g' 's/HH/'$hh'/g';do sed -ie $cmd namelist.wps;done
../UGB
  • wps系列程式的編譯是用ifort,外加自行編譯的jasper與png,因此UGB的內容也有所不同。
module purge
module load compiler/intel/2021 IntelMPI/2021 hdf5/1.12 netcdf/4.7.4 pnetcdf/1.12.2
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/sinotec2/opt/jasper/lib:/work/sinotec2/opt/png/lib ./ungrib.exe
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/work/sinotec2/opt/jasper/lib:/work/sinotec2/opt/png/lib ./metgrid.exe

real及ndown

  • 使用3個node,每個node上執行40個程式,因此總程序為120
sinotec2@lgn303 /work/sinotec2/WRF4
$ cat ./WRF4.2.1/doreal
#!/bin/bash
#SBATCH -A ENT111040             # Account name/project number
#SBATCH -J wrf                   # Job name
#SBATCH -p ct224                 # Partiotion name
#SBATCH -n 120                   # Number of MPI tasks (i.e. processes)
#SBATCH -c 1                     # Number of cores per MPI task
#SBATCH -N 3                     # Maximum number of nodes to be allocated
#SBATCH --ntasks-per-node=40     # Maximum number of tasks on each node
#SBATCH -o rsl.out.%j            # Path to the standard output file
#SBATCH -e rsl.error.%j          # Path to the standard error ouput file

module load compiler/intel/2021 IntelMPI/2021 hdf5/1.12 netcdf/4.7.4 pnetcdf/1.12.2

mpiexec.hydra -bootstrap slurm -n 120 ~/MyPrograms/wrf_install_intel/WRF-4.2.1/main/real.exe
  • ndown.cs也是類似,再原來的腳本之前宣告slurm變數,並下載需要的模組。
  • $gfs$wps為全域變數
#!/bin/bash
#SBATCH ...

dates=();for id in {0..11};do dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y-%m-%d) );done
DOM=( 'CWBWRF_45k' 'SECN_9k' 'TWEPA_3k' 'tw_CWBWRF_45k' 'nests3')


i=2

cd $gfs/${DOM[$i]}/ndown

cp namelist.input23_loop namelist.input
  for cmd in "s/SYEA/$yea1/g" "s/SMON/$mon1/g" "s/SDAY/$day1/g" \
             "s/EYEA/$yea2/g" "s/EMON/$mon2/g" "s/EDAY/$day2/g" ;do
    sed -i $cmd namelist.input
  done

for hd in metoa_em wrf rsl;do if compgen -G "${hd}*" > /dev/null; then rm -f ${hd}*;fi;done

for d in 2 3;do
  dd=$(( $d - 1 ))
  for id in {0..11};do
     for j in $(ls $wps/met_em.d0${d}.${dates[$id]}_*);do
       k=${j/d0${d}/d0${dd}}
       l=${k/$wps\//}
       m=${l/met_/metoa_};ln -s $j $m;done;done;done

mpiexec.hydra -bootstrap slurm -n 120 ./real.exe
#SBATCH -o rsln.out.%j            # Path to the standard output file
#SBATCH -e rsln.error.%j          # Path to the standard error ouput file

mv wrfinput_d02 wrfndi_d02

for id in {0..11};do ln -sf $gfs/${DOM[3]}/wrfout_d02_${dates[$id]}_00:00:00 wrfout_d01_${dates[$id]}_00:00:00;done

sed -i 's/interval_seconds                    = 10800/interval_seconds                    = 3600/g' namelist.input

#ndown.exe is intel version
mpiexec.hydra -bootstrap slurm -n 120 ./ndown.exe

## restore the real and ndown results
cd $gfs/${DOM[$i]}
for f in wrfinput wrfbdy wrffdda wrflowinp;do
  mv ndown/${f}_d02 ${f}_d01
done

wrf之執行

#$ cat $gfs/fcst.cs
...
    mpiexec.hydra -bootstrap slurm -n 120 ../run/wrf.exe
    $BIN/sub $BIN/trans_wrfout.py $BEGD

風場相關檔案之清理

  • 執行完mcip之後,只需留存uv10及hpbl,其餘皆可刪除。

MCIP

平行運作方案

  • 特殊環境變數
    • 這些變數在所有公開範例中都沒有出現過
    • $NPCOL_NPROW是CCTM調控分配多核心程緒的依據
    • $GRID_NAME似與namelist中的grdnam = $GridName重複了
    • $GRIDDESC指得是一個輸入檔,而不是輸出檔(namelist中的file_gd = "$FILE_GD")。
60,62d58
<   setenv NPCOL_NPROW '1 1'
<   setenv GRID_NAME $GridName
<   setenv GRIDDESC $DataPath/wrfout/GRIDDESC_45
250c246
< setenv IOAPI_CHECK_HEADERS  T
---
> setenv IOAPI_CHECK_HEADERS  F
  • slurm的啟動
    • 因為module是bash環境下的函數,在csh環境下則為一別名(alias),在腳本中不能作用,必須回歸到原始的定義來運作。
    • $LMOD_CMD為內定的lmod程式
    • 詳參csh腳本中執行module
set ProgDir    = $CMAQ_PROJ/PREP/mcip/src_5.0pnetcdf
...
eval `$LMOD_CMD tcsh load compiler/intel/2021 IntelMPI/2021 hdf5/1.12 netcdf/4.7.4 pnetcdf/1.12.2`  \
&& eval `$LMOD_SETTARG_CMD -s csh`
eval `$LMOD_CMD tcsh list`  && eval `$LMOD_SETTARG_CMD -s csh`
set MPI = /opt/ohpc/Taiwania3/pkg/intel/2021/mpi/2021.1.1/bin/mpiexec.hydra
mpirun -bootstrap slurm -n 1 $ProgDir/${PROG}.exe #  >& /dev/null
  • 這個intel MPI方案的mcip fortran程式似有錯誤,無法平行運作。
    • 發生錯誤訊息:Attempting to use an MPI routine before initializing MPICH
    • 參考csdn網友的說法,似乎程式中沒有在單近程階段先調用mpi_init,須進入原始碼中進行偵錯。
  • slurm啟動方式
    • slurm環境變數在csh中無法作動,須以sh形式啟動,另外再開啟csh環境
    • sbatch $fcst/csh_mcip.sh 45
$ cat csh_mcip.sh
#!/bin/sh
#SBATCH -A ENT111040             # Account name/project number
#SBATCH -J mcip                  # Job name
#SBATCH -p ct56                  # Partiotion name
#SBATCH -n 1                     # Number of MPI tasks (i.e. processes)
#SBATCH -c 1                     # Number of cores per MPI task
#SBATCH -N 1                     # Maximum number of nodes to be allocated
#SBATCH --ntasks-per-node=1      # Maximum number of tasks on each node
#SBATCH -o rsl.out.%j            # Path to the standard output file
#SBATCH -e rsl.error.%j          # Path to the standard error ouput file

module purge
csh /work/sinotec2/cmaqruns/forecast/run_mcip_DM.csh grid$1 11

序列運作方案

  • 重新編譯hdf5及netcdf4,以ifort而不是mpiifort來編譯
  • 將所有程式庫放在${CMAQ_PROJ}/lib/x86_64/intel/all_noMPI目錄下
set ProgDir    = $CMAQ_PROJ/PREP/mcip/src
...
setenv LD_LIBRARY_PATH ${CMAQ_PROJ}/lib/x86_64/intel/all_noMPI
< $ProgDir/${PROG}.exe
  • 這支程式可以順利執行,但不接受pnetcdf寫出的檔案。需進行$BIN/trans_wrfout.py轉檔(詳見因應intel MPI轉換wrfout格式)。
    • 錯誤訊息:"NCF: NetCDF: Attempt to use feature that was not turned on when netCDF was built."
    • build設定(libnetcdf.settings)的差異如下
項目intel MPIserial說明
執行程式wrf.exemcip.exe前者為後者的上游
C Compilermpiccicc 
額外程式庫-lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl-lm -lz -lcurl 
支援NC-4平行化 
支援PnetCDF前者具有平行化IO功能
支援DAP42前者可以透過網路調用
支援ERANGE Fill3超出範圍時的因應方式

腳本中用到的.py程式

  • 包括add_firstHr.pybrk_day.py
  • 使用/opt/ohpc/pkg/rcec/pkg/python/wrfpost/bin/python即可
  • 程式中使用到ncks、ncrcat等NCO程式,注意修改其出處路徑。

CCTM

run.cctm.csh

  • 空間網格在此設定,也在此分配執行節點。
setenv NPCOL_NPROW "20 10"; set NPROCS   = 200

project.config

  • 時間與個案在此設定。此部分不更改。
  • 工作目錄的頂端也在此設定。需進行相應修正。

cctm.source.v5.3.1.ae7

  eval `$LMOD_CMD tcsh load compiler/intel/2021 IntelMPI/2021 hdf5/1.12 netcdf/4.7.4 pnetcdf/1.12.2`  \
  && eval `$LMOD_SETTARG_CMD -s csh`
  set MPI = /opt/ohpc/Taiwania3/pkg/intel/2021/mpi/2021.1.1/bin
  set MPIRUN = $MPI/mpiexec.hydra
  ( /usr/bin/time -p $MPIRUN -bootstrap slurm -n 200 $BLD/$EXEC ) |& tee buff_${EXECUTION_ID}.txt

csh_cctm.sh

  • 啟動方式:sbatch $fcst/csh_mcip.sh 45
  • 使用ct224其中的200個單元
$ cat csh_cctm.sh
#!/bin/sh
#SBATCH -A ENT111040             # Account name/project number
#SBATCH -J cctm                  # Job name
#SBATCH -p ct224                 # Partiotion name
#SBATCH -n 200                   # Number of MPI tasks (i.e. processes)
#SBATCH -c 1                     # Number of cores per MPI task
#SBATCH -N 5                     # Maximum number of nodes to be allocated
#SBATCH --ntasks-per-node=40     # Maximum number of tasks on each node
#SBATCH -o rsl.out.%j            # Path to the standard output file
#SBATCH -e rsl.error.%j          # Path to the standard error ouput file

module purge
csh run.cctm.${1}.csh

濃度場的nest down

  • 有別於前述第1層東亞domain的ICBC,第2~3層的ICBC需讀取上1層的模擬結果來產生。
    • 需使用國網編譯的前處理程式BCON.BCON.exe(run_bcon_NC.csh)及ICON.exe(run_icon_NC.csh)來接續下層的模擬。
    • 這2支程式都是intel MPI程式,需使用slurm來啟動。
  • 腳本的引數為上一層domain三維的模擬結果(CCTM_ACONC檔)
    • 邊界檔需逐日執行,再以ncrcat整併、最後再加上一小時。
    • 初始檔只需執行一個time frame。
  • 修改項目
  • csh_bcon.sh、csh_icon.sh

後處理

檔案清理及空間維護

  • 做完濃度場的nest down後,3維濃度場(CCTM_ACONC)及粒徑分布(CCTM_APMDIAG)檔案可以只留存第一層,以備作圖。
  • 其餘檔案如不進一步偵錯或其他用途,可以全數刪除
rm *DEP* CCTM_C* *cfg
for nc in $(ls *nc);do ncks -d LAY,0 $nc tmpnc;mv tmpnc $nc;done
                         Block Limits                                    |     File Limits
Filesystem type         blocks      quota      limit   in_doubt    grace |    files   quota    limit in_doubt    grace  Remarks
fs01       USR          110.8G       400G       500G     1.008G     none |    19790       0        0       85     none NCHC_AIcls.twcc.ai
fs02       USR          9.872G       200G       300G     488.4M     none |   194962       0        0       40     none NCHC_AIcls.twcc.ai

地面濃度圖製作

  • wrf-python及cartopy之安裝
    1. 安裝conda模組 module load pkg/Anaconda3
    2. 開新的環境或啟用既有的環境:conda activate ncl_stable
    3. 安裝wrf-python:conda install -c conda-forge wrf-python
    4. cartopy之安裝:pip install cartopy
  • m3nc2gif.py之修改
    • 國網pnetcdf的儲存會發生錯誤,造成濃度檔有缺值(1.E30),程式需做因應處理。
  • $gfs/make_gifs.cs之修改
    • 如前所述,應用自行安裝套件的.py程式不能以腳本直接作為執行檔,需外加python
  for s in PM2.5 PM10 SO2 CO O3 NO2;do
    $bin/sub $pyt $bin/m3nc2gif.py $s.nc;done

結果檔案的傳輸

NetCDF是一種廣泛使用的數據格式,用於存儲科學和工程數據。DAP4(Data Access Protocol)是NetCDF的一個擴展,它提供了更強大和靈活的數據訪問功能,使得用戶可以更加方便地使用和管理NetCDF數據。 DAP4設置的用意是為了讓NetCDF數據能夠通過DAP4協議訪問。通過DAP4,用戶可以通過網絡遠程訪問NetCDF數據,並且可以按需訪問數據的不同部分。這使得NetCDF數據更加容易共享和管理,也使得科學家和工程師更加容易訪問和使用這些數據。 具體來說,DAP4設置可以在NetCDF數據文件中定義和設置一些元數據,例如變量名稱、變量單位、維度等等,這些元數據可以通過DAP4協議訪問。此外,DAP4還提供了一些API,例如使用RESTful Web服務器將數據發佈到網絡上,以及使用ODATA等協議來管理NetCDF數據。這些API可以讓用戶更加靈活地訪問和管理NetCDF數據,並且可以將數據共享到更多的地方。 總之,DAP4設置的用意是為了使NetCDF數據更加方便地進行網絡遠程訪問,並且提供了一些API和協議,使得用戶可以更加靈活地管理和共享這些數據。這些功能可以使得NetCDF數據更加廣泛地應用於科學和工程領域,並且可以讓科學家和工程師更加容易地訪問和使用這些數據。

NetCDF是一種用於存儲科學和工程數據的格式,ERANGE Fill支持是NetCDF的一種特性,它用於在寫入數據時擴展數據集的範圍,並且填充新的部分以保持數據集的一致性和完整性。 ERANGE是一個錯誤碼,它表示數據集的範圍已經達到了數據集所能容納的最大範圍,此時就無法再寫入更多的數據。在遇到這種情況時,ERANGE Fill支持可以擴展數據集的範圍,並且自動填充新的部分以容納更多的數據。這樣就可以繼續寫入數據,同時保持數據集的一致性和完整性。 ERANGE Fill支持的主要作用是在處理大型數據集時,提供一種方便的方法來管理數據集的範圍和內容,避免數據丟失或者數據集被截斷的情況發生。通過使用ERANGE Fill支持,用戶可以更加靈活地操作數據集,將數據集的範圍擴展到所需的大小,而不需要手動創建新的數據集。 總之,ERANGE Fill支持的用意是為了在NetCDF數據集寫入時提供更加靈活和自動化的管理方式,以保護數據集的完整性和一致性,同時避免數據丟失或被截斷的情況發生。

  1. The Climate Data Store (CDS) Application Program Interface (API) is a service providing programmatic access to CDS data. see copernicus.eu How to use the CDS API 

  2. 請解釋netcdf的DAP4設定用意為何?

  3. 請解釋netcdf之ERANGE Fill support用意何在?