2021年第一季度工作总结

目录

又是一年清明时。

去年清明正值全国哀悼日,悼念抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞。 我也写了一篇短文《愿逝者安息》,里面提到要时刻审视自己,注意国家大事对自己的影响。 一年之后再看,我可能需要再加上一句:要注意单位改革对自己的影响。

上个季度总结中计划今年第一季度有四项工作:

  • 撰写技术报告
  • 研究 ESMValTool 如何与分布式调度工具集成
  • 完成 NWPC 消息平台所有考核指标
  • 研究基于 Dask 的分布式数据处理技术

实际上我只完成了前两项,后两项工作则完全没有开展。

技术报告

1 月完成一篇技术报告《基于消息通讯的数值预报业务系统运行监视和分析技术研发》,已提交单位审核,目前在等待评审结果。

第一季度有两篇文章与该技术报告相关:

ElasticSearch使用Scroll检索大规模数据

NWPC消息平台:运行状态分析算法

另外,还对模式运行时长进行了一项比较粗糙的分析

数值预报模式不同时次运行时长是否相同?

这篇发布到公众号的文章被转到单位群中,导致我后续不敢再胡乱在公众号上发布新的文章,也间接影响了自己持续学习的动力。 不过现在我逐渐觉得自己不应该瞻前顾后,对于技术类文章还是想发就发,不要考虑质量,毕竟这不是在发表论文。

诊断工具

从 1 月中旬到 3 月底将近两个半月的时间,我都在研究 ESMValTool 工具,基本摸清该工具数据处理部分的流程,并将该工具与之前开发的分布式调度工具 ploto 整合,重新实现 ploto-esmvaltool 项目。

分析 ESMValTool 工具的最大难点在于数据的缺失。为了跑通各个诊断方法,必须要下载需要的全部数据,包括 CMIP6 数据和各类观测资料数据,花费大量时间。 目前仅测试跑通该工具三分之一的方法,整合 ESMValCore 提供的大部分数据处理方法。 不过,我还没有从在上一季度总结中提到的工作流角度思考集成问题,现有方案拆解的步骤只能串行执行,远不如 ESMValTool 工具提供的多进程执行效率。 想要做一些高附加值的工作,就需要从实现轻量级工作流方面入手,将各个步骤并发执行。

我也一直在质疑花费大量时间研究 ESMValTool 工具对我的工作会有什么帮助,毕竟单位目前不跑气候模式,我也不做诊断方面的开发工作。 不找到与当前工作的结合点,之前花费的时间精力很可能就打了水漂。 对于 ESMValTool 工具,我认为可以借鉴它优秀的 API 接口设计理念,可以参考它的方法函数,实现自己的数据处理函数工具集。 在这方面我才刚刚起步。

数据工具

作为参考 ESMValTool 数据 API 设计的第一步,我研究如何使用不同的工具库对 GRIB2 数据的二维格点场进行插值。 详情参见如下文章:

GRIB笔记:使用scipy实现二维要素场插值

GRIB笔记:使用xarray实现二维要素场插值

GRIB笔记:使用pyinterp实现二维要素场插值

并将部分方法整合到 nwpc-data 库中,形成 interpolate_grid() 函数。 一个简单的调用示例如下所示,使用 scipy 的 RectBivariateSpline 将 GRAPES GFS 数据从 0.25 度插值到 0.1 度。

from nwpc_data.data_finder import find_local_file
from nwpc_data.grib.eccodes import load_field_from_file
from nwpc_data.operator.regrid import interpolate_grid

