智能搜索模型预估框架Augur的建设与实践

在过去十年,机器学习在学术界取得了众多的突破,在工业界也有很多应用落地。美团很早就开始探索不同的机器学习模型在搜索场景下的应用,从最开始的线性模型、树模型,再到近两年的深度神经网络、BERT、DQN等,并在实践中也取得了良好的效果与产出。

本文将与大家探讨美团搜索与NLP部使用的统一在线预估框架Augur的设计思路、效果、优势与不足,希望对大家有所帮助或者启发。

搜索优化问题,是个典型的AI应用问题,而AI应用问题首先是个系统问题。经历近10年的技术积累和沉淀,美团搜索系统架构从传统检索引擎升级转变为AI搜索引擎。当前,美团搜索整体架构主要由搜索数据平台、在线检索框架及云搜平台、在线AI服务及实验平台三大体系构成。在AI服务及实验平台中,模型训练平台Poker和在线预估框架Augur是搜索AI化的核心组件,解决了模型从离线训练到在线服务的一系列系统问题,极大地提升了整个搜索策略迭代效率、在线模型预估的性能以及排序稳定性,并助力商户、外卖、内容等核心搜索场景业务指标的飞速提升。

其实,模型预估的逻辑相对简单、清晰。但是如果要整个平台做得好用且高效,这就需要框架系统和工具建设(一般是管理平台)两个层面的配合,需要兼顾需求、效率与性能。

纯粹从一个工程人员视角来看:模型可以简化为一个公式(举例:f(x1,x2)=ax1+bx2+c),训练模型是找出最合适的参数abc。所谓特征,是其中的自变量x1与x2,而模型预估,就是将给定的自变量x1与x2代入公式,求得一个解而已。(当然实际模型输出的结果可能会更加复杂,包括输出矩阵、向量等等,这里只是简单的举例说明。)

所以在实际业务场景中,一个模型预估的过程可以分为两个简单的步骤:第一步,特征抽取(找出x1与x2);第二步,模型预估(执行公式,获得最终的结果)。

模型预估很简单,从业务工程的视角来看,无论多复杂,它只是一个计算分数的过程。对于整个运算的优化,无论是矩阵运算,还是底层的GPU卡的加速,业界和美团内部都有比较好的实践。美团也提供了高性能的TF-Serving服务(参见《基于TensorFlowServing的深度学习在线预估》一文)以及自研的MLX模型打分服务,都可以进行高性能的Batch打分。基于此,我们针对不同的模型,采取不同的策略:

这一套逻辑很简单,构建起来也不复杂,所以在建设初期,我们快速在主搜的核心业务逻辑中快速实现了这一架构,如下图所示。这样的一个架构使得我们可以在主搜的核心排序逻辑中,能够使用各类线性模型的预估,同时也可以借助公司的技术能力,进行深度模型的预估。关于特征抽取的部分,我们也简单实现了一套规则,方便算法同学可以自行实现一些简单的逻辑。

跟所有新系统的诞生故事一样,老系统一定会出现问题。原有架构在少特征以及小模型下虽有优势,但业务耦合,无法横向扩展,也难以复用。针对需求和老框架的种种问题,我们开始构建了新的高性能分布式模型预估框架Augur,该框架指导思路是:

架构上的改变,让Augur具备了复用的基础能力,同时也拥有了分布式预估的能力。可惜,系统架构设计中没有“银弹”:虽然系统具有了良好的弹性,但为此我们也付出了一些代价,我们会在文末进行解释。

框架思路只能解决“能用”的问题,平台则是为了“通用”与“好用”。一个优秀的预估平台需要保证高性能,具备较为通用且接口丰富的核心预估框架,以及产品级别的业务管理系统。为了能够真正地提升预估能力和业务迭代的效率,平台需要回答以下几个问题:

下面,我们将逐一给出答案。

4.1.1Operator和Transformer

在搜索场景下,特征抽取较为难做的原因主要包括以下几点:

针对特征的处理逻辑,我们抽象出两个概念:

Operator:通用特征处理逻辑,根据功能的不同又可以分为两类:

通过IO、计算分离,特征抽取执行阶段就可以进行IO异步、自动聚合RPC、并行计算的编排优化,从而达到提升性能的目的。

基于这两个概念,Augur中特征的处理流程如下所示:首先,我们会进行特征抽取,抽取完后,会对特征做一些通用的处理逻辑;而后,我们会根据模型的需求进行二次变换,并将最终值输入到模型预估服务中。如下图所示:

4.1.2特征计算DSL

