使用Amazon SageMaker部署Chronos时间序列预测模型
chronos-forecasting 项目地址: https://gitcode.com/gh_mirrors/ch/chronos-forecasting
概述
时间序列预测是许多业务场景中的核心需求,从销售预测到资源规划都离不开准确的预测模型。Chronos是亚马逊科学团队开发的一系列基于Transformer架构的时间序列预测模型,其中Chronos-Bolt是其轻量级版本,专为高效预测而设计。
本文将详细介绍如何将Chronos-Bolt模型部署到Amazon SageMaker平台,使其成为可扩展的生产级预测服务。
为什么选择SageMaker部署?
在本地运行预测模型适合开发和测试阶段,但在生产环境中会面临以下挑战:
- 扩展性问题:本地资源有限,难以应对高并发请求
- 可靠性问题:单点故障风险高
- 维护成本:需要自行管理基础设施
通过SageMaker部署模型可以解决这些问题:
- 自动扩展:根据负载动态调整资源
- 高可用性:内置故障转移机制
- 托管服务:AWS负责底层基础设施管理
- 无缝集成:可与AWS其他服务轻松对接
部署准备
环境配置
首先需要确保已安装最新版的SageMaker Python SDK:
!pip install -U -q sagemaker
模型选择
Chronos提供多个预训练模型变体,主要分为两类:
-
Chronos-Bolt系列(推荐):
autogluon-forecasting-chronos-bolt-base
:基础版autogluon-forecasting-chronos-bolt-small
:轻量版
-
原始Chronos系列:
autogluon-forecasting-chronos-t5-small
autogluon-forecasting-chronos-t5-base
autogluon-forecasting-chronos-t5-large
注意:原始Chronos模型需要GPU支持,运行速度较慢且不支持协变量。对于大多数实际应用,推荐使用Chronos-Bolt系列。
模型部署步骤
1. 创建JumpStart模型
使用JumpStartModel
类初始化模型配置:
from sagemaker.jumpstart.model import JumpStartModel
model_id = "autogluon-forecasting-chronos-bolt-base"
model = JumpStartModel(
model_id=model_id,
instance_type="ml.c5.2xlarge", # CPU实例
# role="your-sagemaker-execution-role" # 可选:指定IAM角色
)
关键参数说明:
model_id
:指定要使用的模型IDinstance_type
:定义用于服务的AWS实例类型- CPU选项:
ml.c5.2xlarge
、ml.m5.xlarge
等 - GPU选项:
ml.g5.2xlarge
等
- CPU选项:
2. 部署模型端点
调用deploy()
方法创建预测端点:
predictor = model.deploy()
部署过程通常需要几分钟,SageMaker会完成以下操作:
- 配置计算实例
- 加载模型
- 设置端点服务
重要提示:端点会持续产生费用,使用完毕后应手动删除以避免不必要的开支。
端点使用指南
基本预测请求
向端点发送包含历史时间序列数据的JSON格式请求:
payload = {
"inputs": [
{"target": [0.0, 4.0, 5.0, 1.5, -3.0, -5.0, -3.0, 1.5, 5.0, 4.0]},
],
"parameters": {
"prediction_length": 10
}
}
response = predictor.predict(payload)
响应包含预测值及分位数信息:
{
"predictions": [{
"mean": [1.41, 1.5, 1.49],
"0.1": [0.12, -0.08, -0.25],
"0.5": [1.41, 1.5, 1.49],
"0.9": [3.29, 3.82, 4.09]
}]
}
多时间序列预测
可以同时预测多个时间序列,每个序列可包含唯一标识和时间信息:
payload = {
"inputs": [
{
"target": [1.0, 2.0, 3.0, 2.0, 0.5],
"item_id": "product_A",
"start": "2024-01-01T01:00:00"
},
{
"target": [5.4, 3.0, 3.0, 2.0, 1.5],
"item_id": "product_B",
"start": "2024-02-02T03:00:00"
}
],
"parameters": {
"prediction_length": 5,
"freq": "1h"
}
}
使用协变量预测
Chronos-Bolt支持使用协变量(外生特征)提升预测精度:
payload = {
"inputs": [{
"target": [1.0, 2.0, 3.0, 2.0, 0.5],
"past_covariates": {
"temperature": [20, 22, 21, 23, 19],
"promotion": ["No", "Yes", "Yes", "No", "No"]
},
"future_covariates": {
"temperature": [18, 17, 16],
"promotion": ["No", "Yes", "No"]
}
}],
"parameters": {
"prediction_length": 3,
"covariate_model": "GBM" # 可选的协变量模型
}
}
数据格式转换
实际业务数据通常以长格式数据框存储,我们可以使用以下工具函数进行格式转换:
import pandas as pd
def df_to_payload(df, target_col, item_id_col=None, time_col=None):
"""将长格式数据框转换为端点请求格式"""
payload = {"inputs": []}
if item_id_col:
groups = df.groupby(item_id_col)
else:
groups = [(None, df)]
for item_id, group in groups:
series = {"target": group[target_col].tolist()}
if item_id:
series["item_id"] = item_id
if time_col:
series["start"] = group[time_col].min().isoformat()
payload["inputs"].append(series)
return payload
def response_to_df(response):
"""将端点响应转换为数据框"""
records = []
for pred in response["predictions"]:
item_id = pred.get("item_id", "default")
for quantile, values in pred.items():
if quantile not in ["item_id", "start"]:
for i, value in enumerate(values):
records.append({
"item_id": item_id,
"timestamp": pred.get("start"),
"step": i+1,
"quantile": quantile,
"value": value
})
return pd.DataFrame(records)
最佳实践与注意事项
-
数据要求:
- 每个时间序列至少包含30个观测值
- 少于5个观测值将导致错误
- 预测长度建议不超过64步
-
性能优化:
- 使用
batch_size
参数控制并行处理数量 - 对于大批量预测,考虑使用异步端点
- 使用
-
成本控制:
- 测试阶段使用CPU实例
- 生产环境根据负载选择合适的实例类型
- 不使用时应删除端点
-
模型选择:
- 简单场景使用Chronos-Bolt-small
- 复杂模式使用Chronos-Bolt-base
- 需要极高精度时考虑原始Chronos-large(需GPU)
总结
通过Amazon SageMaker部署Chronos时间序列预测模型,我们可以快速构建高可用、可扩展的预测服务。本文详细介绍了从模型选择、部署配置到实际使用的完整流程,并提供了处理实际业务数据的最佳实践。
Chronos-Bolt模型特别适合需要快速、准确预测的生产环境,其轻量级设计和协变量支持使其成为业务预测场景的理想选择。
chronos-forecasting 项目地址: https://gitcode.com/gh_mirrors/ch/chronos-forecasting
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考