Euler浅析
前几天,alibaba发布了一款图深度学习
开源框架Euler。其既可单独作为图引擎使用,也可配合TF/XDL(阿里开源深度学习工具)使用。大致浏览了一下euler,从代码的角度来看,整体还是很舒服的。本文就目前所了解的信息,做一个记录,以供后续参考。
introduction
支持用户在数十亿点数百亿边的复杂异构图上进行模型训练。
可独立使用,也可配合TF/XDL
相比文本、语音和图像领域的数据比较容易处理成欧式空间的Grid-like类型,适合现有的深度学习模型处理,图是一种非欧空间下的数据,并不能直接应用现有方法,需要专门设计的图神经网络系统。
整体架构:
分三层:图引擎层、图操作算子层、算法实现层。
PS:
底层存储按照不同的节点与边的类型分别组织
操作算子的接口支持:
全局带权采样点和边的能力。主要用于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 | 传统图数据库 |
---|---|---|
属性 | feature | property |
类型 | type | label |
以下为点,边id的定义以及边信息的含义。IDWeightPair可以理解为实际的边,点和其出边的信息存在一台机器上:
类型 | 定义 | 含义 |
---|---|---|
NodeID | uint64_t | 顶点ID |
EdgeID | tuple<NodeID, NodeID, int32_t> | 边ID,由起点、终点、边类型确定 |
IDWeightPair | tuple<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没有约束,仅作为标签用于异构图。
- 点赞
- 收藏
- 关注作者
评论(0)