Alink技术研究

一、简介

Alink 是阿里巴巴计算平台事业部PAI团队从 2017 年开始基于实时计算引擎 Flink 研发的新一代机器学习算法平台,提供丰富的算法组件库和便捷的操作框架,开发者可以一键搭建覆盖数据处理、特征工程、模型训练、模型预测的算法模型开发全流程,同时基于流式的数据处理,实现模型准实时预测服务
除了上述特点外,Alink提供的Pipeline组件,可以将不同的处理流程串联起来,在模型训练前可以对数据做各种预处理。Alink提供了Java接口和Python接口(PyAlink),开发者不需要Flink的技术背景也可以轻松构建算法模型。
在这里插入图片描述
Alink在阿里巴巴业务中的应用:

  1. 电商推荐系统: Alink用于构建强大的推荐算法,提高电商平台的个性化推荐效果,增强用户体验。
  2. 广告点击率预测: 在广告领域,Alink的分类和回归任务支持,用于预测广告点击率,优化广告投放策略。
  3. 用户行为分析: 通过Alink的聚类算法,阿里巴巴对海量用户行为数据进行分析,从而更好地理解用户需求和行为模式。
  4. 供应链优化: Alink的机器学习模型在供应链领域可以用于优化库存管理、预测需求,提高供应链效率。
    总体而言,Alink在阿里巴巴的业务中发挥着关键作用,为各个领域提供了强大的机器学习支持,推动业务的智能化和效率提升。

1.1丰富的算法库

Alink拥有丰富的批式算法和流式算法,可帮助数据分析和应用开发人员端到端地完成从数据处理、特征工程、模型训练到预测的整个流程工作。Alink开源算法如图所示,在Alink提供的开源算法模块中,每一个模块都包含流式算法和批式算法。比如线性回归,包含批式线性回归训练、流式线性回归预测和批式线性回归预测。
在这里插入图片描述
具体算法使用请查看Alink技术文档,此文档中包含丰富的算法的批组件以及流式组件的使用。

1.2多样的使用体验

Alink使用Java研发,原生提供了整套Java调用接口,可以在本地idea编辑、调试、运行Alink任务,也可以将Alink任务编译、发布到Flink集群中运行。此外,Alink也提供了Python版本:PyAlink。可以通过Jupyter等Notebook的方式使用Alink,提升其交互式和可视化体验;PyAlink既支持本地单机运行,又支持集群提交。PyAlink打通了Operator(Alink组件)和DataFrame的接口,因此,Alink的整个算法流程可无缝融入Python。PyAlink也提供了使用Python函数来调用UDF或者UDTF的方法。

PyAlink在Notebook中的使用如下图所示。图中展示了一个模型训练预测,并打印出了预测结果的过程。
在这里插入图片描述
Alink的数据源也较为丰富,下图是Alink支持的数据源:
在这里插入图片描述

1.3与SparkML的对比

在离线学习算法方面,Alink与SparkML的性能基本相当。下图给出的是一些经典算法的性能对比:对于同一算法,采用相同的数据集、同样的迭代次数等参数。其中的加速比指的是,SparkML所用的时间除以Alink所用的时间之比。若加速比的值为1x(1倍),则说明Alink与SparkML的性能相当。加速比的值越大,说明Alink的性能越好。

在这里插入图片描述
通过上图可以看出,Alink在大部分算法方面的性能优于SparkML,在个别算法方面的性能比SparkML弱,二者在整体上是一个相当的水平。但是,在功能的完
备性方面,Alink更有优势,Alink除了覆盖了SparkML的算法,还包含流式算法、流批混跑、在线学习、中文分词等功能。

1.4准实时服务

Alink基于实时计算引擎Flink,同时支持批式计算和流式计算。目前除FTRL外,其他训练算法基本属于批处理组件。使用批训练组件和流式预测组件可以实
现准实时模型预测服务。
Alink流式预测组件,在指定模型读取的路径后,可自动监控路径下的模型文件,如有新生成的模型文件会自动加载。流式组件读取Kafka队列的消息,经过
预处理和模型预测,将模型结果写回到Kafka消息队列,实现模型的准实时服务。

【Github开源】
【使用手册、教程】
【Alink教程(Java版)】
【Alink教程(Python版)】

二、部署环境

