GraphCast 教學:基於圖神經網路的全球天氣預報 AI 模型
Google DeepMind GraphCast – 以 Graph Neural Network (圖神經網路) 在 Icosahedral Mesh (正二十面體網格) 上建模大氣動力學,實現 10 天全球天氣預報,精度超越 ECMWF 的 HRES 數值天氣預測系統。發表於 Science (2023)。
1. 專案概述 (Project Overview)
1.1 專案背景
傳統的 Numerical Weather Prediction (數值天氣預測; NWP) 仰賴對大氣物理方程式的數值求解,需要龐大的超級電腦運算資源,單次 10 天全球預報需時數小時。GraphCast 由 Google DeepMind 於 2023 年發表在 Science 期刊,提出了一個革命性的替代方案:以 Machine Learning (機器學習) 模型直接從歷史再分析資料 (ERA5 Reanalysis Data) 學習大氣動力學規律,在單一 TPU 上不到一分鐘即可完成 10 天全球預報。
1.2 核心成就
| 指標 | 說明 |
|---|---|
| 預報精度 | 在 1380 項驗證指標中,有超過 90% 優於 ECMWF HRES (歐洲中期天氣預報中心高解析度預報) |
| 解析度 | 0.25 degree (約 25 km) 全球覆蓋,37 個 Pressure Level (氣壓層) |
| 預報變數 | 溫度、風場、濕度、位勢高度等 227 個變數 |
| 推論速度 | 單一 Cloud TPU v4 上,10 天預報 < 60 秒(NWP 需數小時) |
| 訓練資料 | ERA5 再分析資料 (1979-2017),約 39 年的全球大氣觀測 |
1.3 專案生態
本 Repository 同時包含兩個模型:
- GraphCast:確定性預報 (Deterministic Forecast),發表於 Science (2023)
- GenCast:基於 Diffusion Model (擴散模型) 的集合預報 (Ensemble Forecast),發表於 arXiv (2023)
1graphcast/ # 核心程式碼
2 graphcast.py # GraphCast 模型架構
3 gencast.py # GenCast 模型架構
4 autoregressive.py # 自回歸推論包裝器
5 icosahedral_mesh.py # 正二十面體網格定義
6 deep_typed_graph_net.py # 深層圖神經網路
7 ...
8graphcast_demo.ipynb # GraphCast 展示 Notebook
9gencast_mini_demo.ipynb # GenCast Mini 展示 Notebook
10setup.py # 套件安裝
1.4 預訓練模型
| 模型名稱 | 解析度 | 氣壓層 | Mesh 層級 | 訓練資料 | 適用場景 |
|---|---|---|---|---|---|
| GraphCast | 0.25 deg | 37 | 6 | ERA5 1979-2017 | 研究級高精度預報 |
| GraphCast_small | 1.0 deg | 13 | 5 | ERA5 1979-2015 | 低資源環境測試 |
| GraphCast_operational | 0.25 deg | 13 | 6 | ERA5 + HRES fine-tuned | 業務預報 |
| GenCast 0.25deg | 0.25 deg | 13 | 6 | ERA5 1979-2018 | 高精度集合預報 |
| GenCast 1.0deg Mini | 1.0 deg | 13 | 4 | ERA5 1979-2018 | 免費 Colab 可執行 |
2. 核心架構與技術原理 (Architecture & Technical Principles)
2.1 Encode-Process-Decode 架構
GraphCast 採用經典的 Encode-Process-Decode 三階段架構,將傳統 Grid Data (網格資料) 映射到 Graph Structure (圖結構) 上進行訊息傳遞 (Message Passing),再映射回網格產生預測。
graph TB
subgraph INPUT["Input (輸入層)"]
A["ERA5 Grid Data
0.25deg 全球網格
721 x 1440 格點"]
B["Current State (t)
+ Previous State (t-6h)
+ Forcing Variables"]
end
subgraph ENCODE["Encoder (編碼器)"]
C["Grid-to-Mesh
Bipartite GNN
格點 → 網格節點"]
D["Grid Node Features
→ Mesh Node Features"]
end
subgraph PROCESS["Processor (處理器)"]
E["16-layer
Multi-Mesh GNN
正二十面體網格"]
F["Message Passing
在多解析度 Mesh 上
交換資訊"]
end
subgraph DECODE["Decoder (解碼器)"]
G["Mesh-to-Grid
Bipartite GNN
網格節點 → 格點"]
H["Predicted Delta
下一時步的增量"]
end
A --> B --> C --> D --> E --> F --> G --> H
style INPUT fill:#e8f4f8,stroke:#2196F3
style ENCODE fill:#fff3e0,stroke:#FF9800
style PROCESS fill:#e8f5e9,stroke:#4CAF50
style DECODE fill:#fce4ec,stroke:#E91E63
2.2 Icosahedral Multi-Mesh (正二十面體多重網格)
GraphCast 的核心創新在於使用 Icosahedral Mesh (正二十面體網格) 作為中間表示。與傳統的 Latitude-Longitude Grid (經緯度網格) 不同,正二十面體網格在球面上的分布更加均勻,避免了極地區域的過度密集問題。
graph LR
subgraph MESH["Multi-resolution Mesh (多解析度網格)"]
M0["M0: 12 nodes
正二十面體
頂點"]
M1["M1: 42 nodes
1 次細分"]
M2["M2: 162 nodes
2 次細分"]
M3["M3: 642 nodes
3 次細分"]
M4["M4: 2562 nodes
4 次細分"]
M5["M5: 10242 nodes
5 次細分"]
M6["M6: 40962 nodes
6 次細分"]
end
M0 -->|"細分"| M1 -->|"細分"| M2 -->|"細分"| M3 -->|"細分"| M4 -->|"細分"| M5 -->|"細分"| M6
subgraph CONNECT["Multi-Mesh Connectivity (多重網格連接)"]
E1["同層級邊
Intra-mesh edges"]
E2["跨層級邊
Inter-mesh edges"]
E3["所有層級的邊
同時存在於圖中"]
end
M6 --- E1
M3 --- E2
E1 --- E3
style MESH fill:#f3e5f5,stroke:#9C27B0
style CONNECT fill:#e0f2f1,stroke:#009688
為什麼使用正二十面體網格?
- Uniform Sampling (均勻取樣):球面上節點分布均勻,不像經緯度網格在極地過密
- Multi-scale Information Flow (多尺度資訊流):低解析度層級捕捉全球性的大尺度模式 (如 Jet Stream 噴射氣流),高解析度層級捕捉局部天氣系統
- Efficient Message Passing (高效訊息傳遞):粗網格上的邊可以跨越數千公里傳遞資訊,減少需要的 GNN 層數
2.3 Graph Neural Network (圖神經網路) 訊息傳遞
GraphCast 中的 GNN 使用 Typed Graph (型別化圖) 結構,區分不同類型的節點和邊:
| 元素 | 類型 | 說明 |
|---|---|---|
| Grid Nodes | 格點節點 | 代表每個 0.25 deg 格點,攜帶氣象變數特徵 |
| Mesh Nodes | 網格節點 | 正二十面體上的節點,攜帶學習到的潛在特徵 |
| Grid2Mesh Edges | 格點→網格邊 | Encoder 中從格點映射到最近的網格節點 |
| Mesh Edges | 網格內部邊 | Processor 中多解析度網格內的訊息傳遞 |
| Mesh2Grid Edges | 網格→格點邊 | Decoder 中從網格節點映射回格點 |
每一層 GNN 的訊息傳遞機制:
1# 簡化的 Message Passing 虛擬碼
2def message_passing(graph):
3 # 1. 邊更新:根據發送節點、接收節點、邊特徵計算新邊特徵
4 for edge in graph.edges:
5 edge.features = MLP([sender.features, receiver.features, edge.features])
6
7 # 2. 節點更新:聚合所有入邊的訊息
8 for node in graph.nodes:
9 incoming = aggregate([e.features for e in node.incoming_edges])
10 node.features = MLP([node.features, incoming])
11
12 return graph
2.4 Autoregressive Prediction (自回歸預測)
GraphCast 每一步預測未來 6 小時的天氣狀態增量 (Delta)。透過 Autoregressive Rolling (自回歸滾動),將上一步的預測結果作為下一步的輸入,即可延伸到 10 天 (240 小時 = 40 步) 的預報。
sequenceDiagram
participant Input as 輸入資料
participant Model as GraphCast Model
participant Output as 預測結果
Note over Input: t=0h, t=-6h
(兩個時步的觀測)
Input->>Model: State(t=0h) + State(t=-6h) + Forcing
Model->>Output: Delta(t=+6h)
Note over Output: State(t=+6h) = State(t=0h) + Delta
Output->>Model: State(t=+6h) + State(t=0h) + Forcing
Model->>Output: Delta(t=+12h)
Note over Output: State(t=+12h) = State(t=+6h) + Delta
Output->>Model: State(t=+12h) + State(t=+6h) + Forcing
Model->>Output: Delta(t=+18h)
Note over Output: ... 重複至 t=+240h (10天)
2.5 Training Strategy (訓練策略)
- Loss Function (損失函數):使用 Latitude-weighted MSE (緯度加權均方誤差),因為低緯度格點代表更大的面積
- Normalization (正規化):輸入依歷史統計值正規化;目標依歷史時間差正規化
- Curriculum Training (課程式訓練):先訓練 1-step 預測,逐步增加 Autoregressive Steps 到 12 步
- BFloat16 Precision:使用混合精度訓練加速
2.6 GenCast:擴散模型集合預報
GenCast 是 GraphCast 的進階版本,將 Diffusion Model (擴散模型) 引入天氣預報,可以生成 Ensemble Forecast (集合預報):
- 使用 Sparse Transformer (稀疏 Transformer) 取代部分 GNN 層
- 透過 DPM-Solver++ 2S 採樣器 (Sampler) 從 Noise (雜訊) 生成天氣狀態
- 每次採樣產生不同的 Ensemble Member (集合成員),量化預報不確定性 (Uncertainty Quantification)
3. 安裝與環境設定 (Installation & Setup)
3.1 系統需求
| 項目 | 最低需求 | 建議配置 |
|---|---|---|
| Python | 3.10+ | 3.11 |
| GPU/TPU | – (CPU 可跑 small 模型) | Cloud TPU v4 或 A100 GPU |
| RAM | 16 GB | 64 GB+ (0.25deg 模型) |
| Disk | 10 GB (程式碼+小模型) | 500 GB+ (ERA5 訓練資料) |
3.2 基本安裝
1# 1. Clone Repository
2git clone https://github.com/google-deepmind/graphcast.git
3cd graphcast
4
5# 2. 建立虛擬環境 (推薦使用 uv)
6uv venv --python 3.11 .venv
7source .venv/bin/activate
8
9# 3. 安裝套件
10pip install -e .
11
12# 4. 驗證安裝
13python -c "import graphcast; print('GraphCast installed successfully')"
3.3 依賴套件一覽
1# 核心框架
2JAX # Autograd + XLA 編譯器 (Google 的深度學習框架)
3dm-haiku # JAX 上的 Neural Network Library (神經網路函式庫)
4jraph # JAX 上的 Graph Neural Network Library
5
6# 資料處理
7xarray # 多維標籤化陣列 (適合氣象資料)
8xarray-tensorstore # 高效能 Zarr/TensorStore 讀取
9numpy / scipy # 數值計算
10pandas # 時間序列索引
11dask # 惰性 / 平行計算
12
13# 輔助工具
14chex # JAX 測試與除錯工具
15trimesh # 三角網格運算 (建立正二十面體)
16dinosaur # 球諧函數運算
3.4 GPU 環境設定 (JAX + CUDA)
1# 安裝 JAX GPU 版本 (以 CUDA 12 為例)
2pip install --upgrade "jax[cuda12]"
3
4# 驗證 GPU 可見
5python -c "import jax; print(jax.devices())"
6# 預期輸出: [GpuDevice(id=0, process_index=0)]
3.5 TPU 環境設定 (Google Cloud)
詳細步驟請參考 docs/cloud_vm_setup.md。核心流程:
1# 1. 建立 TPU VM
2gcloud compute tpus tpu-vm create graphcast-vm \
3 --zone=us-central2-b \
4 --accelerator-type=v4-8 \
5 --version=tpu-ubuntu2204-base
6
7# 2. SSH 連線
8gcloud compute tpus tpu-vm ssh graphcast-vm --zone=us-central2-b
9
10# 3. 在 VM 上安裝
11pip install graphcast
12pip install jax[tpu] -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
3.6 下載預訓練模型與資料
預訓練模型權重、正規化統計量與範例資料存放在 Google Cloud Storage:
1# 列出可用檔案
2gsutil ls gs://dm_graphcast/graphcast/
3gsutil ls gs://dm_graphcast/gencast/
4
5# 下載 GraphCast small 模型 (最小,適合測試)
6gsutil cp gs://dm_graphcast/graphcast/GraphCast_small_params.npz ./data/
7gsutil cp gs://dm_graphcast/graphcast/stats/ ./data/stats/ -r
8
9# 下載範例輸入資料
10gsutil cp gs://dm_graphcast/graphcast/dataset/ ./data/dataset/ -r
4. 使用教學與範例 (Usage Tutorial & Examples)
4.1 快速開始:Colab Notebook
最簡單的入門方式是使用 Google Colab:
- GraphCast Demo:
graphcast_demo.ipynb– 在 Colab 開啟 - GenCast Mini Demo:
gencast_mini_demo.ipynb– 在 Colab 開啟
4.2 載入模型與資料
1import dataclasses
2import functools
3import math
4import xarray
5from graphcast import (
6 autoregressive,
7 casting,
8 checkpoint,
9 data_utils,
10 graphcast,
11 normalization,
12 rollout,
13)
14
15# 1. 載入模型參數
16with open("GraphCast_small_params.npz", "rb") as f:
17 ckpt = checkpoint.load(f, graphcast.CheckPoint)
18 params = ckpt.params
19 state = {}
20 model_config = ckpt.model_config
21 task_config = ckpt.task_config
22
23print(f"Model config: {model_config}")
24print(f"Task config: {task_config}")
4.3 準備輸入資料
1# 2. 載入範例 ERA5 資料
2# 需要兩個連續時步 (t-6h, t) 的大氣狀態
3example_batch = xarray.open_dataset("era5_example_data.nc")
4
5# 資料維度說明:
6# - batch: 批次維度
7# - time: 時間步 (至少 2 步)
8# - lat: 緯度 (721 for 0.25deg)
9# - lon: 經度 (1440 for 0.25deg)
10# - level: 氣壓層 (37 or 13)
11
12# 3. 分離 inputs / targets / forcings
13inputs, targets, forcings = data_utils.extract_inputs_targets_forcings(
14 example_batch,
15 target_lead_times=slice("6h", f"{6 * task_config.eval_steps}h"),
16 **dataclasses.asdict(task_config),
17)
4.4 建立與執行模型
1# 4. 載入正規化統計量
2diffs_stddev_by_level = xarray.open_dataset("stats/diffs_stddev_by_level.nc")
3mean_by_level = xarray.open_dataset("stats/mean_by_level.nc")
4stddev_by_level = xarray.open_dataset("stats/stddev_by_level.nc")
5
6# 5. 建構 Predictor 鏈
7# GraphCast -> Normalization -> Autoregressive -> Casting
8def construct_wrapped_graphcast(model_config, task_config):
9 predictor = graphcast.GraphCast(model_config, task_config)
10
11 predictor = normalization.InputsAndResiduals(
12 predictor,
13 diffs_stddev_by_level=diffs_stddev_by_level,
14 mean_by_level=mean_by_level,
15 stddev_by_level=stddev_by_level,
16 )
17
18 predictor = autoregressive.Predictor(
19 predictor, gradient_checkpointing=True
20 )
21
22 return predictor
23
24# 6. 使用 Haiku 封裝 (JAX 風格)
25import haiku as hk
26import jax
27
28@hk.transform_with_state
29def run_forward(inputs, targets_template, forcings):
30 predictor = construct_wrapped_graphcast(model_config, task_config)
31 return predictor(inputs, targets_template=targets_template, forcings=forcings)
32
33# 7. 執行推論
34predictions, _ = run_forward.apply(
35 params, state, jax.random.PRNGKey(0),
36 inputs, targets, forcings
37)
38
39print(f"Predictions shape: {predictions.dims}")
40# 預期: {'batch': 1, 'time': 40, 'lat': 721, 'lon': 1440, 'level': 37}
4.5 推論 (Rollout) 模式
對於更長的預報序列,使用 rollout.py 進行非微分的 Python 迴圈推論:
1from graphcast import rollout
2
3# rollout 模式:不保留梯度,可跑更長時步
4predictions = rollout.chunked_prediction(
5 run_forward.apply,
6 rng=jax.random.PRNGKey(0),
7 inputs=inputs,
8 targets_template=targets * 0, # 只需要形狀資訊
9 forcings=forcings,
10 num_steps_per_chunk=1, # 每次推論 1 步
11 params=params,
12 state=state,
13)
4.6 計算損失與梯度 (訓練)
1# 計算訓練損失
2@hk.transform_with_state
3def loss_fn(inputs, targets, forcings):
4 predictor = construct_wrapped_graphcast(model_config, task_config)
5 loss, diagnostics = predictor.loss(
6 inputs, targets, forcings
7 )
8 return loss, diagnostics
9
10# 計算梯度
11(loss, diagnostics), grads = jax.value_and_grad(
12 loss_fn.apply, has_aux=True
13)(params, state, jax.random.PRNGKey(0), inputs, targets, forcings)
14
15print(f"Training loss: {loss:.4f}")
5. 進階功能與最佳實踐 (Advanced Features & Best Practices)
5.1 模型架構自訂
GraphCast 的模型配置透過 ModelConfig 控制:
1from graphcast import graphcast
2
3# 自訂模型配置
4custom_config = graphcast.ModelConfig(
5 resolution=1, # 1 degree 解析度
6 mesh_size=5, # 正二十面體細分次數 (5 → 10242 mesh nodes)
7 latent_size=512, # 隱藏層維度
8 gnn_msg_steps=16, # GNN 訊息傳遞步數
9 hidden_layers=1, # MLP 隱藏層數
10 radius_query_fraction_edge_length=0.6, # Grid-Mesh 連接半徑
11)
12
13# 任務配置
14custom_task = graphcast.TaskConfig(
15 input_variables=[...], # 輸入氣象變數列表
16 target_variables=[...], # 預測目標變數列表
17 forcing_variables=[...], # 強迫變數 (太陽輻射等)
18 pressure_levels=[...], # 氣壓層列表
19 input_duration="12h", # 輸入時間跨度
20)
5.2 記憶體最佳化
0.25 degree 全解析度模型對記憶體需求很高。以下是最佳化策略:
1# 策略 1: Gradient Checkpointing (梯度檢查點)
2predictor = autoregressive.Predictor(
3 predictor,
4 gradient_checkpointing=True # 以計算換記憶體
5)
6
7# 策略 2: BFloat16 精度
8predictor = casting.Bfloat16Cast(predictor)
9
10# 策略 3: Chunked Rollout (分段推論)
11predictions = rollout.chunked_prediction(
12 ...,
13 num_steps_per_chunk=1, # 每次只推論 1 步,釋放中間記憶體
14)
5.3 自訂太陽輻射強迫 (Solar Radiation Forcing)
在 Operational Setting (業務預報場景) 中,需要計算未來時步的太陽輻射:
1from graphcast import solar_radiation
2
3# 計算 Top-of-Atmosphere 入射太陽輻射
4# 與 ERA5 的 tisr 變數相容
5toa_radiation = solar_radiation.get_toa_incident_solar_radiation_for_xarray(
6 single_level_dataset,
7 datetime_dim="time",
8 latitude_dim="lat",
9 longitude_dim="lon",
10)
5.4 資料流水線最佳實踐
graph TD
subgraph DATA["Data Pipeline (資料流水線)"]
A["ERA5 Zarr
(WeatherBench2)"] -->|"xarray + dask"| B["Lazy Loading
惰性載入"]
B -->|"切片指定時間窗口"| C["2-step Input Window
t-6h, t"]
C -->|"data_utils.extract_*"| D["inputs / targets / forcings
分離"]
D -->|"normalization"| E["正規化後的張量"]
E -->|"xarray_jax bridge"| F["JAX Arrays
送入模型"]
end
subgraph TIPS["Best Practices (最佳實踐)"]
T1["使用 Zarr 格式
避免 NetCDF 大檔"]
T2["Dask 惰性載入
不一次讀入記憶體"]
T3["Pin JAX 版本
避免 API 不相容"]
end
DATA -.-> TIPS
style DATA fill:#e3f2fd,stroke:#1565C0
style TIPS fill:#fff8e1,stroke:#F9A825
5.5 Operational Fine-tuning (業務微調)
GraphCast_operational 模型展示了如何將 ERA5 訓練的模型微調到 HRES 資料上:
- Pre-train on ERA5:在 39 年再分析資料上完成基礎訓練
- Fine-tune on HRES-fc0:用 2016-2021 年的 HRES 分析場 (Analysis) 微調
- Benefit (效益):模型可直接使用即時 HRES 資料初始化,不需要等待 ERA5 再分析(ERA5 有數月延遲)
5.6 GenCast 集合預報實務
1import jax.numpy as jnp
2
3# GenCast 生成多個 Ensemble Members
4n_ensemble = 50
5
6predictions_ensemble = []
7for i in range(n_ensemble):
8 rng = jax.random.PRNGKey(i) # 不同隨機種子產生不同成員
9 pred = gencast_rollout(rng, inputs, forcings)
10 predictions_ensemble.append(pred)
11
12# 計算集合統計量
13ensemble_mean = jnp.mean(jnp.stack(predictions_ensemble), axis=0)
14ensemble_std = jnp.std(jnp.stack(predictions_ensemble), axis=0)
15# ensemble_std 代表預報不確定性
6. 應用價值與整合潛力 (Application Value & Integration Potential)
6.1 天氣預報的典範轉移
GraphCast 代表了 AI for Science (AI 驅動科學) 的重要里程碑:
| 面向 | 傳統 NWP | GraphCast |
|---|---|---|
| 方法論 | 基於物理方程式的數值求解 | 資料驅動的端到端學習 |
| 計算需求 | 超級電腦 (數小時) | 單一 TPU/GPU (< 1 分鐘) |
| 開發週期 | 數十年的模型改進 | 月級迭代週期 |
| 可解釋性 | 高 (基於已知物理) | 低 (需要額外分析) |
| 精度 | 業界標竿 | 超越 HRES 在大部分指標 |
6.2 GNN 方法對生物醫學預測的啟發
GraphCast 的 GNN-on-Mesh 方法為其他科學領域提供了重要的方法論啟發。以下類比說明其在生物醫學 (Biomedical) 領域的潛在應用:
Protein Structure Prediction (蛋白質結構預測)
GraphCast 將大氣網格映射到正二十面體 Mesh 的方法,類似於 AlphaFold 將 Protein Residues (蛋白質殘基) 映射到 Pair Representation (配對表示) 的概念。兩者都需要:
- 處理空間中的長距離交互作用 (Long-range Interactions)
- 多尺度特徵捕捉 (Multi-scale Feature Capture)
- 對稱性保持 (Equivariance) – GraphCast 透過球面均勻取樣保持旋轉對稱
Drug-Target Interaction (藥物-標靶交互作用)
GraphCast 的 Encode-Process-Decode 架構可直接移植到分子圖學習:
- Atoms (原子) 作為 Grid Nodes → Molecular Graph (分子圖)
- Protein Binding Site (蛋白質結合位點) 作為 Mesh Nodes
- Drug-Protein Interaction 作為 Grid-Mesh Edges
- 多步 Message Passing 捕捉電荷、疏水性等交互作用
Epidemiological Modeling (流行病學模型)
將 GraphCast 的地理空間建模擴展到疾病傳播:
- 地理區域作為 Mesh Nodes
- 人口流動作為 Edges
- 感染數據作為 Node Features
- 天氣、疫苗等作為 Forcing Variables
6.3 產業整合場景
| 領域 | 應用 | 整合方式 |
|---|---|---|
| 農業 | Crop Yield Prediction (農作物產量預測) | GraphCast 提供 10 天天氣預報作為 Feature Input |
| 能源 | Renewable Energy Forecasting (再生能源預報) | 風場/日照預報 → 風力/太陽能發電量預測 |
| 航空 | Flight Route Optimization (航線最佳化) | 高空風場預報 → 最佳飛行路徑計算 |
| 保險 | Catastrophe Modeling (巨災模型) | 極端天氣事件預測 → 風險定價 |
| 生技 | Clinical Trial Site Selection (臨床試驗地點選擇) | 預報當地天氣對受試者行為的影響 |
6.4 與現有系統的整合
1# 範例:將 GraphCast 預報整合進既有資料管線
2import xarray as xr
3
4# 1. 取得 GraphCast 預報結果
5predictions = run_graphcast_inference(current_era5_data)
6
7# 2. 轉換為標準 CF-conventions NetCDF
8predictions.attrs["Conventions"] = "CF-1.8"
9predictions.to_netcdf("graphcast_forecast.nc")
10
11# 3. 與既有 NWP 產品比較
12ecmwf_forecast = xr.open_dataset("ecmwf_hres_forecast.nc")
13bias = predictions - ecmwf_forecast
14rmse = ((bias ** 2).mean(dim=["lat", "lon"])) ** 0.5
15
16# 4. 產生決策支援資料
17high_wind_warning = predictions["10m_wind_speed"] > 17.2 # Beaufort Scale 8
18heavy_rain_alert = predictions["total_precipitation"] > 50 # mm/6h
7. 常見問題與限制 (FAQ & Limitations)
7.1 常見問題 (FAQ)
Q1: GraphCast 能否取代傳統天氣預報?
目前不能完全取代。GraphCast 在大部分指標上優於 ECMWF HRES,但仍有限制:
- 不能直接用於 Nowcasting (即時預報,0-6 小時)
- 極端事件 (Extreme Events) 的預測可靠度仍需驗證
- 缺乏 Physical Consistency (物理一致性) 保證
Q2: 我可以用自己的資料訓練嗎?
可以,但需要注意:
- 完整 ERA5 訓練資料約 100 TB+
- 建議使用 WeatherBench2 的 Zarr 格式 ERA5 子集
- 訓練 0.25 deg 模型需要多個 TPU v4 Pods (數百核)
GraphCast_small是較可行的訓練起點
Q3: GenCast Mini 在免費 Colab 上跑得動嗎?
可以。gencast_mini_demo.ipynb 專門設計為可在免費 Colab (T4 GPU) 上執行。但注意:
- 解析度較低 (1.0 deg)
- Mesh 細分較少 (4 層)
- 預測品質不代表完整 GenCast 的表現
Q4: 模型權重的授權條款?
- 程式碼:Apache License 2.0 (可商用)
- 模型權重:CC BY-NC-SA 4.0 (非商業用途、需署名、相同方式分享)
- 商業使用模型權重需要另行取得 Google DeepMind 授權
Q5: 如何驗證模型預測品質?
使用 WeatherBench2 驗證框架:
1# WeatherBench2 提供標準化的驗證工具
2# https://weatherbench2.readthedocs.io
3from weatherbench2 import evaluation
4
5rmse = evaluation.compute_rmse(predictions, era5_truth)
6acc = evaluation.compute_acc(predictions, era5_truth, climatology)
7.2 已知限制 (Known Limitations)
| 限制 | 說明 | 影響 |
|---|---|---|
| 解析度上限 | 最高 0.25 deg (~25 km),無法解析 Convective Scale (對流尺度) | 局部暴雨、龍捲風等無法預測 |
| 訓練資料偏差 | 以 ERA5 再分析為 Ground Truth,繼承其系統性偏差 | 資料稀少區域 (海洋、非洲) 品質較低 |
| 無物理約束 | 不保證質量守恆、能量守恆等物理定律 | 長期積分可能漂移 |
| Precipitation (降水) | 降水是衍生變數,預測精度較低 | 量化降水預報仍弱於 NWP |
| 計算門檻 | 0.25 deg 模型需要高端 GPU/TPU | 研究機構門檻較高 |
| Extreme Events (極端事件) | 訓練資料中極端事件樣本稀少 | 超強颱風、熱浪等事件可能低估 |
7.3 未來展望
- Physics-Informed ML (物理約束的機器學習):結合物理方程式作為正則化項
- Higher Resolution (更高解析度):推向 0.1 deg 或 Convective-Scale
- Multi-Model Ensemble (多模型集合):GraphCast + GenCast + NWP 組合
- Domain Adaptation (領域遷移):將架構遷移到海洋預報、空氣品質預報
- Foundation Model (基礎模型):以天氣預報為 Pre-training Task,遷移到其他地球科學問題
7.4 引用資訊
1@article{lam2023learning,
2 title={Learning skillful medium-range global weather forecasting},
3 author={Lam, Remi and Sanchez-Gonzalez, Alvaro and Willson, Matthew
4 and Wirnsberger, Peter and Fortunato, Meire and Alet, Ferran
5 and Ravuri, Suman and Ewalds, Timo and Eaton-Rosen, Zach
6 and Hu, Weihua and others},
7 journal={Science},
8 volume={382},
9 number={6677},
10 pages={1416--1421},
11 year={2023},
12 publisher={American Association for the Advancement of Science}
13}
14
15@article{price2023gencast,
16 title={GenCast: Diffusion-based ensemble forecasting
17 for medium-range weather},
18 author={Price, Ilan and Sanchez-Gonzalez, Alvaro and Alet, Ferran
19 and Andersson, Tom R and El-Kadi, Andrew and Masters, Dominic
20 and Ewalds, Timo and Stott, Jacklynn and Mohamed, Shakir
21 and Battaglia, Peter and Lam, Remi and Willson, Matthew},
22 journal={arXiv preprint arXiv:2312.15796},
23 year={2023}
24}
教學文件產生資訊
- 來源:google-deepmind/graphcast
- Stars: 6679 | Forks: 870 | Language: Python | License: Apache-2.0
- 文件產生日期:2026-06-20
- 本文件由 AI Knowledge Template 系統自動生成
Comments