如何用一套引擎搞定机器学习全流程?

作者:陈戊超(仲卓)

深度学习技能在今世社会发挥的效果越来越大。现在深度学习被广泛运用于个性化引荐、产品查找、人脸辨认、机器翻译、主动驾驶等多个范畴,此外还在向社会各个范畴敏捷浸透。

布景

当时,深度学习的运用越来越多样化,随之涌现出许多优异的核算结构。其间 TensorFlow,PyTorch,MXNeT 作为广泛运用的结构更是备受瞩目。在将深度学习运用于实践事务的进程中,往往需求结合数据处理相关的核算结构如:模型练习之前需求对练习数据进行加工生成练习样本,模型猜测进程中需求对处理数据的一些方针进行监控等。在这样的状况下,数据处理和模型练习别离需求运用不同的核算引擎,添加了用户运用的难度。

本文将同享怎么运用一套引擎搞定机器学习全流程的处理方案。

先介绍一下典型的机器学习作业流程。如图所示,整个流程包括特征工程、模型练习、离线或许是在线猜测等环节。

如何用一套引擎搞定机器学习全流程?

在此进程中,无论是特征工程、模型练习仍是模型猜测,中心都会发生日志。需求先用数据处理引擎比方 Flink 对这些日志进行剖析,然后进入特征工程。再运用深度学习的核算引擎 TensorFlow 进行模型练习和模型猜测。当模型练习好了今后再用 TensorFlow serving 做在线的打分。

上述流程尽管可以跑通,但也存在必定的问题,比方:

  1. 同一个机器学习项目在做特征工程、模型练习、模型猜测时需求用到 Flink 和 TensorFlow 两个核算引擎,布置相对而言更杂乱。
  2. TensorFlow 在分布式的支撑上还不行友爱,运转进程中需求指定机器的 IP 地址和端口号;而实践生产进程常常是运转在一个调度体系上比方 Yarn,需求动态分配 IP 地址和端口号。
  3. TensorFlow 的分布式运转缺少主动的 failover 机制。

针对以上问题,咱们经过结合 Flink 和 TensorFlow,将 TensorFlow 的程序跑在 Flink 集上的这种方法来处理,全体流程如下:

如何用一套引擎搞定机器学习全流程?

特征工程用 Flink 去履行,模型练习和模型的准实时猜测方针使 TensorFlow 核算引擎可以跑在 Flink 集群上。这样就可以用 Flink 一套核算引擎去支撑模型练习和模型的猜测,布置上更简略的一起也节省了资源。

Flink 核算简介

如何用一套引擎搞定机器学习全流程?

Flink 是一款开源大数据分布式核算引擎,在 Flink 里一切的核算都笼统成 operator,如上图所示,数据读取的节点叫 source operator,输出数据的节点叫 sink operator。source 和 sink 中心有多种多样的 Flink operator 去处理,上图的核算拓扑包括了三个 source 和两个 sink。

机器学习分布式拓扑

机器学习分布式运转拓扑如下图所示:

如何用一套引擎搞定机器学习全流程?

在一个机器学习的集群傍边,常常会对一组节点(node)进行分组,如上图所示,一组节点可以是 worker(运转算法),也可以是 ps(更新参数)。

怎么将 Flink 的 operator 结构与 Machine Learning 的 node、Application Manager 人物结合起来?下面将具体解说 flink-ai-extended 的笼统。

Flink-ai-extended 笼统

首要,对机器学习的 cluster 进行一层笼统,命名为 ML framework,一起机器学习也包括了 ML operator。经过这两个模块,可以把 Flink 和 Machine Learning Cluster 结合起来,而且可以支撑不同的核算引擎,包括 TensorFlow。

如下图所示:

如何用一套引擎搞定机器学习全流程?

在 Flink 运转环境上,笼统了 ML Framework 和 ML Operator 模块,担任衔接 Flink 和其他核算引擎。

ML Framework

如何用一套引擎搞定机器学习全流程?

ML Framework 分为 2 个人物。

  1. Application Manager(以下简称 am) 人物,担任办理一切 node 的节点的生命周期。
  2. node 人物,担任履行机器学习的算法程序。

在上述进程中,还可以对 Application Manager 和 node 进行进一步的笼统,Application Manager 里边咱们独自把 state machine 的状态机做成可扩展的,这样就可以支撑不同类型的作业。深度学习引擎,可以自己界说其状态机。从 node 的节点笼统 runner 接口,这样用户就可以依据不同的深度学习引擎去自界说运转算法程序。

ML Operator

