NWPC消息平台:模式运行时长预测消息
本文属于介绍 NWPC 消息平台 系列文章。
NWPC 消息平台中使用 模式运行时长预测消息 (Model Run Time Predict Message) 记录对模式积分任务运行时长的预测结果。
模式运行时长预测
NWPC 已在业务环境中实时预测模式积分任务总体耗时。具体算法请参看以下文章:
恒定步长(全球模式):
动态步长(区域模式):
实际的预测系统如下图所示:
对于每个时次,预测系统通过检测模式输出文件 (二进制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消息平台 系列文章: