当前位置: 首页 > 编程日记 > 正文

百变应用场景下,优酷基于图执行引擎的算法服务框架筑造之路!

作者| 阿里文娱高级专家 随方,

阿里文娱开发专家 轩成

责编 | 屠敏

头图 | CSDN 下载自视觉中国

背景

在阿里的业务中,有广泛的算法应用场景,也沉淀了相关的算法应用平台和工具:基础的算法引擎部分,有成熟的召回和打分预估引擎、在线实时特征服务;推荐算法应用领域,有算法实验平台TPP(源于淘宝个性化平台),提供Serverless形式的算法实验平台,包括资源弹性伸缩,实验能力(代码在线发布、AB分流、动态配置),监控管理(完善的监控报警、流控、降级)等能力,是算法在线应用的基石。

但在实际的算法应用业务中,比如优酷推荐业务,算法应用场景众多(100+活跃场景),需求灵活多变,如果没有一套通用业务框架,用于抽象出通用和定制化的部分来提高算法组件的复用度;会严重拖慢算法实验的节奏。基于图引擎的算法服务框架就是为了封装一套框架,抽象算法在线服务的通用算子,支持运行时的算法流程的装配,提升算法服务场景搭建的效率。

设计概览

算法推荐典型在线处理执行流程:多路粗排召回,合并,预估,打散策略。推荐服务根据用户的设备ID等其他必要信息进行多路并行召回,在召回引擎中进行粗排后,经过必要的过滤处理,截取一定数量的内容调用Rank引擎进行精排预估,预估结果经过一系列算法策略处理后输出最终结果。

整个过程中召回,合并,预估,打散等业务处理有并行处理,有串行处理,根据业务需要能够灵活配置。基于图的推荐业务执行引擎是运行在算法实验平台上的执行引擎,它的典型处理流程是:在AB实验分桶上,通过图形化交互页面配置数据源、业务算子的执行依赖关系,并配置每个算子的运行时动态参数。

系统总体结构如下图所示:分成五个主要的模块(图执行算子元件、图形化配置DAG、图配置动态解析、DAG图执行引擎、Debug调试)。

图:系统总体架构

当推荐请求到达时,引擎读取AB参数,根据参数上配置的算子信息创建算子实例,根据算子的依赖关系配置动态组装成可运行的DAG。根据条件分支配置,动态裁剪运行时的DAG实例,根据图运行占用最大线程数配置,动态调整线程复用。算子通过算法实验平台的底层协程池并行运行。

关键模块

1. 图执行算子元件

1)  数据集

在DAG图中流转的数据统一封装为DataSet数据集,数据集是结构化多行二维数据的封装,在数据集上封装便利的基础算子操作。

数据集上一系列处理操作基于Java的Stream API来进行处理,以此来达到集合处理的最好性能,将非Action操作延迟到最后数据处理时运行。

数据集支持同步数据和异步数据读取,通过异步数据读取方式,可以延迟数据的解析和避免IO的等待,在使用时才进行数据的解析。

2)数据源

将能够返回数据或者数据交互的二方服务封装为通用数据源,所有业务算子围绕数据源的数据进行业务开发,通用数据源包括召回数据集、在线算法需要的辅助数据集(如存放在KV内存存储的旁路召回数据、特征等数据)、打分预估结果集、内存数据源等等。

数据源的封装通过动态参数配置方式实现通用性和可扩展性。数据查询只需要修改配置即可实现数据获取,不需要开发代码。

3)基础算子

在DataSet数据集上封装的基本操作作为基础算子,比如Join、Union、Filter、Sort、Map、Collect等流式操作。在DataSet上重新封装Stream相关API,便于对DataSet进行流式处理。对于大多数非Action类操作,通过流处理API延迟处理。

4)业务算子

召回、预估、合并、打散、过滤等业务操作封装为业务算子,在业务算子中可以查询数据源,返回数据集后通过基础算子计算得到结果。最终业务图中执行单元为业务算子和数据源,业务图中通过对数据源和业务算子的依赖关系进行配置,表达业务逻辑。

2.   图形化配置DAG

