[TOC]
为了让 embedx 的文档更易读,希望用户在提问完,解惑之后,将问题整理到 embedx FAQ
中,以方便后来者使用,感谢各位贡献者。
可以支持有向图,但是有向图对比无向图是有损的,以下列举部分问题
-
基于有向图的随机游走时,下一跳邻居节点如果找不到,会提前返回,导致长度比较短
-
GCN 类模型,使用有向图只聚合以当前节点出发沿有向边得到的邻居节点信息,损失了指向当前节点的所有上游节点信息。
如果 一定要使用有向图 运行,可以使用以下方法:
方法: 给无向边一个非常小的权重,比如 1e-5。
图中有真实边(a b), 权重是 1.0,制造另外一条边(b, a), 权重是 1e-5
构造图数据的时只生成一个方向的数据,造成随机游走的时候每次游走出第一步就跳出了,找不到下一跳节点,提前返回了。
可以使用以下方法解决:
方法: 检查使用的图数据是否是无向图,无向图要求存在边 a 到 b,也必须存在边 b 到 a。
embedx 系统的并行度取决于文件的数量,多线程数量等于线程数量和文件数量的最小值,如果文件数量只有 1 个,启动线程数量等于 1。
可以使用以下方法解决:
方法: 通过划分单个文件为多个文件的方式达到加速的效果。文件数量一般建议划分成 100-1000 个。
-
node feature 保存的是节点本身的特征信息,neighbor feature 保存的是聚合(平均)后的邻居特征信息。
-
neighbor feature 用来加速邻居特征聚合类图神经网络算法,通过直接读取提前计算存储好的邻居聚合特征从而避免重复计算。
-
embedx 要求节点是 uint64 类型,其中前面 16 位存储的是节点的 type,后面 48 位默认是节点本身的信息。
-
embedx 会自动检查节点的前 16 位,可能是输入的图数据中,前 16 位已经被编码了,或者有信息了。
可以使用以下方法解决:
方法: 重新编码,去掉含有信息的编码部分
-
embedx 特征编码方案继承了 deepx_core 里面的特征编码方案,特点是节点空间,速度高效。
-
具体参考特征编码方案
支持模型增量训练,训练时候增加使用参数--in_model,输入训练好的模型目录即可加载模型增量训练。
模型输出的 embedding 是 编码后的节点
对应的 embedding,将 编码后的节点
映射回 原始节点
即可使用。
为了所有模型代码结构的统一,每个模型
都有 train 和 predict 过程。
对于 deepwalk 模型,train 指的是模型训练,predict 指的是 dump 节点的 embedding
。
训练时长主要由模型复杂程度影响,模型越复杂训练速度越慢
,需要的训练时长越长,例如 Graphsage 模型设置两层图卷积与设置一层图卷积相比训练速度更慢。
如果是分布式训练场景,rpc 通信
、I/O
、分配的机器训练能力
也会有一定影响。
- 预估公式
训练时长(s) = 训练轮数 * 训练样本数 / 每秒训练的样本数 / 机器数量
-
参数介绍
-
训练轮数指的是参数
--epoch
-
训练样本数量指的是参数
--in
- 对于随机游走类的图模型如
deepwalk
、node2vec
和unsup_graphsage
等,训练样本数量=节点数量 * 随机游走轮数
- 对于随机游走类的图模型如
-
每秒训练的样本数 指的是
log 中如[src/trainer_context.cc][operator()]:[0] 111 instances/s
中的111 instances/s
-
机器数量,单机训练指的是
线程数量
, 多机训练指的是worker 数量
-
参考model_config中关于 config 与 sparse 参数介绍
。
再次强调下 sparse=1 时,不需要指定节点个数,只需要指定 embedding 维度即可。