No-Code AI:用 ElasticDL 和社区 Keras 模型库实现大量小众预估场景

image

文 / 蚂蚁集团研究员 王益

在互联网行业里有很多需要利用深度学习模型预估点击率的场景,比如广告系统、推荐系统,和搜索引擎。有些重要的场景背后是很大的用户流量,体验了重要的商业价值,所以有数十人甚至数百人的团队在不断优化预估效能。这些团队为了优化自己负责的场景甚至专门研发深度学习工具链。

同时,大量小众的预估场景对应着不小的流量,但是无法配置专门的团队,更不可能开发专门的工具。这类场景因为数量众多,所以总体商业价值毫不弱于上述主流场景,甚至符合长尾分布的 20/80 比例 —— 其总体商业价值数倍于主流场景。

在我们研发和推广 ElasticDL 的过程里,接触到了很多负责此类小众场景的用户们。比如蚂蚁集团的各种大促活动,以及饿了么和菜鸟等业务的营销推荐活动。这些业务场景中,通常是一个算法工程师需要负责多个场景的建模。这就带来一个重要需求 —— 提供一套通用工具以提高大量小众预估场景下算法工程师的建模效率。另外,小众场景里的训练数据可不小 —— 本文梳理的场景都需要分布式训练。

之前的文章《ElasticDL:同时提升集群利用率和研发效率的分布式深度学习框架》 里我们介绍过 ElasticDL 通过 Kubernetes-native 的弹性调度能力,提升机群资源利用率到 >90%。同时,作为一个 Keras 模型的分布式训练系统,ElasticDL 只需要用户提供模型定义,不需要用户定义训练循环 (training loop),更不需要用户开发分布式训练循环。实际上,由于 TensorFlow 社区贡献了很多 Keras 模型,比如 tf.keras.applications 里有很多 CV 领域的模型,DeepCTR 库里有很多 CTR 预估相关的模型,用户可以直接使用的。所以实际上 ElasticDL 在小众场景中的使用可以完全不需要用户 coding。这样的易用性在推广过程中得到了用户的好评。

基于 no-code 的特点,ElasticDL 团队的主力工程师王勤龙为蚂蚁的可视化建模平台 PAI 增加了 ElasticDL 组件,使得大量用户可以通过在 Web 页面里拖拽和配置组件的方式实现 AI 训练。此文基于蚂蚁、饿了么、和飞猪的同事们的反馈梳理,为大家解释 TensorFlow 社区累积的 Keras 模型对中小 AI 场景的价值,以及如何经由 ElasticDL 实现这些价值。

小众预估场景对模型研发效率的期待

小众预估场景具有如下特点:

  1. 应用周期短,可能是应用在某个短时间的大促营销活动。所以算法工程师也需要在短时间内能完成预估模型的开发。
  2. 业务场景复杂多样,比如商品推荐的点击预估、营销活动的目标人群预估、优惠券的核销预估等,一个算法工程有可能会同时负责不同场景的预估建模,不同场景所使用的特征和模型可能区别很大,所说提高小众场景的预估模型的开发效率十分重要。
  3. 样本数据量大。虽然是小众场景,但是在大数据时代,公司都会积累了很多历史样本数据。训练的数据越多,有助于提升预估模型精度。所以在分布式集群上加速预估模型的训练对生产应用十分重要。

小众预估场景的这些特点不仅需要提高建模效率,也给集群管理系统带来了挑战。由于此类场景数量众多,在集群上给每个场景单独划分资源是不切合实际的。同时小众场景的训练作业时多时少,给其调度资源时既要考虑是否满足训练任务的需求,也要考虑集群资源利用率。前者决定了用户的模型训练效率,后者决定了公司成本。

使用 Keras 提高预估模型编程效率

使用 ElasticDL 来做分布式训练,用户主要需要使用 Keras API 来定义一个 Keras Model,如下所示:

import tensorflow as tf

def forward():
    inputs = tf.keras.layers.Input(shape=(4, 1), name="input")
    x = tf.keras.layers.Flatten()(inputs)
    outputs = tf.keras.layers.Dense(3, name="output")(x)
    return tf.keras.Model(inputs=inputs, outputs=outputs, 
                          name="simple-model")

深度学习预估模型一般包含两个部分:

  1. 样本特征预处理定义。将原始特征数据转换成适合深度学习使用的数据,比如标准化、分箱等变换。
  2. 深度学习网络结构定义。定义网络结构来拟合数据分布,提供模型预估精度。

在特征预处理上,TensorFlow 在其最新版本中提供了很多 preprocessing layers 来方便用户做特征预处理。使用这些 preprocessing layer,用户可以很方便地将特征预处理计算逻辑与模型网络结构结合在一起构造一个完整的 Keras 模型。

