Release Notes

MindSpore Graph Learning 0.2.0 Release Notes

Major Features and Improvements

  • [STABLE] Add a CSR sparse operator-based acceleration solution, covering CSR data format conversion, CSR graph padding, and CSR message aggregation.

  • [STABLE] Provide training examples of APPNP, GCN, GAT, GATv2, and MPNN based on the CSR sparse operator.

API Change

New APIs & Enhanced APIs

Python APIs
  • Add graph API mindspore_gl.graph.batch_graph_csr_data

  • Add graph API mindspore_gl.graph.graph_csr_data

  • Add graph API mindspore_gl.graph.PadCsrEdge

  • Add graph API mindspore_gl.graph.sampling_csr_data

  • Add nn API mindspore_gl.nn.GNNCell.sparse_compute

Incompatible Modification

Python APIs
  • mindspore_gl.GraphField add the parameter indicesindptrindices_backwardindptr_backwardcsr,set to use sparse mode. (!214)

    Original Interface v0.2.0
    n_nodes = 7
    n_edges = 8
    src_idx = ms.Tensor([0, 2, 2, 3, 4, 5, 5, 6], ms.int32)
    dst_idx = ms.Tensor([1, 0, 1, 5, 3, 4, 6, 4], ms.int32)
    graph_field = GraphField(src_idx, dst_idx, n_nodes, n_edges)
    
    n_nodes = 7
    n_edges = 8
    indices = ms.Tensor([2, 3, 5, 6, 3, 4, 0, 6], ms.int32)
    indptr = ms.Tensor([0, 2, 4, 5, 6, 7, 8, 8], ms.int32)
    indices_backward = ms.Tensor([4, 0, 0, 2, 3, 1, 1, 5], ms.int32)
    indptr_backward = ms.Tensor([0, 1, 1, 2, 4, 5, 6, 8], ms.int32)
    graph_field = GraphField(n_nodes=n_nodes, n_edges=n_edges, indices=indices, indptr=indptr,
    ...                      indices_backward=indices_backward, indptr_backward=indptr_backward, csr=True)
    
  • mindspore_gl.BatchedGraphField add the parameter indicesindptrindices_backwardindptr_backwardcsr,set to use sparse mode. (!214)

    Original Interface v0.2.0
    n_nodes = 9
    n_edges = 11
    src_idx = ms.Tensor([0, 2, 2, 3, 4, 5, 5, 6, 8, 8, 8], ms.int32)
    dst_idx = ms.Tensor([1, 0, 1, 5, 3, 4, 6, 4, 8, 8, 8], ms.int32)
    ver_subgraph_idx = ms.Tensor([0, 0, 0, 1, 1, 1, 1, 2, 2], ms.int32)
    edge_subgraph_idx = ms.Tensor([0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2], ms.int32)
    graph_mask = ms.Tensor([1, 1, 0], ms.int32)
    graph_field = BatchedGraphField(src_idx, dst_idx, n_nodes, n_edges, ver_subgraph_idx,
    ...                             edge_subgraph_idx, graph_mask)
    
    n_nodes = 9
    n_edges = 11
    indices = ms.Tensor([0, 3, 4, 6, 8, 4, 5, 1, 8], ms.int32)
    indptr = ms.Tensor([0, 1, 3, 5, 6, 7, 8, 9, 9, 9], ms.int32)
    indices_backward = ms.Tensor([0, 5, 1, 1, 3, 4, 2, 2, 6], ms.int32)
    indptr_backward = ms.Tensor([0, 1, 2, 2, 3, 5, 6, 7, 7, 9], ms.int32)
    node_map_idx = ms.Tensor([0, 0, 0, 1, 1, 1, 1], ms.int32)
    edge_map_idx = ms.Tensor([0, 0, 0, 1, 1, 1, 1, 1], ms.int32)
    graph_mask = ms.Tensor([1, 0], ms.int32)
    graph_field = BatchedGraphField(indices=indices, indptr=indptr, indices_backward=indices_backward,
                                    indptr_backward=indptr_backward, csr=True, n_nodes=n_nodes,
    ...                             n_edges=n_edges, ver_subgraph_idx=node_map_idx,
    ...                             edge_subgraph_idx=edge_map_idx, graph_mask=graph_mask)
    

Contributors

Thanks goes to these wonderful people:

James Cheng, yufan, wuyidi, yinpeiqi, liuxiulong, wangqirui, chengbin, luolan, zhengzuohe, lujiale, liyang, huenrui, baocong, zhangqinghua, wangyushan, zhushujing, zhongjicheng, gaoxiang, yushunmin, fengxun, gongyue, wangyixuan, zuochuanyong, yuhan, wangying, chujinjin, xiezuoquan, yeyuhang, xuhn1997.

Contributions of any kind are welcome!