有了Operator的概念,为了方便业务方进行高效的特征迭代,Augur设计了一套弱类型、易读的特征表达式语言,将特征看成一系列OP与其他特征的组合,并基于Bison&JFlex构建了高性能语法和词法解析引擎。我们在解释执行阶段还做了一系列优化,包括并行计算、中间特征共享、异步IO,以及自动RPC聚合等等。

举个例子:

4.1.3配置化的模型表达

特征可以用利用OP、使用表达式的方式去表现,但特征还可能需要经过Transformer的变换。为此,我们同样为模型构建一套可解释的JSON表达模板,模型中每一个特征可以通过一个JSON对象进行配置,以一个输入到TF模型里的特征结构为例:

其中,我们将输入模型的特征名(tf_input_name)和原始特征名(name)做了区分。这样的话,就可以只在外部编写一次表达式,注册一个公用特征,却能通过在模型的结构体中配置不同Transfomer创造出多个不同的模型预估特征。这种做法相对节约资源,因为公用特征只需抽取计算一次即可。

此外,这一套配置文件也是离线样本生产时使用的特征配置文件,结合统一的OP&Transformer代码逻辑,进一步保证了离线/在线处理的一致性,也简化了上线的过程。因为只需要在离线状态下配置一次样本生成文件,即可在离线样本生产、在线模型预估两个场景通用。

4.2.1高效的模型预估过程

OP和Transformer构建了框架处理特征的基本能力。实际开发中,为了实现高性能的预估能力,我们采用了分片纯异步的线程结构,层层CallBack,最大程度将线程资源留给实际计算。因此,预估服务对机器的要求并不高。

为了描述清楚整个过程,这里需要明确特征的两种类型:

一个典型的模型预估请求,如下图所示:

Augur启动时会加载所有特征的表达式和模型,一个模型预估请求ModelScoreRequest会带来对应的模型名、要打分的文档id(docid)以及一些必要的全局信息Context。Augur在请求命中模型之后,将模型所用特征构建成一颗树,并区分ContextLevel特征和DocLevel特征。由于DocLevel特征会依赖ContextLevel特征,故先将ContextLevel特征计算完毕。对于Doc维度,由于对每一个Doc都要加载和计算对应的特征,所以在Doc加载阶段会对Doc列表进行分片,并发完成特征的加载,并且各分片在完成特征加载之后就进行打分阶段。也就是说,打分阶段本身也是分片并发进行的,各分片在最后打分完成后汇总数据,返回给调用方。期间还会通过异步接口将特征日志上报,方便算法同学进一步迭代。

在这个过程中,为了使整个流程异步非阻塞,我们要求引用的服务提供异步接口。若部分服务未提供异步接口,可以将其包装成伪异步。这一套异步流程使得单机(16c16g)的服务容量提升超过100%,提高了资源的利用率。

4.2.2预估的性能及表达式的开销

框架的优势:得益于分布式,纯异步流程,以及在特征OP内部做的各类优化(公用特征、RPC聚合等),从老框架迁移到Augur后,上千份文档的深度模型预估性能提升了一倍。

至于大家关心的表达式解析对对于性能的影响其实可以忽略。因为这个模型预估的耗时瓶颈主要在于原始特征的抽取性能(也就是特征存储的性能)以及预估服务的性能(也就是Serving的性能)。而Augur提供了表达式解析的Benchmark测试用例,可以进行解析性能的验证。

4.2.3系统的其他组成部分

一个完善可靠的预估系统,除了“看得见”的高性能预估能力,还需要做好以下几个常被忽略的点:

Augur在完成了以上多种能力的建设之后,就可以当做一个功能相对完善且易扩展的在线预估系统。由于我们在构建Augur的时候,设立了明确的边界,故以上能力是独立于业务的,可以方便地进行复用。当然,Augur的功能管理,更多的业务接入,都需要管理平台的承载。于是,我们就构建了Poker平台,其中的在线预估管理模块是服务于Augur,可以进行模型特征以及业务配置的高效管理。我们将在下一小节进行介绍。

4.3.1能力的快速复用

Augur在设计之初,就将所有业务逻辑通过OP和Transformer承载,所以跟业务无关。考虑到美团搜索与NLP部模型预估场景需求的多样性,我们还为Augur赋予多种业务调用的方式。

其中服务化是被应用最多的方式,为了方便业务方的使用,除了完善的文档外,我们还构建了标准的服务模板,任何一个业务方基本上都可以在30分钟内构建出自己的Augur服务。服务模板内置了60多个常用逻辑和计算OP,并提供了最佳实践文档与配置逻辑,使得业务方在没有指导的情况下可以自行解决95%以上的问题。整个流程如下图所示:

当然,无论使用哪一种方式去构建预估服务,都可以在美团内部的Poker平台上进行服务、模型与特征的管理。

4.3.2Augur管理平台Poker的构建

实现一个框架价值的最大化,需要一个完整的体系去支撑。而一个合格的在线预估平台,需要一个产品级别的管理平台辅助。于是我们构建了Poker(搜索实验平台),其中的在线预估服务管理模块,也是Augur的最佳拍档。Augur是一个可用性较高的在线预估框架,而Poker+Augur则构成了一个好用的在线预估平台。下图是在线预估服务管理平台的功能架构:

首先是预估核心特征的管理,上面说到我们构建了语言化的特征表达式,这其实是个较为常见的思路。Poker利用Augur提供的丰富接口,结合算法的使用习惯,构建了一套较为流畅的特征管理工具。可以在平台上完成新增、测试、上线、卸载、历史回滚等一系列操作。同时,还可以查询特征被服务中的哪些模型直接或者间接引用,在修改和操作时还有风险提示,兼顾了便捷性与安全性。

4.3.3Poker+Augur的应用与效果

随着Augur和Poker的成熟,美团搜索与NLP部门内部已经有超过30个业务方已经全面接入了预估平台,整体的概况如下图所示:

4.4.1ModelasaFeature,同构or异构?

在算法的迭代中,有时会将一个模型的预估的结果当做另外一个模型输入特征,进而取得更好的效果。如美团搜索与NLP中心的算法同学使用BERT来解决长尾请求商户的展示顺序问题,此时需要BERTasaFeature。一般的做法是离线进行BERT批量计算,灌入特征存储供线上使用。但这种方式存在时效性较低(T+1)、覆盖度差等缺点。最好的方式自然是可以在线实时去做BERT模型预估,并将预估输出值作为特征,用于最终的模型打分。这就需要Augur提供ModelasaFeature的能力。

得益于Augur抽象的流程框架,我们很快超额完成了任务。Modelasafeature,虽然要对一个Model做预估操作,但从更上层的模型角度看,它就是一个特征。既然是特征,模型预估也就是一个计算OP而已。所以我们只需要在内部实现一个特殊的OP,ModelFeatureOpreator就可以干净地解决这些问题了。

我们在充分调研后,发现ModelasaFeature有两个维度的需求:同构的特征和异构的特征。同构指的是这个模型特征与模型的其他特征一样,是与要预估的文档统一维度的特征,那这个模型就可以配置在同一个服务下,也就是本机可以加载这个Stacking模型;而异构指的是ModelFeature与当前预估的文档不是统一维度的,比如商户下挂的商品,商户打分需要用到商品打分的结果,这两个模型非统一维度,属于两个业务。正常逻辑下需要串行处理,但是Augur可以做得更高效。为此我们设计了两个OP来解决问题:

美团搜索内部,已经通过LocalModelFeature的方式,实现了BERTasaFeature。在几乎没有新的使用学习成本的前提下,同时在线上取得了明显的指标提升。

4.4.2OnlineModelEnsemble

Augur支持有单独抽取特征的接口,结合ModelasaFeature,若需要同时为一个文档进行两个或者多个模型的打分,再将分数做加权后使用,非常方便地实现离线Ensemble出来模型的实时在线预估。我们可以配置一个简单的LR、Empty类型模型(仅用于特征抽取),或者其他任何Augur支持的模型,再通过LocalModelFeature配置若干的ModelFeature,就可以通过特征抽取接口得到一个文档多个模型的线性加权分数了。而这一切都被包含在一个统一的抽象逻辑中,使用户的体验是连续统一的,几乎没有增加学习成本。

除了上面的操作外,Augur还提供了打分的同时带回部分特征的接口,供后续的业务规则处理使用。

当然,肯定没有完美的框架和平台。Augur和Poker还有很大的进步空间,也有一些不可回避的问题。主要包括以下几个方面。

被迫“消失”的Listwise特征

前面说到,系统架构设计中没有“银弹”。在采用了无状态分布式的设计后,请求会分片。所以ListWise类型的特征就必须在打分前算好,再通过接口传递给Augur使用。在权衡性能和效果之后,算法同学放弃了这一类型的特征。

当然,不是说Augur不能实现,只是成本有些高,所以暂时Hold。我们也有设计过方案,在可量化的收益高于成本的时候,我们会在Augur中开放协作的接口。

单机多层打分的缺失