2.1本地模式(本地构建Alink Java项目)

2.1.1代码下载源代码并导入Java工程

以本人所用的IntelliJ IDEA编辑器为例。
在这里插入图片描述
完成Import Project.Project alink_java显示如下:
在这里插入图片描述
点击右下方的“Load Maven Project”
注意:国内网络可能会存在Maven仓库连接慢的问题,可以修改Maven为国内的镜像解决,提供阿里云镜像的配置作为参考:

<?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001
/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
<mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository
/public</url> </mirror> </mirrors> </settings>

2.1.2设置本地数据根目录

在运行代码前,需要修改Utils.java中的 ROOT_DIR 设置,改为本地存放Alink教程数据的根目录"D:\Alink\data\"
在这里插入图片描述

2.1.3运行第一个例子

选择Chap01.java,即第一章对应的代码,由于这章代码不需要事先下载数据,可以直接运行。
第一章代码适合Alink初学者学习,可以让我们对Alink代码有个整体的了解,可以下载打开下面Java文件进行学习。
在这里插入图片描述
第二个方法c_5_2()比较有代表性,整体思路如下:
创建训练集(含数据)——>创建预测集(含数据,进行特征选择)——>创建线性回归训练算子——>(训练集+训练算子=模型)——>创建线性回归预测算
子——>(模型、预测集)+预测算子——>预测结果
可以看到案例代码的整体思路就是读取数据调用相应算法进行训练得到模型,再基于模型去进行他操作,比如预测、异常检测等。整体思路看起来简单,但
是实现相应的业务需求还需要研究所选算法的常用类的方法,以及方法的相关参数等。每一类需求涉及算法众多,需要根据业务需求和数据特点准确匹配所
需算法。

三、核心概念

3.1基本概念

数据集(DataSet)与数据流(DataStream)的区别在于用户是否可以假定数据有界。数据集(DataSet)的数据有界就意味着,数据是静止的、确定的,内
容和个数都不会变化。

在逐条读取数据时,数据集(DataSet)的数据是有界的、个数确定,我们可以执行某些操作。比如,统计该数据集的记录总数,计算平均值、方差等统计量;在逻辑上,可以看作把该数据集按照某个操作处理完,得到一个新的数据集,然后对该新数据集进行另外一个操作,得到另一个新的数据集。

批式(Batch)数据对应着数据集(DataSet),流式(Stream)数据对应着数据流(DataStream)。

数据处理的基本流程就是三部分:数据源(Source)、算法组件(Operator)和数据导出(Sink),如下图所示。
在这里插入图片描述

3.2批式任务与流式任务

3.2.1批式任务

批式任务与流式任务看待数据的方式不同,批式任务将数据当作一个整体(数据集)来看待,流式任务将每条数据作为一个基本单位。

我们先看一个典型的批式任务场景,包括读取数据、数据预处理,特征生成、模型训练、预测、评估环节。各个组件依次对上游的结果数据集进行处理。实际某算法平台的一个批式任务运行状态截图如下:
在这里插入图片描述

3.2.2流式任务

流式任务,和“流水线”的操作类似,每个组件就相当于一名工人,每经过一名工人,产品上就会多一个组件;各个计算组件是同时启动的,每条数据在前一个组件处理完成后,会自动推到下一个组件。

对于流式任务,经常用单位时间处理数据的条数来衡量效率。评估需要并发配置的计算资源,以便对线上请求及时响应。

如下图所示,我们看到流式任务的所有组件都在运行状态,每个组件左下角显示的是其每秒处理的数据条数。
在这里插入图片描述

3.3Alink = A+Link

批式任务与流式任务的数据计算及处理操作都发生在组件中,各组件间的连线就是数据的通路。批式任务和流式任务中有关组件与连接的描述是通用的。

Alink定义了组件的抽象基类AlgoOperator,规范了组件的基本行为。由AlgoOperator派生出了两个基类:用于批式计算及处理场景的批式算法组件(BatchO
perator)和用于流式计算及处理场景的流式算法组件(StreamOperator)。

组件间的连接是通过定义link方法实现的,比如,组件algoA的输出是组件algoB的输入,而组件algoB的输出又是组件algoC的输入,则可以通过组件的link
方法表示:
algoA.link(algoB).link(algoC)
Alink的名称可以从这个角度进行解读:“Alink=A+link”。这里的A代表Alink的全部算法组件,其都是由抽象基类AlgoOperator派生出来的;link是AlgoOperator各派生组件间的连接方法。

