diff options
Diffstat (limited to 'tensorflow/contrib/fused_conv/python/ops/fused_conv2d_bias_activation_benchmark.py')
-rw-r--r-- | tensorflow/contrib/fused_conv/python/ops/fused_conv2d_bias_activation_benchmark.py | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/tensorflow/contrib/fused_conv/python/ops/fused_conv2d_bias_activation_benchmark.py b/tensorflow/contrib/fused_conv/python/ops/fused_conv2d_bias_activation_benchmark.py new file mode 100644 index 0000000000..a65d4bc50f --- /dev/null +++ b/tensorflow/contrib/fused_conv/python/ops/fused_conv2d_bias_activation_benchmark.py @@ -0,0 +1,243 @@ +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== +"""Benchmark for fused conv2d bias and activation op.""" + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +import time + +from tensorflow.contrib.fused_conv.python.ops import fused_conv2d_bias_activation_op +from tensorflow.python.client import session as session_lib +from tensorflow.python.framework import ops +from tensorflow.python.ops import control_flow_ops +from tensorflow.python.ops import nn_ops +from tensorflow.python.ops import random_ops +from tensorflow.python.ops import variables +from tensorflow.python.platform import test + + +def build_conv_bias_relu_graph(device, input_shape, filter_shape, strides, + padding, num_iters, data_format): + """builds a graph containing a sequence of conv2d operations. + + Args: + device: String, the device to run on. + input_shape: Shape of the input tensor. + filter_shape: Shape of the filter tensor. + strides: A list of ints. 1-D of length 4. The stride of sliding + window for each dimension of input. + padding: A string from: "SAME", "VALID". The type of padding + algorithm to use. + num_iters: number of iterations to run conv2d. + data_format: data format string of input, 'NHWC' and 'NCHW' are + supported. + + Returns: + An array of tensors to run() + """ + if data_format == "NCHW": + input_shape = [ + input_shape[0], input_shape[3], input_shape[1], input_shape[2] + ] + with ops.device("/%s:0" % device): + inp = variables.Variable(random_ops.truncated_normal(input_shape)) + filt = variables.Variable(random_ops.truncated_normal(filter_shape)) + bias_shape = [filter_shape[-1]] + bias = variables.Variable(random_ops.truncated_normal(bias_shape)) + + outputs = [] + conv2d_out = nn_ops.conv2d( + inp, filt, strides, padding, data_format=data_format) + bias_out = nn_ops.bias_add(conv2d_out, bias, data_format=data_format) + relu_out = nn_ops.relu(bias_out) + outputs.append(relu_out) + for _ in range(1, num_iters): + with ops.control_dependencies([relu_out]): + conv2d_out = nn_ops.conv2d( + inp, filt, strides, padding, data_format=data_format) + bias_out = nn_ops.bias_add(conv2d_out, bias, data_format=data_format) + relu_out = nn_ops.relu(bias_out) + outputs.append(relu_out) + return control_flow_ops.group(*outputs) + + +def build_fused_conv_bias_relu_graph(device, input_shape, filter_shape, strides, + padding, num_iters, data_format): + """builds a graph containing a sequence of conv2d operations. + + Args: + device: String, the device to run on. + input_shape: Shape of the input tensor. + filter_shape: Shape of the filter tensor. + strides: A list of ints. 1-D of length 4. The stride of sliding + window for each dimension of input. + padding: A string from: "SAME", "VALID". The type of padding + algorithm to use. + num_iters: number of iterations to run conv2d. + data_format: data format string of input, 'NHWC' and 'NCHW' are + supported. + + Returns: + An array of tensors to run() + """ + if data_format == "NCHW": + input_shape = [ + input_shape[0], input_shape[3], input_shape[1], input_shape[2] + ] + with ops.device("/%s:0" % device): + inp = variables.Variable(random_ops.truncated_normal(input_shape)) + filt = variables.Variable(random_ops.truncated_normal(filter_shape)) + bias_shape = [filter_shape[-1]] + bias = variables.Variable(random_ops.truncated_normal(bias_shape)) + + outputs = [] + fused_out = fused_conv2d_bias_activation_op.fused_conv2d_bias_activation( + inp, + filt, + bias, + strides, + padding, + data_format=data_format, + activation_mode="Relu") + outputs.append(fused_out) + for _ in range(1, num_iters): + with ops.control_dependencies([fused_out]): + # pylint: disable=g-line-too-long + fused_out = fused_conv2d_bias_activation_op.fused_conv2d_bias_activation( + inp, + filt, + bias, + strides, + padding, + data_format=data_format, + activation_mode="Relu") + outputs.append(fused_out) + return control_flow_ops.group(*outputs) + + +class FusedConv2DBiasActivationBenchmark(test.Benchmark): + """Benchmark conv2d!""" + + def _run_graph(self, device, input_shape, filter_shape, strides, padding, + num_iters, data_format): + """runs the graph and print its execution time. + + Args: + device: String, the device to run on. + input_shape: Shape of the input tensor. + filter_shape: Shape of the filter tensor. + strides: A list of ints. 1-D of length 4. The stride of sliding + window for each dimension of input. + padding: A string from: "SAME", "VALID". The type of padding + algorithm to use. num_iters: Number of iterations to run the + benchmark. + num_iters: number of iterations to run conv2d. + data_format: data format string of input, 'NHWC' and 'NCHW' are + supported. + + Returns: + The duration of the run in seconds. + """ + graph = ops.Graph() + with graph.as_default(): + outputs = build_fused_conv_bias_relu_graph(device, input_shape, + filter_shape, strides, padding, + num_iters, data_format) + with session_lib.Session(graph=graph) as session: + variables.global_variables_initializer().run() + # warmup runs + session.run(outputs) + + start_time = time.time() + session.run(outputs) + duration = (time.time() - start_time) / num_iters + + print("%s inputshape:%s filtershape:%s strides:%s padding:%s " + "%d iters: %.8f sec" % + (device, str(input_shape).replace(" ", ""), + str(filter_shape).replace(" ", ""), + str(strides).replace(" ", ""), padding, num_iters, duration)) + name_template = ( + "conv2d_{device}_input_shape_{inputshape}_filter_shape_{filtershape}_" + "strides_{strides}_padding_{padding}") + + self.report_benchmark( + name=name_template.format( + device=device, + inputshape=str(input_shape).replace(" ", ""), + filtershape=str(filter_shape).replace(" ", ""), + strides=str(strides).replace(" ", ""), + padding=padding).replace(" ", ""), + iters=num_iters, + wall_time=duration) + + return duration + + def benchmark_fused_conv2d_bias_activation(self): + + stride = [1, 1, 1, 1] + paddings = ["VALID", "SAME"] + data_formats = ["NHWC", "NCHW"] + + resnet50_input_shapes = [[64, 14, 14, 256], [64, 14, 14, 256], [ + 64, 14, 14, 1024 + ], [64, 55, 55, 64], [64, 28, 28, 128], [64, 28, 28, 128], [64, 55, 55, 64], + [64, 7, 7, 512], [64, 7, 7, 512], + [64, 28, 28, 512], [64, 55, 55, + 256], [64, 7, 7, 2048]] + + resnet50_filter_shapes = [[1, 1, 256, 1024], [3, 3, 256, 256], [ + 1, 1, 1024, 256 + ], [1, 1, 64, 256], [1, 1, 128, 512], [3, 3, 128, 128], [3, 3, 64, 64], [ + 3, 3, 512, 512 + ], [1, 1, 512, 2048], [1, 1, 512, 128], [1, 1, 256, 64], [1, 1, 2048, 512]] + + inception3_input_shapes = [[64, 17, 17, 768], [64, 35, 35, 96], [ + 64, 35, 35, 288 + ], [64, 8, 8, 384], [64, 8, 8, 384], [64, 17, 17, 192], [64, 35, 35, 64], [ + 64, 17, 17, 192 + ], [64, 17, 17, 160], [64, 17, 17, 160], [64, 17, 17, 768], [ + 64, 35, 35, 256 + ], [64, 35, 35, 48], [64, 35, 35, 192], [64, 17, 17, 128], [ + 64, 17, 17, 160 + ], [64, 8, 8, 448], [64, 17, 17, 128], [64, 17, 17, 768], [64, 17, 17, 160]] + inception3_filter_shapes = [[1, 1, 768, 192], [3, 3, 96, 96], [ + 1, 1, 288, 64 + ], [1, 3, 384, 384], [3, 1, 384, 384], [7, 1, 192, 192], [3, 3, 64, 96], [ + 1, 7, 192, 192 + ], [7, 1, 160, 160], [1, 7, 160, 160], [1, 1, 768, 160], [1, 1, 256, 64], [ + 5, 5, 48, 64 + ], [1, 1, 192, 64], [1, 7, 128, 128], [1, 7, 160, 192], [3, 3, 448, 384], + [7, 1, 128, 128], [1, 1, 768, + 128], [7, 1, 160, 192]] + + print("fused conv2d bias activation benchmark using resnet50's shapes:") + for ishape, fshape in zip(resnet50_input_shapes, resnet50_filter_shapes): + for padding in paddings: + for data_format in data_formats: + self._run_graph("gpu", ishape, fshape, stride, padding, 80, + data_format) + print("fused conv2d bias activation benchmark using inception3's shapes:") + for ishape, fshape in zip(inception3_input_shapes, + inception3_filter_shapes): + for padding in paddings: + for data_format in data_formats: + self._run_graph("gpu", ishape, fshape, stride, padding, 80, + data_format) + + +if __name__ == "__main__": + test.main() |