算子实现代码上通过标注的方式声明算子可配属性的相关描述,比如属性名称、属性类型、描述、取值范围、是否必填等。图形化配置页面读取算子元数据识别算子可配信息在页面展现。通过拖拽的方式将算子组成DAG执行图,平台内部实现图配置和AB配置的互相转换和兼容,DAG图结构的保存同时会转换为AB键值配置并保存。同时支持配置实时刷新和算子元数据更新。通过分组的方式将大图拆分为多个子图,便于图展现和维护。

图:图形化配置

3.   配置动态解析和优化

1)  根据AB配置实时变更图执行结构

图引擎在运行时为了减少解析图结构的耗时,将图结构进行了缓存,在AB配置更新时需要实时反映到图引擎中,所以根据图配置的哈希值校验的方式检测图配置是否更新,图结构变更后会重新创建引擎实例。

2)子图并行线程优化

在DAG执行时,所有算子都交给线程池异步运行,但是在大多数情况下子图可能是一个顺序执行图,不需要并行,不应该占用其他线程,所以在图执行时,动态根据依赖关系识别节点是否需要占用新线程运行。

3)条件分支动态裁剪

如果图结构中存在条件节点,会根据条件节点的动态结果裁剪后续图节点的运行。如果一个图节点的执行条件为否,后续单独依赖它的节点都不会运行,条件节点具备传递性。如果后续节点不单独依赖不运行的节点,则当前节点可运行。

4.   DAG图执行引擎

1)  并发控制

通过图中依赖关系自动解析节点需要通过并行还是串行执行,最大程度复用线程,减少线程切换带来的开销。图执行过程中,并不是线程开的越多越好,在图中可以配置最大并发线程数来控制图的最大并发度,防止并行过多造成开销过大。

2)超时控制

通过整个图上配置超时时间来控制图的超时,根据业务粒度,会将子业务配置为子图,从而通过控制子图的超时时间来控制子业务的超时时间。

3)异步化执行

算子在图中的运行是全异步化的,算子之间通过Reactive模式进行依赖触发。

4)通过协程优化异步执行

AliJDK支持协程,在JVM层面可以将线程优化为协程执行。让用户的代码能够轻量级地分配到多个核上充分利用机器资源,同时遇到阻塞逻辑,也能够通过运行时主动挂起任务,将线程让出给队列中的任务。

DAG运行依赖线程池运行,算法实验平台提供了基础线程池,并同时将线程池在JVM内部优化为协程,通过压测比对,在IO阻塞逻辑比较多的情况下,协程池的性能要优于普通线程池。

5.   Debug调试

1)  线程调用树

在所有算子运行时都会通过性能分析工具在最小影响执行性能的情况下记录节点的耗时时间,通过组装为调用树的形式进行输出,在整个请求超时情况下,输出到对应日志,便于性能和问题分析。

2)Debug

在开发时会用到本地调试能力,通过开发SDK本地运行代码,同时将并行图改为串行运行方便本地调试。

3)日志信息

在图框架运行时会捕捉算子运行异常等信息,通过日志文件和统计Counter的方式进行输出,在页面进行报表呈现和监控。

典型业务应用

1.   典型串行图化改造

以推荐场景的简单业务逻辑举例,通过图化执行提高业务算子并行度,降低延时。

图:典型串行图化改造

在图架构之前,模块的封装都以串行逻辑运行,其中会存在一些可并行优化的处理逻辑。比如在播放过滤和内容池过滤部分,内容池的查询和播放内容的查询本身是不相关,没有直接依赖,是可并行执行的操作。在串行编码情况,实际执行逻辑维持串行逻辑。

通过图化改造后,将查询内容池部分和查询播放内容部分提取为算子,在图中并行执行,被过滤算子依赖,这样可以最大程度的并发执行,充分利用CPU,减少执行延时。

2.   典型业务执行图

以推荐典型业务场景为例,对整个图进行分解。

图:典型业务执行图

业务大图:包含多路召回,后续通过模型混排合并、打散、策略执行返回最终结果。

分支子图:单独一路召回子图中,包含了不同类型的召回,通过过滤、排序、策略合并得到单路结果。

DataSet:策略合并算子会基于图中流转的数据集,使用数据集包装的基本API进行数据集的访问操作。

基础数据源:业务算子中通过封装的通用BE、iGraph、Tair等数据源接口查询或写入数据。

通过业务子图、基础数据集、基础数据源等层面的将业务进行分解,基础数据集API和通用数据源算子和业务无关,业务层通过使用基础API进行业务算子实现和依赖组成最后业务逻辑图。最终达到业务层、基础层的复用。

