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

问题描述

        这个报错说明在构建 DistNodeDataLoader 的时候,底层期望一个支持 GraphBolt 的图对象,但你传入的是传统的 DGLGraph(而不是 GraphBolt 的新格式)。

        在最新版的DGL中,GraphBolt 成为了官方推荐的数据加载加速模块,但目前 DGL 的大多数旧范式依然默认用的是 DGLGraph。也就是说,在没那么新DGL 中,DGLGraph 还没有 _use_graphbolt 属性,而 DGL 内部源码新引入的 DistNodeDataLoader 默认假设图对象可能是 GraphBolt 格式,因此未做好向后兼容。

解决办法

        在创建 DistNodeDataLoader 时,不要使用任何和 edge_weight/prob 相关的采样器(你现在的 sampler 就没指定 prob,但系统可能误以为有)。或者:强制关闭 GraphBolt 路径。

        但其实你已经是默认使用旧版 DGLGraph 接口了,这是 DGL 的一个 bug(目前 dist_dataloader.py 第 156 行没有保护好 _use_graphbolt 的访问)。

临时修复方案(推荐)

在你本地的 dgl/dataloading/dist_dataloader.py 第 156 行前加一行手动 patch:

# PATCH for _use_graphbolt missing in DGLGraph
if not hasattr(g, "_use_graphbolt"):
    g._use_graphbolt = False

操作步骤

① 打开 dist_dataloader.py

vim ~/anaconda3/envs/dgl/lib/python3.9/site-packages/dgl/dataloading/dist_dataloader.py
② 找到以下函数:

大概在第 150 行附近,搜索函数:

def add_edge_attribute_to_graph(g, data_name):

③ 在函数开头加入下面这行代码:

if not hasattr(g, "_use_graphbolt"):
    g._use_graphbolt = False

④ 改完后像这样:

@staticmethod
def add_edge_attribute_to_graph(g, data_name):
    if not hasattr(g, "_use_graphbolt"):
        g._use_graphbolt = False
    if g._use_graphbolt and data_name:
        ...

【踩坑】修复DGL报错 ‘DGLGraph‘ object has no attribute ‘_use_graphbolt‘_ecmascript

然后重新运行你的训练命令即可。

官方推荐方式

        升级你的 DGLGraphGraphBolt 格式,但这会牵涉到对整个数据处理流程的重写,不推荐除非你想探索 GraphBolt 性能。