阿里开源的工业级图表征学习框架 Euler 使用教程

业余杂谈 herman 854浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

Euler 是一个深度学习框架,由阿里妈妈开源。被称为国内首个工业级的图深度学习开源框架,和其他的开源框架不同,Euler 天生就是一个分布式图形深度学习框架。Euler 内置了非常多的算法,本文我们一起来练练手。

图作为表达能力很强的通用的数据结构,可以用来刻画现实世界中的很多问题,例如社交场景的用户网络、电商场景的用户和商品网络、电信场景的通信网络、金融场景的交易网络和医疗场景的药物分子网络等等。相比文本、语音和图像领域的数据比较容易处理成欧式空间的 Grid-like 类型,适合现有的深度学习模型处理,图是一种非欧空间下的数据,并不能直接应用现有方法,需要专门设计的图神经网络系统。

图神经网络等基于图的学习方法将端到端学习与归纳推理相结合,有望解决深度学习无法处理的关系推理、可解释性等一系列问题。对结构知识的表达、计算和组合泛化是实现具备 human-like AI 的关键。

Euler 是大规模分布式的图学习框架,配合 TensorFlow 或者阿里内部的 XDL 等深度学习工具,它支持用户在数十亿点数百亿边的复杂异构图上进行模型训练。

Euler 系统的核心能力

  • 大规模图的分布式学习。工业界的图往往具有数十亿节点和数百亿边,有些场景甚至可以到数百亿节点和数千亿边,在这样规模的图上单机训练是不可行的。Euler 支持图分割和高效稳定的分布式训练,可以轻松支撑数十亿点、数百亿边的计算规模。
  • 支持复杂异构图的表征。工业界的图关系大都错综复杂,体现在节点异构、边关系异构,另外节点和边上可能有非常丰富的属性,这使得一些常见的图神经网络很难学到有效的表达。Euler 在图结构存储和图计算的抽象上均良好的支持异构点、异构边类型的操作,并支持丰富的异构属性,可以很容易的在图学习算法中进行异构图的表征学习。
  • 图学习与深度学习的结合。工业界有很多经典场景,例如搜索/推荐/广告场景,传统的深度学习方法有不错效果,如何把图学习和传统方法结合起来,进一步提升模型能力是很值得探索的。Euler支持基于深度学习样本的 mini-batch 训练,把图表征直接输入到深度学习网络中联合训练。
  • 分层抽象与灵活扩展。Euler 系统抽象为图引擎层、图操作算子层、算法实现层三个层次,可以快速的在高层扩展一个图学习算法。实际上,Euler 也内置了大量的算法实现供大家直接使用。

Euler 框架核心

Euler 系统整体可以分为三层:最底层的分布式图引擎,中间层图语义的算子,高层的图表示学习算法。 

Euler 框架概览

Euler 分布式图引擎

Euler 的分布式图引擎针对海量图存储,分布式并行图计算及异构图进行了优化设计,确保了工业场景下的有效应用。

  • 首先为了存储超大规模图(数十亿点,数百亿边),Euler必须突破单机的限制,从而采用了分布式的存储架构。在图加载时,整张图在引擎内部被切分为多个子图,每个计算节点被分配1个或几个子图进行加载。
  • 为了充分利用各个计算节点的能力,在进行图的操作时,顶层操作被分解为多个对子图的操作由各个节点并行执行。这样随着更多节点的加入,Euler 可以得到更好的服务能力。其次,Euler 引入了多replica的支持。从而用户可以灵活平衡shard与replica的数量,取得更佳的服务能力。最后,Euler 针对图表示学习优化了底层的图存储数据结构与操作算法,单机的图操作性能获得了数倍的提升。
  • 多种不同类型的边,点与属性所组成的异构图,对很多复杂的业务场景必不可少。为了支持异构图计算能力,底层存储按照不同的节点与边的类型分别组织。这样 Euler 可以高效支持异构的图操作。

Euler 中间图操作算子

由于图学习算法的多样性以及业务的复杂性,固定的某几种甚至几十种算法实现无法满足客户的所有需求。所以在 Euler 设计中,围绕底层系统的核心能力着重设计了灵活强大的图操作算子,且所有算子均支持异构图操作语义。用户可以利用它来快速搭建自己的算法变体,满足独特的业务需求。

