从 Ray 到 Chronos:在 Ray 之上使用 BigDL 构建端到端的 AI 用例
在本博客中,我们将介绍 BigDL 的一些核心组件,并展示 BigDL 如何利用 Ray 及其原生库来构建底层基础设施(如 RayOnSpark、AutoML 等)。
引言
Ray 是一个具有简单通用 API 的框架,用于构建创新的 AI 应用。BigDL 是一个开源框架,用于在分布式大数据上构建可扩展的端到端 AI。它利用 Ray 及其原生库来支持 AutoML 和自动化时间序列分析等高级 AI 用例。
在本博客中,我们将介绍 BigDL 的一些核心组件,并展示 BigDL 如何利用 Ray 及其原生库来构建底层基础设施(如 RayOnSpark、AutoML 等),以及这些如何帮助用户使用 Chronos 项目构建自动化时间序列分析等 AI 应用。
RayOnSpark:在 Apache Spark 之上无缝运行 Ray 应用
Ray 是一个开源分布式框架,用于轻松运行新兴的 AI 应用,例如 深度强化学习 和自动化机器学习。BigDL 通过 RayOnSpark 将 Ray 无缝集成到大数据预处理管道中,并已用于构建几个针对特定领域的先进端到端 AI 应用,如 AutoML 和 Chronos。RayOnSpark 在大数据集群(例如 Apache Hadoop* 或 Kubernetes* 集群)的 Apache Spark 之上运行 Ray 程序,因此,内存中的 DataFrame 等对象可以直接流式传输到 Ray 应用中,以支持高级 AI 应用。借助 RayOnSpark,用户可以直接在生产环境中的现有大数据集群上尝试各种新兴 AI 应用。此外,它还允许 Ray 应用无缝集成到大数据处理管道中,并直接在内存 DataFrame 上运行。
图 1 展示了 RayOnSpark 的架构。在 Spark 实现中,Spark 程序运行在驱动程序节点上,并创建一个 SparkSession,其中包含一个负责在集群上启动多个 Spark 执行器以运行 Spark 作业的 SparkContext 对象。在 RayOnSpark 中,Spark 驱动程序另外会创建一个 RayContext 对象,该对象将在同一集群的每个 Spark 执行器旁边自动启动 Ray 进程。RayContext 还会在每个 Spark 执行器中创建一个 RayManager 来管理 Ray 进程(例如,在程序退出时自动关闭进程)。下面的代码块演示了用户在初始化 RayOnSpark 后,如何在标准 Spark 应用程序中直接编写 Ray 代码。
import ray
from bigdl.orca import init_orca_context
from bigdl.orca.ray import RayContext
# Initialize SparkContext on the underlying cluster (e.g. the Hadoop/Yarn cluster)
sc = init_orca_context(cluster_mode="yarn", cores=...,memory=...,num_nodes=...)
# Initialize RayContext and launch Ray under the same cluster.
ray_ctx = RayContext(sc, object_store_memory=...,...)
ray_ctx.init()
@ray.remote
class Counter(object)
def __init__(self):
self.n = 0
def increment(self):
self.n += 1
return self.n
# The Ray actors are created across the big data cluster
counters = [Counter.remote() for i in range(5)]
ray.get([c.increment.remote() for c in counters])
ray_ctx.stop()
sc.stop()
AutoML (orca.automl):使用 Ray Tune 轻松调整 AI 应用
超参数优化 (HPO) 对于数据科学家在准确性、性能等方面实现机器学习或深度学习模型的性能目标至关重要。然而,手动 HPO 调优可能是一个耗时且结果可能不够优化的过程。另一方面,在分布式环境中进行 HPO 可能难以实现。BigDL 引入了一个基于 Ray Tune 构建的 AutoML 功能(通过 orca.automl),以减轻数据科学家的负担。
什么是 orca.automl?
在许多情况下,数据科学家更喜欢在笔记本电脑上进行 AI 应用的原型设计、调试和调优,如果相同的代码可以完整地迁移到集群上并直接运行,这将极大地提高端到端生产力。
BigDL 的 Orca 项目帮助用户将代码从笔记本电脑无缝扩展到大数据集群。此外,BigDL 的 orca.automl 利用 RayOnSpark 和 Ray Tune,提供了一个名为 AutoEstimator 的分布式超参数调优 API。由于 Ray Tune 是框架无关的,AutoEstimator 适用于 PyTorch 和 TensorFlow 模型。用户可以在笔记本电脑、本地服务器、K8s 集群、Hadoop/YARN 集群等上以一致的方式调优他们的模型。
通过这些功能,BigDL 中的 orca.automl 可用于自动探索许多 AI 应用的搜索空间(包括模型、超参数等)。例如,我们使用 BigDL 的 orca.automl 实现了一个 AutoXGBoost(带 HPO 的 XGBoost),以自动拟合和优化 XGBoost 模型。与在 Nvidia A100 上的类似解决方案相比,使用 AutoXGBoost 进行训练快约 1.7 倍,并且最终模型更准确。请参阅 博客 以获取更多信息。您还可以参考 orca.automl 用户指南 来了解设计细节,以及 AutoXGBoost 快速入门 或 任意模型的自动调优 来获取实践知识。
Chronos:使用 Ray 上的 AutoTS 构建自动化时间序列分析
我们还开发了一个自动化时间序列分析框架,称为 Chronos 项目。在自动分析过程中,我们会利用 orca.automl 来调优超参数。
我们为什么需要 Chronos?
时间序列 (TS) 分析已广泛应用于许多实际应用中(例如电信的网络质量分析、数据中心运维的日志分析、高价值设备的预测性维护等),并且越来越重要。准确的预测和检测已成为最热门的任务,并且对传统方法来说是巨大的挑战。深度学习方法通常将时间序列预测和检测视为序列建模问题,最近在这些问题上取得了许多成功。
另一方面,构建用于时间序列预测/检测的机器学习应用程序可能是一个劳动密集型且知识密集型的过程。超参数设置、预处理和特征工程都可能成为专用深度学习模型的瓶颈。为了提供一个高效、强大且易于使用的时间序列分析工具包,我们推出了 Chronos 项目,这是一个用于构建大规模时间序列分析应用程序的框架。由于它构建在 Ray Tune、Ray Train 和 RayOnSpark 之上,因此可以用于 AutoML 和分布式训练。
Chronos 架构介绍
Chronos 提供了许多(10+)内置的深度学习和机器学习模型,用于时间序列预测、检测和仿真,以及许多(70+)数据处理和特征工程工具。用户可以自行调用独立的算法和模型(Forecasters、Detectors、Simulators)以获得最高的灵活性,或者使用我们高度集成、可扩展且自动化的时间序列工作流(AutoTS)。推理过程也通过多种方式进行了优化,包括集成了 ONNX runtimec。
下图展示了 Chronos 在 BigDL 和 Ray 之上的架构。本节重点介绍 AutoTS 组件。AutoTS 框架使用 Ray Tune 作为超参数搜索引擎(运行在 RayOnSpark 之上)。对于自动数据处理,搜索引擎会为预测任务选择最佳的 lookback 值。对于自动特征工程,搜索引擎会从由各种特征生成工具(例如 tsfresh)自动生成的特征集中选择最佳特征子集。对于自动建模,搜索引擎会搜索隐藏维度、学习率等超参数。
Chronos AutoTS 工作流的实践示例
下面的代码演示了使用 Chronos 友好且高度集成的 AutoTS 工作流进行时间序列预测管道的训练和推理过程。这个特定的工作流利用了 TSDataset
上简单直接的 API 来执行一些典型的时间序列处理(例如,插补、缩放等)和特征生成。
import pandas as pd
from sklearn.preprocessing import StandardScaler
from bigdl.chronos.data import TSDataset
# data initialization and split
df = pd.read_csv("table.csv")
tsdata_train, tsdata_val, tsdata_test = TSDataset.from_pandas(df,
dt_col="StartTime",
target_col="AvgRate",
with_split=True,
val_ratio=0.1)
# data processing and feature engineering
standard_scaler = StandardScaler()
for tsdata in [tsdata_train, tsdata_val, tsdata_test]:
tsdata.gen_dt_feature()\
.impute(mode="last")\
.scale(standard_scaler, fit=(tsdata is tsdata_train))
然后,用户可以通过指定模型(内置模型名称/第三方模型的模型创建函数)、lookback 和 horizon 来初始化 AutoTSEstimator
。AutoTSEstimator
在 Ray Tune 之上运行搜索过程;每次运行会同时生成多个 trial(每个 trial 具有不同的超参数和特征子集组合),并将 trial 分发到 Ray 集群中。所有 trial 完成后,将根据目标指标检索最佳超参数集、优化模型和数据处理过程,用于构建结果 TSPipeline
。
from bigdl.chronos.autots import AutoTSEstimator
import bigdl.orca.automl.hp as hp
# create a AutoTSEstimator
auto_estimator = AutoTSEstimator(model='tcn',
past_seq_len=hp.randint(50,100),
future_seq_len=1)
# fit on the AutoTSEstimator with HPO, auto feature, past_seq_len selector
ts_pipeline = auto_estimator.fit(data=tsdata_train,
validation_data=tsdata_val)
TSPipeline
可用于预测、评估和增量拟合。
# predict/evaluate with TSPipeline
y_pred = ts_pipeline.predict(tsdata_test)
test_mse = ts_pipeline.evaluate(tsdata_test, metrics = ['mse'])
有关详细信息,Chronos 用户指南 是一个很好的起点。
使用 Chronos AutoTS 进行 5G 网络时间序列分析
Chronos 已被广泛应用于许多领域,例如电信和 AIOps。Capgemini Engineering 在其 5G 媒体访问控制 (MAC) 中利用 Chronos AutoML 工作流和推理优化,在智能 RAN 控制器节点中实现认知能力。在他们的任务中,Chronos 用于预测 UE 的移动性,以协助 MAC 调度程序在两个关键 KPI 上实现高效链路自适应。通过 Chronos AutoTS,Capgemini 工程师将模型更改为我们内置的 TCN 模型并增加了 lookback 值,从而成功地将 AI 准确性提高了 55%。有关详细信息,请参阅 白皮书。
结论
在本文中,我们介绍了 BigDL 如何利用 Ray 及其库来构建可扩展的大数据 AI 应用(使用 RayOnSpark),提高端到端 AI 开发生产力(使用基于 RayTune 的 AutoML),并构建领域特定的 AI 用例,如 Chronos 项目的自动化时间序列分析。BigDL 还在其他方面采用了 Ray,例如 Ray Train 正在 BigDL Orca 项目中使用,以将单节点 Python Notebook 无缝扩展到大型数据集群。我们还在探索其他用例,例如推荐系统、强化学习等,这些将利用基于 Ray 构建的 AutoML 功能。