logo

G

  • 教程
  • API
  • 示例
  • 插件
  • 所有产品antv logo arrow
  • 6.1.26
  • 画布
    • 简介
    • 初始化参数
    • 场景图能力与生命周期
    • 内置对象
    • 坐标系
    • 画布事件
    • OffscreenCanvas 和服务端渲染
    • CustomElementRegistry
    • 常见问题
  • 渲染器
    • 简介
    • Canvas 渲染器
    • Canvaskit 渲染器
    • SVG 渲染器
    • WebGL 渲染器
    • WebGPU 渲染器
    • 自定义渲染器
  • 相机
    • 简介
    • 相机参数
    • 相机动作
    • 相机动画
  • 事件
    • 简介
    • 事件对象
    • 手势和拖放
    • 常见问题
  • 动画
    • Web Animations API
    • Lottie 动画
  • 基础图形
    • 基础概念
    • DisplayObject
    • Group 图形分组
    • Text 文本
    • Circle 圆形
    • Ellipse 椭圆
    • Rect 矩形
    • Image 图片
    • Line 直线
    • Polygon 多边形
    • Polyline 折线
    • Path 路径
    • HTML 内容
  • 样式系统
    • 简介
    • 继承机制
    • CSS Typed OM
    • CSS Properties & Values API
    • CSS Layout API
    • Pattern
    • Gradient
  • 三维世界
    • 材质
    • 几何
    • 光源
    • Mesh
    • 雾
    • 交互
  • 内置对象
    • EventTarget
    • Node
    • Element
    • Document
    • MutationObserver
    • 工具方法
  • GPGPU
    • 简介
    • 编程模型
    • Kernel API
    • 经典 GPGPU 的实现原理
    • webgpu-graph
  • 声明式用法
    • 使用 Web Components
  • 开发调试工具
    • G 开发者工具
    • 内置的渲染统计信息
    • 第三方开发调试工具

webgpu-graph

上一篇
经典 GPGPU 的实现原理
下一篇
使用 Web Components

资源

Ant Design
Galacea Effects
Umi-React 应用开发框架
Dumi-组件/文档研发工具
ahooks-React Hooks 库

社区

体验科技专栏
seeconfSEE Conf-蚂蚁体验科技大会

帮助

GitHub
StackOverflow

more products更多产品

Ant DesignAnt Design-企业级 UI 设计语言
yuque语雀-知识创作与分享工具
EggEgg-企业级 Node 开发框架
kitchenKitchen-Sketch 工具集
GalaceanGalacean-互动图形解决方案
xtech蚂蚁体验科技
© Copyright 2025 Ant Group Co., Ltd..备案号:京ICP备15032932号-38

Loading...

我们参考 cuGraph 以及其他 CUDA 实现,基于 g-plugin-gpgpu 背后的 WebGPU 能力实现常见的图分析算法,达到大规模节点边数据量下并行加速的目的。

对比 G6 目前提供的 CPU 串行版本有很大提升。

算法名节点 / 边CPU 耗时GPU 耗时Speed up
SSSP1k 节点 5k 边27687.10 ms261.60 ms~100x
PageRank1k 节点 500k 边13641.50 ms130.20 ms~100x

前置条件

在使用前需要确认运行环境与数据这两项前置条件。

WebGPU 运行环境

目前(2022-3-21)在 Chrome 94 正式版本以上即支持 WebGPU,但由于我们使用最新的 WGSL 语法,推荐更新浏览器到最新版。

目前在生产环境使用,需要启用 Origin Trial 以支持 WebGPU 特性(Chrome 100 以上将不再需要):

  • 获取 Token
  • 在页面中添加 <meta> 标签,附上上一步获取的 Token,例如通过 DOM API:
const tokenElement = document.createElement('meta');
tokenElement.httpEquiv = 'origin-trial';
tokenElement.content = 'AkIL...5fQ==';
document.head.appendChild(tokenElement);