首先,Euler 分布式图引擎提供了C++的API来提供所有图操作。基于这个API,Euler 可以方便的基于某个深度学习框架添加图操作的算子,从而利用 Euler C++ 接口访问底层图引擎的能力。Euler 支持广泛使用的深度学习框架,比如阿里巴巴的X-DeepLearning与流行的TensorFlow。后继 Euler 也会考虑支持其它的深度学习框架,比如 PyTorch。本次开源代码全部基于 TensorFlow。

利用灵活的图操作算子,机器学习框架可以在每个mini-batch与Euler交互,动态扩充与组织训练样本。这样,Euler 不仅支持传统的以图为中心的学习模式,且可以把图学习的能力注入传统的学习任务,实现端到端训练。 按照功能分类,Euler 提供的操作接口可以分类如下:

  • 全局带权采样点和边的能力。主要用于 mini-batch 样本的随机生成以及 Negative Sampling。
  • 基于给定节点的邻居操作。这个是图计算的核心能力包括邻居带权采样,取 Top 权重的邻居等。
  • 点/边的属性查找。这个能力使得算法可以使用更丰富的特征,而不仅限于点/边的 ID 特征。

Euler 内置的算法

考虑到框架的易用性,Euler内置了多种知名算法以及几种 Euler 内部的创新算法。所有实现,阿里仔细的进行了测试,保证了算法运行效率,且算法效果与原论文对齐。用户无需进行开发,注入数据到平台后,可以直接使用。Euler 内置的算法列表见下表。有关算法的具体细节,请参见下表中链接的原始论文。

由于 LsHNE 与 LasGNN 算法专门针对复杂的异构图设计,Euler 从阿里内部的实际业务抽取了复杂的异构图数据并开源。

Euler 内置的算法

Euler 上手体验

使用 Euler 首先需要准备 Euler 引擎可以读取的图数据,这里我们使用阿里提供的 PPI(Protein-Protein Interactions)数据集作为例子,提供一个预处理脚本:

apt-get update && apt-get install -y curl
curl -k -O https://raw.githubusercontent.com/alibaba/euler/master/examples/ppi_data.py
pip install networkx==1.11 sklearn
python ppi_data.py

上面的命令会在当前目录下生成一个 PPI 目录,其中包含构建好的 PPI 图数据。

在训练集上训练一个半监督的 GraphSage 模型,用法如下:

python -m tf_euler \
  --data_dir ppi \
  --max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
  --model graphsage_supervised --mode train

上面的命令会在当前目录下生成一个 ckpt 目录,其中包含训练好的 TensorFlow 模型。

在测试集上评估模型的效果:

python -m tf_euler \
  --data_dir ppi --id_file ppi/ppi_test.id \
  --max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
  --model graphsage_supervised --mode evaluate

使用 Euler 算法包默认参数训练得到的模型在测试集上的 mirco-F1 score 大概在 0.6 左右。

导出顶点的 embedding:

python -m tf_euler \
  --data_dir ppi \
  --max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
  --model graphsage_supervised --mode save_embedding

上面的命令会在当下目录下的 ckpt 目录中生成一个 embedding.npy 文件和一个 id.txt 文件,分别表示图中所有顶点的 embedding 和 id。

Euler 所生成的 embedding 可以根据用户的实际需要在后续流程中使用。这里给出一个利用 Faiss 进行相似性检索的例子:

import faiss
import numpy as np

embedding = np.load('ckpt/embedding.npy')
index = faiss.IndexFlatIP(128)
index.add(embedding)
print(index.search(embedding[:5], 4))

Euler 算法包及其底层的图查询引擎支持分布式的模型训练,用户需要在原始的训练命令上加入四个参数--ps_hosts--worker_hosts--job_name--task_index指定分布式角色。使用分布式训练时,数据需要放置在 HDFS 上。

bash tf_euler/scripts/dist_tf_euler.sh \
  --data_dir hdfs://host:port/data \
  --euler_zk_addr zk.host.com:port --euler_zk_path /path/for/euler \
  --max_id 56944 --feature_idx 1 --feature_dim 50 --label_idx 0 --label_dim 121 \
  --model graphsage_supervised --mode train

上面的命令会在 /tmp/log.{woker,ps}.{0,1} 文件中打印日志。

更多功能和用法请参考官方文档:https://github.com/alibaba/euler,如有问题请参与 Issues 讨论。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 阿里开源的工业级图表征学习框架 Euler 使用教程