当前位置: 首页 > news >正文

【教程】DGL中的子图分区函数partition_graph讲解

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

目录

函数形式

函数作用

函数内容

函数入参

函数返参        

使用示例


实际上官方的函数解释中就已经非常详细了。

函数形式

def 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')

函数作用

        为分布式训练对图形进行分区,并将分区存储在文件中。

函数内容

        分区分为三个步骤:
            1) 运行分区算法(如 Metis)将节点分配到分区中;
            2) 根据节点分配构建分区图结构;
            3) 根据分区结果分割节点特征和边特征。

        在对图进行分区时,每个分区都可能包含HALO节点,这些节点被分配给其他分区,但为了提高效率而被包含在本分区中。
        在本文中,local nodes/edges指的是真正属于某个分区的节点和边。其余的都是HALO nodes/edges

        分区数据存储在多个文件中,组织结构如下:

data_root_dir/|-- graph_name.json     # partition configuration file in JSON|-- node_map.npy        # partition id of each node stored in a numpy array (optional)|-- edge_map.npy        # partition id of each edge stored in a numpy array (optional)|-- part0/              # data for partition 0|-- node_feats.dgl  # node features stored in binary format|-- edge_feats.dgl  # edge features stored in binary format|-- graph.dgl       # graph structure of this partition stored in binary format|-- part1/              # data for partition 1|-- node_feats.dgl|-- edge_feats.dgl|-- graph.dgl

        首先,原始图形和分区的元数据存储在一个以"graph_name"命名的 JSON 文件中。
        该 JSON 文件包含原始图的信息以及存储每个分区的文件路径。
        下面是一个示例。

{"graph_name" : "test","part_method" : "metis","num_parts" : 2,"halo_hops" : 1,"node_map": {"_U": [ [ 0, 1261310 ],[ 1261310, 2449029 ] ]},"edge_map": {"_V": [ [ 0, 62539528 ],[ 62539528, 123718280 ] ]},"etypes": { "_V": 0 },"ntypes": { "_U": 0 },"num_nodes" : 1000000,"num_edges" : 52000000,"part-0" : {"node_feats" : "data_root_dir/part0/node_feats.dgl","edge_feats" : "data_root_dir/part0/edge_feats.dgl","part_graph" : "data_root_dir/part0/graph.dgl",},"part-1" : {"node_feats" : "data_root_dir/part1/node_feats.dgl","edge_feats" : "data_root_dir/part1/edge_feats.dgl","part_graph" : "data_root_dir/part1/graph.dgl",},
}
  • graph_name:是用户给出的图形名称。
  • part_method:是将节点分配到分区的方法。目前,支持 "random "和 "metis"。
  • num_parts:是分区的数量。
  • halo_hops:是分区中作为 HALO 节点的节点跳数。
  • node_map:是节点分配映射表,它显示了节点被分配到的分区 ID。
  • edge_map:是边的分配映射,它告诉我们边被分配到的分区 ID。
  • num_nodes:是全局图中的节点数。
  • num_edges:是全局图中的边数。
  • part-*:存储一个分区的数据。

        如果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``中的信息还可用于计算节点类型和边类型。
        "node_map"和"edge_map"中的数据格式如下:

