Euler浅析

举报
弓乙 发表于 2019/01/23 16:57:25 2019/01/23
【摘要】 前几天,alibaba发布了一款图深度学习开源框架Euler。其既可单独作为图引擎使用,也可配合TF/XDL(阿里开源深度学习工具)使用。大致浏览了一下euler,从代码的角度来看,整体还是很舒服的。本文就目前所了解的信息,做一个记录,以供后续参考。introduction支持用户在数十亿点数百亿边的复杂异构图上进行模型训练。可独立使用,也可配合TF/XDL相比文本、语音和图像领域的数据比较...

前几天,alibaba发布了一款图深度学习开源框架Euler。其既可单独作为图引擎使用,也可配合TF/XDL(阿里开源深度学习工具)使用。大致浏览了一下euler,从代码的角度来看,整体还是很舒服的。本文就目前所了解的信息,做一个记录,以供后续参考。

introduction

  • 支持用户在数十亿点数百亿边的复杂异构图上进行模型训练。

  • 可独立使用,也可配合TF/XDL

  • 相比文本、语音和图像领域的数据比较容易处理成欧式空间的Grid-like类型,适合现有的深度学习模型处理,图是一种非欧空间下的数据,并不能直接应用现有方法,需要专门设计的图神经网络系统。

整体架构:

分三层:图引擎层、图操作算子层、算法实现层。

PS:

  1. 底层存储按照不同的节点与边的类型分别组织

  2. 操作算子的接口支持:

全局带权采样点和边的能力。主要用于mini-batch样本的随机生成以及Negative Sampling。

基于给定节点的邻居操作。这个是图计算的核心能力包括邻居带权采样,取Top权重的邻居等。

点/边的属性查找。这个能力使得算法可以使用更丰富的特征,而不仅限于点/边的ID特征。

内置算法:

名称算法类型是否自研特点
DeepWalk随机游走经典的无偏随机游走无监督算法
Node2Vec随机游走利用可配置参数在游走时可倾向BFS或DFS
LINE其它灵活利用1阶,2阶邻居信息的无监督算法
GCN邻居汇聚CNN操作类似推广到非欧空间的算法
GraphSAGE邻居汇聚GCN改进,提出邻居采样,多种汇聚函数等
GAT邻居汇聚将Attention技术用于邻居汇聚
LsHNE随机游走异构图中随机游走,利用深度网络编码
LasGNN邻居汇聚半监督大规模异构图卷积网络学习方法
Scalable-GCN邻居汇聚加速GCN训练的一种方法

LsHNE与LasGNN算法专门针对复杂的异构图设计。

启动方式:

Local&remote(分布式训练时,图数据存在于HDFS中。)

数据类型:

这里给出一些术语的相应含义,以便于理解。

中文euler传统图数据库
属性featureproperty
类型typelabel

以下为点,边id的定义以及边信息的含义。IDWeightPair可以理解为实际的边,点和其出边的信息存在一台机器上:

类型定义含义
NodeIDuint64_t顶点ID
EdgeIDtuple<NodeID, NodeID, int32_t>边ID,由起点、终点、边类型确定
IDWeightPairtuple<NodeID, float, int32_t>邻居信息,包含终点,权重,边类型

ps:

  • Vertexid 8byte

  • Edgeid 20 byte

  • Node: 8+4+4=16byte + collection

  • Edge: 20+4+4=28byte + feature

 

  • 点,边结构自带权重 float weight_;

  • 点边类型:type

  • 属性:Float(0)、uint64(1)、binary(2)

这三类属性会分别被识别为稠密特征、稀疏特征,和二进制特征。既可用于优化存储,也可帮助训练加速。

  • 稠密特征对应于图中的Float32Feature,可以在模型中作为全连接或卷积层的输入;

  • 稀疏特征对应于图中的UInt64Feature,可以在模型中作为tf.nn.embedding_lookop_sparse的输入;

  • 二进制特征对应于图中的BinaryFeature,可以按照用户自定义的方式消费。图数据示例

内部实际结构:

      std::unordered_map<euler::common::NodeID,  Node*> node_map_;
    
     std::unordered_map<euler::common::EdgeID,  Edge*,
    
     euler::common::EdgeIDHashFunc,  euler::common::EdgeIDEqualKey> edge_map_;

Ps:

  • EdgeIDHashFunc - cityHash

  • edge包含边上的三种feature值,边的类型,边的weight。

  • node包含点id,点的类型,点的weight。

Euler model

line / randomwalk / graphsage / graphsage_supervised / scalable_gcn / gat / saved_embedding

最后,几个值得注意的点:

1. 关于插入效率,

主要的点/边数据,用两个map node_map_edge_map_管理,并用两个大力度锁,node_map_insert_lock和edge_map_insert_lock控制线程安全。

2. 关于weight,

点,边结构自带权重 float weight_,表现为对于模型训练的浑然天成的支持。

3. 关于导入,

必须使用指定的紧凑存储的二进制格式。提供了一种json格式的明文转换工具,使用euler前,需要做预处理。点边信息会经过预处理整理为一行(euler里面称为Block)。

4. 关于切分方式,

边切-random partition。即所有的点分到n个分片(partition)。每个分片只包含node_id % num_partitions = par_idx*的顶点。顶点与其出边存储在一起(block)。

5. 关于block,

明文的block含有较多冗余信息,如重复的neignbor,neignbor中还包含neignbor的weight。

6. 关于schema,

schema信息隐含在type中,且schema对property没有约束,仅作为标签用于异构图。

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。