Augur一次可以进行多个模型的打分,模型相互依赖(下一层模型用到上一层模型的结果)也可以通过Stacking技术来解决。但如果模型相互依赖又逐层减少预估文档(比如,第一轮预估1000个,第二轮预估500),则只能通过多次RPC的方式去解决问题,这是一个现实问题的权衡。分片打分的性能提升,能否Cover多次RPC的开销?在实际开发中,为了保持框架的清晰简单,我们选择了放弃多层打分的特性。

离线能力缺失?

Poker是搜索实验平台的名字。我们设计它的初衷,是解决搜索模型实验中,从离线到在线所有繁复的手工操作,使搜索拥有一键训练、一键Fork、一键上线的能力。与公司其他的训练平台不同,我们通过完善的在线预估框架倒推离线训练的需求,进而构建了与在线无缝结合的搜索实验平台,极大地提升了算法同学的工作效。

未来,我们也会向大家介绍产品级别的一站式搜索实验平台,敬请期待。

在统一了搜索的在线预估框架后,我们会进一步对Augur的性能&能力进行扩展。未来,我们将会在检索粗排以及性能要求更高的预估场景中去发挥它的能力与价值。同时,我们正在将在线预估框架进一步融合到我们的搜索实验平台Poker中,与离线训练和AB实验平台做了深度的打通,为业务构建高效完整的模型实验基础设施。

如果你想近距离感受一下Augur的魅力,欢迎加入美团技术团队!

朱敏,紫顺,乐钦,洪晨,乔宇,武进,孝峰,俊浩等,均来自美团搜索与NLP部。

