[EuroSys2023 Best Poster] 面向动态图的极低时延GNN推理采样服务

news2024/11/23 0:25:32

作者:沈雯婷

GraphLearn是阿里云机器学习平台PAI 团队和达摩院智能计算实验室图计算团队共建的工业界大规模图神经网络训练框架, 也是一站式图计算平台GraphScope的图学习引擎。GraphLearn最新开源了面向动态图的GNN在线推理实时采样服务(DGS)。DGS具备处理实时高吞吐图更新的能力,并能保证低时延、高并发的推理采样查询处理。其图更新和采样查询的性能在分布式环境下线性可扩展。近期,GraphLearn团队和浙大联合发表的《Dynamic Graph Sampling Service for Real-time GNN Inference at Scale》被评选为EuroSys2023 best poster。

image.png

Poster地址:https://2023.eurosys.org/docs/posters/eurosys23posters-final40.pdf
开源项目地址: GraphLearn, GraphScope

背景介绍

GNN模型通过图结构表征高阶邻域信息,在大规模工业落地中,一种常用的训练方式是通过邻域采样的方式来降低通信和计算的开销,从而获得分布式的扩展性。与此同时,在推荐、金融反欺诈等真实业务场景中,图的结构和属性往往会随着时间动态变化,GNN模型需要能实时采样并表征这些邻域的动态信息。

由于在线学习容易造成模型的抖动,在实际生产应用中,模型的部署也通常需要经过复杂的生产链路,因此一般采用近线模型进行部署,为了让GNN模型能够实时表征邻域信息,在GNN模型的推理过程中,需要通过实时的采样图结构和属性来进行实时推理

为保证用户体验,这种实时推理的任务具有极低时延的需求,留给采样查询的时延空间非常小。同时,由于工业大图的数据规模和在线推理服务的QPS往往超出单机的存储和计算能力。因此,我们需要提供一个在大规模的动态图上保障极低时延的面向GNN模型推理的实时采样服务(P99在20毫秒以内),并具备在分布式环境下线性扩展的能力。

挑战

实时图采样服务的直观做法是维护一个动态图的存储和查询模块,在推理请求到达时对请求的点进行邻居采样计算和属性收集,采样计算得到的样本作为模型服务的输入进行推理。但是图数据的分布和推理采样的负载特性,导致这种直观的做法难以在分布式的动态图上实现稳定的低延时采样,具体地,存在以下挑战:

  1. 邻居采样需要遍历所有的邻居,并且随着图的动态变化,邻居不断变化,难以保证复杂的采样计算的低时延,超点的存在也造成了时延的不稳定。
  2. 由于图数据分布存在不均衡的特点,各个图分片上的存储和计算负载分布不均,造成采样延时的不稳定,也为分布式下线性扩展带来挑战。
  3. 推理采样一般为多跳采样,并且需要收集顶点或边上的动态属性,在分布式图上,多跳采样和属性访问带来的网络和本地I/O开销,对时延造成很大的影响。

关键设计

与一般图数据库的负载不同,动态图推理采样服务在服务于一个给定的模型的在线推理时,其对应的图采样具有固定的pattern。如一个常见User-Item,Item-Item二部图上的GraphSAGE模型,这个图采样的pattern一般是对于请求的用户ID(feed_id),根据时间戳作为概率采样它最新2个最新购买的商品,对这2个商品采样他们相关系数最高的2个商品。用GraphLearn提供的GSL(Graph Sampling Language)表达成如下Query:

image.png

图1: 二跳采样Query

这种固定pattern的Query,给大规模的动态图采样提供了稳定的低延时服务的机会。

DGS系统设计的关键点:

  1. 存算分离和感知Query的Cache

DGS将图存储和采样计算进行分离。采样计算一般是指随机采样,最新邻居采样(topk timestamp),或通过边权重(或边timestamp)做概率分布采样。前两种采样的时间复杂度为O(1),概率分布采样通常使用Alias Method实现,在动态图中变化的概率分布上需要反复计算Alias Table,其时间和空间复杂度均为O(N), 其中,N为顶点的邻居数,并不断发生变化。与图存储的简单读写不同,图采样过程包含存储的读写与复杂的计算,因此我们首先将存储和计算进行分离,并且在计算侧,系统预先将服务的特定Query所需要访问的数据cache起来,以提升图采样计算的空间局部性。

  1. Event-driven预采样

为了加速采样请求的响应,DGS将每个顶点的采样计算从请求输入的时刻提前到图更新事件发生的时刻,利用空间换取时间,使得采样请求发生时仅需要完成点查。同时,为了降低图更新事件从发生到样本生成之间的staleness,DGS采用流采样的方式,通过带权重的蓄水池采样算法,在每个更新到达时,根据预安装的Query,进行流式采样。这种图更新事件驱动的采样前置的方式,使得对每个顶点的图数据存储空间和计算时间都变成了常数*O(K),其中K为蓄水池大小。通过将图采样计算的结果预先存储在cache中解决了挑战1中的问题。

  1. Multi-hop拆解和Lazy拼接