总结&展望

基于图引擎的算法服务框架建设,通过抽象算法业务的通用组件,提供图形化流程编排工具和图执行引擎,实现了0代码、配置化支持算法业务需求。为快速的算法应用,不断提升用户的个性化服务打下了坚实基础。对推荐、搜索、广告等算法应用业务有参考价值。

接下来,为了进一步提升引擎性能,我们将在构图优化和引擎执行性能上做优化,在保持业务表达灵活简洁的同时,追求更优的执行性能。

推荐阅读
  • 重构ncnn,腾讯优图开源新一代移动端推理框架TNN

  • 墨奇科技汤林鹏:如何用 AI 技术颠覆指纹识别?

  • 性能超越最新序列推荐模型,华为诺亚方舟提出记忆增强的图神经网络

  • 研发的未来在哪里?Serverless 云开发来了!

  • 真惨!连各大编程语言都摆起地摊了!

  • 国外小伙怒喷加密货币行业:入行两年,我受够了!

你点的每个“在看”,我都认真当成了AI

相关文章:

Attach Volume 操作(Part II) - 每天5分钟玩转 OpenStack(54)

上一节我们讨论了 attach volume 操作中 cinder-api 的工作,本节讨论 cinder-volume 和 nova-compute 如何将 volume attach 到 Instance。cinder-volume 初始化 volume 的连接cinder-volume 接收到 initialize_connection 消息后,会通过 tgt 创建 targe…

关于DataGrid等控件中的自动编号

作者&#xff1a;未知 请作者速与本人联系序号内容1Taye2BOx3Glass4StarCraft一、正序A、AllowPagingFalse情况下<asp:DataGrid id"DataGrid1" runat"server"> <Columns> <asp:TemplateColumn> <ItemTemplate> …

45个优秀的国外电子商务网站设计实例

这篇文章与大家分享45个国外优秀的电子商务网站设计案例&#xff0c;希望能带给你灵感。对于电子商务网站来说&#xff0c;也许销售更多产品比漂亮的外观设计更重要&#xff0c;不过漂亮的东西总是能给用户留下深刻的印象&#xff0c;一起欣赏。 TALBOTS Free People Armani Ex…

曝光!十万开发者喜爱的顶级当红讲师

作为一枚后浪程序员&#xff0c;在互联网时代下我们拥有巨大优势&#xff1a;知识的时间空间界限被打破&#xff0c;让我们有机会学习到前沿技术知识。以往&#xff0c;大部分程序员都是是通过传统的博客文章、参与线下会议等形式来获取最新知识&#xff0c;而 CSDN 推出的在线…

连接centos7桌面方法

方法一&#xff1a; 第一步$sudo yum install tigervnc* 第二步$vncserver&#xff08;提示输入连接密码&#xff09; 第三步关防火墙或开5901..等端口 第四步vncview连接 方法二&#xff1a; 下载nomachine https://www.nomachine.com/download/linux&id1rpm &#xff0d;…

让“云”无处不在-Citrix Xenserver之一 环境搭建

让“云”无处不在-Citrix Xenserver 一、准备部署环境 马博峰 2011年8月 ——————————————————————————————————————— 一、Xenserver介绍 Citrix XenServer 是一个完整的服务器虚拟化平台&#xff0c;已针对 Windows 和 Linux 虚拟服务器…

DataGrid/DataList

很久以前就想写一些关于DataGrid/DataList的东西&#xff0c;但是一直以来&#xff0c;一方面自感所学未深&#xff0c;另一方面&#xff0c;总觉无从下笔&#xff0c;一拖再拖&#xff0c;离刚开始的念头已距一年有余。DataGrid/DataList在ASP.NET中的重要性&#xff0c;想必就…

京东姚霆:推理能力,正是多模态技术未来亟需突破的瓶颈!

受访者 | 姚霆&#xff0c;京东 AI 研究院算法科学家记者 | 夕颜来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;21 世纪&#xff0c;没有谁不知道电商&#xff0c;工资可以不发&#xff0c;但是每个月不网购几单&#xff0c;那是不可能的&#xff01;打开熟悉的购…

[转]C#网络编程(异步传输字符串) - Part.3