我们的官网已经添加了该 token,因此只需要使用最新版 Chrome 就能正常运行全部算法示例。

图数据格式

我们使用 G6 的图数据格式,它也是以下所有算法的第一个固定参数。在内部我们会将其转换成 GPU 内存友好的图存储格式例如 CSR(compressed sparse row):

const data = {
// 点集
nodes: [
{
id: 'node1', // String,该节点存在则必须,节点的唯一标识
x: 100, // Number,可选,节点位置的 x 值
y: 200, // Number,可选,节点位置的 y 值
},
{
id: 'node2', // String,该节点存在则必须,节点的唯一标识
x: 300, // Number,可选,节点位置的 x 值
y: 200, // Number,可选,节点位置的 y 值
},
],
// 边集
edges: [
{
source: 'node1', // String,必须,起始点 id
target: 'node2', // String,必须,目标点 id
},
],
};

如果数据格式不满足以上要求,算法将无法正常执行。

使用方式

我们提供以下两种方式使用:

  • 没有 G 的 Canvas 画布,仅希望用它执行算法,不涉及渲染。这也是最简单的使用方式。
  • 已有 G 的 Canvas 画布,例如正在使用它渲染,此时仅需要调用算法。

方法一

创建一个 WebGPUGraph,内部会完成画布创建、插件注册等一系列初始化工作。完成后直接调用算法:

import { WebGPUGraph } from '@antv/webgpu-graph';
const graph = new WebGPUGraph();
(async () => {
// 调用算法
const result = await graph.pageRank(data);
})();

方法二

如果已经在使用 G 的 Canvas 画布进行渲染,可以复用它,并执行以下操作:

  • 注册 g-plugin-gpgpu 插件
  • 等待画布初始化
  • 获取 GPU Device
  • 调用算法,此时算法的第一个参数为上一步获取到的 Device
import { Canvas } from '@antv/g';
import { Renderer } from '@antv/g-webgpu';
import { Plugin } from '@antv/g-plugin-gpgpu';
import { pageRank } from '@antv/webgpu-graph';
const webgpuRenderer = new Renderer();
webgpuRenderer.registerPlugin(new Plugin());
const canvas = new Canvas({
container: 'my-canvas-id',
width: 1,
height: 1,
renderer: webgpuRenderer,
});
(async () => {
// 等待画布初始化完成
await canvas.ready;
// 通过渲染器获取 Device
const plugin = webgpuRenderer.getPlugin('device-renderer');
const device = plugin.getDevice();
// 调用算法,传入 device 和图数据
const result = await pageRank(device, data);
})();

以下所有算法均为异步调用。

Link Analysis

PageRank

为图中每一个节点计算 PageRank 得分。

参数列表如下:

名称类型是否必选描述
graphDataGraphDatatrue图数据
epsilonnumberfalse判断 PageRank 得分是否稳定的精度值,默认值为 1e-05
alphanumberfalse阻尼系数(dumping factor),指任意时刻,用户访问到某节点后继续访问该节点指向的节点的概率,默认值为 0.85。
maxIterationnumberfalse迭代次数,默认值为 1000

返回值为一个结果数组,包含 id 和 score 属性,形如 [{ id: 'A', score: 0.38 }, { id: 'B', score: 0.32 }...]。

其中数组元素已经按照 score 进行了从高到低的排序,因此第一个元素代表重要性最高的节点。

参考以下 CUDA 版本实现:

  • https://github.com/princeofpython/PageRank-with-CUDA/blob/main/parallel.cu
  • https://docs.rapids.ai/api/cugraph/stable/api_docs/api/cugraph.dask.link_analysis.pagerank.pagerank.html

使用方式如下,示例:

const result = await graph.pageRank(data);
// [{id: 'B', score: 0.3902697265148163}, {}...]

在较大规模的点边场景下有非常明显的提升:

