Caffe2 - Python API
A deep learning, cross platform ML framework
device_reduce_sum_bench.py
1 ## @package device_reduce_sum_bench
2 # Module caffe2.experiments.python.device_reduce_sum_bench
3 from __future__ import absolute_import
4 from __future__ import division
5 from __future__ import print_function
6 from __future__ import unicode_literals
7 
8 import argparse
9 import itertools
10 import logging
11 import os
12 
13 from six import add_metaclass
14 import numpy as np
15 
16 from caffe2.python import workspace, core
17 from caffe2.python.hypothesis_test_util import runOpBenchmark, gpu_do
18 
19 logging.basicConfig()
20 logger = logging.getLogger(os.path.basename(__file__))
21 logger.setLevel(logging.INFO)
22 
23 ALL_BENCHMARKS = {}
24 
25 
26 class BenchmarkMeta(type):
27  def __new__(metacls, name, bases, class_dict):
28  cls = type.__new__(metacls, name, bases, class_dict)
29  if name != 'Benchmark':
30  ALL_BENCHMARKS[name] = cls
31  return cls
32 
33 
34 @add_metaclass(BenchmarkMeta)
35 class Benchmark(object):
36 
37  def __init__(self):
38  self.results = []
39 
40  def display(self):
41  print('Results ({}):'.format(type(self).__name__))
42  print('input size ms/iter')
43  print('------------------------------ -----------')
44  for size, ms in self.results:
45  print('{!s:<30} {:.4f}'.format(size, ms))
46 
47 
49  def run(self):
50  op = core.CreateOperator(
51  "SumElements",
52  ["X"],
53  ["y"]
54  )
55 
56  for n in itertools.imap(pow, itertools.cycle([10]), range(10)):
57  X = np.random.rand(n).astype(np.float32)
58  logger.info('Running benchmark for n = {}'.format(n))
59  ret = runOpBenchmark(gpu_do, op, inputs=[X])
60  self.results.append((n, ret[1]))
61 
62 
64  def run(self):
65  op = core.CreateOperator(
66  "SumSqrElements",
67  ["X"],
68  ["y"]
69  )
70 
71  for n in itertools.imap(pow, itertools.cycle([10]), range(10)):
72  X = np.random.rand(n).astype(np.float32)
73  logger.info('Running benchmark for n = {}'.format(n))
74  ret = runOpBenchmark(gpu_do, op, inputs=[X])
75  self.results.append((n, ret[1]))
76 
77 
79  def run(self):
80  op = core.CreateOperator(
81  "SoftmaxWithLoss",
82  ["X", "label"],
83  ["probs", "avgloss"],
84  )
85 
86  for n in itertools.imap(pow, itertools.cycle([10]), range(8)):
87  for D in itertools.imap(pow, itertools.cycle([10]), range(3)):
88  X = np.random.rand(n, D).astype(np.float32)
89  label = (np.random.rand(n) * D).astype(np.int32)
90  logger.info('Running benchmark for n = {}, D= {}'.format(n, D))
91  ret = runOpBenchmark(gpu_do, op, inputs=[X, label])
92  self.results.append(((n, D), ret[1]))
93 
94 
95 def parse_args():
96  parser = argparse.ArgumentParser(os.path.basename(__file__))
97  parser.add_argument('-b', '--benchmarks', nargs='+',
98  default=ALL_BENCHMARKS.keys(),
99  help='benchmarks to run (default: %(default)s))')
100  return parser.parse_args()
101 
102 
103 def main():
104  args = parse_args()
105 
106  benchmarks = [ALL_BENCHMARKS[name]() for name in args.benchmarks]
107  for bench in benchmarks:
108  bench.run()
109  for bench in benchmarks:
110  bench.display()
111 
112 
113 if __name__ == '__main__':
114  workspace.GlobalInit(['caffe2', '--caffe2_log_level=2'])
115  main()