GraphCast气象预报工具快速入门完全指南:4步在免费Colab上跑出全球预报
2026/9/20 6:56:20 网站建设 项目流程

GraphCast气象预报工具快速入门完全指南:4步在免费Colab上跑出全球预报

【免费下载链接】weathernext项目地址: https://gitcode.com/GitHub_Trending/gr/weathernext

GraphCast 是 Google DeepMind 出品的深度学习气象预报工具,它把图神经网络 GraphCast 与扩散模型 GenCast 封装成一套可直接运行的中期天气预报系统(1~15 天全球尺度),并且是唯一提供预训练权重、归一化统计量和示例输入数据的开源实现。本文带你先在免费 Colab 上 10 分钟内跑出第一份预报,再对比 4 种部署环境、完成 3 个典型实战任务,最后才回头拆解原理。

一、快速上手:最短路径跑通结果

最轻量的路线是免费的 Colab +gencast_mini_demo.ipynb:它运行的是GenCast 1p0deg Mini <2019(1° 分辨率、13 个气压层、4 次细分二十面体网格),也是四个官方模型中内存占用最小的一个,能跑在 Colab 免费提供的 TPUv2-8 上,你本地不需要任何硬件。

步骤1:克隆仓库并打开演示笔记本

git clone https://gitcode.com/GitHub_Trending/gr/graphcast cd graphcast

拿到仓库源码后,将gencast_mini_demo.ipynb导入 Colab 打开,后续所有操作都在浏览器里完成。

步骤2:把运行时切换为 TPU

点击菜单栏"运行时 → 更改运行时类型",在"硬件加速器"一栏选择 TPU(TPUv2-8,免费)。不选 TPU 的话只能用 CPU,30 步的自回归外推(rollout,即把上一步输出反复喂回模型逐步推演)会慢到无法接受。

步骤3:运行安装与初始化单元

依次运行"Upgrade packages"、"Pip install repo and dependencies"两个单元(会自动安装仓库代码与 JAX、Haiku、xarray 等依赖),再运行"Reconfigure jax if running on TPU"单元刷新 TPU 运行时。运行完成后控制台不再报错即表示环境就绪。

步骤4:选模型、选数据并加载

在"Choose the model"下拉框里选带Mini字样的 checkpoint(预训练快照),运行"Load the model"单元;随后在"Choose data to plot"前一步的下拉框里选与模型匹配的 1° ERA5 示例数据集(Notebook 已按分辨率自动过滤,如source-era5_date-2019-03-29_res-1.0_levels-13_steps-30.nc),运行"Load weather data"单元。加载成功后单元格下方会显示一个含time维度的 xarray 数据集(NetCDF 格式的多变量大气场容器)。

步骤5:构建模型并跑出自回归预报

先运行"Extract training and eval data"与"Load normalization data"两个单元,再运行"Build jitted functions…",最后运行"Autoregressive rollout (loop in python)"单元。跑完后你会得到predictions对象:8 个集合成员 × 30 个 12 小时步(约 15 天)的全球预报场。

✅ 验证点:接下来运行"Plot prediction samples and diffs"单元,能看到"目标值 / 预测值 / 差值"三栏动画随时间推进,且温度场(默认2m_temperature)形态与目标基本吻合,说明预报确实跑通了。

Q: 第一个 rollout 单元跑了五六分钟没输出,是卡死了吗? A: 不是。首次执行包含 JAX 的即时编译(tracing + compilation),是一次性固定开销;同一会话内再跑一遍会快得多。Notebook 中"Run the model"的说明段落也明确提示了这一点。

二、环境选型:一张表看清所有方案

环境适用场景硬件要求安装/启动命令
免费 Colab(TPUv2-8)学习体验、跑 GenCast Mini无本地要求,完全免费Notebook 首个单元自动 pip 安装
本地机器(CPU)读源码、改代码调试≥16GB 内存pip install -e .
云 TPU v5e(4 芯片)1° 版 GenCast 推理约 21GB 主机内存 + 约 8GB HBMgcloud compute tpus queued-resources create node-1 --node-id=node-1 --zone=us-south1-a --accelerator-type=v5litepod-4 --runtime-version=v2-tpuv5-litepod
云 TPU v5p(8 芯片)0.25° 高分辨率业务级推理约 250GB 主机内存 + 约 32GB HBM同上,改为--accelerator-type=v5p-8 --zone=us-east5-a --runtime-version=v2-alpha-tpuv5
云 GPU(H100)只有 GPU 资源的场景0.25° 版需约 300GB 系统内存 + 约 60GB 显存需把模型 attention 改为triblockdiag_mha(见下方说明)

