## 簡介與題目說明 **1.題目簡介** 2022年9月上旬,臺灣在軒嵐諾颱風和梅花颱風接續影響下,分別發生強降雨事件。梅花颱風共造成有 10 處積淹水災點,農業損失估計約新臺幣 447 萬元(2022年軒嵐諾與梅花颱風氣象分析,李榮宗等),此題的目的是藉由FourCastNet(FCN)模擬梅花颱風(2022/9/9-10)的路徑與風速,藉此了解此模式對於颱風模擬的效能,並比較模擬結果與實際颱風的差異。 本題希望參賽者採用Python架構的開源物理機器學習平臺Modulus 中的相關應用為題目,不同於傳統數值氣象模式需要大量物理與流力計算才能模擬結果,FCN是以資料驅動的機器學習進行模型訓練,此類AI模型尚未受到氣象界認可,預報品質離數值氣象預報仍有一段差距,但是有快速推演大量資料的優點,未來仍然有很多發展和應用的空間。 此題將分成六個工作項目A至F來進行評分,包括環境配置、檔案前處裡、建立跨節點環境、完成訓練與推論,與最後結果呈現,項目A-C繳交一張圖,項目D-F各繳交兩張圖。 :::warning "C.建立跨節點訓練環境" 若建立失敗仍能繼續完成項目D、E、F,請自行斟酌比賽時間。 ::: **2.題目參考連結:** [Modulus Nvidia Doc](https://docs.nvidia.com/deeplearning/modulus/modulus-sym/user_guide/neural_operators/fourcastnet.html) [Modulus-sym Github](https://github.com/NVIDIA/modulus-sym/tree/main) [NVlab FourCastNet Github](https://github.com/NVlabs/FourCastNet) **3.賽前建議準備:** AI訓練基本概念、docker設置與使用、python基本使用、jupyter note基本使用。 ## 比賽中提供資料 以下為此題提供之檔案,如果沒有在比賽登入節點中 **/work/fcn/** 中找到這些檔案請告知現場工作人員。 ![](https://hackmd.io/_uploads/HJgeAtNs2.png) 1. 氣象原始檔,2002-2021的 pl. nc 與 sfc. nc (/ERA5_nc/*.nc) 2. 轉檔程式 (NC_HDF5.py、get_stats_EA.py) 3. Inference 氣象檔(/data/inference/2022_sep.h5) 4. FCN 主程式(/fourcastnet/src、/conf、fcn_era5.py、inferencer. py) 5. 繪圖程式(/post_process/FCN_plot_v2.ipynb) ## A.完成單節點環境與Modulus 配置 此部分為基本環境配置分,請參考[:link:][installation] 中的步驟於主機上安裝Modulus,此部分不限制安裝方式,建議可以用Docker進行環境安裝,呈現結果只須執行/example/helmholtz/中的helmholtz.py。不需要持續執行只要看到,Success Loading Model 及給分。 **a.繳交資料** 執行helmholtz.py之截圖,檔名請用 **XX隊_FCN_A.jpg** 或其他圖檔格式。 **b.繳交範例** ![](https://hackmd.io/_uploads/BJSduCE93.jpg) :::info Hint: 如果使用Docker需要安裝 Nvidia container toolkit,並建議docker image 使用modulus:23.05 ::: :::warning 若安裝Docker,系統會產生一個虛擬網卡,此時在container外執行其他mpirun時,需要指定網段。參考指令 ``` mpirun --mca btl_tcp_if_include <network interface name> <your command> ``` ::: [installation]: https://docs.nvidia.com/deeplearning/modulus/modulus-sym/user_guide/getting_started/installation.html ## B.完成檔案前處理 此部份為氣象資料前處理,主機裡提供歐洲中期天氣預報中心(ECMWF)所下載之20年(2002-2021)之NetCDF(.nc)資料,其解析度為0.25度經緯度,每6小時一筆資料 (0:00, 6:00, 12:00, 18:00),**XXXX_pl.nc**檔為不同氣壓分層資料,**XXXX_sfc.nc**為地表層資料,其中包含風速、氣壓、溼度等20種參數資料。本題將以東亞(90-150°E , 10-55 °N)資料為模型訓練資料。 FCN讀取的資料格式為HDF5(.h5),請執行轉檔程式 **NC_HDF5.py**,將提供的pl.nc與sfc.nc資料合併成一年一筆的.h5檔,其檔案格式為一個(1460, 20, 180, 240)四維資料,分別為時間、氣象參數、經度、緯度。 **a.繳交資料** 轉檔後之h5詳細資料大小截圖,檔名請用 **XX隊_FCN_B.jpg** 或其他圖檔格式 **b.繳交範例** ![](https://hackmd.io/_uploads/r127dgBch.png) :::info Hint:轉檔程式用到的Module有:h5py, numpy, netCDF4, mpi4py,其中會用到h5py中的mpi功能,建議可用以下指令在conda安裝h5py並開啟mpi功能 ``` conda install -c conda-forge "h5py=*=mpi*" ``` 並在conda環境中輸入以下變數來開啟MPI功能 ``` export HDF5_MPI="ON" ``` ::: ## C.建立跨節點訓練環境 此部分希望參賽者可以利用4台主機所有的GPU資源來進行訓練,相關步驟不在官方文件中,需要參賽者利用網路資源或個人經驗建立跨節點環境,若無法順利建立仍可以完成後面的訓練和推演。如果使用Docker環境,可以使用Hint中host network或Docker Swarm方式建立連線。 在執行訓練程式fcn_era5.py前,請先參考[項目D](https://hackmd.io/RoxYODlYRDWNA6-4RAFyWA?view#D%E5%AE%8C%E6%88%90%E6%A8%A1%E5%9E%8B%E8%A8%93%E7%B7%B4) 中的檔案配置。 **a.繳交資料** 執行fcn_era5.py並截圖openmpi用到的prcess,檔名請用 XX隊_FCN_C.jpg 或其他圖檔格式 **b.繳交範例** ![](https://hackmd.io/_uploads/BJxHgfB9n.png) :::info Hint: 這邊提供在Docker之間建立host network的方法,供參賽者參考。 1.分別在4個節點安裝docker與Nvidia Container toolkit後,並以下面指令建立4個docker,並用相同的sshport連線。(可以更改mydockername,區分不同主機的docker) ``` $export mydockername=worker1 $export sshport=54321 $docker run --gpus all --shm-size=50g --ulimit memlock=-1 \ --ulimit stack=67108864 --runtime nvidia \ -v /home/fourcastnet/examples:/examples \ --network=host \ --name $mydockername \ -e sshport=$sshport \ -dt modulus:23.05 \ bash -c "apt update && apt install openssh-server -y; sed -e 's/#Port 22/Port ${sshport}/' -i /etc/ssh/sshd_config; service ssh restart; sleep infinity" ``` 完成之後,進入docker並建立免密碼ssh連線。 ``` $docker exec -it $mydockername bash $cd ~ $ssh-keygen $cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys ``` 完成後切換container,將主機1 id_rsa.pub的公鑰貼到主機2、3、4的 ~/.ssh/authorized_keys 中。也將主機2、3、4的公鑰貼到主機1的authorized_keys中。 完成後以指定port測試連線。 並且互相連線一次讓提示訊息消失。 ``` $ssh pca2 -p $sshport $exit $ssh pca3 -p $sshport $exit $ssh pca4 -p $sshport ``` 完成連線後,建立hostfile分配GPU工作 ``` $vi hostfile ``` ``` pca1 slots=4 pca2 slots=4 pca3 slots=4 pca4 slots=4 ``` 完成後,建立訓練shell ``` vi fcn.sh ``` ``` #!/bin/sh export MASTER_ADDR=pca1 export MASTER_PORT=33333 python fcn_era5.py ``` 再執行訓練 shell ``` OMPI_MCA_plm_rsh_args="-p ${sshport}" mpirun -n 16 --hostfile hostfile --allow-run-as-root ./fcn.sh ``` ::: ## D.完成模型訓練 此部分希望參賽者至少完成20 epoch (假設使用4 GPUs、batch size 設定為2,需至少**70000** steps)。在AI訓練(Training)與推演(inference)之前,需先將需要的資料配置好到/train、/test和normalizaiton需要的/stats,請將項目B所轉出的檔案進行以下資料配置,並且修改主要配置檔 /conf/config_FCN.yaml、/src中dataset.py和metrics.py的相關路徑。 要產出stats中的平均、標準差和時間數列,可以修改並執行get_stats_EA.py來取得。 ![](https://hackmd.io/_uploads/Hkhe9GBqn.jpg) :::info Hint: 1.config_FCN.yaml中batch size和maximum step為主要影響訓練時間的參數。 2.原始資料大小/ (Batch size × GPUs)=1 Epoch 3.若訓練中途停止,程式可依照output中儲存的資料,繼續後面的訓練。 ::: 完成後,以mpirun執行主訓練程式fcn_era5.py ``` mpirun -n 4 --allow-run-as-root python fcn_era5.py ``` 或項目C中提到的跨節點訓練 ``` OMPI_MCA_plm_rsh_args="-p ${sshport}" mpirun -n 16 --hostfile hostfile --allow-run-as-root ./fcn.sh ``` 完成訓練後會產生一個 /output/fcn_era5/ 資料夾,裡面將有 events.out.tfevents.xxx訓練記錄檔,請將整個資料夾下載到自己的電腦上,並下載TensorBoard後,可在Jupyter Notebook 用以下指令在指定port開啟。 ``` %reload_ext tensorboard %tensorboard --logdir=C:/Users/path/fcn_era5/ --port=45678 ``` 成功執行後便可在瀏覽器上以 http://localhost:45678/ 看訓練結果。 **a.繳交資料** 請將TensorBoard loss圖截圖並且附上以下表格,檔名請用 XX隊_FCN_D-1.jpg 或其他圖檔格式,表格也可以截圖並用檔名XX隊_FCN_D-2.jpg。 | Final Step | batch size | total training time |GPU used |final loss | | -------- | -------- | -------- |-------- |-------- | | | grid: ___ validation:____ | _______min | | **b.繳交範例** **D-1** ![](https://hackmd.io/_uploads/H1nPBQI5h.jpg) **D-2**![](https://hackmd.io/_uploads/ByFjU785h.png) ::: warning 訓練速度與final loss不影響評分。 ::: ## E.完成指定日期數據推演並繪製指定參數(風速、氣壓) 請執行inferencer.py並繪製產出的pred.npy中 9/9-9/10 (8 time steps)的風速($\sqrt{v10^2+u10^2}$)與地表氣壓預報(surface pressure)。 可以使用/post_process/FCN_plot_v2.ipynb 來繪製,但氣壓圖請自行更改參數,並用**不同色標**繪製。 :::info /data/inference/2022_sep.h5 為已轉好檔的2022/9資料,可於inferencer.py中讀取,以進行預報。 ::: **a.繳交資料** 繪製9/9-9/10 8 time steps的風速與地表氣壓圖,風速檔請用**XX隊_FCN_E-1.jpg**,氣壓圖請用**XX隊FCN_E-2.jpg** **b.繳交範例** 風速模擬 ![](https://i.imgur.com/Zdg8dnu.png) ## F.呈現指定日期之預報10公尺水平風(u10)之RMSE 與ACC 請繪製inferencer.py產出之9/9-9/10的10公尺水平風(u10)之RMSE與ACC值。 兩者的定義與公式可參考[2] Appendix C[:link:](https://arxiv.org/pdf/2202.11214.pdf),繪製方法不拘,但須在**圖上標示各點數值**。 :::warning **需繳交項目E,項目F才會給分。** ::: **a.繳交資料** 繪製9/9-9/10 8 time steps的水平風速(u10)的RMSE與ACC,檔名請用**XX隊_FCN_F-1.jpg**與**XX隊FCN_F-2.jpg** **b.繳交範例** ![](https://hackmd.io/_uploads/HkL3Ur8c2.png) ![](https://hackmd.io/_uploads/SJI3IB852.png) ## 參考資料 [1] 李宗融、黃紹欽、王安翔、黃柏誠、于宜強, "2022 年軒嵐諾與梅花颱風氣象分析" ,國家災害防救科技中心災害防救電子報第 209 期 (2022) [2] Pathak, Jaideep, et al. “FourCastNet : A global data-driven high-resolution weather model using adaptive Fourier neural operators” arXiv preprint arXiv:2202.11214 (2022). [3] Hersbach, Hans, et al. “The ERA5 global reanalysis” Quarterly Journal of the Royal Meteorological Society (2020). [4] Hersbach, Hans, et al. “ERA5 hourly data on pressure levels from 1959 to present. Copernicus Climate Change Service (C3S) Climate Data Store (CDS).” , 10.24381/cds.bd0915c6 (2018) [5] Hersbach, Hans et al., “ERA5 hourly data on single levels from 1959 to present. Copernicus Climate Change Service (C3S) Climate Data Store (CDS).” , 10.24381/cds.adbb2d47 (2018)