如何用一套引擎搞定机器学习全流程?

ML Operator 模块供给了两个接口:

  1. addAMRole,这个接口的效果是在 Flink 的作业里添加一个 Application Manager 的人物。Application Manager 人物如上图所示便是机器学习集群的办理节点。
  2. addRole,添加的是机器学习的一组节点。

运用 ML Operator 供给的接口,可以完成 Flink Operator 中包括一个Application Manager 及 3 组 node 的人物,这三组 node 别离叫 role a、 role b,、role c,三个不同人物组成机器学习的一个 cluster。如上图代码所示。Flink 的 operator 与机器学习作业的 node 一一对应。

机器学习的 node 节点运转在 Flink 的 operator 里,需求进行数据交流,原理如下图所示:

如何用一套引擎搞定机器学习全流程?

Flink operator 是 java 进程,机器学习的 node 节点一般是 python 进程,java 和 python 进程经过同享内存交流数据。

TensorFlow On Flink

TensorFlow 分布式运转

如何用一套引擎搞定机器学习全流程?

TensorFlow 分布式练习一般分为 worker 和 ps 人物。worker 担任机器学习核算,ps 担任参数更新。下面将解说 TensorFlow 怎么运转在 Flink 集群中。

TensorFlow Batch 练习运转方法

如何用一套引擎搞定机器学习全流程?

Batch 方法下,样本数据可以是放在 HDFS 上的,关于 Flink 作业而言,它会起一个source 的 operator,然后 TensorFlow 的 work 人物就会发动。如上图所示,假如 worker 的人物有三个节点,那么 source 的并行度就会设为 3。同理下面 ps 人物有 2 个,所以 ps source 节点就会设为 2。

而 Application Manager 和其他人物并没有数据交流,所以 Application Manager 是独自的一个节点,因而它的 source 节点并行度一直为 1。这样 Flink 作业上发动了三个 worker 和两个 ps 节点,worker 和 ps 之间的通讯是经过原始的 TensorFlow 的 GRPC 通讯来完成的,并不是走 Flink 的通讯机制。

TensorFlow stream 练习运转方法

如何用一套引擎搞定机器学习全流程?

如上图所示,前面有两个 source operator,然后接 join operator,把两份数据合并为一份数据,再加自界说处理的节点,生成样本数据。在 stream 方法下,worker 的人物是经过 UDTF 或许 flatmap 来完成的。

一起,TensorFlow worker node 有3 个,所以 flatmap 和 UDTF 相对应的 operator 的并行度也为 3, 由于ps 人物并不去读取数据,所所以经过 flink source operator 来完成。

下面咱们再讲一下,假如现已练习好的模型,怎么去支撑实时的猜测。

运用 Python 进行猜测

如何用一套引擎搞定机器学习全流程?

运用 Python 进行猜测流程如图所示,假如 TensorFlow 的模型是分布式练习出来的模型,而且这个模型非常大,比方说单机放不下的状况,一般出现在引荐和查找的场景下。那么实时猜测和实时练习原理相同,仅有不同的当地是多了一个加载模型的进程。

在猜测的状况下,经过读取模型,将一切的参数加载到 ps 里边去,然后上游的数据仍是经过和练习时分相同的处理方法,数据流入到 worker 这样一个人物中去进行处理,将猜测的分数再写回到 flink operator,而且发送到下流 operator。

运用 Java 进行猜测

如何用一套引擎搞定机器学习全流程?

如图所示,模型单机进行猜测时就没必要再去起 ps 节点,单个 worker 就可以装下整个模型进行猜测,尤其是运用 TensorFlow 导出 save model。一起,由于 saved model 格局包括了整个深度学习猜测的悉数核算逻辑和输入输出,所以不需求运转 Python 的代码就可以进行猜测。

此外,还有一种方法可以进行猜测。前面 source、join、UDTF 都是对数据进行加工处理变成猜测模型可以辨认的数据格局,在这种状况下,可以直接在 Java 进程里边经过 TensorFlow Java API,将练习好的模型 load 到内存里,这时会发现并不需求 ps 人物, worker 人物也都是 Java 进程,并不是 Python 的进程,所以咱们可以直接在 Java 进程内进行猜测,而且可以将猜测成果持续发给 Flink 的下流。

总结

在本文中,咱们解说了 flink-ai-extended 原理,以及 Flink 结合 TensorFlow 怎么进行模型练习和猜测。期望经过本文大同享,我们可以运用 flink-ai-extended, 经过 Flink 作业去支撑模型练习和模型的猜测。