上图为官方对比:同一份 0.25° GenCast 权重在 TPUv4 与 H100 上生成预报的误差差值(RMSE 与 CRPS,色标 ±3%)。绝大多数要素误差差在 ±3% 以内,H100 平均仅差约 0.3%(RMSE)和 0.4%(CRPS),精度基本无损,但 0.25° 模型 30 步推理要 25 分钟左右,比 TPU 的 8 分钟慢约 3 倍。

云 TPU 的成本参考(docs/cloud_vm_setup.md中给出):v5e 4 芯片跑 1° GenCast 的 30 步 rollout 约 5 分钟(含首次编译),单次成本约 0.11~0.48 美元;v5p 8 芯片跑 0.25° 版约 30 分钟,成本约 2.50~11.10 美元。Spot(抢占式)实例还能再打 0.09~0.4 折。

在 Console 里创建 TPU 时先确认项目(如上图),创建成功后 SSH 进 VM 启动 Jupyter 服务,把生成的本地 URL 填进gencast_demo_cloud_vm.ipynb的连接对话框即可:

python3 -m notebook --port=8081 --no-browser

执行后终端会打印一个http://localhost:8081/...?token=...的链接,把它粘贴进 Notebook 的 Local Runtime 弹窗,浏览器随即接管远端 TPU 上的内核。

Q: 创建 TPU 时报Stockout错误怎么办? A: 说明该区当时没有空闲配额。勾选创建表单里的"Enable queuing"(命令行方式则用queued-resources create),请求会进入"Compute Engine > TPUs > Queued Resources"排队,容量释放后自动变为 active。另外注意:UI 里的"pre-emptibility"选项已废弃,不要勾选,否则会直接报错。

三、实战演练:完成 3 个真实任务

3.1 用 GenCast 做 15 天全球集合预报

数据准备:Mini demo 自带示例数据source-era5_date-2019-03-29_res-1.0_levels-13_steps-30.nc,含 2019-03-29 起 30 个 6 小时帧的 ERA5 再分析场。运行"Extract training and eval data"单元后,eval_inputs取前 2 帧作为初始条件(GenCast 使用当前帧 + 12 小时前的帧),eval_targets是其后每个 12 小时时刻的真值:

eval_inputs, eval_targets, eval_forcings = ( data_utils.extract_inputs_targets_forcings( example_batch, target_lead_times=slice("12h", f"{(example_batch.dims['time']-2)*12}h"), **dataclasses.asdict(task_config)))

模型运行:核心是rollout.chunked_prediction_generator_multiple_runs,它按预报步迭代,一步预测被 jit 编译、8 个集合成员 pmap 并行到多块 TPU 上:

num_ensemble_members = 8 rngs = np.stack([jax.random.fold_in(jax.random.PRNGKey(0), i) for i in range(num_ensemble_members)], axis=0) chunks = [] for chunk in rollout.chunked_prediction_generator_multiple_runs( predictor_fn=run_forward_pmap, rngs=rngs, inputs=eval_inputs, targets_template=eval_targets * np.nan, forcings=eval_forcings, num_steps_per_chunk=1, num_samples=num_ensemble_members, pmap_devices=jax.local_devices()): chunks.append(chunk) predictions = xarray.combine_by_coords(chunks)

跑完得到predictionssample维为 8、time维为 28 个 12 小时步(约 14 天)的集合预报。注意集合成员数应是 TPU 芯片数的倍数,TPUv2-8 下用 8 正好一块芯片一个样本。

结果可视化:运行"Plot prediction samples and diffs"单元,对任意要素(默认 2 米温度)逐样本输出"Targets / Predictions / Diff"三栏动画;再运行"Plot ensemble mean and CRPS"单元,得到集合平均场和逐格点的 CRPS(连续排名概率得分,衡量预报分布与真值偏差的综合指标)热力图。

踩坑说明:集合成员数若不能整除芯片数,pmap 会报设备分片错误;首次运行包含编译时间,别中途断开。

3.2 用 GraphCast 做确定性逐步预报