THE END
1.ChatGPT与传统聊天机器人的不同之处chatgpt文章ChatGPT与传统聊天机器人的不同之处主要体现在模型架构、训练数据、对话连贯性、适应性和功能方面。 1. 模型架构: ChatGPT是基于深度学习的模型,使用了Transformer架构,这种架构可以处理长文本,同时具有较好的并行计算能力。 传统聊天机器人则多采用基于规则或基于统计的机器学习模型,需要手工设计规则,过程繁琐。 https://www.chatgptzc.com/chatgptwenzhang/49093.html
2.Neurips2024解读系列之——IlyaSutskever快速回顾了大家熟知的预训练的几个历史阶段以及scale law究竟scale在哪里,law是什么的经典结果图。 但是,尽管计算设备(更好的GPU,比如H200)还能提升,数据用完了,预训练似乎走到头了? 此处又给出了几种可能得解决办法, 发展Agent代理提高模型性能(时下比较火,又是一个大的方向) https://zhuanlan.zhihu.com/p/12741832800
3.机器学习中的在线学习与离线学习离线训练是什么意思离线学习:一个batch训练完才更新权重,这样的话要求所有的数据必须在每一个训练操作中(batch中)都是可用的,个人理解,这样不会因为偶然的错误把网络带向极端。 这种理解方式在国外论文中出现比较多,国外称为online and batch learning.离线就是对应batch learning.这两种方式各有优点,在线学习比较快,但是有比较高的残差https://blog.csdn.net/a493823882/article/details/83240496
4.大模型是什么意思大模型的应用嘲有哪些→MAIGOO知识大模型通常具有更多的参数和更复杂的结构,这使得大模型在实时性要求较低的场景下具有优势,例如离线批处理、离线训练、离线预测等。小模型通常具有较少的参数和简单的结构,这使得小模型在实时性要求较高的场景下具有优势。 复杂程度: 大模型通常具有更复杂的结构和更多的参数,这使得大模型能够处理更复杂的数据模式和关https://www.maigoo.com/goomai/315161.html
5.相比于离线训练,在线训练的好处有什么?问答离线训练毕竟使用的是 T-1 或者 T-2 的数据去做的,没有对线上实时产生的行为数据进行利用,对于数据的时效性利用相对较差。 比如说,有这样的一个场景,今天我的整个平台只对 14 岁以下的少女做某个运营活动,而平台上充斥了大量的年龄段的客户,整个平台的交互行为都变了,这个时候你的模型还是 T-1 去做的,将https://developer.aliyun.com/ask/446535
6.亭台楼阁范文10篇(全文)1. 鉴赏是什么意思? 提示:评品欣赏 2. 我们来评品欣赏一下本文的美主要体现在哪些方面? (讨论) 提示:归纳鉴赏散文的方法 通常可以从两个大的方面来评价欣赏一篇散文: 1) 语言, 作者的遣词造句是否具有美感, 这叫言内之美, 本文的语言之美体现在修辞美、诗意美、联想美等方面; https://www.99xueshu.com/w/ikeybm7iw2tp.html
7.淘宝推荐嘲的利器:融合复杂目标且支持实时调控的重排模型一个重排模型在线上能为一个权重生成好的序列,一定是因为它在离线训练的时候就已经见过这套权重或者相似的权重了。所以在离线训练的时候,对于每一个 training 的 sample 或者每一个 training 的 batch,都是采样一个 w 做训练的,因为不知道线上真实会遇到什么样的 w,进行采样。https://www.51cto.com/article/773581.html
8.GitHubShaoQiBNU/Google论文对比了上述所有结构的MTL在腾讯视频VCR和VTR两个任务上相对单任务模型的离线训练结果: 可以看到,几乎所有的网络结构都是在一个任务上表现优于单任务模型,而在另一个任务上表现差于单任务模型。尽管MMoE有了一定的改进,在VTR上取得了不错的收益,但在VCR上的收益接近于0。 https://github.com/ShaoQiBNU/Google_MTL
9.推荐模型离线评测效果好,线上效果却不佳的原因推荐系统里非常常见,并且往往非常的隐蔽的一种数据分布不一致的情况被称之为冰山效应,也就是说离线训练用的是有偏的冰山上的数据,而在线上预估的时候,需要预测的是整个冰山的数据,包括大量冰面以下的数据!我们看下面这张图。左边是我们的Baseline,绿色的表示正样本,红色表示负样本,灰色部分表示线上由于推荐系统的“https://www.jianshu.com/p/34489b31c783
10.系统回顾深度强化学习预训练,在线离线等研究这一篇就够了为了追求更少监督的大规模预训练,无监督 RL 领域发展迅速,它允许智能体在没有奖励信号的情况下从与环境的互动中学习。此外,离线强化学习 (offline RL) 发展迅猛,又促使研究人员进一步考虑如何利用无标签和次优的离线数据进行预训练。最后,基于多任务和多模态数据的离线训练方法进一步为通用的预训练范式铺平了道路。https://m.thepaper.cn/newsDetail_forward_20718623
11.如何在本地(离线)使用PrivateGPT训练自定义AI聊天机器人2. PrivateGPT可以离线使用,无需连接任何在线服务器,也无需从OpenAI或Pinecone添加任何API密钥。为了便于使用,它在你的电脑上本地运行一个LLM模型。因此,你必须在你的电脑上下载一个与GPT4All-J兼容的LLM模型。我在下面添加了详细的步骤供你参考。 设置环境来训练一个私人的AI聊天机器人 https://www.wbolt.com/how-train-ai-chatbot-using-privategpt-offline.html
12.chapter111.md·StarTogether/mlopsbook用户T-1 时刻发生的行为(播放某首歌、观看某个主播、打赏/付费),需要在T时刻实时反馈到训练数据中,提供模型学习 下图2-4一个比较常见的特征实时化的实现框架图,主要包括日志系统、离线画像、实时画像,通过 storm、flink、kafka 完成实时数据的处理和传输, 并存储在 hbase 和 redis 中,最后落盘到 hdfs 中。实时https://api.gitee.com/StarTogether/mlops-book/blob/master/chapter-11-1.md
13.蚂蚁金服核心技术:百亿特征实时推荐算法揭秘备注:弹性特征带来一个显著的优势:只要用足够强的L1稀疏性约束,在单机上就能调试任意大规模的特征训练,带来很多方便。我们的hashmap实现是KV化的,key是特征,value是vector的首地址。 离线训练优化 经过这样的改造后,在离线批量学习上,带来了以下变化: 在线训练优化 https://maimai.cn/article/detail?fid=1010621115&efid=mIQCHnkj0zjxlpygUmo5mg
14.基于多时间尺度多智能体深度强化学习无功电压控制方法与流程8.(2)将有载调压分接头(oltc)、电容器组(cb)和储能(es)均定义为智能体,在第一时间尺度阶段,搭建环境和智能体交互的马尔科夫决策过程的交互训练环境;在该过程的交互训练中,输入光伏、风机和负荷的预测数据,采用ddqn算法(double q network)进行离线训练无功优化离散动作策略;训练完毕,得到智能体oltc、cb和es的调https://www.xjishu.com/zhuanli/60/202110597000.html
15.曾真论大模型预训练数据的信息披露另一方面,数据缺乏时效性。模型通常是离线完成预训练后加载到系统中,在与用户交互时通常也不像搜索引擎那样联网寻找答案,因而信息的时效性欠缺;有的系统搭载了检索增强模块,允许模型访问特定的在线知识数据库,但当模型从多个来源聚合信息,结果可能还是从不同文档截取出部分合成一个仍有错误的回答。https://www.jfdaily.com/sgh/detail?id=1258325