將預報系統移轉到國網
Table of contents
背景
項目 | 國網 | 超微 | 說明 |
---|---|---|---|
供電及網路穩定性 | 高 | 低 | 後者受到大樓內外主客觀因素干擾 |
軟硬體維護 | 專人負責 | 自行負責 | 前者含在費用之中 |
費用負擔 | 按使用收費 | 批次採購 | 後者折舊分攤沈重 |
儲存裝置 | 不提供自行備份 | 自行備份 | 前者增加傳輸困難 |
運維人力需求 | 低 | 高 | 前者只需自行負責專案部分 |
- 統移轉到國網遭遇到的困難與解決方案考量
ICBC
- 因東亞domain ICBC的準備主要是下載、檔案轉換,這些方面國網的表現也不差。因未涉及大量的計算,並未使用到slurm。
CAMS數據之下載
- 檔案下載會需要使用到cdsapi1模組、需另行下載。
- 國網的作法
- 裝置Anaconda環境:
module load pkg/Anaconda3
- 開始一個空的conda環境:
conda env create gribby
- 裝置cdsapi:
pip install cdsapi
- 國網python套件是裝置在個人的家目錄下(
~/.conda
),因此執行上須以對應之python($pyt
)來啟動程式,無法以執行檔直接執行方式來執行。
- 裝置Anaconda環境:
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之執行
- 執行wrf之後隨即執行trans_wrfout.py,並執行mcip
#$ 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 MPI | serial | 說明 |
---|---|---|---|
執行程式 | wrf.exe | mcip.exe | 前者為後者的上游 |
C Compiler | mpicc | icc | |
額外程式庫 | -lpnetcdf -lhdf5_hl -lhdf5 -lm -lz -lcurl | -lm -lz -lcurl | |
支援NC-4平行化 | 是 | 否 | |
支援PnetCDF | 是 | 否 | 前者具有平行化IO功能 |
支援DAP42 | 是 | 否 | 前者可以透過網路調用 |
支援ERANGE Fill3 | 是 | 否 | 超出範圍時的因應方式 |
腳本中用到的.py程式
- 包括add_firstHr.py及brk_day.py
- 使用
/opt/ohpc/pkg/rcec/pkg/python/wrfpost/bin/python
即可 - 程式中使用到ncks、ncrcat等NCO程式,注意修改其出處路徑。
CCTM
- 公版模式的架構把CCTM分成3段來控制:排放及網格(run.cctm.csh)、時間個案(project.config)、以及科學設定(cctm.source.v5.3.1.ae7)等。
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
- bash設定slurm 環境變數
- 使用ct56其中的1個process
- 呼叫不同的csh腳本
- 參考前述mcip平行運作方案
後處理
檔案清理及空間維護
- 做完濃度場的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
- 檢視使用者總磁碟機用量(TWCC - III 使用手冊:儲存資源與目錄位置)
/usr/lpp/mmfs/bin/mmlsquota -u sinotec2 --block-size auto fs01 fs02
- fs01:/work
- fs02:/home
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之安裝
- 安裝conda模組
module load pkg/Anaconda3
- 開新的環境或啟用既有的環境:
conda activate ncl_stable
- 安裝wrf-python:
conda install -c conda-forge wrf-python
- cartopy之安裝:
pip install cartopy
- 安裝conda模組
- 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
結果檔案的傳輸
- 不建議傳輸大型檔案,如果需要,也必須壓縮後傳送。
- 國網上可以使用git
- 傳輸方案選擇詳見公版模式輸入輸出檔案及傳輸管理
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數據集寫入時提供更加靈活和自動化的管理方式,以保護數據集的完整性和一致性,同時避免數據丟失或被截斷的情況發生。
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 ↩
請解釋netcdf的DAP4設定用意為何?
請解釋netcdf之ERANGE Fill support用意何在?