4
import caffe2.python.fakelowp.init_shared_libs # noqa
5
from hypothesis import given, settings
6
from hypothesis import strategies as st
7
from caffe2.proto import caffe2_pb2
8
from caffe2.python import core
9
from caffe2.python import workspace
10
from caffe2.python.onnx.onnxifi import onnxifi_caffe2_net
11
from caffe2.python.fakelowp.test_utils import print_test_debug_info
12
import caffe2.python.serialized_test.serialized_test_util as serial
15
core.GlobalInit(["caffe2", "--glow_global_fp16=1",
16
"--glow_global_fused_scale_offset_fp16=1",
17
"--glow_global_force_sls_fp16_accum=1"])
19
GLOW_LOWERED_BATCHNORM = False
22
def reference_spatialbn_test16(X, scale, bias, mean, var, epsilon, order):
23
X = X.astype(np.float16)
24
scale = scale.astype(np.float16)
25
bias = bias.astype(np.float16)
26
mean = mean.astype(np.float16)
27
# var = var.astype(np.float16)
28
assert(order == "NCHW")
30
scale = scale[np.newaxis, :, np.newaxis, np.newaxis]
31
bias = bias[np.newaxis, :, np.newaxis, np.newaxis]
32
mean = mean[np.newaxis, :, np.newaxis, np.newaxis]
33
var = var[np.newaxis, :, np.newaxis, np.newaxis]
34
Y = ((X - mean) * (scale / np.sqrt(var + epsilon).astype(np.float16))) + bias
35
return Y.astype(np.float32)
38
# Test the lowered BN op
39
class BatchnormTest(serial.SerializedTestCase):
40
# TODO: using hypothesis seed, sweep dimensions
41
@given(seed=st.integers(0, 65535),
42
size=st.integers(2, 30),
43
input_channels=st.integers(2, 40),
44
batch_size=st.integers(2, 20))
45
@settings(deadline=datetime.timedelta(seconds=10))
46
def test_bn(self, seed, size, input_channels, batch_size):
47
workspace.ResetWorkspace()
53
pred_net = caffe2_pb2.NetDef()
54
pred_net.name = "pred"
55
pred_net.external_input.extend(["X", "scale", "bias", "mean", "var"])
56
pred_net.external_output.append("Y")
57
pred_net.op.add().CopyFrom(
60
["X", "scale", "bias", "mean", "var"],
68
if GLOW_LOWERED_BATCHNORM:
69
refopname = "SpatialBNFakeLoweredFp16NNPI"
71
refopname = "SpatialBNFakeFp16NNPI"
73
pred_net_ref = caffe2_pb2.NetDef()
74
pred_net_ref.name = "pred"
75
pred_net_ref.external_input.extend(["X", "scale", "bias", "mean", "var"])
76
pred_net_ref.external_output.append("X")
77
pred_net_ref.op.add().CopyFrom(
80
["X", "scale", "bias", "mean", "var"],
88
scale = np.random.rand(input_channels).astype(np.float32) + 0.5
89
bias = np.random.rand(input_channels).astype(np.float32) - 0.5
90
mean = np.random.randn(input_channels).astype(np.float32)
91
var = np.random.rand(input_channels).astype(np.float32) + 0.5
93
batch_size, input_channels, size, size).astype(np.float32) - 0.5
95
workspace.FeedBlob("scale", scale)
96
workspace.FeedBlob("bias", bias)
97
workspace.FeedBlob("mean", mean)
98
workspace.FeedBlob("var", var)
100
# Use for reference to debug
101
# Y_np = reference_spatialbn_test16(X, scale, bias, mean, var, epsilon, order)
103
pred_net_onnxified = onnxifi_caffe2_net(
105
{"X": [batch_size, input_channels, size, size],
106
"scale": [input_channels],
107
"bias": [input_channels],
108
"mean": [input_channels],
109
"var": [input_channels]},
114
num_onnxified_ops = sum(
115
1 if o.type == "Onnxifi" else 0 for o in pred_net_onnxified.op)
116
np.testing.assert_equal(num_onnxified_ops, 1)
118
workspace.FeedBlob("X", X)
120
workspace.CreateNet(pred_net_onnxified)
121
workspace.CreateNet(pred_net_ref)
123
workspace.RunNet(pred_net_ref.name)
124
Y_c2 = workspace.FetchBlob("Y")
126
workspace.RunNet(pred_net_onnxified.name)
127
Y_glow = workspace.FetchBlob("Y")
129
if not np.allclose(Y_glow.astype(np.float16), Y_c2.astype(np.float16)):
130
diff = np.abs(Y_glow - Y_c2).astype(np.float16)
131
print_test_debug_info(
142
"rowwise_diff": np.max(np.abs(diff), -1)})