数据准备:打开graphcast_demo.ipynb,模型下拉框选 checkpoint(官方提供 0.25° 正式版、1°GraphCast_small和 HRES 微调的 operational 版三个权重),示例数据集覆盖 fake/era5/hres 三种来源、1°/0.25°/6° 等分辨率。GraphCast 以 6 小时为步长:

train_inputs, train_targets, train_forcings = ( data_utils.extract_inputs_targets_forcings( example_batch, target_lead_times=slice("6h", f"{eval_steps*6}h"), **dataclasses.asdict(task_config)))

模型运行:GraphCast 是确定性模型(无集合维),rollout 用单跑接口:

predictions = rollout.chunked_prediction( run_forward_jitted, rng=jax.random.PRNGKey(0), inputs=eval_inputs, targets_template=eval_targets * np.nan, forcings=eval_forcings)

结果可视化:"Plot predictions"单元同样给出"目标 / 预测 / 差值"三栏动画,可以直观看到低压槽东移、对流云区演变的模拟过程。

踩坑说明:该 Notebook 在 rollout 前有一行分辨率断言——model_config.resolution必须等于360/lon格点数,选错数据集会直接抛AssertionError,按提示重选匹配模型的数据即可;另外 0.25° 权重在纯 CPU 运行时内存不够,请用 1°small权重或换 TPU。

3.3 验证训练链路:算损失与梯度

数据准备:沿用 3.1 的train_inputs/train_targets/train_forcings(12 小时单步训练切片)。

模型运行

loss, diagnostics = loss_fn_jitted( rng=jax.random.PRNGKey(0), inputs=train_inputs, targets=train_targets, forcings=train_forcings) print("Loss:", float(loss))

再用grads_fn_jitted可得到全网络梯度(Mean |grad|量级在 1e-3 附近为正常)。

结果可视化diagnostics是逐要素的损失分解 xarray,可挑要素打印数值确认各通道都有有效梯度。

踩坑说明:损失/梯度比推理更吃内存——gencast_mini_demo.ipynb明确提示这些单元"requires larger amounts of memory than running inference",只在小模型(Mini 或 random 架构)上稳妥。

Q: 运行 GraphCast 演示时 cartopy 绘图直接崩溃? A: Colab 内核自带的 shapely 版本与 cartopy 不兼容。graphcast_demo.ipynb中已内置"Workaround for cartopy crashes"单元:先pip uninstall -y shapely再从源码重装 shapely,跑一遍即可。

核心模块路径```/graphcast/rollout.py # 推理期自回归外推循环 /graphcast/gencast.py # GenCast 一步预测 + 采样器配置 /graphcast/graphcast.py # GraphCast 主架构```

四、原理深挖:它是怎么工作的

两个模型共享一个思路:不要直接预报,而是让网络学会"大气状态如何演化一小步",然后用循环把这一小步叠成 10 天。

GraphCast 的类比是"城市路网上的邻居互报"。地球表面被铺上一层二十面体三角网格(mesh,比经纬网格在两极更均匀),每个网格点是一个节点、特征向量装着温度/湿度/风场等几十项要素。模型先编码把网格数据搬到粗到细的多层网格图上,再由一个 4 次消息传递的图网络做处理——每个节点反复向邻居要信息、更新自己的状态,这恰好对应大气的局地耦合(低压吸引周围气流这种物理过程靠消息传递步数来学习),最后解码把网格上的状态投回规则经纬网格输出预报。整个"编码器→图处理器→解码器"在 graphcast/graphcast.py 里实现,mesh_sizegnn_msg_stepslatent_size三个超参分别控制网格细化层数、消息传递轮数和节点特征宽度。

GenCast 换了一台发动机:它不输出"最可能的那一个",而是生成一个分布。类比修图软件里的"去噪"——从一团纯噪声出发,用一个去噪器(denoiser,内部同样是网格上的稀疏 Transformer)分 20 个噪声等级逐步擦掉噪声,最终"擦"出一份 12 小时后的天气。每个 12 小时步生成 8 个样本就是集合预报,样本之间的离散程度天然就是不确定性;采样用 DPM-Solver++ 2S 加速器(graphcast/dpm_solver_plus_plus_2s.py),比朴素反向扩散快得多。另外它还会按历史统计量对输入做归一化、对输出按"时间差"分布做反归一化(graphcast/normalization.py),相当于让模型只学"变化量"而不用记绝对数值。

五、性能与边界:什么时候好用、什么时候别用