data_path = find_local_file(
    "grapes_gfs_gmf/grib2/orig",
    start_time="2021031800",
    forecast_time="24h"

field = load_field_from_file(
    data_path,
    parameter="t",
    level_type="pl",
    level=850,
)

target_grid = xr.DataArray(
    coords=[
        ("latitude", np.arange(89.95, -90, -0.1)),
        ("longitude", np.arange(0, 360, 0.1))
    ]
)

target_field = interpolate_grid(
    field,
    target_grid,
    scheme="rect_bivariate_spline"
)

另外,nwpc-data 库还增加了对 NetCDF 文件和 CSV 文件的简单支持,并添加更多的数据源配置文件。

在实现机器学习方法上,第一季度仍然没有进展,想想我已经喊了半年要实现某种方法,却始终在原地踏步,我该好好思考下了。 作为实现机器学习算法的前置步骤,第一季度我将目光转向观测资料检索,重新捡起 2019 年编写的 CMADaaS MUSIC 接口 Python API 项目 perillaroc/nuwe-cmadaas-python。 2019 年版的策略是让 MUSIC 库支持 Python 3,尽可能保持 API 接口和使用方式不变。 而在第一季度我开始参考 nmc_met_iometeva 库中 CMADaaS 相关函数的设计,提供封装后的高层 API 接口。 目标是通过尽可能少的函数提供尽可能多的检索功能,将不同检索接口通过支持多种类型的参数和不同参数的组合封装到一个函数接口中,同时将返回结果封装为 Python 常见的数据结构。

例如下面的代码调用 getSurfEleByTimeRangeAndStaIDRange 接口检索中国逐小时地面观测数据 (SURF_CHN_MUL_HOR),返回 pandas.DataFrame 对象:

>>> import pandas as pd
>>> from nuwe_cimiss.station import retrieve_obs_station
>>> table = retrieve_obs_station(
...     "SURF_CHN_MUL_HOR",
...     time=pd.Interval(
...         pd.to_datetime("2021-03-01 00:00:00"),
...         pd.to_datetime("2021-03-01 06:00:00"),
...         closed="left",
...     ),
...     station=("53582", "54511"),
...     config_file="../../nwpc-oper.yaml"
... )
>>> table
     Station_Id_d      Lat       Lon    Alti  ... PRE_1h PRE_6h PRE_24h     PRS
0           53582  39.7103  113.6644  1079.2  ...      0      0     8.6   901.5
1           53582  39.7103  113.6644  1079.2  ...      0      0     8.6   900.4
2           53582  39.7103  113.6644  1079.2  ...      0      0     8.6   902.1
3           53582  39.7103  113.6644  1079.2  ...      0      0     8.6   901.7
4           53582  39.7103  113.6644  1079.2  ...      0    1.2     8.6   901.7
           ...      ...       ...     ...  ...    ...    ...     ...     ...
2677        54511     39.8  116.4667    31.3  ...      0    0.2    17.2  1026.8
2678        54511     39.8  116.4667    31.3  ...      0    0.1    15.7  1025.2
2679        54511     39.8  116.4667    31.3  ...      0    0.1    16.4  1026.2
2680        54511     39.8  116.4667    31.3  ...      0    0.6    17.2  1027.5
2681        54511     39.8  116.4667    31.3  ...      0    2.1    17.6    1028
[2682 rows x 17 columns]

其他工作

更新 nmc-message-client 库,符合最新消息规范。

还有诸多事务性工作,比如工作计划,HPC 资源申请,交流 GRAPES 模式业务流程和维护工具等等。

思考

第一季度也在关注领域内的新闻 (主要是 ECMWF 通讯),详情查看如下文章:

视界:新NCAR-WYOMING超级计算机将加速科学探索

视界:ecFlow 5为成员国带来好处

ECMWF 在 2 月份召开 Virtual workshop: Weather and climate in the cloud,我也关注了其中的一些报告:

Cloud-WS 2021:数据工具库CliMetLab

Cloud-Ws 2021:事件通知工具Aviso

第一季度也阅读了几篇论文,部分论文的阅读笔记请查看如下文章:

论文阅读:ECMWF机器学习路线图2021-2030

论文阅读:数字时代开放的天气和气候科学

论文阅读:气候模式代码可访问性调查

最近一段时间对于业内动态的关注明显不够,在迅速发展的时期,及时了解最新信息就变得尤为重要。 后续我应该加快对工作相关论文和类似 Cloud-WS 2021 等研讨会的关注,争取从中获得工作灵感。

总结

第一季度花费大量时间研究 ESMValTool 的代码,虽然搞懂了数据处理部分的流程并成功进行二次封装,但依然缺乏更深入的开发工作。 需要将研究 ESMValTool 代码得到的启发应用到实际项目中,将这一段时间的工作体现在代码工具库中,让工作能延续下去。 绝对不能频繁切换研究方向,导致工作之间没有延续性,也更无法形成有价值的成果。

去年开发的 nwpc-data 工具只支持 GRIB 2 文件的提取功能,今年第一季度开始尝试增加对其它格式文件的支持,比如 NetCDF 和 CSV,目前功能非常简单,需要进一步完善。 只有提取功能显然不够,还需要支持大量的数据源和数据操作。 第一季度增加一两项 HPC 本地数据的配置文件,后续应该更广泛地扩展数据源。 目前已参考 nwpc-data 项目的接口设计方式,完善 perillaroc/nuwe-cmadaas-python 项目,支持 CMADaaS 数据检索。 数据处理方面只实现简单的格点到格点插值函数,下一步应该继续开发其它数据操作函数。

总体来说,第一季度专注于计划中的两项重要任务,并取得一定的成效。 但在其他方面的工作进展却不够明显,没有形成完整成体系的规划路线,而且仍然存在对于未来方向不确定的顾虑。

新的一年是否有良好的开端?我很难给出完全肯定的回答。

下一步计划

第二季度的核心任务有两点:

  • 完成 NWPC 消息平台项目,完成所有验收相关工作。
  • 完成汛期前的业务系统建设升级任务,包括 MESO 和 TYM 的整合。

技术开发任务包括:

  • 继续开发数据工具 nwpc-data。 完善对多种数据格式的支持 (NetCDF, CSV, …, GrADS?)。 参考 ESMValTool 的 API 增加数据处理函数。 添加新的数据源,比如 CMADaaS。 考虑使用 nwpc-data 的数据处理功能实现一个简单的机器学习算法。
  • 如果有时间则进一步开发诊断平台的 ESMValTool 相关功能,尝试实现一个简单的轻量级工作流组件。

其它业务相关工作包括:

  • 完善去年实现的 nwpc-graphics 绘图工具,尝试与迁移加工流水线项目相结合,作为统一的底层绘图接口
  • 升级业务系统 ecFlow 版本到 V5.X (汛期前是否要完成?)

另外,需要为工具类项目编写更详细的文档。

参考

2020年第四季度工作总结