开发者社区 > 博文 > 京东零售开源图深度学习框架Galileo设计理念及异构图推荐模型详解
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

京东零售开源图深度学习框架Galileo设计理念及异构图推荐模型详解

  • 京东零售技术
  • 2022-01-24
  • IP归属:北京
  • 35240浏览

    Galileo开源地址:

    https://github.com/JDGalileo/galileo,欢迎star和试用,也欢迎贡献代码。



    导读




    开源图11.jpg


    数据、算法、算力并列称为AI时代的三驾马车。从数据角度,随着信息技术的快速发展,各领域数据量均呈现爆发式增长,数据形式呈现多样化、复杂化的趋势,图数据便是其中一个典型代表。从算法角度,为了挖掘大数据中的价值,机器学习技术被广泛使用,近几年随着硬件算力的突破性提升,深度学习作为机器学习的一个分支受到显著关注。图深度学习,用深度学习技术挖掘图数据中的价值是一个新兴前沿的方向,深度学习模型可有效捕捉图中的隐含关系,提供更好的数据表征,目前在互联网领域搜索、推荐、广告、风控等业务中已经有许多探索和实践,也取得了可观的业务效果。


    图数据将各种实体对象表示为顶点,将它们之间的关系表示为边,例如在电商领域中,用户和商品均可以作为图的顶点,用户和商品的交互行为即是图的边,在京东内部,用户和商品均是亿级规模,构建的图具有超大规模、异构、多重属性等特点。在实际应用时,处理这种体量的超大规模异构图,通常面临消耗资源大、训练评估性能低、现有的深度学习框架Tensorflow和PyTorch等难以训练图模型,缺乏统一图模型编程范式等困难和挑战。


    针对上述图技术在超大规模场景中落地存在的问题,我们京东零售自研并开源了一个易用可扩展的图深度学习框架Galileo(伽利略),核心功能包括支持超大规模异构图、支持多后端分布式训练、支持图嵌入算法和图神经网络。Galileo开源地址https://github.com/JDGalileo/galileo,欢迎star和试用,也欢迎贡献代码。此外,我们也将于今年底与清华大学出版社发行出版Galileo 配套图书:《图深度学习从理论到实践》,敬请期待。


    这里特别致谢京东零售数据算法通道委员会对项目的支持,在京东零售数据算法通道委员会的协调领导下,营造了良好的技术氛围,注重技术沉淀及行业影响,积极参与学术交流,鼓励前瞻性项目探索,挑战业界难题,推动Galileo在京东多个应用场景中成功落地。


    本文首先介绍Galileo框架的设计理念、使用方法和工作原理,然后介绍一个基于异构图的推荐模型,最后介绍Galileo未来的发展规划。



    Galileo框架设计理念




    Galileo是一个支持超大规模异构图、高性能、双后端,并且易使用和扩展的图深度学习框架,旨在解决超大规模图算法在工业级场景的落地难题,提供图神经网络和图嵌入等模型的训练评估及预测能力。


    开源图1.jpg

    图1 Galileo整体架构


    Galileo图深度学习框架的整体架构如图1所示,我们采用了分层的设计理念,从下至上主要分为分布式图引擎、多后端分布式框架、图模型三层:

    1.分布式图引擎:采用紧凑高效的内存结构表达图数据,能够以极低内存支持超大规模异构图;采用ZeroCopy机制实现全链路调用,支持高性能图查询和图采样;

    2.多后端分布式框架:支持Tensorflow和PyTorch双后端,配置化单机分布式训练,支持Keras和Estimator训练,提供统一的图查询和图采样接口,易扩展;

    3.图模型:遵循数据与模型解耦,提升代码复用性;基于组件化设计,降低模型实现难度,支持Message Passing范式编写图模型,也支持Python直接访问训练后端接口,易使用且灵活性高。

    更多关于Galileo的详细介绍请参考我们之前发表的文章《京东零售图计算平台Galileo即将开源 瞄准大规模图算法在工业级场景落地》。



    快速上手Galileo




    Galileo提供了简单通用的SDK,用户能够轻松开始图建模,完整的文档见Galileo docs(https://github.com/JDGalileo/galileo/tree/main/docs),这里我们只给出一个精简的步骤来说明如何快速上手Galileo。我们提供了三种方式供用户安装使用Galileo,前两种分别是以手动安装Galileo的pip源或conda源安装包(https://github.com/JDGalileo/galileo/blob/main/docs/pip.md)和从源码(https://github.com/JDGalileo/galileo/blob/main/docs/install.md)编译安装的形式,第三种是我们更推荐的,在Docker容器中使用Galileo,我们提供的Docker镜像(https://hub.docker.com/r/jdgalileo/galileo)中预置Galileo最新版本和必须的依赖库,用户可以按照如下方式启动容器并运行第一个示例:

    第一步,启动Docker容器。

    第一步,启动Docker容器。



    docker run -it –-rm jdgalileo/galileo:latest bash


    第二步,在预置示例Galileo examples(https://github.com/JDGalileo/galileo/tree/main/examples)中挑选一个图神经网络的例子来执行,以Node2vec模型为例。




    bash examples/start_zk.shpython3 examples/tf/node2vec/simple.py


    例子中使用Galileo提供的Keras Trainer训练一个Node2vec模型,模型使用公开的CORA数据集,完整代码见Node2vec模型(https://github.com/JDGalileo/galileo/blob/main/examples/tf/node2vec/simple.py)。如果用户想要实现一个自定义模型参考定制化图模型(https://github.com/JDGalileo/galileo/blob/main/docs/custom.md)。



    Galileo工作原理




    相信现在大家基本了解了Galileo框架和初步使用方法,但大部分对图技术感兴趣的用户应该会有这样的疑问:Galileo到底是如何加载图数据并喂给模型的?接下来将详细介绍Galileo的工作原理,探究其具体的运行机制。


    开源图2.jpg

    图2 Galileo工作原理


    1、下载公开的图数据集或者准备自己的图数据,见详细的图数据准备教程(https://github.com/JDGalileo/galileo/blob/main/docs/data_prepare.md)。

    2、使用galileo_convertor将图数据源格式转换为图二进制格式。

    3、图引擎加载图二进制格式数据,并初始化采样器。

    4、启动RPC图引擎服务。

    5、向zookeeper注册图服务。

    6、训练节点worker的图引擎客户端发现图服务。

    7、Tensorflow或PyTorch的Dataset调用图引擎客户端的查询和采样接口。

    8、不同的模型inputs从图引擎服务中获取图数据,包括顶点、边、特征等数据。

    9、Dataset将图样本拼接为MiniBatch数据喂给图模型,支持多线程并行预拉取。

    10、模型训练后,输出图模型的checkpoints或 Embeddings。


    图2中不同颜色的框代表Galileo框架包含三种进程:图引擎进程(图中绿色框),训练节点worker进程(图中红色框)和Zookeeper进程(图中粉色框)。



    推荐场景的异构图模型




    在电商推荐场景中,实体通常指用户和商品,实体间的关系包含商品与商品、用户与用户、用户与商品三种交互关系,实体和关系还携带有丰富的属性,例如用户有性别、年龄、地区等,商品有类目、品牌、规格、包装、产地等,用户行为有浏览、加购、分享、点赞、收藏等。总结而言,推荐图数据具有超大规模、复杂异构、关系稀疏、特征高维等特点。


    目前基于图的推荐算法主要专注于用户商品二部图,只能处理一种交互关系,不使用属性特征或仅使用非常单一的属性特征,不能有效挖掘用户和商品的深层关系。因此我们使用Galileo框架设计了一个针对异构图的模型HeteSAGE,以提升推荐系统的准确性。HeteSAGE模型使用多组元路径编码异构特征信息,支持编码多种类型的特征信息,可以刻画异构顶点之间的复杂关系。HeteSAGE模型的伪代码见图3。


    开源图3.jpg

    图3 HeteSAGE模型伪代码


    在一轮训练过程中,HeteSAGE首先根据输入目标顶点采样邻居以及特征信息,使用编码器编码多种类型的特征信息,再经过多层图卷积操作,使用注意力机制融合特征信息,最后输出目标顶点的向量表示。


    HeteSAGE模型处理的异构图用G=(V,E,T,A)表示,其中V表示顶点集合,E表示边集合,T表示异构图中顶点和边的类型,顶点类型集合用T_v表示,边类型集合用T_e表示,A表示异构图中顶点的特征信息,包括稀疏特征A_s和稠密特征A_d。多组元路径用M表示。模型输出顶点的向量表示。

    HeteSAGE模型详细步骤如下:

    1、首先通过顶点类型映射函数获取目标顶点集合V的类型集合O(伪代码的第1行),遍历所有顶点类型集合(伪代码的第2行),根据当前顶点类型t和目标顶点集合的类型集合O计算出目标顶点集合V的属于当前顶点类型t的顶点集合Vt(伪代码的第3行)。


    2、然后对当前顶点类型t的顶点集合Vt的特征及其邻居的特征进行编码和卷积操作(伪代码的第4行到第7行)。

    a)第一步对多组元路径M进行遍历(伪代码的第4行),元路径指的是多阶邻居采样时从初始顶点到最大阶顶点路径上的边的类型列表.

    b)第二步对顶点集合Vt使用元路径m采样多阶邻居(伪代码的第5行),得到多阶邻居集合N(t,m),具体采样方法借鉴了GraphSAGE算法中的方式.

    c)第三步编码多种类型的特征信息(伪代码的第6行),目前支持稀疏特征和稠密特征。在电商场景下,异构图数据中顶点存在多种类型的特征,稀疏特征例如有用户的性别、年龄等,商品的类目,品牌等,稠密特征例如有用户的收入等,商品的名称,价格等,而且多种类型的特征的维度也不同,维度也比较高。因此需要编码多种类型的特征为统一低维度的特征。稀疏特征A_s使用查Embedding表的方式编码,稠密特征Ad使用转移矩阵编码,可以拼接或相加得到最终编码后的特征F(t,m)。

    d)第四步是多层邻居的图卷积操作(伪代码的第7行),得到目标顶点的卷积特征F'(t,m),具体方法也借鉴了GraphSAGE算法中的卷积方式,聚合函数也支持Mean聚合、pool聚合、LSTM聚合等;最终将多组元路径M下的顶点特征表示F'(t,m)拼接在一起得到F'(M)。


    3、最后使用自注意力机制融合多组元路径的特征F'(M)得到当前顶点类型的特征F_t(伪代码的第8行),最终输出目标顶点的向量表示H(伪代码的第9行)。



    Galileo未来规划




    1、打造Galileo平台,支持建、存、查、算、用一体的自动化构建系统。

    2、支持实时图计算和动态图计算。

    3、持续集成前沿图模型,探索适合GNN的新型硬件。

    Galileo开源地址:

    https://github.com/JDGalileo/galileo,欢迎star和试用,也欢迎贡献代码。


    作者:技数中心杜华


    团队介绍

    Galileo项目组属于京东零售数据算法通道下的数据智能研发部。 

    这是一个有技术和梦想的团队,团队成员均来自国内一线互联网公司和双一流大学,既有经验丰富的资深架构师和技术扎实的中坚力量,也有朝气蓬勃的后起之秀。团队在训练框架及高性能计算领域积累了丰富的实战经验。

    团队致力于工业级数据算法模型在京东零售真实业务场景中的落地,大规模机器学习及商业分析平台九数,推动了京东无人投放广告的高速增长,成为京东广告的核心收入来源。

    Galileo团队也非常欢迎志同道合的优秀人才加入,有意者请与<duhua@jd.com>联系。