| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- # Copyright (c) 2019, NVIDIA CORPORATION. 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.
- import time
- import numpy as np
- import tensorflow as tf
- __all__ = ['BenchmarkHook']
- class BenchmarkHook(tf.train.SessionRunHook):
- latencies = ['avg', 50, 90, 95, 99, 100]
- def __init__(self, global_batch_size, warmup_steps=10):
- self.warmup_steps = warmup_steps
- self.global_batch_size = global_batch_size
- self.iter_times = []
- def before_run(self, run_context):
- self.t0 = time.time()
- def after_run(self, run_context, run_values):
- batch_time = time.time() - self.t0
- self.iter_times.append(batch_time)
- def get_average_speed_and_latencies(self):
- if len(self.iter_times) > self.warmup_steps + 5:
- warmup_steps = self.warmup_steps
- elif len(self.iter_times) > 15:
- warmup_steps = 10
- elif len(self.iter_times) > 10:
- warmup_steps = 5
- elif len(self.iter_times) > 4:
- warmup_steps = 2
- elif len(self.iter_times) > 1:
- warmup_steps = 1
- else:
- warmup_steps = 0
- times = self.iter_times[warmup_steps:]
- avg_time = np.mean(times)
- speed = self.global_batch_size / avg_time
- latencies = {}
- for lat in self.latencies:
- if lat == 'avg':
- val = avg_time
- else:
- val = np.percentile(times, lat)
- latencies[str(lat)] = val
- return speed, latencies
|