|
- """
- Test file for nas on node classification
-
- AUTOGL_BACKEND=pyg python test/nas/node_classification.py
- AUTOGL_BACKEND=dgl python test/nas/node_classification.py
-
- TODO: make it a unit test file to test all the possible combinations
- """
-
- import os
- import logging
-
- logging.basicConfig(level=logging.INFO)
-
- from autogl.backend import DependentBackend
-
- if DependentBackend.is_dgl():
- from autogl.module.model.dgl import BaseAutoModel
- from dgl.data import CoraGraphDataset
- elif DependentBackend.is_pyg():
- from torch_geometric.datasets import Planetoid
- from autogl.module.model.pyg import BaseAutoModel
-
- import torch
- import torch.nn.functional as F
- from autogl.module.nas.space.single_path import SinglePathNodeClassificationSpace
- from autogl.module.nas.space.graph_nas import GraphNasNodeClassificationSpace
- from autogl.module.nas.space.graph_nas_macro import GraphNasMacroNodeClassificationSpace
- from autogl.module.nas.estimator.one_shot import OneShotEstimator
- from autogl.module.nas.backend import bk_feat, bk_label
- from autogl.module.nas.algorithm import Darts, RL, GraphNasRL, Enas, RandomSearch,Spos
- import numpy as np
- from autogl.solver.utils import set_seed
-
- set_seed(202106)
-
- def test_model(model, data=None, check_children=False):
- """
- Test model interface.
-
- Interface
- ---------
- - model.from_hyper_parameter()
- - model.model.forward()
- - model.to()
- - model.initialize()
- """
- assert isinstance(model, BaseAutoModel)
- assert hasattr(model, "to")
- assert hasattr(model, "initialize")
- model.initialize()
- model.to("cuda")
- if data is not None:
- data = data.to("cuda")
-
- assert hasattr(model, "model")
- __model = model.model
- assert isinstance(__model, torch.nn.Module)
-
- if data is not None:
- __model.forward(data)
-
- # FIXME: we can only perform tests when hyper_parameter_space is []
- if len(model.hyper_parameter_space) == 0:
- model_2 = model.from_hyper_parameter({})
- if check_children:
- test_model(model_2, data)
-
-
- if __name__ == "__main__":
-
- print("Testing backend: {}".format("dgl" if DependentBackend.is_dgl() else "pyg"))
-
- if DependentBackend.is_dgl():
- dataset = CoraGraphDataset()
- else:
- dataset = Planetoid(os.path.expanduser("~/.cache-autogl"), "Cora")
-
- data = dataset[0]
-
- di = bk_feat(data).shape[1]
- do = len(np.unique(bk_label(data)))
-
-
- print("evolutionary + singlepath ")
- space=SinglePathNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di,output_dim=do)
- esti=OneShotEstimator()
- algo=Spos(cycles=200)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("evolutionary + graphnas ")
- space=GraphNasNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di,output_dim=do)
- esti=OneShotEstimator()
- algo=Spos(cycles=200)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("Random search + graphnas ")
-
- space = GraphNasNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = RandomSearch(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("Random search + singlepath ")
- space = SinglePathNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = RandomSearch(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("rl + graphnas ")
- space = GraphNasNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = RL(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("graphnasrl + graphnas ")
- space = GraphNasNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = GraphNasRL(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("enas + graphnas ")
- space = GraphNasNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = Enas(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("darts + graphnas ")
- space = GraphNasNodeClassificationSpace(con_ops=['concat']).cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = Darts(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("darts + singlepath ")
- space = SinglePathNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = Darts(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("Random search + graphnas macro")
- space = GraphNasMacroNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = RandomSearch(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
-
- print("RL + graphnas macro")
- space = GraphNasMacroNodeClassificationSpace().cuda()
- space.instantiate(input_dim=di, output_dim=do)
- esti = OneShotEstimator()
- algo = RL(num_epochs=10)
- model = algo.search(space, dataset, esti)
- test_model(model, data, True)
|