| |
|
| |
|
| |
|
| |
|
| |
|
| | import unittest |
| | import numpy as np |
| | import copy |
| | from hypothesis import given |
| | import hypothesis.strategies as st |
| |
|
| | from caffe2.python.model_helper import ModelHelper |
| | from caffe2.python.models import resnet |
| | from caffe2.python import workspace, brew |
| | import caffe2.python.hypothesis_test_util as hu |
| | import caffe2.python.mkl.rewrite_graph as rewrite_graph |
| |
|
| |
|
| | def deterministic_io(model): |
| | model = copy.deepcopy(model) |
| | for i, op in enumerate(model.InitProto().op): |
| | op.device_option.random_seed = i + 1 |
| | if not model.Proto().external_output: |
| | model.Proto().external_output.extend([model.Proto().op[-1].output[0]]) |
| | return model |
| |
|
| | def simple_fc(): |
| | model = ModelHelper(name="r") |
| | brew.fc(model, "data", "fc", 10, 10) |
| | return model, [(1, 10)] |
| |
|
| | def double_matmul(): |
| | model = ModelHelper(name="r") |
| | fc0 = brew.fc(model, "data", "fc0", 10, 10) |
| | fc1 = brew.fc(model, fc0, "fc1", 10, 10) |
| | model.Proto().external_output[:] = [str(fc0), str(fc1)] |
| | return model, [(1, 10)] |
| |
|
| | def simple_relu(): |
| | model = ModelHelper(name="r") |
| | brew.relu(model, "data", "fc") |
| | return model, [(1, 10)] |
| |
|
| |
|
| | def simple_mlp(): |
| | model = ModelHelper(name="r") |
| | brew.relu( |
| | model, |
| | brew.fc( |
| | model, |
| | brew.relu( |
| | model, |
| | brew.fc( |
| | model, |
| | "data", |
| | "fc1", |
| | 10, |
| | 10), |
| | "rl1"), |
| | "fc2", |
| | 10, |
| | 10), |
| | "rl2") |
| | return model, [(1, 10)] |
| |
|
| |
|
| | def simple_cnn(): |
| | model = ModelHelper(name="r", arg_scope={"order": "NCHW", "is_test": True}) |
| | brew.conv( |
| | model, "data", 'conv1', 3, 16, kernel=3, stride=1 |
| | ) |
| | brew.spatial_bn( |
| | model, 'conv1', 'conv1_spatbn', 16, epsilon=1e-3 |
| | ) |
| | brew.relu(model, 'conv1_spatbn', 'relu1') |
| | return model, [(1, 3, 32, 32)] |
| |
|
| |
|
| | def alexnet(): |
| | model = ModelHelper(name="r", arg_scope={"order": "NCHW", "is_test": True}) |
| | conv1 = brew.conv( |
| | model, |
| | "data", |
| | "conv1", |
| | 3, |
| | 64, |
| | 11, ('XavierFill', {}), ('ConstantFill', {}), |
| | stride=4, |
| | pad=2 |
| | ) |
| | relu1 = brew.relu(model, conv1, "conv1") |
| | pool1 = brew.max_pool(model, relu1, "pool1", kernel=3, stride=2, pad=0, |
| | legacy_pad=3) |
| | lrn1 = brew.lrn( |
| | model, pool1, "pool1_lrn", size=5, alpha=1.0e-4, beta=0.75, bias=1.0) |
| | conv2 = brew.conv( |
| | model, |
| | lrn1, |
| | "conv2", |
| | 64, |
| | 192, |
| | 5, |
| | ('XavierFill', {}), |
| | ('ConstantFill', {}), |
| | pad=2 |
| | ) |
| | relu2 = brew.relu(model, conv2, "conv2") |
| | pool2 = brew.max_pool(model, relu2, "pool2", kernel=3, stride=2) |
| | lrn2 = brew.lrn( |
| | model, pool2, "pool2_lrn", size=5, alpha=1.0e-4, beta=0.75, bias=1.0) |
| | conv3 = brew.conv( |
| | model, |
| | lrn2, |
| | "conv3", |
| | 192, |
| | 384, |
| | 3, |
| | ('XavierFill', {}), |
| | ('ConstantFill', {}), |
| | pad=1 |
| | ) |
| | relu3 = brew.relu(model, conv3, "conv3") |
| | conv4 = brew.conv( |
| | model, |
| | relu3, |
| | "conv4", |
| | 384, |
| | 256, |
| | 3, |
| | ('XavierFill', {}), |
| | ('ConstantFill', {}), |
| | pad=1 |
| | ) |
| | relu4 = brew.relu(model, conv4, "conv4") |
| | conv5 = brew.conv( |
| | model, |
| | relu4, |
| | "conv5", |
| | 256, |
| | 256, |
| | 3, |
| | ('XavierFill', {}), |
| | ('ConstantFill', {}), |
| | pad=1 |
| | ) |
| | relu5 = brew.relu(model, conv5, "conv5") |
| | pool5 = brew.max_pool(model, relu5, "pool5", kernel=3, stride=2) |
| | fc6 = brew.fc( |
| | model, |
| | pool5, "fc6", 256 * 6 * 6, 4096, ('XavierFill', {}), |
| | ('ConstantFill', {}) |
| | ) |
| | relu6 = brew.relu(model, fc6, "fc6") |
| | fc7 = brew.fc( |
| | model, relu6, "fc7", 4096, 4096, ('XavierFill', {}), ('ConstantFill', {}) |
| | ) |
| | relu7 = brew.relu(model, fc7, "fc7") |
| | drop7 = brew.dropout(model, relu7, "fc7_dropout", is_test=1, ratio=0.5) |
| | fc8 = brew.fc( |
| | model, drop7, "fc8", 4096, 1000, ('XavierFill', {}), ('ConstantFill', {}) |
| | ) |
| | relu8 = brew.relu(model, fc8, "fc8") |
| | brew.dropout(model, relu8, "fc8_dropout", is_test=1, ratio=0.5) |
| | return model, [(1, 3, 224, 224)] |
| |
|
| |
|
| | def simple_resnet(): |
| | model = ModelHelper(name="r", arg_scope={"order": "NCHW", "is_test": True}) |
| | resnet.create_resnet_32x32( |
| | model, "data", num_input_channels=1, num_groups=1, num_labels=5, |
| | is_test=True) |
| | return model, [(1, 1, 32, 32)] |
| |
|
| |
|
| | def complex_resnet(): |
| | model = ModelHelper(name="r", arg_scope={"order": "NCHW", "is_test": True}) |
| | resnet.create_resnet50( |
| | model, "data", num_input_channels=1, num_labels=5, is_test=True, |
| | no_loss=True) |
| | return model, [(1, 1, 224, 224)] |
| |
|
| |
|
| | @unittest.skipIf(not workspace.C.use_mkldnn, "No MKLDNN support.") |
| | class MKLRewriteTest(hu.HypothesisTestCase): |
| | @given(gen=st.sampled_from([simple_relu, simple_fc, |
| | simple_mlp, simple_cnn])) |
| | def test_mkl_simple_rewrite(self, gen): |
| | cpu_model, (shape,) = gen() |
| | cpu_model = deterministic_io(cpu_model) |
| | mkl_model = rewrite_graph.rewrite_model_helper_simple(cpu_model) |
| | X = np.random.randn(*shape).astype(np.float32) |
| |
|
| | def run(model): |
| | self.ws.run(model.InitProto()) |
| | self.ws.create_blob(model.Proto().external_input[0]).feed(X) |
| | self.ws.run(model.Proto()) |
| | return self.ws.blobs[model.Proto().external_output[0]].fetch() |
| |
|
| | np.testing.assert_allclose(run(cpu_model), run(mkl_model), |
| | atol=1e-4, rtol=1e-4) |
| |
|
| | def test_mkl_resnet_rewrite(self): |
| | cpu_model, (shape,) = complex_resnet() |
| | cpu_model = deterministic_io(cpu_model) |
| | mkl_model = rewrite_graph.rewrite_model_helper_simple(cpu_model) |
| | np.random.seed(1701) |
| | X = np.random.randn(*shape).astype(np.float32) |
| |
|
| | def run(model): |
| | self.ws.run(model.InitProto()) |
| | self.ws.create_blob(model.Proto().external_input[0]).feed(X) |
| | self.ws.run(model.Proto()) |
| | return self.ws.blobs[model.Proto().external_output[0]].fetch() |
| | np.testing.assert_allclose(run(cpu_model), run(mkl_model), |
| | atol=1e-4, rtol=1e-4) |
| |
|
| | def test_mkl_multi_output_rewrite(self): |
| | cpu_model, shapes = double_matmul() |
| | cpu_model = deterministic_io(cpu_model) |
| | mkl_model = rewrite_graph.rewrite_model_helper_simple(cpu_model) |
| | np.random.seed(1701) |
| | Xs = [np.random.randn(*shape).astype(np.float32) for shape in shapes] |
| |
|
| | def run(model): |
| | self.ws.run(model.InitProto()) |
| | for (name, X) in zip(model.Proto().external_input, Xs): |
| | self.ws.create_blob(name).feed(X) |
| | print(model.Proto()) |
| | self.ws.run(model.Proto()) |
| | return [self.ws.blobs[name].fetch() |
| | for name in model.Proto().external_output] |
| |
|
| | run(mkl_model) |
| |
|
| | np.testing.assert_allclose(run(cpu_model), run(mkl_model), |
| | atol=1e-4, rtol=1e-4) |
| |
|
| | def test_mkl_alexnet_rewrite(self): |
| | cpu_model, (shape,) = alexnet() |
| | cpu_model = deterministic_io(cpu_model) |
| | mkl_model = rewrite_graph.rewrite_model_helper_simple(cpu_model) |
| | np.random.seed(1701) |
| | X = np.random.randn(*shape).astype(np.float32) |
| |
|
| | def run(model): |
| | self.ws.run(model.InitProto()) |
| | self.ws.create_blob(model.Proto().external_input[0]).feed(X) |
| | self.ws.run(model.Proto()) |
| | return self.ws.blobs[model.Proto().external_output[0]].fetch() |
| | np.testing.assert_allclose(run(cpu_model), run(mkl_model), |
| | atol=1e-4, rtol=1e-4) |
| |
|
| | if __name__ == "__main__": |
| | import unittest |
| | unittest.main() |
| |
|