【DGL系列】详细分析DGL中dgl.NID和orig_id的区别

news2024/11/16 0:34:17

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn]

如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~

目录

背景知识

深入分析

初步结论

代码验证

实验设计

结果分析

最终结论

扩展思考


本文将详细分析orig_id和dgl.NID的区别。

背景知识

        在做子图分区的时候,可以返回NID和orig_id,具体我们看看官方教程里的介绍:

以下来自:7.1 Preprocessing for Distributed Training — DGL 0.8.2post1 documentation


By default, the partition API assigns new IDs to the nodes and edges in the input graph to help locate nodes/edges during distributed training/inference. After assigning IDs, the partition API shuffles all node data and edge data accordingly. After generating partitioned subgraphs, each subgraph is stored as a DGLGraph object. The original node/edge IDs before reshuffling are stored in the field of ‘orig_id’ in the node/edge data of the subgraphs. The node data dgl.NID and the edge data dgl.EID of the subgraphs store new node/edge IDs of the full graph after nodes/edges reshuffle. During the training, users just use the new node/edge IDs.

  1. 默认情况下,分区 API 会为输入图中的节点和边分配新的 ID,以帮助在分布式训练/推理期间定位节点/边。
  2. 分配 ID 后,分区 API 会相应地洗牌所有节点数据和边数据。生成分区子图后,每个子图都存储为 DGLGraph 对象。
  3. 重新洗牌前的原始节点/边 ID 存储在子图的节点/边数据的“orig_id”字段中。
  4. 子图的节点数据 dgl.NID 和边数据 dgl.EID 存储节点/边重新洗牌后完整图的新节点/边 ID。
  5. 在训练期间,用户只需使用新的节点/边 ID。

提醒:这里的“重新洗牌 reshuffle”指的是“重新排序”。

深入分析

        上面的大概意思就是说,orig_id存储的是打乱前节点在原本大图的idNID存储的是打乱后节点在原本大图的id。

        我们先看一下执行分区的函数partition_graph:

dgl.distributed.partition.partition_graph — DGL 0.8.2post1 documentation

dgl.distributed.partition.partition_graph(g, graph_name, num_parts, out_path, num_hops=1, part_method='metis', reshuffle=True, balance_ntypes=None, balance_edges=False, return_mapping=False, num_trainers_per_machine=1, objtype='cut')

需要注意的是:

        如果 reshuffle=False,则分区的节点 ID 和边 ID 不属于连续的 ID 范围。在这种情况下,DGL 将节点/边映射(从节点/边 ID 到分区 ID)存储在单独的文件(node_map.npy 和 edge_map.npy)中。节点/边映射存储在 numpy 文件中。此格式已弃用,下一个版本将不再支持此格式。换言之,未来版本在对图形进行分区时将始终对节点 ID 和边 ID 进行随机排序

        如果 reshuffle=True,则 node_map 和 edge_map 包含用于在全局节点/边 ID 到分区本地节点/边 ID 之间映射的信息。对于异构图,node_map和edge_map中的信息也可用于计算节点类型和边类型。该操作可以让分区中的节点和边位于连续的 ID 范围内

        从本质上讲,node_map 和 edge_map 是字典。键是节点/边缘类型。这些值是包含分区中相应类型的 ID 范围的开始和结束对的列表。列表的长度是分区的数量;列表中的每个元素都是一个元组,用于存储分区中特定节点/边缘类型的 ID 范围的开始和结束。

        分区的图形结构存储在 DGLGraph 格式的文件中。每个分区中的节点都会被重新标记为始终从0开始。我们将原始图中的节点 ID 称为 global ID,而将每个分区中重新标记的 ID 称为 local ID。每个分区图都有一个节点数据张量,存储在名为 dgl.NID 的字段下,其中的每个值都是该节点的全局 ID。同样,边也会被重新标记,从本地 ID 到全局 ID 的映射将存储为名为 dgl.EID 的整数边数据张量下。对于异构图,DGLGraph 还包含一个节点数据 dgl.NTYPE 用于表示节点类型和边数据 dgl.ETYPE 表示边类型。

        当 reshuffle=True 时,“orig_id”存在。它表示reshuffle之前原始图中的原始节点 ID。

初步结论

        上面也就是说,当 reshuffle=True 时,才会返回“orig_id”字段。考虑到分区完,子分区上的节点ID可能是不连续的(可能影响后续算法执行),所以reshuffle就是重新分配ID,以便在该子分区上的ID能够连续。

        因此,orig_id是洗牌前的大图ID,dgl.NID是洗牌后的大图ID

代码验证

实验设计

        我们通过简单代码验证下是不是这样,我们以节点N来看。

原本的大图:

# 定义图的边
src_nodes = torch.tensor([0, 1, 2, 3, 4, 2])  # 起始节点
dst_nodes = torch.tensor([1, 2, 3, 4, 5, 4])  # 结束节点

