阿里大规模图学习平台 GraphLearn 在推荐召回、安全风控等场景的应用
分享嘉宾:艾宝乐 阿里巴巴 高级开发工程师
编辑整理:王帅 金山云
出品平台:DataFunTalk
导读: GraphLearn是面向大规模图神经网络(Graph Neural Network,GNN)的研发和应用而设计的 大规模 、分布式训练推理一体化图学习平台。它从工业应用场景出发,提炼和抽象了一套适合于当下图神经网络模型的编程范式,实现了 采样优化 、 稀疏场景模型优化 、针对PyTorch的GPU加速 ,并已经成功应用在阿里巴巴内部以及若干互联网公司的如 推荐召回 、安全风控等场景。
今天的分享将从下面四方面展开:
- 平台介绍
- 系统优化
- 应用案例
- 在线推理
01 平台介绍
1. GraphLearn—工业级大规模图学习平台
工业场景中的图具有大规模(边可到千亿级别)、异构(不同点边类型多)、属性丰富(点和边Float、标签属性等)的特点,常见的TensorFlow和PyTorch无法直接处理此类图,而传统的图处理和计算引擎欠缺自动微分能力。
GraphLearn将图引擎(Graph Engine)和张量引擎结合起来,一方面,图引擎具有鲁棒性(容错、动态伸缩)、高效性(存储、采样等)特点,通过基于内存的分布式存储和RPC, 能够高效处理大规模图数据,并封装了python接口和类似gremlin的GSL接口提供图采样、特征查询等操作,通过这些操作从大图里采样子图并且组织成EgoGraph或者SubGraph格式。另一方面,基于TensorFlow/PyTorch等深度学习引擎抽象和实现了数据转换和处理模块,常见卷积层和模型,提供用户友好兼具灵活性的算子。基于上述设计,面向工业场景设计的大规模图学习平台GraphLearn,可以有效降低 GNN 应用研发的成本。
2. GraphLearn拓扑和****特征存储
( 1 ) GraphLearn****拓扑:
①图较大时,由于单机无法存储,将图进行切分。
②图切分含多种,默认邻接矩阵的行切分,可保证:
- 一跳邻居存储于本地;
- 多跳通过热点缓存,减少跨机通信。
(2) 特征存储:
- Src点和dst点映射,本地index。
- 基于本地index,构建连续点特征表,保证高效存储。
- 图的拓扑以邻接表的形式存储,支持存储边的权重、标签、属性等。
- 构图时,会对邻接表按照边权重预先排序,基于权重的topK大小进行采样,时间复杂度为O(1)。
3. GraphLearn采样实现
由于图是分片存储,并非所有跳的存储全部在本地,需要RPC的调用。采样的执行逻辑是分布式的。
- 基于Partition算法,通过映射表,获取输入节点的邻居存储所在Server;
- 在本地Server采用Alias方法进行采样;
- 按照原顺序将本地采样结果进行拼接,输出采样结果。
上述采样执行逻辑是Op执行的一种实现,整体Op执行逻辑类似,当接到请求,进行Partition,在server端执行后,进行stitch,得到完整的结果。同时,允许用户执行自己的Op,如出入度的查询等。
GraphLearn的采样实现特点:
- Alias Method O(1)时间复杂度
- 边权重预排序
- 多种采样策略:Topk, random, edge_weight, in_degree
4. GraphLearn GNN模型范式
GNN通常分为MiniBatch训练和FullBatch训练,考虑到工业场景下大规模图的训练效率,GraphLearn采用的是MiniBatch方式进行训练。具体地,GNN训练流程包括子图采样、特征预处理以及消息传递。
(1) 子图采样
- 从输入大图的样本中,采样到节点及其邻居,构建成子图;
- 支持固定个数邻居的采样,抽象为EgoGraph的形式;
- 在v0.4版本:EgoGraph:root点称之为Ego;某一跳的邻居个数固定;不同跳数的邻居个数可以不同;形成了dense格式的采样树状子图,可以应用dense的算子,更高效。
- 在1.0版本:开始支持类似PyG的数据组织格式,包含子图拓扑edge_index和点特征node_feature,适合更加一般的子图表示。
(2) 特征预处理
- 原始特征多样,如用户统计特征、标签特征等;
- 类型包括int、Float、string;
- 工业场景特征较复杂,特征处理模块较重要,会影响后面的模型效果。
(3) 消息传递
- EgoGraph based: 在v0.4版本里,主要考虑类似GraphSAGE的聚合方式,基于dense格式的EgoGraph构建,计算图为树结构。
- SubGraph based: 更加general的Message Passing。
5. GraphLearn架构
GraphLearn的架构从下至上为:
(1) 图引擎和NN引擎层
- 分布式图存储和查询引擎。
- 兼容常用深度学习框架,支持TensorFlow和PyTorch。
(2) 数据层
- 提供简洁灵活的数据预处理,如FeatureColumn和FeatureHandler对原始数据进行转化。
- Dataset,可以将采样的子图组织成EgoGraph或SubGraph的形式。
(3) 网络层: 封装常用图卷积层,支持异构图.
(4) 模型层
- 实现常见GNNs, KG等算法。
- 支持自定义算法。
6. GraphLearn GNN训练链路
GraphLearn中GNN的训练链路如下图,用户在准备好点、边数据后,基于GraphLearn进行Graph构建,其次通过GSL(如采样)产生样本流,进行点、边特征处理后构建GNN模型,定义损失函数进行训练、预测,最后导出模型/向量。
7. GraphLearn—分布式图学习平台
( 1 ) GraphLearn****功能
- 支持百亿边、十亿点规模图
- 支持异构图、属性图、有向图、无向图
- 支持多种采样、负采样策略
- 高效的多线程异步采样
- 支持多种数据源(ODPS, OSS, HDFS)
- 支持多种GNN算法:GraphSAGE, GCN,GAT, Bipartite-GraphSAGE, RGCN, UltraGCN等
- 支持Tensorflow1.x和PyTorch / PyG
- GPU训练优化(即将开源)
- 在线推理(即将开源)
- Temporal GNN(开发中)
GraphLearn开源地址:https://github.com/alibaba/graph-learn
GraphLearn文档地址:https://graph-learn.readthedocs.io/zh_CN/latest/
系统优化
1. 采样优化
(1) 图采样
图采样就是从大图中采样一个子图,并做必要的数据对齐,以满足深度学习迭代训练的需要。
① 图采样大致包含几类 :
- 遍历型(Traverse),从图上获取一个batch的点或边数据;
- 关系型(Neighborhood,Subgraph),获取点的N跳邻域并生成由点构成的子图,用于构造训练样本;
- 负采样(Negative),与关系型相对,一般用于无监督训练场景,产生负例样本。
② 问题: GNN****训练采样和特征查找成为瓶颈(耗时占比大)
- 采样抽象为query,采用DAG进行并行执行
- 基于Actor的无锁纯异步调度和训练过程pipeline
- Gremlin-like language
g.E("u2i").batch(64).alias('edge').outV().alias('src');
遍历“加载到图中的u2i数据”,batch size为64,命名为“edge”,输出边的源顶点,命名为“src”。
2. 稀疏场景GNN模型优化
在稀疏场景下,GNN模型优化主要从性能和效果两方面进行优化。
(1)性能优化
- AdamAsync Optimizer,加速梯度更新;
- 输入string特征进行hash压缩存储,减少通信和存储;
- Embedding 融合,高性能embedding lookup。
(2)效果优化
- 高质量边生成方法
- Batch-share 负采样 + Softmax CE损失函数
- Embedding Normalization
3. gl_torch:针对PyTorch的GPU加速
鉴于越来越多的用户选用PyTorch进行训练,由于GraphLearn底层的数据结构与PyTorch的不同,数据转换的开销较大,因此我们针对PyTorch的训练进行了进一步优化。
GNN训练的典型流程如下图:
1.一个batch的输入样本的原始数据;
2.K-Hop采样(在不同机器采样,网络开销高);
3.构建子图数据(拓扑和特征);
4.将数据copy到GPU中进行训练;
5.模型训练得到GNN模型。
[OSDI21] P3: Distributed Deep Graph Learning at Scale
(1) 问题
基于Graph-Learn对接PyTorch的方案瓶颈在IO(通信,数据拷贝和格式转换)。
(2) 优化思路:
- 通信优化
- 减少数据转换
- 利用图的性质(提高locality)
和quiver team合作:https://github.com/quiver-team/torch-quiver
①gl_torch—GPU sampling
- 图拓扑使用CSR格式存储在GPU/pin memory。
- CUDA Kernel进行采样。
- 基于OBGN数据,gl_torch GPU采样是pyg CPU(单核)采样的80倍左右。
②gl_torch UnifiedTensor
- CPU-GPU统一访问的UnifiedTensor:GPU间p2p访问;GPU Zero-Copy访问内存。
③gl_torch Feature
-
基于UnifiedTensor,封装了Feature的实现。
a.将数据分成冷数据和热数据。
b.冷数据存储于CPU,CPU的数据可以采用Shared Memory的方式做进程间的通信。
c.热数据存储于GPU,GPU卡没有NVLink连接的话,每个卡存储replica。GPU卡有NVLink,可在有NVLink连接的GPU组之间进行replica,GPU缓存的数据也更多。
④gl_torch 运行模式
gl_torch支持模式:
- 图的拓扑存储可在CPU、GPU或Pinned Memory;
- Feature可存于CPU或者Unified Tensor;
- 采样和子图的Induce可在CPU或GPU中;
- 特征Collection可以在CPU或者GPU中。
gl_torch运行模式推荐最后一行的配置。图的拓扑较小,可放于Pinned内存中,特征需要较大带宽,建议放于Unified Tensor中,采样等可以利用空闲的GPU。
⑤gl_torch 性能
基于OGBN-Papers100M数据(亿级别点、十亿级别边),batchsize为1024,三跳采样,利用8卡的V100进行训练,可得到近似线性加速的效果。
基于OGBN-MAG数据(异构图网络),batchsize为1024,二跳采样,利用8卡的V100进行训练,与PyG比较,gl_torch进行优化后可以达到较大的提升。
03 应用案例
1. 推荐召回
(1)GraphSAGE
① 方案: 把u2i/i2i推荐问题转换成顶点间的边连接预测问题。
- 构图很关键,图关系意味着模型学习的上限。
- 数据:user-item关系,item-item关系,user和item原始特征。
② 优点: 不局限于行为历史序列,可供挖掘多类型高阶关系,易捕捉数据的动态变化,运行效率高。
(2)丰富的模型库(推荐召回)
- i2i 召回: 构建高质量i2i图,GraphSAGE模型训练进行向量召回,提高对长尾的覆盖。
- u2i 召回: UltraGCN模型,简化GCN模型,直接计算user和他点击过的item以及user和该item相似的item(共现关系)直接的内积,得到最终的相似度。
- 序列推荐: SURGE模型,将序列通过metric learning转换成图,从而用GNN挖掘用户兴趣。
2. 安全风控
(1)垃圾注册检测
- 垃圾注册检测场景,点分类模型
- 多种类型边的RGCN算法
- 优点:利用账号之间的多种关系,发掘团伙信息
(2)垃圾评论识别
[CIKM2019] Spam Review Detection with Graph Convolutional Networks
垃圾评论识别,是一个二分类模型,判断评论是否为垃圾,首先构建 商品 - 评论 - 用户的异构图以及 评论 - 相似度 - 评论的同构图 ,其次融合四个embedding向量构建模型。
①异构图
- 商品-评论-用户;
- 用GCN计算2-hop局部关系信息;
- 基于meta-path的GCN·挖掘强化显著特征关系。
②同构图
- 评论-相似度-评论;
- 使用approximateKNN Graph算法构建;
- 同构图上计算GCN,等同于表征LaplacianSmoothing全局特征。
04 在线推理
1. 在线推理采样服务系统架构
(1) 模块构成
- 数据加载模块,Data Loader
- 采样模块,Sample Builder
- 样本收集模块,sample Collector
- 样本存储模块,Sample Store
- 采样数据发布模块,Sample Publisher
(2)性能
- 2跳采样P99延时20ms
- 分钟级图更新
- QPS单机2万,支持线性扩展
2. 在线推理链路
- 用户的数据动态更新到在线动态的图服务引擎
- 通过推理采样查询得到采样结果
- 采样结果通过GNN模型服务引擎进行在线推理。
上述在线推理相关内容已经开源,并将在v1.1.0版本release。
在文末分享、点赞、在看,给个3连击呗~
分享嘉宾
艾宝乐 阿里巴巴 高级开发工程师
艾宝乐目前在阿里巴巴计算平台PAI担任高级开发工程师,主要负责图学习平台的研发和图学习算法业务落地工作。其硕士毕业于南京大学,从事深度学习和计算机视觉研究,在阿里主要从事推荐系统、参数服务器、图学习平台的建设和业务落地等工作,其参与开发的图学习框架GraphLearn支撑了阿里内部数十个部门相关业务落地,同时也在其他若干公司的推荐和风控场景取得了实际落地效果。