dmlc / dmlc/dgl

Heterogeneous subgraph operation crashes with CSC-only format

Open
#5,722 0 comments 0 reactions 0 assignees View on GitHub
bug:confirmed
Dominant language
Python
Stars
14.3k
Forks
3.1k
PR merge metrics
No merged PRs in 30d

Description

## 🐛 Bug

Calling `hg.subgraph()` will crash on heterogeneous graphs with CSC format under certain cases

## To Reproduce

Steps to reproduce the behavior:

```python
g = dgl.heterograph({
('A', 'AB', 'B'): ([1,2,3,4,5],[0,1,2,1,0]),
('B', 'BA', 'A'): ([0,1,2,1,0],[1,2,3,4,5]),
})

# works
g = g.formats('csr')
g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})

# crashes
g = g.formats('csc')
g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})
```

```
---------------------------------------------------------------------------
DGLError Traceback (most recent call last)
Input In [28], in ()
1 g = g.formats('csc')
----> 2 sg = g.subgraph({'A': [3, 4, 5], 'B': [0, 1, 2]})

File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/utils/internal.py:1051, in alias_func.._fn(*args, **kwargs)
1049 @wraps(func)
1050 def _fn(*args, **kwargs):
-> 1051 return func(*args, **kwargs)

File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/subgraph.py:164, in node_subgraph(graph, nodes, relabel_nodes, store_ids, output_device)
158 device = context_of(nodes)
160 induced_nodes = [
161 nodes.get(ntype, F.copy_to(F.tensor([], graph.idtype), device))
162 for ntype in graph.ntypes
163 ]
--> 164 sgi = graph._graph.node_subgraph(induced_nodes, relabel_nodes)
165 induced_edges = sgi.induced_edges
166 # (BarclayII) should not write induced_nodes = sgi.induced_nodes due to the same
167 # bug in #1453.

File ~/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/heterograph_index.py:1038, in HeteroGraphIndex.node_subgraph(self, induced_nodes, relabel_nodes)
1021 """Return the induced node subgraph.
1022
1023 Parameters
(...)
1035 The subgraph index.
1036 """
1037 vids = [F.to_dgl_nd(nodes) for nodes in induced_nodes]
-> 1038 return _CAPI_DGLHeteroVertexSubgraph(self, vids, relabel_nodes)

File dgl/_ffi/_cython/./function.pxi:295, in dgl._ffi._cy3.core.FunctionBase.__call__()

File dgl/_ffi/_cython/./function.pxi:227, in dgl._ffi._cy3.core.FuncCall()

File dgl/_ffi/_cython/./function.pxi:217, in dgl._ffi._cy3.core.FuncCall3()

DGLError: [07:53:52] /home/ubuntu/dgl/src/array/cpu/spmat_op_impl_csr.cc:514: Check failed: oldi >= 0 && oldi < csr.num_rows: Invalid row index: 3
Stack trace:
[bt] (0) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dmlc::LogMessageFatal::~LogMessageFatal()+0x4e) [0x7fd7ab47ff06]
[bt] (1) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::aten::CSRMatrix dgl::aten::impl::CSRSliceMatrix<(DGLDeviceType)1, long>(dgl::aten::CSRMatrix, dgl::runtime::NDArray, dgl::runtime::NDArray)+0x2c2) [0x7fd7ab764b6e]
[bt] (2) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::aten::CSRSliceMatrix(dgl::aten::CSRMatrix, dgl::runtime::NDArray, dgl::runtime::NDArray)+0x8bf) [0x7fd7ab45c21c]
[bt] (3) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::UnitGraph::CSR::VertexSubgraph(std::vector > const&) const+0x336) [0x7fd7abb6b476]
[bt] (4) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::UnitGraph::VertexSubgraph(std::vector > const&) const+0x9d) [0x7fd7abb577f7]
[bt] (5) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(dgl::HeteroGraph::VertexSubgraph(std::vector > const&) const+0x5cf) [0x7fd7ab9ecc67]
[bt] (6) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(+0xd9ca69) [0x7fd7aba05a69]
[bt] (7) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(+0xda9b4a) [0x7fd7aba12b4a]
[bt] (8) /home/ubuntu/miniconda3/lib/python3.9/site-packages/dgl-1.2-py3.9-linux-x86_64.egg/dgl/libdgl.so(std::function::operator()(dgl::runtime::DGLArgs, dgl::runtime::DGLRetValue*) const+0x5a) [0x7fd7ab93ba72]
```

## Expected behavior

CSC should not crash

## Environment

- DGL Version (e.g., 1.0): master
- Backend Library & Version (e.g., PyTorch 0.4.1, MXNet/Gluon 1.3): PyTorch 2.0
- OS (e.g., Linux): Linux
- How you installed DGL (`conda`, `pip`, source): source
- Build command you used (if compiling from source): `cmake -DUSE_OPENMP=OFF -DUSE_CUDA=ON` (turning on OpenMP has the same problem).
- Python version: 3.9
- CUDA/cuDNN version (if applicable):
- GPU models and configuration (e.g. V100):
- Any other relevant information:

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.