但是很多预估场景的特征数量很大,可能涉及用户属性、商品属性、地理位置等特征。对每个特征都手动编程定义预处理逻辑,也是件繁琐的事。同时特征预处理定义还需要一些样本特征的统计信息来保证特征变换的准确性,比如标准化操作需要特征的均值和标准差,分箱需要特征值的分布信息来确定分箱边界。在阿里巴巴集团,大多数预估场景的数据都是以结构化表形式存储在阿里云的 MaxCompute 中。针对此类数据,我们结合 MaxCompute 的大数据计算能力开发了自动生成预处理 Layer 功能。用户只需要选择使用的特征列,就可以自动完成特征统计并根据统计结果生成预处理的 Layer,用户只需关心模型的深度学习网络结构的定义。

在预估模型的网络结构定义上,DeepCTR 模型库提供了很多前沿的 CTR 预估模型。用户可以很方便地调用这些模型来构造自己的预估模型。针对常用的 CTR 深度学习预估模型,我们在蚂蚁集团的 PAI 平台上封装了一个 ElasticDL-DeepCTR 组件,该组件能根据数据集自动生成特征预处理逻辑,并预置了 Wide&Deep、DeepFM、xDeepFM等算法,用户只需配置参数即可进行分布式模型训练。

弹性调度提升训练效率

小众预估场景所使用的样本数量一般也很大,几百万到几千万条不等,单机训练很慢满足模型的训练效率,往往需要在分布式集群上来加速模型训练。因为小众预估场景的数量多,单独给每个场景划分资源训练模型无疑会大幅增加集群管理员的工作。但是资源划分少会影响训练速度,划分过多则可能造成资源浪费。所以通常的做法是,这些小众预估场景的模型训练共享一个资源池。但是共享一个资源池很难同时兼顾用户体验和集群资源利用率。小众预估场景的模型训练作业往往时多时少。作业少的时候,资源池空闲造成资源浪费;作业多的时候,后面提交的任务需要排队等待。

ElasticDL 的弹性训练则能很好地解决了这个问题。通常一个 Kubernetes 集群上的资源是多个租户共用的,这些租户可能运行着各种不同的计算任务,比如在线服务任务、数据计算任务等。为了保证不同租户的 Service-Level Objective (SLO),集群管理者会给各租户分配资源配额。每个租户有高优先级使用自己的资源配额来执行计算任务,如果配置内的资源有空闲,其他租户则能用低优先级使用该租户配额里空闲的资源。如果使用过程中,原有租户计算任务增加,则其他租户需要归还使用的资源。由于集群中不同租户的使用峰值和低谷一般是错开的,所以集群中经常存在空闲资源。模型训练的租户使用 ElasticDL 则能以低优先级方式借调其他组租户的空闲资源来训练模型。就算训练过程中 ElasticDL 作业的 worker 被原有租户抢占了,训练作业不会终止失败。ElasticDL 会在集群里寻找其他租户的空闲资源来启动新的 worker,并将新 worker 加入训练作业。

在蚂蚁集团,几十个租户同时使用一个 Kubernetes 集群,我们在集群上只划分了很少的资源来启动 ElasticDL 作业的 master 和 PS 进程,而资源需求大且数量多的 worker 进程则全部使用低优先级的资源来运行。这样只要集群有空闲资源,训练作业就能快速开始,从而提升了这些小众预估模型的训练效率,也同时提升了集群资源利用率。

应用案例

以下我们简述几个阿里经济体内使用 ElasticDL 提升模型研发效能的小众场景。

蚂蚁财富的理财活动推荐

支付宝 818 金选理财节活动,新发基金策略(用于某债基带货)和黄金雨活动策略(用于促活跃)需要使用 CTR 预估来提升活动效果。该场景积累了几百万样本数据,且样本中包含用户属性、理财产品属性等很多特征。使用 ElasticDL 预估方案,非常方便地将 DeepFM 使用到了此次活动中。相比之前使用的规则策略,活动期间,页面的点击率有明显提升。

饿了么补贴投放预估

饿了么 C 端补贴(天降红包/高温补贴券包项目)是通过对用户发放红包以撬动用户下单的目的进行发放的,因此在不同门槛/面额组合下对用户核销/下单概率的预估是将平台收益最大化(ROI 最大化)的必要条件。类似逻辑同样适用在 B 端补贴上(百亿补贴项目),只不过 B 端补贴需要叠加用户对门店属性的适应/偏好/LBS限制/物流限制等更复杂的情况。ElasticDL 提供的 CTR 预估方案非常简单易用,训练的 xDeepFM 模型上线后效果很好。为后续的核销率拟合/ROI 优化提供了坚实有力的基础。

小结

针对 Keras 模型,ElasticDL 利用 TensorFlow 的 Eager execution 在 Kubernetes 上实现了弹性分布式训练,让用户只需提供 Keras 模型定义就可以提交分布式训练作业。同时由于 TensorFlow 社区拥有丰富的 Keras 模型库,用户可以做到 no-code 就能完成一个预估模型的应用。

由于 ElasticDL 在阿里经济体内部的展示的应用价值,ElasticDL 的另一位主力工程师齐俊在配合阿里云团队,争取尽快让阿里经济体之外的用户可以在阿里云上使用 ElasticDL。这项对接工作结束之后,我们再为大家带来更新。


原文:TensorFlow 公众号