至此,DGS解决了输入顶点的实时一跳采样。然而DGS主要服务于多跳采样,以二跳采样为例,输入顶点的一跳结果更新后,对应的二跳结果也需要更新(同时更新收集的属性)。在跳数更多的情况下,这种连锁反应造成的指数级增长的读写开销,对采样请求的时延产生巨大的影响。DGS解决该问题的方式是根据预安装的Query,将图采样按照每一跳进行拆解。对于每一跳采样,对图中对应顶点类型的所有顶点进行对应的流式预采样和存储。例如,图1中的Query可以拆解位图2所示,结合Event-driven预采样,每个顶点对应的样本在蓄水池中存储和更新如图3所示。

并且,DGS将多跳样本的拼接推迟到对应的推理采样请求发生的时刻(Lazy拼接),以避免提前拼接后持续更新。

image.png

图2: 二跳采样Query拆解

image.png

图3: Event-driven更新

  1. 订阅-发布机制

我们将多跳的拼接延迟到请求发生的时候,然而,多跳结果往往存储在不同分片上,跨机通信带来了大量的网络通信开销。因此,DGS设计了一套订阅-发布机制,即将请求的id根据特定的分片算法路由到对应的服务机器上,该机器上订阅这些id和它的多跳邻居的更新。随着邻居关系的改变,订阅表也不断更新。

  1. 读写隔离

根据以上的系统设计,当采样请求发生时,DGS将它路由到指定worker,进行本地的查询即可获得多跳采样结果。为了优先保障读的latency,同时保证写的staleness,DGS在调度读写task时进行优先级调度。同时,在系统架构上,将频繁计算和更新存储(写)的任务和响应采样请求(读)的任务放在不同的机器上,进行读写的隔离。

系统架构

DGS系统的核心组件架构如下图所示,主要为Sampling Worker和Server Worker组件。

图4: DGS系统核心架构

图4: DGS系统核心架构

图更新根据Key(例如顶点ID)分片发给Sampling Worker的对应分区。每个Sampling Worker负责特定的分区:进行一跳预采样并将结果发给Serving Worker。每个Serving Worker缓存从Sampling Worker接收到的K个一跳查询的采样结果,并响应全图中某一特定分片的顶点的推理采样请求。

Sampling Workers和Serving Workers可以独立的进行弹性扩缩容,以应对图更新和推理请求的负载变化。为了让生成完整K跳采样结果的延迟最小化,DGS将顶点 V i V_{i} Vi的所有K跳采样结果提前发送给响应 V i V_{i} Vi推理请求的Serving Worker,使得K跳图采样计算转化为仅需要访问Serving Worker上本地缓存的操作。为了实现这一点,每个Sampling Worker维护每个一跳查询的订阅表,记录订阅一跳查询结果的Serving Worker列表。例如,将顶点

V j V_{j} Vj V i V_{i} Vi的一跳样本中增删会触发消息来将该事件发送到包含 V j V_{j} Vj的分区的Sampling Worker,并相应地更新 V j V_{j} Vj的订阅信息。

通过这种设计,DGS可以在高并发的推理采样的负载下,表现出非常稳定的延迟性能。

性能

在真实的阿里巴巴电子商务数据集上进行的实验表明,DGS可以将推理请求 (两跳随机采样查询)的P99延迟保持在20ms毫秒之内,单个Serving Worker的QPS约20,000,并可以线性扩展。图数据更新的吞吐达到109MB/s,也同样可以线性扩展。

image.png

图5: 实验配置和性能数据

结语

本文对DGS进行了技术解读,介绍了DGS核心模型的设计思路。实际上,DGS作为服务还包含了服务拉起模块、高可用模块、数据加载模块,以及和模型服务对接的客户端,借助DGS,用户可以基于实时变化的图结构和特征来推理得到最新的图表征。我们提供了一个端到端的基于GraphLearn的训练、模型部署和基于DGS在线推理的tutorial,欢迎试用!更多细节请参考源码和技术文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

端口占用解决报错:Web server failed to start. Port 8080 was already in use.

报错信息如下: Description: Web server failed to start.Port 8080 was already in use. Action: Identify and stop the process thats listening on port 8080 or configure this application to listen on another port. 当idea项目启动时报这个错,意思是端…

2019年一月联考逻辑真题