# 创建图对象
g = dgl.graph((src_nodes, dst_nodes))

# 图是无向的,所以添加反向边
g = dgl.to_bidirected(g)

# 打印图的信息
print("Nodes in the graph:", g.nodes())
print("Edges in the graph:", g.edges())
plot_dgl_graph(g)

输出:

Nodes in the graph: tensor([0, 1, 2, 3, 4, 5])
Edges in the graph: (tensor([0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5]), tensor([1, 3, 0, 2, 1, 3, 4, 0, 2, 4, 2, 3, 5, 4]))

进行分区:

partition = dgl.distributed.partition_graph(g, graph_name='test', num_parts=2,
                                    out_path='./test/', num_hops=1, return_mapping=True,
                                    balance_edges=False) 

获取分区1的信息:

# 读取子图信息
g1, nodes_feats1, efeats1, gpb1, graph_name1, node_type1, etype1 = dgl.distributed.load_partition('./test/test.json', 0)

print(g1.ndata[dgl.NID])
print(g1.ndata['orig_id'])

输出:

nodes:   tensor([0, 1, 2, 3, 4, 5])
NID:      tensor([0, 1, 2, 3, 4, 5])
orig_id: tensor([1, 4, 5, 0, 2, 3])

# 注意,后三个(即nodes中的3,4,5)是halo节点

获取分区2的信息:

# 读取子图信息
g2, nodes_feats2, efeats2, gpb2, graph_name2, node_type2, etype2 = dgl.distributed.load_partition('./test/test.json', 1)

print(g2.ndata[dgl.NID])
print(g2.ndata['orig_id'])

输出:

nodes:   tensor([0, 1, 2, 3, 4])
NID:      tensor([3, 4, 5, 0, 1])
orig_id: tensor([0, 2, 3, 1, 4])

# 注意,后两个(即nodes中的3,4)是halo节点

结果分析

从上面的分区1和分区2的结果上可以看出:

  • 每个分区中的g.nodes()都是从0开始的,确实每个分区的节点被重新分配了ID。验证了“背景知识”里的第1、2条;
  • 节点并不是按顺序划分到子分区,因此每个分区中的orig_id是不连续的,并且反映了最原始的大图中的节点ID。验证了“背景知识”里的第3条;
  • reshuffle操作对大图的节点ID进行了重新排序,因此可以看到每个分区中的NID确实是连续的。验证了“背景知识”里的第4条;

最终结论

        因此,可以有以下结论:

  1. orig_id存储的是重新排序前,节点在大图上的ID;
  2. dgl.NID存储的是重新排序后,节点在大图上的ID;
  3. 两者都是global id
  4. orig_id存储的才是真正的、最原始的节点ID;
  5. dgl.NID存储的ID虽然也能代表全局ID,但它是重新排序后的ID;
  6. 第4和5点反映出,节点位置如果变化,orig_id不会变,但dgl.NID可能会变;

基于以上几点,在使用的时候需要多加注意区分。正如“背景知识”的第5点所说,我觉得大部分情况下,dgl.NID应该就够用了。

扩展思考

        你知道gpb1.partid2nids(0)、gpb1.partid2nids(1)返回的是NID还是orig_id吗?

print('partid2nids of part 0: ', gpb1.partid2nids(0))
print('partid2nids of part 1: ', gpb1.partid2nids(1))

输出:

partid2nids of part 0:  tensor([0, 1, 2])
partid2nids of part 1:  tensor([3, 4, 5])

        所以,它返回的是NID哦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Redis核心技术与实战》学习笔记4——AOF日志:宕机了,Redis如何避免数据丢失?

文章目录 AOF 日志是如何实现的?三种写回策略 日志文件太大了怎么办?AOF 重写会阻塞吗?小结 大家好,我是大白。 如果有人问你:“你会把 Redis 用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使…

【Kubernetes】k8s集群之包管理器Helm

目录 一.Helm概述 1.Helm的简介 2.Helm的三个重要概念 3.Helm2与Helm3的的区别 二.Helm 部署 1.安装 helm 2.使用 helm 安装 Chart 3.Helm 自定义模板 4.Helm 仓库 每个成功的软件平台都有一个优秀的打包系统,比如Debian、Ubuntu 的 apt,RedH…

医疗器械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

在当今这个日新月异的数字时代,医疗器械行业正经历着前所未有的变革与升级。随着5G技术的迅猛发展和智能制造的深入应用,医疗器械5G智能制造工厂物联数字孪生平台应运而生,它不仅为传统制造业注入了新的活力,更以其独特的优势引领…

C++图像识别、图像识别接口、ocr api

如果您在找工作并且在找内容审核编辑的工作,那么不难发现,快手在全国多个招聘网站发布了关于“内容审核编辑”岗位的招聘信息,据悉,此次的“内容审核编辑”岗位招聘的规模达3000人。因为快手上面“低龄妈妈”内容的炒作&#xff0…

Linux 与 Windows 服务器操作系统 | 全面对比