3.3.1BatchOperator和StreamOperator

由算法组件的抽象基类(AlgoOperator)派生出两个基类:批式算法组件(BatchOperator,或称为批式处理组件、批式组件)和流式算法组件(StreamOper
ator,或称为流式处理组件、流式组件),它们的UML类图如下图所示。
在这里插入图片描述
Alink将每个批式操作定义为一个批式组件(BatchOperator),每个批式组件在命名上都以“BatchOp”为后缀;同样,将每个流式操作定义为一个流式组件
(StreamOperator),每个流式组件在命名上都以“StreamOp”为后缀。

通过这样的定义,批式任务和流式任务都可以用相同的方式进行描述,这样就可以大大降低批式任务和流式任务转换的代价。若需要将一个批式任务改写为流式任务,只需要将批式组件后面的“BatchOp”后缀变为“StreamOp”,相应的link操作便可转换为针对流式数据的操作。也正是因为Alink的批式组件和流式组件有如此密切的联系,所以才能将机器学习的管道(Pipeline)操作推广到流式场景。

3.3.2Link

简单地说,link方式指的是在工作流中通过连线的方式,串接起不同的组件。link方式给我们带来的一个简化是,前序组件的产出结果可能比较复杂,比如描述的是一个机器学习模型,我们不必了解其细节、不必详细描述它,只要通过“link”的方式将两个组件建立连接,后面的组件即可通过该连接(link)来获取前序组件的处理结果数据、数据的列数,以及各列的名称和类型。

连接(link)是有方向的,组件A连接组件B,即先执行组件A,然后将计算结果传给组件B继续执行,则组件间的关系可以通过以下三种方式表示:
A.linkTo(B)
B.linkFrom(A)
A.link(B)

3.4Pipeline与PipelineModel

管道(Pipeline)的概念源于Scikit-learn。可以将数据处理的过程看成数据在“管道”中流动。管道分为若干个阶段(PipelineStage),数据每通过一个阶段就发生一次变换,数据通过整个管道,也就依次经历了所有变换。

如果要在管道中加入分类器,对数据进行类别预测,就涉及模型的训练和预测,这需要分两个步骤完成。所以,管道也会被细分为管道定义与管道模型
(PipelineModel)。在管道定义中,每个PipelineStage会按其是否需要进行模型训练,分为估计器(Estimator)和转换器(Transformer)。随后,可以对其涉及模型的部分,即对估计器(Estimator)进行估计,从而得到含有模型的转换器。该转换器被称为Model,并用Model替换相应的估计器,从而每个阶段都可以直接对数据进行处理。我们将该Model称为PipelineModel。

上面介绍了几个概念,用图形表示它们之间的关系如下:
在这里插入图片描述
转换器(Transformer):Pipeline中的处理模块,用于处理Table。输入的是待处理的数据,输出的是处理结果数据。

Model:派生于转换器(Transformer)。其可以存放计算出来的模型,用来进行模型预测。其输入的是预测所需的特征数据,输出的是预测结果数据。

估计器(Estimator):估计器是对输入数据进行拟合或训练的模型计算模块,输出适合当前数据的转换器(模型)。输入的是训练数据,输出的是Model。

Pipeline与PipelineModel构成了完整的机器学习处理过程,可以分为三个子过程:定义过程,模型训练过程,数据处理过程。

定义过程:按顺序罗列Pipeline所需的各个阶段。Pipeline由若干个Transformer和Estimator构成,按用户指定的顺序排列,并在逻辑上依次执行。

模型训练过程:使用Pipeline的fit方法,对Pipeline中的Estimator进行训练,得到相应的Model。Pipeline执行fit方法后得到的结果是PipelineModel。
数据处理过程:该过程指的是通过PipelineModel直接处理数据。

比如,LR分类算法作为一个Estimator,可以在构建Pipleline的时候进行定义,之后在fit的过程中,会使用LR的训练算法,得到LR model,并将其作为整个PipelineModel的一部分;在使用PipelineModel处理数据时,会相应地调用LR算法的预测部分。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值