NWPC消息平台:模式运行时长预测消息

目录

本文属于介绍 NWPC 消息平台 系列文章。

NWPC 消息平台中使用 模式运行时长预测消息 (Model Run Time Predict Message) 记录对模式积分任务运行时长的预测结果。

模式运行时长预测

NWPC 已在业务环境中实时预测模式积分任务总体耗时。具体算法请参看以下文章:

恒定步长(全球模式)

NWPC笔记:预测模式积分时长 - 线性回归

动态步长(区域模式)

NWPC笔记:预测动态步长模式积分时长 - 线性回归

实际的预测系统如下图所示:

GRAPES GFS 模式积分时长预测系统

对于每个时次,预测系统通过检测模式输出文件 (二进制postvar文件),实时获得模式积分进度。 当积分进行到预设时效,即某个时效文件生成时,预测系统会启动预测任务,根据当前模式积分的日志输出预测总体运行时间。 上图所示的 GRAPES GFS 预测系统中每隔 24 小时进行一次预测。

因为检测文件是否输出有滞后性,同时在 PI 上启动 Python 程序有一定的延时,预测程序实际运行时模式积分会超过预定的时效。 为了尽可能利用数据,预测程序会使用最新的模式积分时长数据。

模式运行时长预测消息用于记录对积分任务总体耗时的预测。

消息结构

模式运行时长预测消息 (ModelRunTimePredictMessage) 符合 NWPC 消息平台的 事件消息 (EventMessage) 规范,消息结构如下图所示:

数据段由以下几个部分构成:

  • system:系统名称
  • start_time:起报时次,格式 YYYY-MM-DDThh:mm:ss
  • request:请求参数
  • current:积分当前情况
  • predict:预测结果
  • model:模型参数

request

request 字段记录进行预测时的请求参数,对应预测系统中预定义的时效,包括:

  • forecast_time:预报时效,表示为时间段,符合 ISO 8601 格式
  • valid_time:预报时刻,格式 YYYY-MM-DDThh:mm:ss

current

current 字段记录进行预测时,模式积分的当前运行情况,包括:

  • forecast_time:预报时效,同 request
  • valid_time:预报时刻,同 request
  • ctime:积分累积时长,单位分钟

predict

predict 字段记录预测结果,目前仅对整个积分过程进行预测,即 total 字段。 包括:

  • forecast_time:预报时效,同 request
  • ctime:积分累积时长,单位分钟

model

model 字段记录拟合模型的参数,不同类型的模型使用不同的参数,主要用于后续进一步分析。 目前仅使用线性模型,包括如下字段:

  • type:模型类型,目前仅使用 linear
  • coef:系数
  • intercept:截距

注意:不同模式拟合模型时所用的时长数据单位可能不一致,所以不同模式的系数没有可比性。

示例

GRAPES GFS 模式 2020 年 10 月 22 日 00 时次积分到 036 时效进行预测,预计整个积分过程 (240小时预报) 耗时 49 分钟。

{
  "app": "check_grapes_gfs",
  "type": "predict.forecast_output",
  "time": "2020-10-22T04:42:58.333005Z",
  "data": {
    "current": {
      "ctime": 15.518446666666673,
      "forecast_time": "P3DT2H7M30S",
      "valid_time": "2020-10-25T02:07:30"
    },
    "model": {
      "coef": 12.238943617755426,
      "intercept": 31.877154615788015,
      "type": "linear"
    },
    "predict": {
      "total": {
        "ctime": 49.48706038128484,
        "forecast_time": "P10DT0H0M0S"
      }
    },
    "request": {
      "forecast_time": "P3DT0H0M0S",
      "valid_time": "2020-10-25T00:00:00"
    },
    "start_time": "2020-10-22T00:00:00",
    "system": "grapes_gfs_gmf"
  }
}

GRAPES MESO 3KM 模式 2020 年 10 月 22 日 06 时次积分到 018 时效进行预测,预计整个积分过程 (36小时预报) 耗时 64 分钟。

{
  "app": "check_grapes_meso_3km",
  "type": "predict.forecast_output",
  "time": "2020-10-22T09:30:17.824593Z",
  "data": {
    "current": {
      "ctime": 33.34033666666662,
      "forecast_time": "P0DT18H23M1S",
      "valid_time": "2020-10-23T00:23:01"
    },
    "model": {
      "coef": 103.46061416832282,
      "intercept": 119.57898432559784,
      "type": "linear"
    },
    "predict": {
      "total": {
        "ctime": 64.06935157308699,
        "forecast_time": "P1DT12H0M0S"
      }
    },
    "request": {
      "forecast_time": "P0DT18H0M0S",
      "valid_time": "2020-10-23T00:00:00"
    },
    "start_time": "2020-10-22T06:00:00",
    "system": "grapes_meso_3km"
  }
}

实现

下面介绍 nwpc-oper/nwpc-log-tool 项目中对模式运行时长预测消息的简单实现。

generate_message_data() 函数用于从预测模型中生成 NWPC 消息平台事件消息 (EventMessage) 的数据段。

def generate_message_data(
        start_time: typing.Union[datetime.datetime, pd.Timestamp],
        forecast_hour: float,
        forecast_length: int,
        current_record: pd.DataFrame,
        model: linear_model.LinearRegression,
) -> typing.Dict:
    coef = model.coef_[0]
    intercept = model.intercept_

    predict_minutes = model.predict(
        np.reshape(forecast_length, (-1, 1))
    )[0] / 60
    print(predict_minutes)

    start_time = pd.to_datetime(start_time, format="%Y%m%d%H")
    forecast_time = pd.Timedelta(f"{forecast_hour}h")
    valid_time = start_time + forecast_time

    predict_time = pd.Timedelta(f"{forecast_length}h")

    data = {
        "start_time": start_time.isoformat(),
        "request": {
            "forecast_time": forecast_time.isoformat(),
            "valid_time": valid_time.isoformat(),
        },
        "current": {
            "forecast_time": current_record["forecast_time"].isoformat(),
            "valid_time": current_record["valid_time"].isoformat(),
            "ctime": float(current_record["ctime"] / 60),
        },
        "model": {
            "type": "linear",
            "coef": coef,
            "intercept": intercept,
        },
        "predict": {
            "total": {
                "forecast_time": predict_time.isoformat(),
                "ctime": predict_minutes
            }
        }
    }
    return data

参数说明:

  • start_time:起报时次
  • forecast_hour:请求的预报时效
  • forecat_length:需要预测的预报时效
  • current_record:当前积分运行情况,包括积分步数,时效和累积时间
  • model:使用 scikit-learn 拟合的线性模型

参考

nwpc-oper/nwpc-message-client 项目

https://github.com/nwpc-oper/nwpc-message-client

nwpc-oper/nwpc-log-tool 项目

https://github.com/nwpc-oper/nwpc-log-tool

NWPC消息平台 系列文章:

NWPC消息平台:产品事件消息

NWPC消息平台:ecFlow 命令消息

NWPC消息平台:验证 ecFlow 命令消息