1什么是AHPA
丰富的数据指标:支持包括CPU、GPU、Memory、QPS、RT以及外部指标等。在以往的工作中,一旦业务流量过大不可避免地我们会面向业务流程选择一种较为合适的服务器,作为我们扩容服务的基础。以2021年美团的整体大数据框架服务器降本增效,模块解耦举例子。2021年美团外卖大数据部门通过对cpu计算型业务、gpu计算型业务(推荐系统、智能定价系统)、qps业务场景(限时秒杀系列)等业务场景、疫情禁止堂食带来的业务暴增场景。
稳定性保障:AHPA的弹性逻辑基于主动预测、被动兜底的策略,并结合降级保护,保证了资源的稳定性。通过时间序列算法对未来的24小时业务进行流量预测。
主动预测:根据历史指标预测出未来一段时间的趋势结果,适用于周期性的应用。
被动预测:实时预测。针对突发流量场景,通过被动预测实时准备资源。
降级保护:支持配置多个时间区间范围最大、最小值。
多种伸缩方式:AHPA支持伸缩方式包括Knative、HPA以及Deployment:
Knative:解决Serverless应用场景下,基于并发数、QPS或RT弹性冷启动的问题。
HPA:简化HPA弹性策略配置,降低用户使用弹性的门槛,解决使用HPA面临的弹性滞后问题。
Deployment:直接使用Deployment,自动扩缩容。
核心优势
更快:毫秒级预测,秒级弹性。
更准:复杂周期识别率95%以上,主动预测和被动预测相结合。
更稳: 支持分钟级边界保护配置。
适用场景
有明显周期性场景。例如直播、在线教育、游戏服务场景等。
固定实例数+弹性兜底。例如常态业务下应对突发流量等。
推荐实例数配置场景。提供标准K8s API获取预测结果,常用于与自身业务平台进行集成。
在gpu部署深度学习场景通过对模型的整体拆分构建不同网络层的弹性库扩容可以进一步降低模型推理时所需要的模型推理服务器成本。和以往的整体模型推理不同,对深度学习模型层的拆分可以在低参数网络层部分分配更少的gpu节点,高参数量网络层部分分配更多的gpu计算节点。
2什么是PADDLE TS
PaddleTS 是一个易用的深度时序建模的Python库,它基于飞桨深度学习框架PaddlePaddle,专注业界领先的深度模型,旨在为领域专家和行业用户提供可扩展的时序建模能力和便捷易用的用户体验。PaddleTS 的主要特性包括:
· 设计统一数据结构,实现对多样化时序数据的表达,支持单目标与多目标变量,支持多类型协变量
· 封装基础模型功能,如数据加载、回调设置、损失函数、训练过程控制等公共方法,帮助开发者在新模型开发过程中专注网络结构本身
· 内置业界领先的深度学习模型,包括NBEATS、NHiTS、LSTNet、TCN、Transformer, DeepAR(概率预测)、Informer等时序预测模型,以及TS2Vec等时序表征模型
· 内置多样化的数据转换算子,支持数据处理与转换,包括缺失值填充、异常值处理、归一化、时间相关的协变量提取等
· 内置经典的数据分析算子,帮助开发者便捷实现数据探索,包括数据统计量信息及数据摘要等功能
· 自动模型调优AutoTS,支持多类型HPO(Hyper Parameter Optimization)算法,在多个模型和数据集上展现显著调优效果
· 第三方机器学习模型及数据转换模块自动集成,支持包括sklearn、pyod等第三方库的时序应用
· 支持在GPU设备上运行基于PaddlePaddle的时序模型
3智能弹性扩容带来的降本增效
AHPA中弹性扩容带来的降本增效。降低运维人工,提升机器集群使用效率。
4 PADDLE TS中的算法介绍
4.1 LSTNET
LSTNet is a time series forecasting model introduced in 2018. LSTNet uses the Convolution Neural Network (CNN) and the
Recurrent Neural Network (RNN) to extract short-term local dependency patterns among variables and to discover long-term
patterns for time series trends.
作者:Lai G, et al. 论文:"Modeling Long- and Short-Term Temporal Patterns with Deep Neural Networks",
论文链接:<https://arxiv.org/abs/1703.07015>
LSTNet 是2018年引入的时间序列预测模型。LSTNet使用卷积神经网络(CNN)和递归神经网络(RNN)提取短期局部变量之间的依赖模式,并发现时间序列趋势的长期模式。
Lai G等人,“用深度神经网络建模长期和短期时间模式”,
论文直达
4.2 Informer
Informer is a state-of-the-art deep learning model introduced in 2021.
It is an encoder-decoder architecture whose core feature is the prob sparse attention mechanism,
which achieves the O(LlogL) time complexity and O(LlogL) memory usage on dependency alignments.
Zhou H, et al. "Informer: Beyond efficient transformer for long sequence time-series forecasting", arxiv.org/abs/2012.07…
Informer 是2021推出的最先进的深度学习模型。 它是一种编码器-解码器架构,其核心特征是“概率稀疏关注”机制, 这实现了依赖性对齐的O(LlogL)时间复杂度和O(LlogL)内存使用。
Zhou H等人,“Informer:超越长序列时间序列预测的高效变压器”
论文直达
4.3 TCN
Temporal Convolution Net .
序列建模通用卷积和递归网络的经验评估
Bai S, et al. "An empirical evaluation of generic convolutional and recurrent networks for sequence modeling",
论文直达
4.4 Transformer
Transformer is a state-of-the-art deep learning model introduced in 2017.
It is an encoder-decoder architecture whose core feature is the multi-head attention mechanism,
which is able to draw intra-dependencies within the input vector and within the output vector (self-attention)
as well as inter-dependencies between input and output vectors (encoder-decoder attention).
Transformer是2017年推出的最先进的深度学习模型。 它是一种编码器-解码器体系结构,其核心特征是“多头关注”机制, 其能够在输入向量内和输出向量内绘制帧内相关性(“自我关注”) 以及输入和输出向量之间的相互依赖性(“编码器-解码器注意”)。
作者:Vaswani A, et al. 论文:"Attention Is All You Need", 论文链接arxiv.org/abs/1706.03…
5 基于paddle ts的lstnet网络的autots股票价格实践
5.1 环境配置
需要设备cpu或者是gpu,cpu环境的安装相对简单 gpu需要安装显卡驱动 版本与paddle gpu 驱动版本一致 例如 利用conda 安装paddlepaddle-gpu cuda 10.2 ```
conda install paddlepaddle-gpu==2.3.2 cudatoolkit=10.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/
conda install paddlepaddle-gpu==2.3.2 cudatoolkit=11.2 -c mirrors.tuna.tsinghua.edu.cn/anaconda/cl… -c conda-forge
cuda 11.6
conda install paddlepaddle-gpu==2.3.2 cudatoolkit=11.6 -c mirrors.tuna.tsinghua.edu.cn/anaconda/cl… -c conda-forge
cpu
conda install paddlepaddle==2.3.2 --channel mirrors.tuna.tsinghua.edu.cn/anaconda/cl…
paddle ts中基于分布式框架ray实现了自动调参数和单机多进程、多机分布式并行计算 本阶段paddle ts尚未进行稳定发版 所有代码基于paddle ts 压缩包中代码进行调参实现。 一个基于股票数据的LSTNet时序预测实现 ps:目前最先进的应该是infomer的实现,但是infomer尚未实现autots的适配。lstnet是目前比较先进的。 文件名 `` ```python
import argparse
import json
import os.path
import pandas as pd
from paddlets.automl import AutoTS
from paddlets.models.forecasting import LSTNetRegressor
#
parser = argparse.ArgumentParser(description="chinese_stock_keras_tuner_owner")
parser.add_argument('-base_one', '--base_one', default='')
args = parser.parse_args()
# #
base_one = args.base_one
# # 通过pandas读取数据并显示前三条,与上图一一对应
csv_path = os.path.join("tu_share_data_day", base_one)
# csv_path = "tu_share_data_day/600690.SH.csv"
# base_one = "600690.SH.csv"
result_center = "result_center"
pic_center = "pic_center"
model_center = "model_center"
best_param_center = "best_param_center"
if not os.path.exists(result_center):
os.mkdir(result_center)
if not os.path.exists(pic_center):
os.mkdir(pic_center)
if not os.path.exists(model_center):
os.mkdir(model_center)
if not os.path.exists(best_param_center):
os.mkdir(best_param_center)
# print(pd.read_csv(csv_path).columns)
dam_data = pd.read_csv(csv_path).values.tolist()
dam_data.reverse()
# print(dam_data)
for i in range(len(dam_data) - 1):
dam_data[i].append(dam_data[i + 1][3])
dam_data[i].append(dam_data[i + 1][4])
dam_data[i].append(dam_data[i + 1][5])
dam_data[i].append(int(i + 1))
# print(dam_data)
dam_data = pd.DataFrame(dam_data[:-1],
columns=['ts_code', 'trade_date', 'open', 'high', 'low', 'close',
'pre_close', 'change', 'pct_chg', 'vol', 'amount', 'next_high',
'next_low',
'next_close', 'index_new'])
from paddlets.datasets import TSDataset
# 构建数据集
dataset = TSDataset.load_from_dataframe(
dam_data, # pd.DataFrame
time_col="index_new", # 索引
target_cols=['next_high', 'next_low',
'next_close'], # 需要预测的结果
observed_cov_cols=['open', 'high', 'low', 'close',
'pre_close', 'change', 'pct_chg', 'vol', 'amount'] # 观测协变量
)
from paddlets.transform import StandardScaler
# 对数据集进行归一化操作
scaler = StandardScaler()
scaler.fit(dataset)
dataset = scaler.transform(dataset)
# 定义autots模型、输入特征维度、输出特征维度 以下案例输入15天股票数据 预估未来5天股票走势
autots_model = AutoTS(LSTNetRegressor, in_chunk_len=15, out_chunk_len=5)
# n_trials automl实验次数
ready_model = autots_model.fit(dataset, n_trials=1)
# 保存模型到指定位置
ready_model.save(os.path.join(model_center, base_one))
# 获取模型最优网络参数
best_param = autots_model.best_param
json.dump(best_param, open(os.path.join(best_param_center, base_one), "w"))
# 同构auto_model 推理当前数据集 获取到对未来的预估结果
predicted = autots_model.predict(dataset)
# 反归一化
predicted = scaler.inverse_transform(predicted)
open(os.path.join(result_center, base_one + ".json"), "w").write(predicted.to_json())
print(predicted)
# 对预估结果进行可视化
ax = predicted.plot()
fig = ax.get_figure()
fig.savefig(os.path.join(pic_center, base_one + ".png"))
调用以下代码实现数据训练工作start-1000.py
from tqdm import tqdm
def base_lstm(base_one):
return os.system("python keras_tuner_chinese.py --base_one "+base_one)
if __name__ == '__main__':
import os
base_path = "./tu_share_data_day"
base_list = os.listdir(base_path)
result = [base_lstm(j) for j in tqdm(base_list[:1000])]