test_compressor.py 2.96 KB
Newer Older
1
from unittest import TestCase, main
2
import tensorflow as tf
3
4
import torch
import torch.nn.functional as F
5
import nni.compression.torch as torch_compressor
6

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if tf.__version__ >= '2.0':
    import nni.compression.tensorflow as tf_compressor

def get_tf_mnist_model():
    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(filters=32, kernel_size=7, input_shape=[28, 28, 1], activation='relu', padding="SAME"),
        tf.keras.layers.MaxPooling2D(pool_size=2),
        tf.keras.layers.Conv2D(filters=64, kernel_size=3, activation='relu', padding="SAME"),
        tf.keras.layers.MaxPooling2D(pool_size=2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(units=128, activation='relu'),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(units=10, activation='softmax'),
    ])
    model.compile(loss="sparse_categorical_crossentropy",
        optimizer=tf.keras.optimizers.SGD(lr=1e-3),
        metrics=["accuracy"])
    return model
25

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class TorchMnist(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = torch.nn.Conv2d(1, 20, 5, 1)
        self.conv2 = torch.nn.Conv2d(20, 50, 5, 1)
        self.fc1 = torch.nn.Linear(4 * 4 * 50, 500)
        self.fc2 = torch.nn.Linear(500, 10)

    def forward(self, x):
        x = F.relu(self.conv1(x))
        x = F.max_pool2d(x, 2, 2)
        x = F.relu(self.conv2(x))
        x = F.max_pool2d(x, 2, 2)
        x = x.view(-1, 4 * 4 * 50)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
42
43
        return F.log_softmax(x, dim=1)

44
45
46
47
48
def tf2(func):
    def test_tf2_func(self):
        if tf.__version__ >= '2.0':
            func()
    return test_tf2_func
49
50
51
52

class CompressorTestCase(TestCase):
    def test_torch_pruner(self):
        model = TorchMnist()
chicm-ms's avatar
chicm-ms committed
53
        configure_list = [{'sparsity': 0.8, 'op_types': ['default']}]
QuanluZhang's avatar
QuanluZhang committed
54
        torch_compressor.LevelPruner(model, configure_list).compress()
55

56
57
58
59
60
    def test_torch_fpgm_pruner(self):
        model = TorchMnist()
        configure_list = [{'sparsity': 0.5, 'op_types': ['Conv2d']}]
        torch_compressor.FPGMPruner(model, configure_list).compress()

61
62
    def test_torch_quantizer(self):
        model = TorchMnist()
Cjkkkk's avatar
Cjkkkk committed
63
64
65
66
67
68
69
70
        configure_list = [{
            'quant_types': ['weight'],
            'quant_bits': {
                'weight': 8,
            },
            'op_types':['Conv2d', 'Linear']
        }]
        torch_compressor.NaiveQuantizer(model, configure_list).compress()
71

72
73
74
75
76
77
78
79
80
81
82
83
84
85
    @tf2
    def test_tf_pruner(self):
        configure_list = [{'sparsity': 0.8, 'op_types': ['default']}]
        tf_compressor.LevelPruner(get_tf_mnist_model(), configure_list).compress()

    @tf2
    def test_tf_quantizer(self):
        tf_compressor.NaiveQuantizer(get_tf_mnist_model(), [{'op_types': ['default']}]).compress()

    @tf2
    def test_tf_fpgm_pruner(self):
        configure_list = [{'sparsity': 0.5, 'op_types': ['Conv2D']}]
        tf_compressor.FPGMPruner(get_tf_mnist_model(), configure_list).compress()

86
87
88

if __name__ == '__main__':
    main()