视界:earthkit介绍
本文翻译自 ECMWF 的一篇通讯文章,介绍 ECMWF 正在开发的 earthkit 工具库。
Introducing earthkit
by Iain Russell, Tiago Quintino, Baudouin Raoult, Sándor Kertész, Pedro Maciel, James Varndell, Corentin Carton de Wiart, Edward Comyn‑Platt, Olivier Iffrig, James Hawkes, Simon Smart
in ECMWF Newsletter Number 179 - Spring 2024 (Published in April 2024)
https://www.ecmwf.int/en/newsletter/179/computing/introducing-earthkit
以下正文部分使用 ChatGPT 和文心一言翻译自原文,并根据笔者理解略有修改。
正文
Earthkit 是一个由 ECMWF 领导的令人振奋的全新开源 Python 开发项目,通过简化数据访问、处理、分析、可视化等过程,为加速天气和气候科学工作流提供强大的工具。 Earthkit 正处于多年开发的初期阶段,但许多方面已经开放以供测试和反馈。
Earthkit 背景
2023 年,ECMWF 发布了 2023 年至 2027 年的软件战略和路线图 (Quintino et al., 2023),概述了未来五年软件开发的计划。 支撑软件战略的一些核心原则包括:
- 提高软件的可重用性和组件化程度
- 进一步利用外部软件
- 采用开放式开发
- 确保数据可扩展性到新的更高分辨率
- 现代化至新的标准以提高互操作性
Earthkit 通过提供多个可互操作的软件组件来帮助我们实现这一愿景,这些组件建立在广受欢迎的开源 Python 库之上,例如 NumPy、pandas 和 Matplotlib。 它还集成并利用了已在 ECMWF 业务系统中广泛应用的健壮且已准备好投入运行的软件栈 (例如 ecCodes、Fields DataBase (FDB) 等)。
ECMWF 在开发处理大量数据且强调时效性的软件方面拥有数十年的经验。 考虑到这一点,我们设计 earthkit 时遵循了一些原则,例如能够在不从存储中读取任何数据或写入任何数据的情况下执行整个工作流。 我们也响应了高性能计算设施 (HPCF) 中 GPU 架构的趋势,确保处理管道是 GPU 准备就绪的。
Earthkit 的覆盖范围广泛,旨在最终取代 Metview,即 ECMWF 的气象工作站软件,成为 ECMWF 检索、检查、处理和可视化气象数据的一体化环境。 这是一项不小的任务,我们承认这将需要数年时间,因为 Metview 在过去三十年中一直不断发展 (回顾其初期,请参见:Daabeck et al., 1995)。 另一个最终将被 Earthkit 取代的主要软件包是 Magics,即 ECMWF 具有 35 年发展历史的绘图软件包 (Lamy-Thépaut et al., 2023)。 其功能将由 earthkit-maps 和 earthkit-plots 组件覆盖。 Metview 和 Magics 的开发已经放缓,以便更加专注于 earthkit,并且随着更多 earthkit 功能的推出,用户迁移路径将被规划。
Earthkit 架构
Earthkit 由多个 Python 组件组成,每个组件都专注于特定领域,如数据访问、重网格化或绘图。 这些组件可能依赖于 ECMWF 开发的多个 Python 和二进制库,而这些库又可能依赖于成熟的第三方 Python 和二进制库。 架构背后的驱动力之一是代码的可重用性和组件化————每个包都应专注于一项任务,并出色地完成它。
除了直接使用 earthkit 的最终用户外,ECMWF 还有许多应用程序和框架将随着时间的推移迁移到使用 earthkit。 这些包括 ECMWF 的后处理框架 PProc,检验软件 Quaver,图形预报 Web 应用程序 ecCharts,水文后处理框架 Danu,以及 Common Data Store (CDS) 引擎。 这些都在图 1 中进行了总结。
接下来的几节将介绍一些选定的 earthkit 组件的一些细节。
图 1:构成 earthkit 的软件组件的高层概述。依赖链包括许多成熟的第三方库,涵盖数据表示和处理 (NumPy、pandas 和 Xarray)、绘图 (Matplotlib) 和压缩 (libaec) 等领域。图片来自原文
Earthkit-data
earthkit-data 的目的是双重的。 首先,它提供了一个用于访问数据的接口,包括从磁盘加载文件、从URL、直接从 ECMWF 的 FDB 以及从 ECMWF 的 MARS 等远程服务中加载数据。 其次,它以格式无关的方式表示数据,并提供数据提取、检查、切片、过滤和转换功能。 通过这种方式,它提供了一个数据层,使所有的 earthkit 组件能够互操作。 所有这些都通过高级接口提供,其中数据传输、格式和存储的细节对用户来说是抽象和透明的。
为了简化数据访问,用户可以调用单个方法 from_source()
。
有多种内置的源可用,例如 ‘file’、‘url’、‘fdb’ 或 ‘mars’,支持包括 GRIB、NetCDF、BUFR 和许多其他数据格式在内的广泛数据格式。
一些例如 URL 和 FDB 的源可以直接作为流读入内存,从而实现不涉及任何存储 I/O 的高效工作流。
此外,用户可以定义自己的源作为插件,然后发布和与他人共享,而无需更新和发布 earthkit-data 本身。
Earthkit-data 还可以轻松处理 tar.gz 文件,返回其解压后的内容组合。
图 2 中的代码展示了如何加载这样的数据并显示打包的 GRIB 文件的内容,图 2 显示了结果。
import earthkit.data
path = "https://get.ecmwf.int/repository/test-data/earthkit-data/examples/test_gribs.tar.gz"
ds = earthkit.data.from_source("url", path)
ds.ls()
图 2 ls()
函数显示每个要素场的信息列;用户可以指定额外的键。图片来自 PyCharm 运行截图
对用户来说的另一个好处是,从远程源检索的数据可以缓存到磁盘上,当再次运行相同的检索时,可以立即访问它。 该缓存高度可配置,可以根据操作环境的典型要求进行关闭,比如应尽量减少磁盘访问并明确磁盘访问。
由 from_source()
返回的所有数据对象都允许使用一些常见方法,包括通过 to_numpy()
、to_pandas()
和 to_xarray()
将底层数据转换为熟悉的科学 Python 格式。
GRIB 数据和合适的 NetCDF 文件被表示为 FieldList
(即要素场列表:在给定时间或时间段内大气的水平切片),提供了更专业和更丰富的功能。
通过设计,earthkit-data 中的内存使用量被保持在最低限度,尽可能实现了惰性加载。
当遍历从 GRIB 创建的 FieldList
时,默认情况下仅在内存中保留一个要素场。
当必须处理大于内存的数据集时,此技术至关重要,它可以处理任意数量的 GRIB 要素场。
我们还可以将要素场表示为元数据对象和存储值的 NumPy 数组的组合。
通过这种方式,我们可以构建与原始数据格式解耦的整个 FieldLists
。
这种表示对计算特别有用,并且计划在不久的将来支持其他数组后端,例如适用于 GPU 的 PyTorch。
有关示例,请参阅 earthkit-data 文档,包括用户指南和 API 参考,网址为 https://earthkit-data.readthedocs.io/en/latest/
Earthkit-maps
Earthkit-maps 是 earthkit 的地理空间可视化组件,使用户能够通过几行代码就制作出具有出版质量的天气和气候地图。 它是一个方便的工具,可快速查看来自各种格式的任何地理空间数据,同时也提供了足够的深度来完全自定义图表的每一个方面,以供出版或演示使用。
Earthkit-maps 建立在巨人的肩膀上,借鉴了 ECMWF 的 Magics 可视化软件的一些特性和理念,并将它们应用到一个基于功能丰富的开源可视化库 Matplotlib 和 cartopy 构建的后端上。 它在这个坚实的基础之上,结合领域特定知识,提供了一个超级简单的 API,可以省去用户在使用 Magics 或 Matplotlib 时通常需要编写的大部分代码。
Earthkit-maps 还利用了 earthkit-data 和 earthkit-regrid 的功能,极大地简化了从数据源到可视化的过程。 用户可以轻松编写与输入无关的代码,既可以用于 GRIB 数据,也可以用于 NetCDF 数据。这些代码还可与常规经纬度网格完全相同的方式可视化八面体简化高斯网格上的数据。
最后,earthkit-maps 还提供了一些额外的便利功能,包括:
- 裁剪特定区域以适应指定的国家、地区或大陆,并(可选地)为给定的世界区域优化地图投影
- 根据输入元数据自动选择合适的样式
- 创建和使用基于组织、项目或个人选择的样式库
- 使用从数据的元数据直接读取的模板来格式化标题和标签
- 内置支持来自 Natural Earth 制图库的各种辅助图层,如城市、市区、河流、湖泊等
使用 earthkit-maps 的最快方法是使用 earthkit.maps.quickplot()
函数,它尝试基于数据元数据以最佳方式可视化数据。
图 3 显示了 2 米温度和平均海平面气压的示例图。
import earthkit.data
import earthkit.maps
source_filename = "era5-2t-mslp-christmas-2010.grib"
earthkit.data.download_example_file(source_filename)
data = earthkit.data.from_source("file", source_filename)
earthkit.maps.quickplot(data)
图 3 earthkit-maps 的 quickplot()
函数能够自动分配样式并组合图层。图片来自代码运行结果
我们有一个全球范围的领域,但如果想聚焦到欧洲怎么办?
只需要添加一个 domain="Europe"
参数,就可以得到如图 4 所示的绘图。
earthkit.maps.quickplot(data, domain="Europe")
图 4:指定一个预定义域作为 quickplot()
函数的参数的结果。图片来自代码运行结果
要获取更多示例,请查阅 earthkit-maps 文档,包括用户指南和示例图库,网址为 https://earthkit-maps.readthedocs.io/en/latest/
Earthkit-regrid
Earthkit-regrid 是一个专门用于将地理点从一个排列映射到另一个排列的组件,例如将八面体简化高斯网格 (octahedral reduced Gaussian grid) 转换为特定空间分辨率的常规经纬度网格 (regular latitude-longitude grid)。
Earthkit-regrid 利用了插值本质上是输入和输出网格分辨率和格式之间的几何关系的原理。 这种关系被建模为线性运算 y = Ax,其中 x 和 y 分别表示输入和输出要素场,A 表示插值算子,是一个将输入映射到输出的矩阵。 这个矩阵通常是稀疏的(轻量级的),可以通过各种优化的后端高效实现乘法运算,包括基于 CPU 和 GPU 的架构。 将矩阵计算与插值过程分离的优势在于,它允许开发一个更简单的插值包,该包可以仅使用最少的 Python 库在任何地方部署。
计算插值权重、缓存和执行乘法的概念最初由 MIR (Meteorological Interpolation and Regridding) 软件包提出 (Maciel et al, 2017)。 这是 ECMWF 归档和产品生成服务(MARS/pgen)的后处理引擎,对于服务的可扩展性和效率至关重要。 Earthkit-regrid 利用预先计算的 MIR 插值权重,这些权重适用于大量输入/输出网格组合和有限数量的插值方法,这些权重从指定的在线源获取,并在第一次请求时进行缓存。 MIR 支持许多高级的插值方法(例如保守插值或支持 ECMWF IFS 的气候文件的方法),具有广泛的配置能力,并且已经满足了高分辨率模式运行日益增长的需求。 通过共享插值权重,MIR 的功能将随着时间的推移逐渐变得更加易于 earthkit-regrid 访问。
将生成插值权重与通过高级 Python 包执行插值分开的策略对用户和作为数据提供者的 ECMWF 都具有极大的优势。 earthkit-regrid 的未来版本将能够直接调用 MIR 引擎,以便进行未预先计算的重网格化。 因此,将会支持新的输入/输出网格组合和更复杂的插值方法,而无需更改用户环境。 earthkit 和 MIR 之间的协同作用证明了协作软件开发的转变潜力。
有关更多信息和示例,请参阅 earthkit-regrid 文档,网址为 https://earthkit-regrid.readthedocs.io/en/latest/
Earthkit-meteo
earthkit-meteo 组件目前处于设计阶段,将包含一系列在我们领域广泛使用的气象和数学函数。 它旨在提供清晰的 API,并配备广泛的测试,以确保它们在各种情境下的安全应用,如业务预报后处理、集成到用户应用程序以及在 Jupyter 笔记本中使用等。
earthkit-meteo 组件将被组织成多个子模块,每个子模块专门用于特定的后处理类别:
- thermo: 包含热力学函数,包括湿度计算、温度转换等。
- wind: 计算与风有关的量,如风向,以及极坐标和笛卡尔坐标之间的转换。
- stats: 提供基本的数学和统计函数,包括分位数和 NumPy 函数的扩展。
- extreme: 包括极端预报指数 (Extreme Forecast Index, EFI) 和 SOT (Shift of Tails)。
- score: 提供指标,如 CRPS (Continuous Ranked Probability Score)。
- … 更多功能正在陆续增加中!
earhtkit-meteo 模块将通过两个主要接口提供,每个接口都针对不同的用例而设计:
- NumPy 低级 Python API。该接口直接处理 NumPy 数组,方便进行高效的后处理,而无需进行数据管理的复杂操作。
- earthkit 高级 Python API。该接口在整个处理过程中维护元数据,确保输出是有效的 earthkit-data 对象,并具有适当的元数据,这些元数据是从输入构造而来的。
在初版发布之前,earthkit-meteo 将进行一些整合工作,首次发布将首先引入 NumPy 级别 API。
合作
earthkit 的所有源代码都在 GitHub 上公开可用,我们积极采用开放式开发的方式。 这种开发方式意味着我们将公开地开发代码库,使开发过程透明化,并从一开始就让社区以及特别是 ECMWF 成员国和合作国参与其中,并寻求对 earthkit 组件系统的设计和功能提供早期反馈。
早期合作已经启动。例如:
- 瑞士国家气象局 (MeteoSwiss) 正寻求将 earthkit 组件作为其新一代后处理系统的基础;
- 德国气象局 (DWD) 为 earthkit-data 提供了设计和要求,以支持从 Amazon S3 (Simple Storage Service) 中访问数据;
- 澳大利亚气象局 (BoM) 正在为 earthkit-maps 贡献新的绘图样式。
通过这些以及未来的合作,我们相信 earthkit 将加强我们的业务工作流程,成为 PProc (用于后处理)、ecCharts 或新的机器学习框架等应用程序的基础构建模块。
总结和未来工作
earthkit 是 ECMWF 于 2023 年发布的软件战略的重要组成部分,充分体现了其所有原则。 随着越来越多的服务和应用程序迁移到使用 earthkit,我们将创建一个更加高效和一致的软件栈。 眼下的重点将是通过 earthkit-meteo 和计划中的 earthkit-hydro 来实现基本和科学计算,并将 earthkit-regrid 发展到更充分利用 MIR 重采样引擎的阶段。
earthkit 的发展具有坚实的未来,计划中或处于早期开发阶段的组件将继续增加。 earthkit-plots 将作为 earthkit-maps 的补充,提供生成非地图绘图的方式,例如时间序列 (time series)、气象图 (meteograms) 和剖面图 (cross sections)。 earthkit-climat 将提供计算气候指标和风险因子的方法,预计该组件将高度依赖社区驱动。 这是因为由 ECMWF 实施的欧盟的哥白尼气候变化服务 (C3S) 的承包商将在生成完全可追溯的项目输出 (例如派生数据集和 Web 应用程序) 的同时,贡献他们的专业知识。
我们设想一个未来,earthkit 被 ECMWF 内部和外部广泛采用和贡献,并作为一个平台,加强与成员国之间的互动。 earthkit 仍在开发中,但 earthkit-data、earthkit-maps、earthkit-plots 和 earthkit-regrid 的测试版已通过 PyPI 提供。 我们欢迎通过 GitHub 提交的问题来反馈这些软件包。
对于 earthkit 的通用介绍可以访问这里: https://earthkit.readthedocs.io/en/latest/
安装说明在这里: https://earthkit.readthedocs.io/en/latest/install.html
earthkit-data、earthkit-mpas 和 earthkit-regrid 的 GitHub 代码仓库可在以下链接找到:
- https://github.com/ecmwf/earthkit-data
- https://github.com/ecmwf/earthkit-maps
- https://github.com/ecmwf/earthkit-regrid
进一步阅读
Quintino, T., U. Modigliani, F. Pappenberger, S. LamyThépaut, S. Smart, J. Hawkes, et al., 2023: Software Strategy and Roadmap 2023–2027. ECMWF Technical Memorandum No. 904. https://www.ecmwf.int/en/elibrary/81334-software-strategy-and-roadmap-2023-2027
Daabeck, J., B. Norris & B. Raoult, 1995: Metview – Interactive Access, Manipulation and Visualisation of Meteorological Data on UNIX Workstations. ECMWF Newsletter No. 68, 9–28.
Lamy-Thépaut, S., S. Siemen & J. Varndell, 2023: What next for Magics visualisation? ECMWF Newsletter No. 177, 22–26. https://www.ecmwf.int/en/newsletter/177/computing/what-next-magics-visualisation
Maciel P., T. Quintino, U. Modigliani, P. Dando, B. Raoult, W. Deconinck, et al., 2017: The new ECMWF interpolation package MIR. ECMWF Newsletter No. 152, 36–39. https://www.ecmwf.int/en/newsletter/152/computing/new-ecmwf-interpolation-package-mir
注:正文部分到此结束,以下内容为译者添加
讨论
这篇新闻通讯稿再次明确提出 earthkit 将替代现有的 Metview 和 Magics 软件,成为 ECMWF 下一代的一体化工作环境。 译者一直认为以 ecCodes、Magics、Metview、ecFlow 为代表使用 C/C++ 开发的软件工具是 ECMWF 自研软件体系最重要的标志,并以此来鼓吹工具软件应该自研并且开源。 没想到随着 2023 年 ECMWF 软件路线图发布,ECMWF 迅速转向构建以 Python 为核心的软件工具栈,而 earthkit 则是策略转变的典型产物。
在 earthkit 诞生之前,译者除了 ecCodes 和 ecFlow 的 Python API 接口外很少接触 ECMWF 开发的 Python 工具库,只有 cfgrib 让译者有眼前一亮的感觉,并参考 cfgrib 以及 nmcdev 小组的 nmc_met_io 工具开发了 reki 和 nuwe-cmadaas-python 两个数据准备相关工具库。 关于 reki 的开发过程,请参考《nwpc-data更名为reki》。
earthkit 的出现再一次让译者眼前一亮,也促使译者自去年开始逐渐形成 cedarkit 工具套件的构想,并将绘图工具包由 meda 更名为 cedarkit-maps。 关于 cedarkit 的初步想法及 cedarkit-maps 的介绍请参考《绘图工具库cedarkit-maps介绍》。
earthkit 采用将不同功能拆分到不同项目中的组织方式,与 nmcdev 的 nmc_met 系列工具集和 NCAR 的 geocat 系统工具集不谋而合。 多项目的方式极大增加了用户的学习成本,但能够降低单个项目的集成难度,更方便作为“基础构建模块”引入到其他工具库中。 译者近期看到由 nmcdev 开源的采用集成式架构的 meteva 也分离出了单独的数据处理工具库 meteva-base,并应用到 NMC 的智能预报系统 NIMM 中,逐渐走向多项目的组织形式。 译者在翻译博文《视界:Magic可视化的下一步将何去何从?》中有更详细的讨论,欢迎浏览。
文中详细介绍了 earthkit 不同组件的特色功能,非常值得 cedarkit 后续借鉴。例如
数据准备方面:
- 文件要素清单:从数据加载转向数据探索的必备功能
- 延迟加载:降低内存使用的必由之路
- 元数据与数据分离:数据可以独立于元数据存在,提高可扩展性,降低集成工具的前提条件
- CPU / GPU 后端:AI 时代必须考虑 GPU 架构
数据可视化方面:
- 一键出图:一个函数实现自动图形绘制,极大降低学习成本
- 内置样式:工具专业性的体现,一键出图的基础
- 全面可定制:不只有一键出图,还为“高级”用户提供全面的定制方法
- 可扩展:方便推广使用
而且 CEMC 缺乏内部的通用插值库。可能是因为 CEMC 当前的数值天气预报模式业务系统使用等经纬度网格,从模式原始输出制作模式产品不需要额外的水平插值。 不过 CEMC 下一代模式不再使用等经纬度网格,无论是背景场预处理还是产品后处理都需要进行水平插值,也许会诞生内部通用的插值库。
译者将持续关注 earthkit 工具套件的开发进展,并持续将其优秀的设计理念引入到 cedarkit 的设计与开发过程中,期望 cedarkit 能够成为单位构建其他 Python 工具库的基础组件。
参考
原文:
https://www.ecmwf.int/en/newsletter/179/computing/introducing-earthkit
相关博文: