如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
问题描述
这个报错说明在构建 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:
...
然后重新运行你的训练命令即可。
官方推荐方式
升级你的 DGLGraph 为 GraphBolt 格式,但这会牵涉到对整个数据处理流程的重写,不推荐除非你想探索 GraphBolt 性能。
