在服务器操作系统的领域,Linux 和 Windows 一直是两个备受关注的选择。 首先来看 Windows 操作系统。它由 Microsoft Corporation 开发,在桌面领域占据显著份额,其中 Windows 10 是使用最广泛的版本,广泛应用于个人计算机和企业桌…

8月16日笔记

只有DNS协议出网场景 DNS 协议是一种请求、应答协议,也是一种可用于应用层的隧道技术。DNS 隧道的工作原理很简单,在进行 DNS 查询时,如果查询的域名不在 DNS 服务器本机缓存中,就会访问互联网进行查询,然后返回结果。…

ELK整合实战,filebeat和logstash采集SpringBoot项目日志发送至ES

文章目录 ELK整合实战使用FileBeats将日志发送到Logstash配置Logstash接收FileBeat收集的数据并打印Logstash输出数据到Elasticsearch利用Logstash过滤器解析日志Grok插件Grok语法用法 输出到Elasticsearch指定索引 前文:FileBeats详解 前文:logstash详解…

pdf翻译软件哪个好用?多语言轻松转

想知道怎么用pdf翻译器在线翻译吗?无需复杂操作,一键即可解锁语言障碍。 在这个全球化日益加深的时代,掌握pdf文件的快速翻译技巧尤为重要。 无论是学习、工作还是国际交流,以下4个免费pdf翻译技巧都将是你不可或缺的得力助手。…

Apollo9.0 PNC源码学习之Planning模块—— Lattice规划(一):笛卡尔和Frenet坐标系

参考文章:Frenet坐标系 or Cartesian坐标系? 1 Lattice规划算法框架结构 2 Frenet坐标系 // 跟据匹配点,计算Frenet坐标系的S-L值// 3. according to the matched point, comp

十九、中介者模式

文章目录 1 基本介绍2 案例2.1 Developer 抽象类2.2 FrontendDeveloper 类2.3 BackendDeveloper 类2.4 Mediator 接口2.5 ProjectManager 类2.6 Client 类2.7 Client 类的运行结果2.8 总结 3 各角色之间的关系3.1 角色3.1.1 Colleague ( 同事 )3.1.2 ConcreteColleague ( 具体的…

RabbitMQ-消息队列-centos7

一、RabbitMQ安装 1、通过官网下 官网网址:https://www.rabbitmq.com 首先下载erlang-23.3.4.11-1.el7.x86_64.rpm,其次下载rabbitmq-server-3.10.0-1.el7.noarch.rpm 注意:RabbitMQ是由erlang开发的,所以必须先安装erlang版本…

Pytorch1: Anaconda下载,安装,配置

Anaconda手册 一,Anconada1,Anconada简介 二、下载、安装、配置环境变量1,安装 三、anaconda创建多版本python环境四、anaconda 安装 pytorch五、Jupyter Notebook 一,Anconada 1,Anconada简介 Anaconda就是一个用于…

【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch

JUC:java.util.concurrent 一、Callable 接⼝ 接口方法Callablecall,带有返回值Runnablerun,void所以创建一个线程,希望它给你返回一个结果,那么使用 Callable 更加方便一些 比如,创建一个线程&#xff…

leetcode350. 两个数组的交集 II,哈希表

leetcode350. 两个数组的交集 II 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可…

导出word格式的Javadoc(可用于快速生成项目详细设计文档)

导出word格式的Javadoc ​ 最近要编写项目详细设计文档,作为程序员当然想看看有没有能够自动生成的办法,生成详细设计文档,然后再在生成的基础上略做修改就好了(偷懒大法~),还真有,特此分享&am…

数字乡村+智慧农业数字化转型大数据平台建设方案

1. 数字农业发展趋势 数字农业正经历全环节数字技术应用、全流程生产经营再造、全方位线上线下对接和管理服务全生命周期覆盖的四大趋势,标志着我国农业进入高质量发展新阶段。 2. 数字乡村的战略意义 数字乡村作为数字化、网络化和信息化的产物,对于…

人工智能技术工程师由谁颁发?都学习哪些课程?

人工智能技术工程师是一个充满挑战和机遇的职业。他们将用自己的专业知识和技能,为人类带来更加美好的未来。 一、人工智能工程师发证单位是谁? 人工智能技术工程师证书是由工业和信息化部教育与考试中心颁发的。 工信部电子标准院的人工智能从业人员认…

基于飞腾平台的Hadoop的安装配置

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

旅游卡真伪一招辨别,避免旅行陷阱!

揭秘旅游卡真伪!一招教你识别隐藏陷阱,避免旅行大坑! 对于热爱旅行的朋友们来说,旅游卡无疑是一种方便又实惠的选择。 然而,随着市场上的旅游卡种类越来越多,如何选择一张真实有效的旅游卡成为了大家关注…

CI/CD 自动化:最大限度地提高极狐GitLab 群组的“部署冻结”影响

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…