|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""Executes Keras benchmarks and accuracy tests.""" |
|
|
|
from __future__ import absolute_import |
|
from __future__ import division |
|
from __future__ import print_function |
|
|
|
import tensorflow as tf |
|
from official.benchmark.perfzero_benchmark import PerfZeroBenchmark |
|
from official.utils.flags import core as flags_core |
|
|
|
|
|
class KerasBenchmark(PerfZeroBenchmark): |
|
"""Base benchmark class with methods to simplify testing.""" |
|
|
|
def __init__(self, |
|
output_dir=None, |
|
default_flags=None, |
|
flag_methods=None, |
|
tpu=None): |
|
super(KerasBenchmark, self).__init__( |
|
output_dir=output_dir, |
|
default_flags=default_flags, |
|
flag_methods=flag_methods, |
|
tpu=tpu) |
|
|
|
def _report_benchmark(self, |
|
stats, |
|
wall_time_sec, |
|
top_1_max=None, |
|
top_1_min=None, |
|
log_steps=None, |
|
total_batch_size=None, |
|
warmup=1, |
|
start_time_sec=None): |
|
"""Report benchmark results by writing to local protobuf file. |
|
|
|
Args: |
|
stats: dict returned from keras models with known entries. |
|
wall_time_sec: the during of the benchmark execution in seconds |
|
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. |
|
start_time_sec: the start time of the program in seconds since epoch |
|
""" |
|
|
|
metrics = [] |
|
if 'accuracy_top_1' in stats: |
|
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']}) |
|
|
|
if (warmup and 'step_timestamp_log' in stats and |
|
len(stats['step_timestamp_log']) > warmup): |
|
|
|
|
|
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 |
|
metrics.append({'name': 'exp_per_second', |
|
'value': examples_per_sec}) |
|
|
|
if 'avg_exp_per_second' in stats: |
|
metrics.append({'name': 'avg_exp_per_second', |
|
'value': stats['avg_exp_per_second']}) |
|
|
|
if start_time_sec and 'step_timestamp_log' in stats: |
|
time_log = stats['step_timestamp_log'] |
|
|
|
startup_time = time_log[0].timestamp - start_time_sec |
|
metrics.append({'name': 'startup_time', 'value': startup_time}) |
|
|
|
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}) |
|
|