Skip to content

Commit

Permalink
[v0.10.0 -> v0.13.0] Task11 (#230)
Browse files Browse the repository at this point in the history
  • Loading branch information
Anleeos authored Dec 1, 2023
1 parent 8256c5f commit 72e78fd
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 46 deletions.
65 changes: 26 additions & 39 deletions docs/how_to/relay/01-build_network.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ title: 构建图卷积网络

本文介绍如何用 Relay 构建图卷积网络(GCN)。本教程演示在 Cora 数据集上运行 GCN。Cora 数据集是图神经网络(GNN)的 benchmark,同时是支持 GNN 训练和推理的框架。我们直接从 DGL 库加载数据集来与 DGL 进行同类比较。

```bash
pip install torch==2.0.0
pip install dgl==v1.0.0
```

有关 DGL 安装,参阅 [DGL 文档](https://docs.dgl.ai/install/index.html)

有关 PyTorch 安装,参阅 [PyTorch 指南](https://pytorch.org/get-started/locally/)
Expand Down Expand Up @@ -64,22 +69,12 @@ Using backend: pytorch
from dgl.data import load_data
from collections import namedtuple

def load_dataset(dataset="cora"):
args = namedtuple("args", ["dataset"])
data = load_data(args(dataset))

# 删除自循环,避免重复将节点的特征传递给自身
g = data.graph
g.remove_edges_from(nx.selfloop_edges(g))
g.add_edges_from(zip(g.nodes, g.nodes))

return g, data

def evaluate(data, logits):
test_mask = data.test_mask # 未包含在训练阶段的测试集
def evaluate(g, logits):
label = g.ndata["label"]
test_mask = g.ndata["test_mask"]

pred = logits.argmax(axis=1)
acc = ((pred == data.labels) * test_mask).sum() / test_mask.sum()
acc = (torch.Tensor(pred[test_mask]) == label[test_mask]).float().mean()

return acc
```
Expand All @@ -90,9 +85,6 @@ def evaluate(data, logits):
"""
Parameters
----------
dataset: str
Name of dataset. You can choose from ['cora', 'citeseer', 'pubmed'].
num_layer: int
number of hidden layers
Expand All @@ -106,13 +98,14 @@ num_classes: int
dimension of model output (Number of classes)
"""

dataset = "cora"
g, data = load_dataset(dataset)
dataset = dgl.data.CoraGraphDataset()
dgl_g = dataset[0]

num_layers = 1
num_hidden = 16
infeat_dim = data.features.shape[1]
num_classes = data.num_labels
features = dgl_g.ndata["feat"]
infeat_dim = features.shape[1]
num_classes = dataset.num_classes
```

输出结果:
Expand Down Expand Up @@ -143,16 +136,14 @@ Done saving data into cached files.

``` python
from tvm.contrib.download import download_testdata
from dgl import DGLGraph

features = torch.FloatTensor(data.features)
dgl_g = DGLGraph(g)
features = torch.FloatTensor(features)

torch_model = GCN(dgl_g, infeat_dim, num_hidden, num_classes, num_layers, F.relu)

# 下载预训练的权重
model_url = "https://homes.cs.washington.edu/~cyulin/media/gnn_model/gcn_%s.torch" % (dataset)
model_path = download_testdata(model_url, "gcn_%s.pickle" % (dataset), module="gcn_model")
model_url = "https://homes.cs.washington.edu/~cyulin/media/gnn_model/gcn_cora.torch"
model_path = download_testdata(model_url, "gcn_cora.pickle", module="gcn_model")

# 将 weights 加载到模型中
torch_model.load_state_dict(torch.load(model_path))
Expand All @@ -177,7 +168,7 @@ with torch.no_grad():
logits_torch = torch_model(features)
print("Print the first five outputs from DGL-PyTorch execution\n", logits_torch[:5])

acc = evaluate(data, logits_torch.numpy())
acc = evaluate(dgl_g, logits_torch.numpy())
print("Test accuracy of DGL results: {:.2%}".format(acc))
```

Expand Down Expand Up @@ -270,26 +261,25 @@ def GraphConv(layer_name, input_dim, output_dim, adj, input, norm=None, bias=Tru
import numpy as np
import networkx as nx

def prepare_params(g, data):
def prepare_params(g):
params = {}
params["infeats"] = data.features.numpy().astype(
"float32"
) # 目前仅支持 float32 格式
params["infeats"] = g.ndata["feat"].numpy().astype("float32")

# 生成邻接矩阵
adjacency = nx.to_scipy_sparse_matrix(g)
nx_graph = dgl.to_networkx(g)
adjacency = nx.to_scipy_sparse_array(nx_graph)
params["g_data"] = adjacency.data.astype("float32")
params["indices"] = adjacency.indices.astype("int32")
params["indptr"] = adjacency.indptr.astype("int32")

# 标准化 w.r.t.节点的度
degs = [g.in_degree[i] for i in range(g.number_of_nodes())]
degs = [g.in_degrees(i) for i in range(g.number_of_nodes())]
params["norm"] = np.power(degs, -0.5).astype("float32")
params["norm"] = params["norm"].reshape((params["norm"].shape[0], 1))

return params

params = prepare_params(g, data)
params = prepare_params(dgl_g)

# 检查特征的 shape 和邻接矩阵的有效性
assert len(params["infeats"].shape) == 2
Expand All @@ -310,7 +300,7 @@ assert params["infeats"].shape[0] == params["indptr"].shape[0] - 1

``` python
# 在 Relay 中定义输入特征、范数、邻接矩阵
infeats = relay.var("infeats", shape=data.features.shape)
infeats = relay.var("infeats", shape=features.shape)
norm = relay.Constant(tvm.nd.array(params["norm"]))
g_data = relay.Constant(tvm.nd.array(params["g_data"]))
indices = relay.Constant(tvm.nd.array(params["indices"]))
Expand Down Expand Up @@ -391,10 +381,7 @@ m.run()
logits_tvm = m.get_output(0).numpy()
print("Print the first five outputs from TVM execution\n", logits_tvm[:5])

labels = data.labels
test_mask = data.test_mask

acc = evaluate(data, logits_tvm)
acc = evaluate(dgl_g, logits_tvm)
print("Test accuracy of TVM results: {:.2%}".format(acc))

import tvm.testing
Expand Down
8 changes: 1 addition & 7 deletions docs/how_to/relay/03-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,7 @@ from tvm.relay.op.contrib.cutlass import partition_for_cutlass
from tvm import relay
from tvm.relay import testing
import tvm.testing
from tvm.contrib.cutlass import (
has_cutlass,
num_cutlass_partitions,
finalize_modules,
finalize_modules_vm,
)
from tvm.contrib.cutlass import finalize_modules

img_size = 8
```
Expand All @@ -44,7 +39,6 @@ def get_network():
"dweight", relay.TensorType((batch_size, 16 * img_size * img_size), "float16")
)
weight = relay.var("weight")
second_weight = relay.var("second_weight")
bn_gamma = relay.var("bn_gamma")
bn_beta = relay.var("bn_beta")
bn_mmean = relay.var("bn_mean")
Expand Down
6 changes: 6 additions & 0 deletions docs/how_to/relay/04-relay_visualizer.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,12 @@ Relay IR 模块可以包含很多操作。通常单个操作很容易理解,

这里用渲染器来渲染文本形式的计算图,它是一个轻量级、类似 AST 可视化工具(灵感来自 [clang ast-dump](https://clang.llvm.org/docs/IntroductionToTheClangAST.html))。以下将介绍如何通过接口类来实现自定义的解析器和渲染器。

安装依赖可运行:

```bash
pip install graphviz
```

更多细节参考 `tvm.contrib.relay_viz`

``` python
Expand Down

0 comments on commit 72e78fd

Please sign in to comment.