上图为 Mini 模型(8 成员集合)对比 ECMWF 51 成员 ENS(2019 年,公平 CRPS)的误差比(蓝色=比 ENS 好,红色=更差,色标 ±20%)。可以读出三条边界:

  1. 好用区:500~850hPa 中低层、3~10 天的中期预报大面积为蓝,尤其比湿q与 2 米温度在 5~10 天时效显著优于 ENS——这正是"中期预报(5~10 天)"这个用武之地。
  2. 别指望的区:200hPa 平流层附近的风场(u/v)在 0~3 天大面积偏红,高层位势高度z前 7 天也偏弱;超过 10 天后各要素误差普遍抬升。
  3. Mini ≠ 主力:官方明确说 Mini 精度"reasonable but not representative",它是为低成本演示牺牲精度的版本;业务级精度要看 0.25° 版(论文中 0~10 天多数要素 RMSE 优于 ENS)。
优化方法适用场景效果复杂度
0.25° 降到 1°/Mini内存受限(≤21GB 主机内存即可跑 1°)主机内存从约 250GB 降到约 21GB低(换权重即可)
集合成员 50 → 8演示、学习、显存紧张内存与耗时约为 1/6低(改num_ensemble_members
Spot 抢占式 TPU成本敏感的非关键任务折扣 60%~91%(可能被随时回收)低(命令加--spot
BFloat16 混合精度(casting.pyTPU 上跑 GraphCast显存减半、计算更快低(Notebook 已默认包裹)
GPU 上换triblockdiag_mhaattention无 TPU 只有 H100 类 GPU精度降约 0.3%~0.4%,0.25° 推理约慢 3 倍中(需改SparseTransformerConfig两个字段)

六、排错FAQ与资源导航

Q: TPU 上跑 Notebook 时 JAX 行为怪异或导入libtpu失败? A: Colab 的 TPU 镜像里 jax/libtpu 版本偏旧。gencast_mini_demo.ipynb已内置处理单元:pip uninstall -y libtpu libtpu-nightly后重装jax[tpu],运行它并重启内核。

Q: 想用自己的初始场,去哪里拿 ERA5 数据? A: 演示用的小样本已放在仓库配套的dm_graphcast公开 Cloud Bucket 中(Notebook 直接匿名读取);完整训练数据是 ECMWF 的 ERA5 再分析(1979 年起、6 小时分辨率),推荐按 Weatherbench2 的 Zarr 形式获取。注意数据时间格式必须与模型要求一致:GenCast 用当前帧 + 12 小时前帧,GraphCast 用 6 小时步。

Q: 输出能用于商业产品吗? A: 分两份:代码是 Apache 2.0,可商用;但预训练模型权重是 CC BY-NC-SA 4.0,仅限非商业用途。做商业预报服务需要自行训练权重。

Q: 本地 CPU 能跑吗? A: 能但很慢。graphcast_demo.ipynb支持选 random 小模型 + 6° 低分辨率数据,在 CPU 上做 4 步 1° 推理勉强可行;要完整体验请直接用 Colab 免费 TPU。

资源导航:

  • 云端部署文档:docs/cloud_vm_setup.md(含 TPU 选型、成本估算、GPU 备选方案)
  • 演示笔记本:gencast_mini_demo.ipynb(免费 TPU)、graphcast_demo.ipynb(GraphCast 三权重)、gencast_demo_cloud_vm.ipynb(云 TPU)
  • 源码入口:graphcast/ 目录,predictor_base.py定义统一接口,losses.py含纬度加权损失
  • 论文:GraphCast 发表于 Science 2023(Lam et al.);GenCast 为 arXiv:2312.15796(Price et al.);两者引文格式见 README.md

从免费 Colab 的一次 rollout,到 v5p 八芯片的业务级推理,这条链路你已经完整走过一遍:GraphCast 教你"大气一小步怎么演化",GenCast 在此基础上把预报升级为"一个带不确定性的分布"。建议的下一步实践:先跑通 Mini demo,然后把初始日期换成最近一年里的某一天,对比 8 成员集合平均与你选要素的目标场 CRPS 曲线——这会让你对"AI 预报的置信度"建立起第一手直觉,也为切换到 0.25° 高分辨率版本打好判断基础。

【免费下载链接】weathernext项目地址: https://gitcode.com/GitHub_Trending/gr/weathernext

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询