本文转自&#xff1a;http://www.tracefact.net/CSharp-Programming/Network-Programming-Part3.aspx 这篇文章我们将前进一大步&#xff0c;使用异步的方式来对服务端编程&#xff0c;以使它成为一个真正意义上的服务器&#xff1a;可以为多个客户端的多次请求服务。但是开始之…

【百度地图API】——如何用label制作简易的房产标签

摘要&#xff1a; 最近&#xff0c;API爱好者们纷纷说&#xff0c;自定义marker太复杂了&#xff01;不仅定义复杂&#xff0c;连所有的dom事件都要自己重新定义。有没有快速简易创建房产标签的方法呢&#xff1f; 答案当然是有的啦~ 我们可以利用label嘛&#xff01; --------…

李洪根关于[SQL]对于分页存储过程

作者&#xff1a;李洪根 微软MVP1。我个人认为最好的分页方法是: Selecttop10*fromtablewhereid>200写成存储过程,上面的语句要拼一下sql语句,要获得最后大于的哪一个ID号2。那个用游标的方式,只适合于小数据量的表,如果表在一万行以上,就差劲了你的存储过程还比不上NOT IN…

避不开的算法,如何吃透?

作者 | Alekya Ragipally译者 | 弯月&#xff0c;编辑 | 屠敏题图 | 自东方 IC出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;当你使用搜索引擎&#xff08;例如Google Chrome、Mozilla Firefox等&#xff09;的时候&#xff0c;后台发生了什么&#xff…

CentOS 6.4下PXE+Kickstart无人值守安装操作系统