算法名节点 / 边CPU 耗时GPU 耗时Speed up
PageRank1k 节点 500k 边13641.50 ms130.20 ms~100x

⚠️ 目前我们的实现需要使用 V * V 的存储空间,因此节点数量太多会触发 JS 的数组的 RangeError。

Traversal

SSSP

单源最短路径,即从一个节点出发,到其他所有节点的最短路径。

参数列表如下:

名称类型是否必选描述
graphDataGraphDatatrue图数据
sourcestringtrue源节点 id
weightPropertyNamestringfalse边的权重属性字段名,若不指定,则认为所有边权重相同
maxDistancenumberfalse最大距离,默认为 1000000

返回值为一个结果数组,形如 [{ target: 'A', distance: 10, predecessor: 'B' }, ...]。其中数组中每一个元素包含以下属性:

  • target 路径终点 id
  • distance 从源节点到终点的距离
  • predecessor 到达 target 的上一个节点 id

参考以下 CUDA 版本实现:

  • https://www.lewuathe.com/illustration-of-distributed-bellman-ford-algorithm.html
  • https://github.com/sengorajkumar/gpu_graph_algorithms
  • https://docs.rapids.ai/api/cugraph/stable/api_docs/api/cugraph.traversal.sssp.sssp.html

以下图为例,我们希望获取以 A 为源节点到所有节点的最短路径:

在图数据中,边的权重字段为 weight,示例:

edges: [
{
source: 'A',
target: 'B',
weight: 9,
},
// 省略其他边
];

对于返回结果的解读方法如下,如果我们想获取从 A 到 E 的完整最短路径,可以先从最后一个元素看起,发现 E 的前序节点为 B,然后 B 的前序节点为 D,最终可以得到 A -> C -> D -> B -> E 这样一条完整的最短路径:

const result = await graph.sssp(data, 'A', 'weight');
// 结果如下
[
{ target: 'A', distance: 0, predecessor: 'A' },
{ target: 'B', distance: 8, predecessor: 'D' },
{ target: 'C', distance: 4, predecessor: 'A' },
{ target: 'D', distance: 6, predecessor: 'C' },
{ target: 'E', distance: 11, predecessor: 'B' },
];

需要注意的是,如果起始节点和终点为同一节点,distance 等于 0。

在较大规模的点边场景下有非常明显的提升:

算法名节点 / 边CPU 耗时GPU 耗时Speed up
SSSP1k 节点 5k 边27687.10 ms261.60 ms~100x

APSP

Accelerating large graph algorithms on the GPU using CUDA

BFS

  • Scalable GPU Graph Traversal
  • https://github.com/rafalk342/bfs-cuda
  • https://github.com/kaletap/bfs-cuda-gpu

DFS

https://github.com/divyanshu-talwar/Parallel-DFS

Nodes clustering

K-Means

  • A CUDA Implementation of the K-Means Clustering Algorithm
  • "Yinyang" K-means and K-nn using NVIDIA CUDA

Community Detection

Louvain

  • Demystifying Louvain’s Algorithm and Its implementation in GPU
  • https://docs.rapids.ai/api/cugraph/stable/api_docs/api/cugraph.louvain.html
  • https://github.com/rapidsai/cugraph/tree/branch-22.08/cpp/src/community

K-Core

K-Core Decomposition with CUDA

Label Propagation

  • Parallel Graph Component Labelling with GPUs and CUDA
  • GPU-Accelerated Graph Label Propagation for Real-Time Fraud Detection

minimumSpanningTree

  • https://github.com/jiachengpan/cudaMST
  • https://github.com/Dibyadarshan/GPU-Based-Fast-Minimum-Spanning-Tree

Similarity

Cosine Similarity

https://github.com/adamantmc/CudaCosineSimilarity

Nodes Cosine Similarity

Others

Cycle Detection

https://github.com/hamham240/cudaGraph/blob/main/src/algos/cudaCD.cu