面向 NetworkX 用户的加速生产就绪型图形分析

news2024/9/23 23:24:20

目录

借助 NetworkX 轻松进行图形分析

使用 cuGraph 加速图形分析

使用 ArangoDB 进行生产就绪型图形分析

借助 cuGraph 和 ArangoDB 实现 GPU 加速分析

实施示例

测试环境

下载数据

创建 NetworkX 图形

在不使用 ArangoDB 的情况下运行 cuGraph 算法

将 NetworkX 图形保留为 ArangoDB

实例化 NetworkX-ArangoDB 图形

使用 ArangoDB 运行 cuGraph 算法

ArangoDB 中的数据持久性

将 CRUD 功能与 NetworkX-ArangoDB 结合使用


NetworkX 是一款热门且易于使用的 Python 图形分析库。然而,其性能和可扩展性可能无法满足中型到大型网络的需求,这可能会严重影响用户的工作效率。

NVIDIA 和 ArangoDB 已经通过一项无需更改 NetworkX 代码的解决方案共同解决了这些性能和扩展问题,该解决方案集成了三个主要组件:

  • NetworkX API
  • 使用的图形加速 RAPIDS cuGraph
  • ArangoDB 中的大规模生产就绪型分析

在本文中,我将讨论如何让 NetworkX 用户的生活更轻松,向您展示一个实现示例,并解释如何开始抢先体验。

借助 NetworkX 轻松进行图形分析

NetworkX 广泛用于数据科学家、学生和许多其他人员的图形分析。它是开源的、 WELL-DOCUMENTED 并通过简单的 API 支持大量算法。

也就是说,其一个已知的限制是它在中大型图形方面的性能,这严重地影响了它在生产应用中的实用性。

使用 cuGraph 加速图形分析

RAPIDS cuGraph 图形分析加速库弥合了 NetworkX 与基于 GPU 的图形分析之间的差距:

  • 图形创建和操作:使用 NetworkX 创建和操作图形,将数据无缝传递至 cuGraph,以加速处理大型图形。
  • 快速图形算法:利用 NVIDIA GPUs 的强大功能进行实时分析。
  • 数据互操作性:支持 NetworkX 图形对象和其他格式的数据,实现机器学习、ETL 任务和图形分析之间的简单数据交换。

最棒的地方是,您无需更改代码即可享受 NVIDIA GPU 加速的优势。只需安装 nx-cugraph 库并指定 cuGraph 后端。有关安装和性能基准测试的更多信息,请参阅在 NVIDIA GPU 上加速 NetworkX 以实现高性能图形分析。

简而言之,对于大小介于 10 到 1000 之间的 k,GPUs 可将单次 betweenness centrality 运行速度提高 11 到 600 倍。

使用 ArangoDB 进行生产就绪型图形分析

NetworkX 用户通常必须采用一套复杂的方法来持久化图形数据:

  • 手动将数据导出到平面文件
  • 关系型数据库
  • 临时解决方案,例如使用内存存储

每种方法都有一系列独特的挑战,迫使您花费时间和精力来管理和操作图形数据,而不是专注于分析和数据科学任务。

ArangoDB 的数据持久性层可让一个或多个用户更轻松地在任何无法容纳内存的大型网络上执行图形操作。通过将 ArangoDB 集成为持久性数据层,您将看到以下几个潜在优点:

  • 可扩展性:图形数据可以跨多个节点横向扩展,而不仅仅是纵向扩展,从而处理大量数据集。
  • 性能:用于实时分析和操纵图形数据的快速读写操作。
  • 灵活性:在一个完全集成的平台上支持所有热门数据模型:图形、文档、全文本搜索、键/值和地理空间模型;还支持多租户。

图 1 展示了如何将 ArangoDB 集成到 NetworkX 用户的工作流程中,从而改变图形数据的存储和访问方式。通过提供这种新的持久性层,ArangoDB 使数据科学家能够专注于他们擅长的工作,而不是数据操作和其他细节。

Workflow diagram shows starting with a query into NetworkX that has been loaded with data using Python DataFrames and persisting data in ArangoDB.

图 1. ArangoDB 作为 NetworkX 持久性层

数据持久性使用户能够利用其他团队成员完成的工作。数据不必从源加载并编译为每个用户的图形,而是可以从数据库加载图形。

图形算法的结果也可以存储和检索,而不是由每个用户再次运行。最终,这节省了用户的时间和资金。

借助 cuGraph 和 ArangoDB 实现 GPU 加速分析

在 NetworkX 中,分析大型数据集需要很长时间。这就是 ArangoDB 使用 RAPIDS cuGraph 分析图形数据的原因,尤其是在数据增长到足以导致性能降低时。

Workflow diagram shows starting with a query into NetworkX that has been loaded with data using Python DataFrames; using cuGraph in memory on a GPU for algorithms and processing; and persisting data in ArangoDB.

图 2. 使用 ArangoDB、NetworkX 和 cuGraph 分析大规模图形。

通过 NetworkX 接口使用 GPU 扩展 ArangoDB 有几个好处。首先,与使用 CPU 相比,使用 GPU 从 ArangoDB 提取数据的速度要快得多。这是因为 ArangoDB 优化了其数据提取工具,以独特地满足 cuGraph 数据结构的需求,即坐标列表(COO)图形格式。

其次,您可以通过笔记本电脑或其他客户端分析大型图形数据。NetworkX充当客户端API库,用于处理图形算法,这些算法所需的内存超过客户端所能提供的内存。

最后,无需更改代码。cuGraph 支持 NetworkX 用户零代码更改,因此您可以使用自己熟悉的工具。

实施示例

得益于 NetworkX 后端到后端接口的功能,只要机器上有可用的 NVIDIA GPU,nx-arangodb 图形即可使用 nx-cugraph 的 GPU 功能。换言之,当使用 nx-arangodb 时,仍可选择通过 NetworkX 运行 CPU 或 GPU 算法。

以下各节展示了如何使用 NetworkX 和 nx-arangodb 库在 ArangoDB 中创建和持久化图形:

  • 下载数据
  • 创建 NetworkX 图形
  • 在不使用 ArangoDB 的情况下运行 cuGraph 算法
  • 将 NetworkX 图形保留为 ArangoDB
  • 实例化 NetworkX-ArangoDB 图形
  • 使用 ArangoDB 运行 cuGraph 算法

测试环境

在本文中,我使用了具有 13 GB 系统 RAM 的 Intel Xeon CPU,并将其与具有 84 GB 系统 RAM 和 40 GB GPU RAM 的 NVIDIA A100 GPU 进行了比较。我使用的是 CUDA 12.2。

Stanford Network Analysis Platform (SNAP) 引用专利数据集是一张在 1975 年至 1999 年期间授予的专利引文图,总计包含 370 万个节点和 1650 万个边缘。代码示例依赖于 Betweenness Centrality 图形算法,可帮助您找到哪些专利比其他专利更重要,并了解它们的相对重要性。

在本文中,我使用了通过 ArangoGraph 托管服务提供的 ArangoDB 实例,该实例使我能够为未来会话保留任何已创建的图形。它作为企业版 3.11.8,以六个节点(每个节点 32 GB 内存)的分片数据库运行。

下载数据

首先,下载 Citation Patents 数据集,并将其写入文本文件。

# Median Time: 10 seconds 

import gzip

import shutil

import requests

url = 'https://snap.stanford.edu/data/cit-Patents.txt.gz'

name = 'cit-Patents.txt'

# Download gz

response = requests.get(url, stream=True)

response.raise_for_status()

# Stream gz data & write to text file

with response.raw as r, gzip.open(r, 'rb') as f_in, open(name, 'wb') as f_out:

    shutil.copyfileobj(f_in, f_out)

创建 NetworkX 图形

接下来,使用 pandas 边缘列表对 NetworkX 图形进行实例化。

# Median Time: 90 seconds

import pandas as pd

import networkx as nx

# Read into Pandas

pandas_edgelist = pd.read_csv(

    "cit-Patents.txt",

    skiprows=4,

    delimiter="\t",

    names=["src", "dst"],

    dtype={"src": "int32", "dst": "int32"},

)

# Create NetworkX Graph from Edgelist

G_nx = nx.from_pandas_edgelist(

    pandas_edgelist, source="src", target="dst", create_using=nx.DiGraph

)

在不使用 ArangoDB 的情况下运行 cuGraph 算法

可以通过将 backend 设置为 cugraph 来调用 NetworkX 算法。这使用 nx-cugraph 的 GPU 加速算法实现,无需更改代码。

# Median Time: 5 seconds

result = nx.betweenness_centrality(G_nx, k=10, backend="cugraph")

或者,设置 NETWORKX_AUTOMATIC_BACKENDS 环境变量,将 cugraph 指定为选定的 NetworkX 后端,而不是指定 backend 参数。

将 NetworkX 图形保留为 ArangoDB

此时,您可以选择将本地 NetworkX 图形保留到 ArangoDB 中。假设您有一个在提供的 DATABASE_HOST 上运行的 ArangoDB 实例,您可以通过实例化一个 NetworkX 对象,并使用参数 along with 一个特定名称来加载图形。

# Median Time: 3 Minutes

import os

import nx_arangodb as nxadb

os.environ["DATABASE_HOST"] = "https://123.arangodb.cloud:8529"

os.environ["DATABASE_USERNAME"] = "root"

os.environ["DATABASE_PASSWORD"] = "password"

os.environ["DATABASE_NAME"] = "myDB"

# Load the DiGraph into ArangoDB

G_nxadb = nxadb.DiGraph(

    name="cit_patents",

    incoming_graph_data=G_nx,

    write_batch_size=50000

)

现在,假设已创建新的 Python 会话。你可以自行决定是在同一台机器还是在其他机器上创建新会话。当你与团队成员合作进行协作开发时,这可能会很有用。

实例化 NetworkX-ArangoDB 图形

通过使用环境变量指定连接凭据并重新实例化 nxadb.DiGraph,可以重新连接到持久图形。提供可选的 read_batch_size 和 read_parallelism 参数,以优化数据读取。

图形实例化不会将图形拉入内存,而是建立与持久图形的远程连接。

# Median Time: 0 seconds

import nx_arangodb as nxadb

os.environ["DATABASE_HOST"] = "https://123.arangodb.cloud:8529"

os.environ["DATABASE_USERNAME"] = "root"

os.environ["DATABASE_PASSWORD"] = "password"

os.environ["DATABASE_NAME"] = "myDB"

# Connect to the persisted Graph in ArangoDB

# This doesn't pull the graph; You're just establishing a remote connection.

G_nxadb }}{{= nxadb.DiGraph(

     name="cit_patents",

           read_parallelism=15,

           read_batch_size=3000000

)

使用 ArangoDB 运行 cuGraph 算法

通过使用 GPU,您可以依靠相同的算法来获取 ArangoDB 图形的 GPU 表示,其内存占用明显小于 CPU 表示。在提取 ArangoDB 图形后,它被缓存为 NetworkX-cuGraph 图形,这使您能够运行更多算法,而无需再次拉取算法,除非用户明确要求这样做。

# Option 1: Explicit Graph Creation

from nx_arangodb.convert import nxadb_to_nxcg

# Pull the graph from ArangoDB and cache it

# Median Time: 30 seconds

G_nxcg = nxadb_to_nxcg(G_nxadb)

# Median Time: 5 seconds

result = nx.betweenness_centrality(G_nxcg, k=10)

# Option 2 (recommended): On-demand Graph Creation

# This pulls the graph from ArangoDB on the first algorithm call & caches it 

# Median Time: 35 seconds

result = nx.betweenness_centrality(G_nxadb, k=10)


ArangoDB 中的数据持久性

鉴于在 ArangoDB 中保留 NetworkX 图形的新功能,与不涉及数据库相比,您可以将加载新会话的速度提高 3 倍。

说明步骤时间 (秒)
ArangoDB 中不保留数据0-2 小时105
ArangoDB 中的数据持久性535
加速3 倍

表 1. 使用和不使用 ArangoDB 的工作流比较。

在数据上运行多个会话或要求多人在没有ArangoDB的情况下分析相同的数据将给从头开始带来不便。拥有持久性层有助于此工作流程。这使得cuGraph和ArangoDB的组合成为在NetworkX中处理大型图形的关键策略。

将 CRUD 功能与 NetworkX-ArangoDB 结合使用

如果您选择将 NetworkX-ArangoDB 用于 CRUD 功能,则可以使用更多的功能。NetworkX-ArangoDB 十分重视零代码更改,这意味着 NetworkX-ArangoDB 图的 CRUD 接口与 NetworkX 图形相同。

坚持使用 ArangoDB 还可以利用 ArangoDB 的多模型查询语言,Arango 查询语言(AQL)。这是一种统一查询语言,可在一个平台上执行图形遍历、全文搜索、文档检索和键值查找。

import nx_arangodb as nxadb

G_nxadb = nxadb.DiGraph(name="cit_patents") # Connect to ArangoDB

assert G_nxadb.number_of_nodes() == G_nx.number_of_nodes()

assert G_nxadb.number_of_edges() == G_nx.number_of_edges()

assert len(G_nxadb[5526234]) == len(G_nx[5526234])

G_nxadb.nodes[1]["foo"] = "bar"

del G_nxadb.nodes[1]["foo"]

G_nxadb[5526234][4872081]["object"] = {"foo": "bar"}

G_nxadb[5526234][4872081]["object"]["foo"] = "bar!"

del G_nxadb[5526234][4872081]["object"]

G_nxadb.add_edge("A", "B", bar="foo")

G_nxadb["A"]["B"]["bar"] = "foo!"

del G_nxadb.nodes["A"]

del G_nxadb.nodes["B"]

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

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

相关文章

【Qt 即时通讯项目】登录验证码是如何做到的呢

文章目录 1. 登录注册功能验证码实现2. 验证码生成的流程3. 细节部分 1. 登录注册功能验证码实现 🐧①目的:引入验证码,目的是用来避免程序被其它程序暴力破解的方式找到密码。 2. 验证码生成的流程 ①🍎首先通过Qt的QRandomGen…

初始Linux 和 各种常见指令

目录 Linux背景 1. 发展史 Linux发展历史 1.历史 2. 开源 Linux下基本指令 01. ls 指令 02. pwd命令 03. cd 指令 04. touch指令 05.mkdir指令(重要): 06.rmdir指令 && rm 指令(重要): …

OpenCV结构分析与形状描述符(20)计算一个包围给定点集的最小外接圆函数minEnclosingCircle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个包围二维点集的最小面积的圆。 该函数使用迭代算法来寻找一个二维点集的最小外接圆。这意味着函数将会通过反复逼近的过程来计算出能够…

【Shiro】Shiro 的学习教程(四)之 SpringBoot 集成 Shiro 原理

目录 1、第一阶段:启动服务,构建类的功能2、第二阶段:正式请求 1、第一阶段:启动服务,构建类的功能 查看 Shiro 配置类 ShiroConfiguration: Configuration public class ShiroConfiguration {// 创建 sh…

算法里面的离散化

一、离散化(discretization)在算法和数据结构中指的是将连续的输入数据映射到离散的值或者范围,从而使得处理和计算变得更高效。通常用于处理大范围或者无限可能的输入,以便将其转化为有限的、可以有效处理的范围。 离散化的定义…

opencv之傅里叶变换

文章目录 前言理论基础Numpy实现傅里叶变换实现傅里叶变换实现逆傅里叶变换 高通滤波示例OpenCV实现傅里叶变换实现傅里叶变换实现逆傅里叶变换 低通滤波示例 前言 图像处理一般分为空间域处理和频率域处理。 空间域处理是直接对图像内的像素进行处理。空间域处理主要划分为灰…

Mysql基础练习题 1757.可回收且低脂的产品(力扣)

编写解决方案找出既是低脂又是可回收的产品编号。 题目链接: https://leetcode.cn/problems/recyclable-and-low-fat-products/description/ 建表插入数据: Create table If Not Exists Products (product_id int, low_fats ENUM(Y, N), recyclable …

Kernel 内核 BUG_ON()和WARN_ON()

WARN_ON() DEBUG_ON() 不是一个标准的 Linux 内核宏,它可能是特定内核版本或者特定内核配置中的一个宏,或者在某些内核代码中自定义的宏。一般来说,如果存在 DEBUG_ON(),它可能被用作一个调试开关,用于在调试版本中启…

2024.9.11

时钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QTimer> #include <QPainter> #include <QPen> #include <QBrush> #include <QTime> #include <QDebug> QT_BEGIN_NA…

国内如何优雅的用Google?无需安装任何工具!

前言 Google可以说时每个程序猿的标配&#xff0c;但由于网络问题&#xff0c;在访问Google的时候或多或少都会遇到一系列的问题&#xff0c;接下来介绍一个非常“炸裂”的Google打开方式。 LiteIcoding 在此之前&#xff0c;你需要访问这个地址 https://lite.icoding.ink 这…

【Qt】QSS的设置方式

QSS的设置方式 QWidget 中包含了 setStyleSheet ⽅法, 可以直接设置样式. 上述代码我们已经演⽰了上述设置⽅式 还可以通过 QApplication 的 setStyleSheet ⽅法设置整个程序的全局样式. 设置全局样式&#xff0c;可以将界面上所有的样式都集中到一起来组织。 全局样式优点:…

56 - II. 数组中数字出现的次数 II

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9856%20-%20II.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0%20II/README.md 面试题 56 - II. 数…

大屏可视化常用图标效果表达

1-echarts-雷达图 2-echarts-仪表盘 3-echarts-水球图&#xff08;利用插件&#xff0c;echarts-liquidfill&#xff09; 4-element UI tree 添加连接线&#xff0c;修改样式或使用插件&#xff08;element-tree-line&#xff09; 5-echarts-漏斗图 6-echarts-饼状图嵌套 optio…

力扣刷题之2181.合并零之间的节点

题干描述 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff0c;其值是所有已合并节点的值之和。然后将所有 0 …

为什么 1T 的硬盘容量只有 931G?真相在这里!

硬盘容量疑问 以一个容量为 1T 的硬盘为例&#xff0c;在 Windows 系统下&#xff0c;容量显示只有 931G&#xff0c;不应该是 1024GB 吗&#xff1f;这到底是为什么呢&#xff1f;是商家在欺骗消费者吗&#xff1f; 按照之前内存大小的计算逻辑&#xff08;1MB 1024KB&…

AI电商,如何提高设计效率?

第一步&#xff1a;找参考 第二步&#xff1a;提取关键词 我用的文心一言 第三步&#xff1a;选择AI绘画工具&#xff08;千鹿 设计助手&#xff09; 千鹿设计助手——FLux文生图&#xff0c;你也可以选择你手上的AI绘画工具 这个新用户注册会赠送1000积分 第四步生图

[笔记] 电机工作制以及软硬特性的本质推导

原始资料来源&#xff1a;某电机厂商 1.电机非常规操作术语和许可次数 1.1 电机操作术语 点动&#xff1a;通电后立即关停&#xff0c;最终速度不到额定转速的1/4电制动&#xff1a;制动到额定转速的1/3逆转&#xff1a;也就是打反车&#xff0c;不等停车&#xff0c;立即翻…

Java、python、php三个版本 抗震救灾物资管理系统 抗洪救灾物资分配系统 救援物资申请平台(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

在 Web 中判断页面是不是刷新

在 Web 开发中&#xff0c;我们经常需要区分用户是否通过刷新操作重新加载了页面。这一操作可能是由用户手动刷新&#xff08;如按下 F5 键或点击浏览器刷新按钮&#xff09;或通过浏览器自动重新加载。判断页面是否刷新有助于开发者优化用户体验&#xff0c;例如在使用 vue 的…

超详细,手把手带你源码启动 Thingsboard-Gateway + MQTT 接入设备

超详细&#xff0c;手把手带你源码启动 Thingsboard-Gateway MQTT 接入设备 前置条件 thingsboard&#xff0c;我这里选择的是本地源码启动postgresql&#xff0c;这里采用的是个人服务器部署的公共服务EMQX&#xff0c;这里同样采用服务器部署的公共服务MQTTX 客户端Mysql【…