{"node_type": [ [ part1_start, part1_end ],[ part2_start, part2_end ],... ],...
},

        本质上,``node_map``和`edge_map``是字典。键是节点/边类型。值是成对的列表,包含分区中相应类型的 ID 范围的起点和终点。列表的长度是分区的数量;列表中的每个元素都是一个元组,存储了分区中特定节点/边类型的 ID 范围的起点和终点。

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

        分区图包含额外的节点数据("inner_node "和 "orig_id")和边数据("inner_edge"):

  • inner_node:表示节点是否属于某个分区。
  • inner_edge:表示一条边是否属于一个分区。
  • orig_id:在 reshuffle=True 时存在。它表示重新洗牌前原始图中的原始节点 ID。

       节点和边的特征被分割开来,与每个图形分区一起存储。分区中的所有节点/边特征都以 DGL 格式存储在一个文件中。节点/边特征存储在字典中,其中键是节点/边数据的名称,值是张量。我们不存储 HALO 节点和边的特征。

        在执行 Metis 分区时,我们可以对分区施加一些约束。目前,它支持两种平衡分区的约束条件。默认情况下,Metis 总是尝试平衡每个分区中的节点数。

  • balance_ntypes:平衡每个分区中不同类型节点的数量。
  • balance_edges:平衡每个分区中的边数。

        为了平衡节点类型,用户需要传递一个包含 N 个元素的向量来表示每个节点的类型。N 是输入图中的节点数。

函数入参

  • g : DGLGraph

    要分割的输入图

  • graph_name : str

    图的名称。该名称将用于构建 dgl.distributed.DistGraph

  • num_parts : int

    分区数

  • out_path : str

    存储所有分区数据文件的路径

  • num_hops : int, optional

    我们在分区图结构上构建的 HALO 节点的跳数。默认值为 1

  • part_method : str, optional

    分区方法。支持 "random"和 "metis"。默认值为 "metis"

  • reshuffle : bool, optional

    是否打乱节点和边,使分区中的节点和边处于连续的 ID 范围内。默认值为 True。该参数已被弃用,将在下一版本中删除

  • balance_ntypes : tensor, optional

    每个节点的节点类型。这是一个一维整数数组。其值表示每个节点的节点类型。Metis分区使用此参数。指定该参数后,Metis 算法将尝试把输入图分割成多个分区,每个分区中每个节点类型的节点数大致相同。默认值为 "None",这意味着 Metis 只对图进行分区,以平衡节点数量。

  • balance_edges : bool

    指示是否平衡每个分区中的边。该参数用于 Metis 算法使用。

  • return_mapping : bool

    如果 `reshuffle=True` 表示返回洗牌后的节点/边 ID 与原始节点/边 ID 之间的映射。

  • num_trainers_per_machine : int, optional

    每台机器的trainer数量。如果不是 1,则会先将整个图划分给每个trainer,即 num_parts*num_trainers_per_machine parts。每个节点的trainer ID 将存储在节点特征 "trainer_id "中。然后,同一台机器上trainer的分区将被合并成一个更大的分区。分区的最终数量为 "num_part"。

  • objtype : str, "cut" or "vol"

    将目标设置为边缘切割最小化或通信量最小化。Metis 算法会使用这一参数。

函数返参        

  • Tensor or dict of tensors, optional

    如果 "return_mapping=True",则返回一个一维张量,表示同构图中经过洗牌的节点 ID 与原始节点 ID 之间的映射;如果是异构图,则返回一个一维张量的 dict,其 key 是节点类型,value 是每个节点类型的经过洗牌的节点 ID 与原始节点 ID 之间的一维张量映射。

  • Tensor or dict of tensors, optional

    如果 "return_mapping=True",则返回一个一维张量,表示同质图中经过洗牌的边 ID 与原始边 ID 之间的映射;如果是异质图,则返回一个一维张量的 dict,其 key 是边类型,value 是每个边类型的经过洗牌的边 ID 与原始边 ID 之间的 1D 张量映射。

使用示例

>>> dgl.distributed.partition_graph(g, 'test', 4, num_hops=1, part_method='metis',out_path='output/', reshuffle=True,balance_ntypes=g.ndata['train_mask'],balance_edges=True)
>>> g, node_feats, edge_feats, gpb, graph_name = dgl.distributed.load_partition('output/test.json', 0)

相关文章:

【教程】DGL中的子图分区函数partition_graph讲解

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 目录 函数形式 函数作用 函数内容 函数入参 函数返参 使用示例 实际上官方的函数解释中就已经非常详细了。 函数形式 def partition_graph(g, graph_name, num_parts, out_path, num_hops1, part…...

关于layui table回显以及选择下一页时记住上一页数据的问题

代码如下 <div class"layui-form-item"><label class"layui-form-label">选择商品</label><div class"layui-input-inline"><input type"text" name"keyword" id"keyword" placehold…...

kafka消息系统实战

kafka是什么&#xff1f; 是一种高吞吐量的、分布式、发布、订阅、消息系统 1.导入maven坐标 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.4.1</version></dependency&…...

Kafka3.0.0版本——Leader故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Leader故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟机…...

BI系统框架模型

一 技术架构 二 数据源 主数据 &#xff1a;组织|岗位|人员|大区|三大主数据&#xff08;客户、物料、供应商&#xff09;财务主数据&#xff08;科目|成本中心|利润中心|资产&#xff09;|工作中心|工艺路线 业务数据 &#xff1a;线索|业务机会|合同|订单|采购|生产|发…...

双向交错CCM图腾柱无桥单相PFC学习仿真与实现(3)硬件功能实现

前言 前面介绍了双向交错CCM图腾柱的系统设计仿真实现&#xff0c;仿真很理想 双向交错CCM图腾柱无桥单相PFC学习仿真与实现&#xff08;1&#xff09;系统问题分解_卡洛斯伊的博客-CSDN博客 然后又介绍了SOG锁相环仿真实现的原理 双向交错CCM图腾柱无桥单相PFC学习仿真与实…...

微软用 18 万行 Rust 重写了 Windows 内核

微软正在使用 Rust 编程语言重写其核心 Windows 库。 5 月 11 日——Azure 首席技术官 Mark Russinovich 表示&#xff0c;最新的 Windows 11 Insider Preview 版本是第一个包含内存安全编程语言 Rust 的版本。 “如果你参加了 Win11 Insider 环&#xff0c;你将在 Windows 内…...

word 调整列表缩进

word 调整列表缩进的一种方法&#xff0c;在试了其他方法无效后&#xff0c;按下图所示顺序处理&#xff0c;编号和文字之间的空白就没那么大了。 即右键word上方样式->点击修改格式->定义新编号格式->字体->取消勾选 “……对齐到网格”->确定...

nginx学习

一、nginx常用版本 Nginx开源版&#xff1a; http://nginx.org/ nginx plus商业版本&#xff08;好像功能支持更多&#xff09; https://www.nginx.com/ openresty &#xff08;免费&#xff0c;用的也是这个&#xff09; https://openresty.org/cn/ Tengine https://tengine.…...

python+TensorFlow实现人脸识别智能小程序的项目(包含TensorFlow版本与Pytorch版本)(一)

pythonTensorFlow实现人脸识别智能小程序的项目&#xff08;包含TensorFlow版本与Pytorch版本&#xff09;&#xff08;一&#xff09; 一&#xff1a;TensorFlow基础知识内容部分&#xff08;简明扼要&#xff0c;快速适应&#xff09;1、下载Cifar10数据集&#xff0c;并进行…...

ChatGPT怎么用于政府和公共服务?

将ChatGPT用于政府和公共服务领域是一种创新的应用方式&#xff0c;可以改善政府与公众之间的互动&#xff0c;提升公共服务的效率和质量。ChatGPT作为一个自然语言处理模型&#xff0c;可以在政府信息传递、公共参与、服务支持等方面发挥积极作用。以下将详细探讨ChatGPT如何用…...

dvwa文件上传通关及代码分析

文章目录 low等级medium等级high等级Impossible等级 low等级 查看源码&#xff1a; <?phpif( isset( $_POST[ Upload ] ) ) {// Where are we going to be writing to?$target_path DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";$target_path . basename( …...

数字孪生:重塑政府决策与公共服务

在之前的文章中为大家分享了数字孪生在很多行业的应用场景&#xff0c;本文和大家一起探讨一下数字孪生在政务管理方面能有哪些应用&#xff0c;以及其对公共服务提供的积极影响。 1&#xff09;城市规划方面 数字孪生技术可用于模拟城市的发展和规划。政府可以建立城市的虚拟…...

Leetcode:【448. 找到所有数组中消失的数字】题解

题目 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 难度&#xff1a;简单 题目链接&#xff1a;448. 找到所有数组中消失的数字 示例1 输入&…...

2023年中,量子计算产业现状——

2023年上半年&#xff0c;量子计算&#xff08;QC&#xff09;领域取得了一系列重要进展和突破&#xff0c;显示出量子计算技术的快速发展和商业应用的不断拓展。在iCV TAnk近期发表的一篇报告中&#xff0c;团队从制度进步、产业生态、投融资形势、总结与展望四个方面对量子计…...

微信小程序智慧流调微信小程序设计与实现

摘 要 自从2020年新冠疫情爆发以来&#xff0c;对全国人民的健康和全国各地区的经济发展都带来了很大的影响&#xff0c;并且新冠肺炎对各个领域带来的影响还未完全消除。近三年以来&#xff0c;全国各地区多次爆发新的疫情&#xff0c;导致许多人被隔离&#xff0c;也导致全国…...

分布式集群框架——有关zookeeper的面试考点

3.掌握Zookeeper的概念 当涉及到大规模分布式系统的协调和管理时&#xff0c;Zookeeper是一个非常重要的工具。 1. 分布式协调服务&#xff1a;Zookeeper是一个分布式协调服务&#xff0c;它提供了一个高可用和高性能的环境&#xff0c;用于协调和同步分布式系统中的各个节点…...

Spring Cloud Gateway的快速使用

环境前置搭建Nacos&#xff1a;点击跳转 Spring Cloud Gateway Docs 新建gateway网关模块 pom.xml导入依赖 <!-- 网关 --> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifact…...

VSCode-C++环境配置+Cmake

文章目录 一、环境配置二、Win10 Cmake 一、环境配置 转载链接 二、Win10 Cmake 创建CMakeLists.txt cmake_minimum_required(VERSION 3.26) project(graph_algorithm)set(CMAKE_CXX_STANDARD 17)add_executable(main main.cppshared_variable.cpp )cmake . -G "MinGW…...

python爬虫14:总结

python爬虫14&#xff1a;总结 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生不好…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...