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 層級訓練資料適用場景
GraphCast0.25 deg376ERA5 1979-2017研究級高精度預報
GraphCast_small1.0 deg135ERA5 1979-2015低資源環境測試
GraphCast_operational0.25 deg136ERA5 + HRES fine-tuned業務預報
GenCast 0.25deg0.25 deg136ERA5 1979-2018高精度集合預報
GenCast 1.0deg Mini1.0 deg134ERA5 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

為什麼使用正二十面體網格?

  1. Uniform Sampling (均勻取樣):球面上節點分布均勻,不像經緯度網格在極地過密
  2. Multi-scale Information Flow (多尺度資訊流):低解析度層級捕捉全球性的大尺度模式 (如 Jet Stream 噴射氣流),高解析度層級捕捉局部天氣系統
  3. 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 系統需求

項目最低需求建議配置
Python3.10+3.11
GPU/TPU– (CPU 可跑 small 模型)Cloud TPU v4 或 A100 GPU
RAM16 GB64 GB+ (0.25deg 模型)
Disk10 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:

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 資料上:

  1. Pre-train on ERA5:在 39 年再分析資料上完成基礎訓練
  2. Fine-tune on HRES-fc0:用 2016-2021 年的 HRES 分析場 (Analysis) 微調
  3. 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 驅動科學) 的重要里程碑:

面向傳統 NWPGraphCast
方法論基於物理方程式的數值求解資料驅動的端到端學習
計算需求超級電腦 (數小時)單一 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 未來展望

  1. Physics-Informed ML (物理約束的機器學習):結合物理方程式作為正則化項
  2. Higher Resolution (更高解析度):推向 0.1 deg 或 Convective-Scale
  3. Multi-Model Ensemble (多模型集合):GraphCast + GenCast + NWP 組合
  4. Domain Adaptation (領域遷移):將架構遷移到海洋預報、空氣品質預報
  5. 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 系統自動生成