2019年一月联考逻辑真题 三、逻辑推理:第 26~55 小题,每小题 2 分,共 60 分。下列每题给出的 A、B、C、D、 E 五个选项中,只有一项是符合试题要求的。请在答题卡上将所选项的字母涂黑。 真题(2019-26&#…

【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——链表,基本上你每一段代码都可能会用到

链表解决了顺序表插入或删除元素麻烦的问题,链表的存储结构是用一组任意的存储单元来存放线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。 对每个数据元素ai,除了存储其本身的信息之外,还需存储一个指…

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这…

港联证券投资前瞻:新能源汽车再迎助力 科技巨头持续加注机器人领域

上周五,A股主要股指全线走高,沪指涨近1%,上证50指数涨近2%。截至收盘,沪指涨0.79%报3230.07点,深成指涨1.5%报10998.08点,创业板指涨1.22%报2233.27点,上证50指数涨1.73%;两市合计成…

圆梦,终于进阿里了,分享面试题

前面我说过:能去大厂就去大厂,有机会就去争取,年纪轻轻的,多努力就完事了。 总有黑粉怼我:进大厂哪有你说的那么简单,呵呵…… 我笑而不语,你自己都不相信自己,还怎么进&#xff1…

在 Python 中为对象添加属性

我们将介绍如何在 Python 中为对象添加属性。 我们还将通过示例介绍如何在 Python 中更改对象的属性。 在 Python 中为对象添加属性 在 Python 中,我们时常使用对象,因为 Python 是一种面向对象的语言。 对象使我们的代码可重用并易于实现复杂的结构。 …

《MySQL(二):基础篇- SQL》

文章目录 2. SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2.3.2.2 表操作-数据类型2.3.2.3 表操作-案例2.3.2.4 表操作-修改2.3.2.5 表操作-删除 2.4 图形化界面工具2.4.1 安装2.4.2 使用 2.5 DML2.5.1 添加数据2.5.2 修改数据2.…

MySQL数据同步到ES的4种解决方案

一、背景 大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢&…

[2.0快速体验]Apache Doris 2.0 弹性计算节点快速体验

​1. 概览 我们都知道Doris 目前是一个典型的Share-Nothing的架构,Doris 通过绑定数据和计算资源在同一个节点获得非常好的性能表现. 但随着Doris 计算引擎性能持续提高, 越来越多的用户也开始选择使用Doris直接查询数据湖数据. 这类场景是一种Share-Disk场景, 数据…

Vue.js 中的模板编译原理是什么?

Vue.js 中的模板编译原理是什么? Vue.js是一种流行的前端框架,它使用了一种称为“模板”的技术来实现视图的渲染和更新。在Vue.js中,模板是一种类似HTML的语言,用于描述视图的结构和内容。但是,Vue.js并不直接将模板转…

【web框架】——Django01——如桃花来

目录索引 web框架介绍:常见软件的架构:*CS架构:**BS架构:* 网络通信:socket知识复习:*服务端代码逻辑:**客户端代码逻辑:* socket代码演示:*服务端代码演示:*…

【学习记录】win10 + ubuntu 22.04双系统安装

一、背景 因为家里的台式(Windows 10)最近一直频繁蓝屏,再加上Win10之前经常性的资源管理器未响应,对Windows系统逐渐失去了信心,于是想着安装稳定性较好的Linux。以前抵触Linux是因为其人机交互界面没Windows那么直观…

今天来当一下数据库,看一下sql到底在里面如何执行的?

今天来当一下数据库,看一下sql到底在里面如何执行的? 一、引子 不管是开发,还是运维,亦或者是产品。 多多少少会写sql,只不过有的人写得多,有的人写得少罢了。 但是你有想过,在数据库中&…

ASCII 码对照表

1. ASCII码表(控制字符) 2. ASCII码表(打印字符) 3. ASCII码表(扩展字符)

不要藏着掖着了,600万用户已经使用“Excel新版本”,统统拿走

600万用户正在切换 已经2023年,就不用再藏着掖着了,目前已经有600万用户开始使用了。 没错,“Excel新版本”已经开始普及了,正在大面积替代切换,不仅Excel用户能用,Access用户照样可以轻松玩转&#xff0…

VBA中如何调用自定义函数

一、问题提出 在VBA中我要把B列中所有的非空单元格的值都判断一遍,如果大于60就在其旁边的单元格写入"及格",反之就写入不及格。如下图所示: 由于B列的非空单元格数量无法确定,所以我们就要定义一个自定义的函数来获取…

【Qt】delegate的自定义实现函数createEditor进不去【2023.05.07】

摘要 妈卖批,因为这个函数进不去,emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。 1.正确✔: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) cons…

DCASE挑战赛中的声音事件检测与定位(SELD)子任务介绍

DCASE(Detection and Classification of Acoustic Scenes and Events)系列挑战赛包含多个与声音计算相关的子任务,以DCASE2023为例,其包含如下七个与声音计算相关的任务。 (source:DCASE challenge website) 声音事件…

ChatGPT配合两款神器,1分钟生成流程图

流程图,工作上再正常不过的一种图形,常见制图方法对比: 传统手动制图:耗时耗力,迁移性差AI 辅助制图:使用自然语言提出需求,零基础快速制图 几款常见的我在用的在线绘图工具推荐: Pr…