keras_benchmark.py 3.85 KB
Newer Older
Toby Boyd's avatar
Toby Boyd committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Copyright 2018 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.
# ==============================================================================
"""Executes Keras benchmarks and accuracy tests."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

Adrian Kuegel's avatar
Adrian Kuegel committed
21
import tensorflow as tf
22
from official.benchmark.perfzero_benchmark import PerfZeroBenchmark
23
from official.utils.flags import core as flags_core
Toby Boyd's avatar
Toby Boyd committed
24
25


26
class KerasBenchmark(PerfZeroBenchmark):
Toby Boyd's avatar
Toby Boyd committed
27
28
  """Base benchmark class with methods to simplify testing."""

David Chen's avatar
David Chen committed
29
30
31
32
33
  def __init__(self,
               output_dir=None,
               default_flags=None,
               flag_methods=None,
               tpu=None):
34
35
36
    super(KerasBenchmark, self).__init__(
        output_dir=output_dir,
        default_flags=default_flags,
David Chen's avatar
David Chen committed
37
38
        flag_methods=flag_methods,
        tpu=tpu)
Toby Boyd's avatar
Toby Boyd committed
39

40
41
42
43
44
45
46
  def _report_benchmark(self,
                        stats,
                        wall_time_sec,
                        top_1_max=None,
                        top_1_min=None,
                        log_steps=None,
                        total_batch_size=None,
David Chen's avatar
David Chen committed
47
48
                        warmup=1,
                        start_time_sec=None):
Toby Boyd's avatar
Toby Boyd committed
49
    """Report benchmark results by writing to local protobuf file.
Toby Boyd's avatar
Toby Boyd committed
50
51
52

    Args:
      stats: dict returned from keras models with known entries.
53
      wall_time_sec: the during of the benchmark execution in seconds
Toby Boyd's avatar
Toby Boyd committed
54
55
56
57
58
      top_1_max: highest passing level for top_1 accuracy.
      top_1_min: lowest passing level for top_1 accuracy.
      log_steps: How often the log was created for stats['step_timestamp_log'].
      total_batch_size: Global batch-size.
      warmup: number of entries in stats['step_timestamp_log'] to ignore.
David Chen's avatar
David Chen committed
59
      start_time_sec: the start time of the program in seconds since epoch
Toby Boyd's avatar
Toby Boyd committed
60
    """
61

62
    metrics = []
63
    if 'accuracy_top_1' in stats:
Hongkun Yu's avatar
Hongkun Yu committed
64
65
66
67
68
69
70
71
72
73
      metrics.append({
          'name': 'accuracy_top_1',
          'value': stats['accuracy_top_1'],
          'min_value': top_1_min,
          'max_value': top_1_max
      })
      metrics.append({
          'name': 'top_1_train_accuracy',
          'value': stats['training_accuracy_top_1']
      })
74
75
76
77
78
79
80
81
82
83

    if (warmup and 'step_timestamp_log' in stats and
        len(stats['step_timestamp_log']) > warmup):
      # first entry in the time_log is start of step 1. The rest of the
      # entries are the end of each step recorded
      time_log = stats['step_timestamp_log']
      elapsed = time_log[-1].timestamp - time_log[warmup].timestamp
      num_examples = (
          total_batch_size * log_steps * (len(time_log) - warmup - 1))
      examples_per_sec = num_examples / elapsed
Hongkun Yu's avatar
Hongkun Yu committed
84
      metrics.append({'name': 'exp_per_second', 'value': examples_per_sec})
85
86

    if 'avg_exp_per_second' in stats:
Hongkun Yu's avatar
Hongkun Yu committed
87
88
89
90
      metrics.append({
          'name': 'avg_exp_per_second',
          'value': stats['avg_exp_per_second']
      })
David Chen's avatar
David Chen committed
91
92
93
94
95
96
97

    if start_time_sec and 'step_timestamp_log' in stats:
      time_log = stats['step_timestamp_log']
      # time_log[0] is recorded at the beginning of the first step.
      startup_time = time_log[0].timestamp - start_time_sec
      metrics.append({'name': 'startup_time', 'value': startup_time})

98
99
100
101
102
103
    flags_str = flags_core.get_nondefault_flags_as_str()
    self.report_benchmark(
        iters=-1,
        wall_time=wall_time_sec,
        metrics=metrics,
        extras={'flags': flags_str})