数据管道揭秘:Snakemake如何批量调度5个CMIP6数据集的下载与重网格化

数据管道揭秘:Snakemake如何批量调度5个CMIP6数据集的下载与重网格化

数据管道揭秘:Snakemake如何批量调度5个CMIP6数据集的下载与重网格化

【免费下载链接】ClimaXFoundation model for weather & climate项目地址: https://gitcode.com/gh_mirrors/cli/ClimaX

想用气候大模型做研究,第一步往往不是跑模型,而是和"数据"死磕:几十个CMIP6数据集、跨越165年的逐6小时文件、动辄上百GB的体积……手动一个个下载再重网格化,几乎是不可能完成的任务。今天这篇文章,就带新手和普通用户走进ClimaX开源项目背后的CMIP6数据下载与重网格化数据管道,看看它是如何用Snakemake工作流引擎,一键批量调度5个CMIP6模式数据集(AWI-ESM、CMCC、HAMMOZ、MPI-ESM、TaiESM1)完成从"原始NetCDF下载"到"统一分辨率重网格化"的全流程。

为什么要做CMIP6数据预处理管道?🤔

CMIP6(第六次耦合模式比较计划)是全球气候研究的基础数据源,但它有个"老毛病":每个模式的网格分辨率、经纬度定义、变量命名都不一样

  • AWI-ESM-1-1-LR 的 2 米气温叫tas,ERA5 里叫t2m
  • CMCC-CM2-HR4 的气温叫ta,ClimaX 里叫t
  • MPI-ESM1-2-HR 的位势高度叫zg,重网格化后要换算成z并乘上重力加速度。

如果直接把这些"五花八门"的数据喂给模型,训练必然失败。所以需要一条可复现的数据预处理管道:先按模式分别下载,再统一重网格化到同一分辨率(如 1.40625°),最后重命名变量对齐 ERA5 规范。ClimaX 项目把这条管道做成了声明式的 Snakemake 工作流,配置即数据,一条命令跑完全部 5 个数据集。

5个CMIP6数据集,一份配置一个模式 📁

snakemake_configs/目录下,每个模式都有独立的文件夹,里面是一个Snakefile加若干份 YAML 配置。先看配置长什么样——以 MPI-ESM 的位势高度配置 为例:

datadir: /data/CMIP6/MPI-ESM server_prefix: http://esgf-data1.llnl.gov/thredds/fileServer/css03_data/CMIP6/CMIP name: geopotential cmip_name: zg era_name: z output_type: 6hrPlevPt run: r1i1p1f1 version: v20190815 res: - 1.40625

这份配置就是"数据管道的大脑":cmip_name告诉管道去 ESGF 服务器上找哪个变量,era_name告诉管道重网格化后要改成什么名字,res指定目标分辨率。5 个数据集(AWI-ESM、CMCC、HAMMOZ、MPI-ESM、TaiESM1)各自维护自己的 YAML,互不干扰,想加一个新模式只需要复制一份配置即可。

一条Snakefile,调度三段式流水线 ⚙️

Snakemake 的核心理念是"规则即依赖"。打开任意模式的 Snakefile,你会发现整条 CMIP6 数据管道其实只有 4 条规则,环环相扣:

第一步:download 规则——wget 批量拉取原始文件 📥

rule download: output: "{dataset}/raw/{name}/{name}_{year_str}_raw.nc" shell: "wget https://esgf-data1.llnl.gov/.../{config[cmip_name]}_..._{wildcards.year_str}.nc " "-O {wildcards.dataset}/raw/{config[name]}/{config[name]}_{wildcards.year_str}_raw.nc"

它用wget从 ESGF 服务器下载原始 NetCDF,并按{dataset}/raw/{name}/的目录结构落盘。注意开头的year_strings生成了 1850~2015 年共 165 年的时间分段,也就是说每条规则会自动展开成上百个并行下载任务,Snakemake 帮你安排得明明白白。

第二步:regrid 规则——调用重网格化脚本 🔄

rule regrid: input: "{dataset}/raw/{name}/{name}_{year_str}_raw.nc" output: "{dataset}/{res}deg/{name}/{name}_{year_str}_{res}deg.nc.tmp" shell: "python ../../src/data_preprocessing/regrid.py \ --input_fns {input} --output_dir {wildcards.dataset}/{wildcards.res}deg/{wildcards.name} \ --ddeg_out {wildcards.res} --cmip 1 \ --rename {config[cmip_name]} {config[era_name]} --file_ending nc.tmp"

下载完成会自动触发重网格化。这一步调用的核心脚本是 src/data_preprocessing/regrid.py:它用xarray读取 NetCDF,用xesmf双线性插值把数据插值到统一经纬网格,同时完成两件事——丢掉 CMIP6 特有的lat_bndslon_bnds等边界坐标,以及把cmip_name重命名为era_name(比如tast2m)。

regridder = xe.Regridder(ds_in, grid_out, method, periodic=True, reuse_weights=reuse_weights) ds_out = regridder(ds_in, keep_attrs=True).astype('float32')

值得一提的细节:如果变量是位势高度zg,脚本会乘上 9.807 换算成位势米z;如果是太阳辐射rsdt,则会换算成tisr并做时间重采样。这些气候学上的"小心思"都藏在 regrid 脚本里,对新手非常友好。

第三步:delete 规则——临时文件转正 ✅

重网格化先输出.nc.tmp临时文件,等该年份所有分辨率都处理完,delete规则(优先级 100)统一把它们mv成最终的*_deg.nc正式文件,避免读到写了一半的脏数据。

第四步:all 规则——最终产物汇总 🎯

rule all: input: expand("{datadir}/{res}deg/{name}/{name}_{year_str}_{res}deg.nc", datadir=config['datadir'], res=config['res'], name=config['name'], year_str=year_strings)

all规则定义了整条数据管道的"终点":只有全部 165 年的重网格化文件都齐了,Snakemake 才认为任务成功。这就是声明式工作流的好处——你只管描述目标,Snakemake 自动反推需要执行哪些下载和重网格化任务

批量调度5个数据集:一条命令全搞定 🚀

最妙的是,5 个模式的配置除了datadirserver_prefix、变量映射不同,Snakefile 逻辑完全一致。这意味着你只需要分别在每个模式目录下执行:

snakemake --configfile config_2m_temperature.yml -j 8

Snakemake 就会自动解析 YAML 配置,按规则依赖展开成数百个下载与重网格化任务,并用-j指定并行度。想要 5 个数据集全部处理?写一个简单的循环或用一个总 Snakefile 聚合即可,真正的"一次配置,全家受益"。

数据管道小结:新手能学到什么?💡

环节工具作用
批量下载wget+ Snakefile 通配符按年份自动展开 165 年任务
重网格化regrid.py +xesmf双线性插值到 1.40625° 统一网格
变量对齐--rename cmip_name era_nametas→t2mta→tzg→z
任务调度Snakemake 规则依赖自动编排下载→重网格化→落盘

对新手来说,这条数据管道最大的价值在于可复现性:只要保留snakemake_configs/下的 YAML 和 Snakefile,任何人在任何机器上都能重建一模一样的 CMIP6 训练数据。如果你正准备用 ClimaX 做气候预测研究,不妨先从读懂这份 Snakemake 数据管道配置 开始,把数据地基打牢,模型训练才能事半功倍。快去试试吧!🔥

【免费下载链接】ClimaXFoundation model for weather & climate项目地址: https://gitcode.com/gh_mirrors/cli/ClimaX

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