一、简介1.1 什么是PXEPXE(Pre-boot Execution Environment&#xff0c;预启动执行环境)是由Intel公司开发的最新技术&#xff0c;工作于Client/Server的网络模式&#xff0c;支持工作站通过网络从远端服务器下载映像&#xff0c;并由此支持通过网络启动操作系统&#xff0c;在…

Asp.NET中常用的一些优化性能的方法

ASP.NET 的缓存机制相比ASP有很大的改进&#xff0c;本文档除对常用优化方法进行总结介绍外&#xff0c;强调了如何使用ASP.NET的缓存来获得最佳性能。1&#xff1a;不要使用不必要的session 和ASP中一样&#xff0c;在不必要的时候不要使用Session。可以针对整个应用程序或者页…

不信你看!这次Python和AI真的玩儿大了!!

这是一个很难让人心平气和的年代。不少人都想学 AI&#xff0c;总担心自己学不会&#xff0c;学不懂&#xff0c;或者学的课不是只教Python&#xff0c;就是缺少项目实战。最终都是浅尝辄止&#xff0c;不了了之&#xff01;我每天在公众号后台收到上千条类似的留言&#xff1a…

【引用】在Eclipse中将java Project转换成Dynamic Web Project

编辑工程的.project文件&#xff1a; 添加 <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> <nature>org.eclipse.jem.workbench.JavaEMFNature<…

mysql之字符编码问题

mysql编码分为服务端编码和客户端编码两大类字段编码, 表编码, 数据库编码这些编码都属于服务端编码,服务端编码决定你可以存哪些字符以及这些字符要哪种规则排序.字段编码优先级最高. 你插入用什么码属于客户端编码, 你用什么客户端编码都无所谓,只要插入前加个命令set names …

关于GCN,我有三种写法

作者 | 阿泽来源 | 阿泽的学习笔记&#xff08;ID: aze_learning&#xff09;本篇文章主要基于 DGL 框架用三种不同的方式来实现图卷积神经网络。DGL简介DGL&#xff08;Deep Graph Library&#xff09;框架是由纽约大学和 AWS 工程师共同开发的开源框架&#xff0c;旨在为大家…

CentOS5快速搭建vsftp服务

既然强调快速, 我们就马上开始&#xff0c;环境是centos5安装vsftpd&#xff0c;用了半天做了测试与修改&#xff0c;终于完成。 第一步&#xff1a;安装vsftpd&#xff0c;在终端允许 # yum -y install vsftpd 没什么问题就直接安装好啦 第二步&#xff1a;编辑vsftpd的配置…

我和freelancer不得不说的故事5 --- 心理落差

我和freelancer不得不说的故事5 --- 心理落差 我下海之前所在的外企&#xff0c;是一家顶级知名IT企业&#xff0c;其SAP咨询服务业务规模和影响都很大&#xff0c;是SAP咨询界五大咨询公司之一。我从07年加入这家公司&#xff0c;到辞职下海&#xff0c;在这家公司工作8年半。…

一起谈.NET技术,asp.net控件开发基础(18)

本篇继续上篇的讨论&#xff0c;可能大家已经在使用asp.net2.0了,DataSource属性不再使用,而是跟数据源控件搭配使用.现在讨论的绑定技术都是基于1.1版本,先熟悉一下,本质上是一样的,这样一步步的学习.对以后绝对有帮助.因为当你使用数据源控件,只需要设置一个DataSourceID,方便…

使用sqlserver来存放和取得session

asp.net 提供了三种存放 session的方式。 1 InProc 2 State Server 3 SQL Server 第一种是我们经常用的&#xff0c;第2中就是使用一个名为 state server 的机器用它的内存来存放其他机器的session 状态&#xff0c;其实&#xff0c;我们还可以在 sql server 里面来存放和取…

五项挑战获四项第一,地平线霸榜Waymo自动驾驶算法挑战赛

美国当地时间6月15日&#xff0c;Alphabet&#xff08;Google母公司&#xff09;旗下的自动驾驶公司Waymo在CVPR 2020自动驾驶Workshop上揭晓Waymo开放数据集挑战赛的结果&#xff0c;边缘AI芯片企业地平线斩获5项挑战中的4项全球第一。 本次挑战赛&#xff0c;Waymo开放了其自…

SSO单点登录基于CAS架构封装 Memcached 实例

2019独角兽企业重金招聘Python工程师标准>>> SSO认证中心是CAS整个应用架构的一个极其重要的关键点&#xff0c;必须满足如下两点要求&#xff1a; 1.高可用&#xff0c;不允许程序发生故障。如果认证中心发生故障&#xff0c;整个应用群将无法登录&#xff0c;导致…

HTMLButton控件下的Confirm()

作者&#xff1a;未知 请作者速与本人联系一、前言在ASP.NET中大部分如删除等一些动作为了友好都为添加confirm()来弹出消息框进行提示&#xff0c;但是HTML控件和WEB控件是否使用的方法是一样的呢?二、方法A. System.Web.UI.WebControls.Button控件现在一般都是这样在Page_…

Python 还能实现哪些 AI 游戏?附上代码一起来一把!

作者 | 李秋键责编 | Carol头图 | CSDN 付费下载自视觉中国人工智能作为当前热门在我们生活中得到了广泛应用&#xff0c;尤其是在智能游戏方面&#xff0c;有的已经达到了可以和职业选手匹敌的效果。而DQN算法作为智能游戏的经典选择算法&#xff0c;其主要是通过奖励惩罚机制…

一起谈.NET技术,专访微软MVP衣明志:走进ASP.NET MVC 2框架开发

日前微软已经发布ASP.NET MVC 2框架RC版&#xff0c;究竟这次RC版本的发布对于WEB开发者带来怎样的改变&#xff1f;以及未来ASP.NET MVC 2正式版还会有哪些改进&#xff1f;带着这样的问题&#xff0c;我们51CTO记者彭凡专门采访了微软MVP衣明志老师。ASP.NET MVC是微软官方提…

Entity Framework:Code-First Tutorial开篇

这个系列文章是关于Entity Framework Code-First的英文系列文章&#xff0c;内容不错&#xff0c;每篇一个主题知识点介绍&#xff0c;特转载过来 原文地址&#xff1a;http://www.entityframeworktutorial.net/code-first/entity-framework-code-first.aspx转载于:https://www…

Android开发者指南(22) —— Accessing Resources

前言   本章内容为Android开发者指南的Framework Topics/Application Resources/Accessing Resources章节&#xff0c;译为"资源调用"&#xff0c;版本为Android 3.2 r1&#xff0c;翻译来自&#xff1a;"CodeGuy"&#xff0c;欢迎访问他的博客&#xff…

如何快速实现HTML编辑器.NET组件

作者&#xff1a;未知 请作者速与本人联系得到“素材”首先我们需要得到一个HTML编辑器的原始代码&#xff0c;网上有不少这类的编辑器&#xff0c;如大名鼎鼎的RichTextBox&#xff0c;为了避免版权纠纷&#xff0c;以我所做得为例&#xff08;暂名&#xff1a;UltraTextBox…