keras_cifar_benchmark.py 13.2 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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.
# ==============================================================================
Toby Boyd's avatar
Toby Boyd committed
15
"""Executes Keras benchmarks and accuracy tests."""
Shining Sun's avatar
Shining Sun committed
16
17
from __future__ import absolute_import
from __future__ import division
Toby Boyd's avatar
Toby Boyd committed
18
19
from __future__ import print_function

20
import os
21
import time
Hongkun Yu's avatar
Hongkun Yu committed
22

Toby Boyd's avatar
Toby Boyd committed
23
from absl import flags
Hongkun Yu's avatar
Hongkun Yu committed
24
import tensorflow as tf
Toby Boyd's avatar
Toby Boyd committed
25

26
from official.benchmark import keras_benchmark
27
from official.benchmark import benchmark_wrappers
28
from official.benchmark.models import resnet_cifar_main
29

30
MIN_TOP_1_ACCURACY = 0.929
31
MAX_TOP_1_ACCURACY = 0.938
Toby Boyd's avatar
Toby Boyd committed
32

Toby Boyd's avatar
Toby Boyd committed
33
FLAGS = flags.FLAGS
Hongkun Yu's avatar
Hongkun Yu committed
34
CIFAR_DATA_DIR_NAME = 'cifar-10-batches-bin'
Toby Boyd's avatar
Toby Boyd committed
35

36

Toby Boyd's avatar
Toby Boyd committed
37
38
class Resnet56KerasAccuracy(keras_benchmark.KerasBenchmark):
  """Accuracy tests for ResNet56 Keras CIFAR-10."""
39

40
  def __init__(self, output_dir=None, root_data_dir=None, **kwargs):
41
42
43
44
45
    """A benchmark class.

    Args:
      output_dir: directory where to output e.g. log files
      root_data_dir: directory under which to look for dataset
46
      **kwargs: arbitrary named arguments. This is needed to make the
Hongkun Yu's avatar
Hongkun Yu committed
47
48
        constructor forward compatible in case PerfZero provides more named
        arguments before updating the constructor.
49
50
    """

51
    self.data_dir = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME)
52
    flag_methods = [resnet_cifar_main.define_cifar_flags]
Toby Boyd's avatar
Toby Boyd committed
53

54
55
    super(Resnet56KerasAccuracy, self).__init__(
        output_dir=output_dir, flag_methods=flag_methods)
Toby Boyd's avatar
Toby Boyd committed
56

57
58
59
60
  def _setup(self):
    super(Resnet56KerasAccuracy, self)._setup()
    FLAGS.use_tensor_lr = False

Toby Boyd's avatar
Toby Boyd committed
61
  def benchmark_graph_1_gpu(self):
62
    """Test keras based model with Keras fit and distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
63
    self._setup()
Toby Boyd's avatar
Toby Boyd committed
64
    FLAGS.num_gpus = 1
65
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
66
67
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
68
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu')
Toby Boyd's avatar
Toby Boyd committed
69
    FLAGS.dtype = 'fp32'
70
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
71
72

  def benchmark_1_gpu(self):
73
74
    """Test keras based model with eager and distribution strategies."""
    self._setup()
Toby Boyd's avatar
Toby Boyd committed
75
    FLAGS.num_gpus = 1
76
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
77
78
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
79
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu')
Toby Boyd's avatar
Toby Boyd committed
80
81
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
82
    self._run_and_report_benchmark()
83

84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
  def benchmark_cpu(self):
    """Test keras based model on CPU."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.data_dir = self.data_dir
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
    FLAGS.model_dir = self._get_model_dir('benchmark_cpu')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_cpu_no_dist_strat(self):
    """Test keras based model on CPU without distribution strategies."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.data_dir = self.data_dir
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
    FLAGS.model_dir = self._get_model_dir('benchmark_cpu_no_dist_strat')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.distribution_strategy = 'off'
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_cpu_no_dist_strat_run_eagerly(self):
    """Test keras based model on CPU w/forced eager and no dist_strat."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.data_dir = self.data_dir
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
    FLAGS.model_dir = self._get_model_dir(
        'benchmark_cpu_no_dist_strat_run_eagerly')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.run_eagerly = True
    FLAGS.distribution_strategy = 'off'
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

127
128
129
130
131
132
133
134
135
136
137
138
139
  def benchmark_1_gpu_no_dist_strat(self):
    """Test keras based model with eager and no dist strat."""
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.data_dir = self.data_dir
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.distribution_strategy = 'off'
    self._run_and_report_benchmark()

140
  def benchmark_1_gpu_no_dist_strat_run_eagerly(self):
141
    """Test keras based model w/forced eager and no dist_strat."""
142
143
144
145
146
147
148
149
150
151
152
153
154
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.data_dir = self.data_dir
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
    FLAGS.model_dir = self._get_model_dir(
        'benchmark_1_gpu_no_dist_strat_run_eagerly')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.run_eagerly = True
    FLAGS.distribution_strategy = 'off'
    self._run_and_report_benchmark()

155
156
  def benchmark_graph_1_gpu_no_dist_strat(self):
    """Test keras based model with Keras fit but not distribution strategies."""
157
    self._setup()
158
159
    FLAGS.distribution_strategy = 'off'
    FLAGS.num_gpus = 1
160
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
161
162
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
163
164
165
166
167
168
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu_no_dist_strat')
    FLAGS.dtype = 'fp32'
    self._run_and_report_benchmark()

  def benchmark_2_gpu(self):
    """Test keras based model with eager and distribution strategies."""
169
    self._setup()
Toby Boyd's avatar
Toby Boyd committed
170
    FLAGS.num_gpus = 2
171
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
172
173
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
174
    FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
175
    FLAGS.dtype = 'fp32'
176
    FLAGS.enable_eager = True
177
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
178

179
180
  def benchmark_graph_2_gpu(self):
    """Test keras based model with Keras fit and distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
181
    self._setup()
182
    FLAGS.num_gpus = 2
183
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
184
185
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
186
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
187
    FLAGS.dtype = 'fp32'
188
189
    self._run_and_report_benchmark()

190
  @benchmark_wrappers.enable_runtime_flags
191
192
  def _run_and_report_benchmark(self):
    start_time_sec = time.time()
193
    stats = resnet_cifar_main.run(FLAGS)
194
    wall_time_sec = time.time() - start_time_sec
Toby Boyd's avatar
Toby Boyd committed
195

196
    super(Resnet56KerasAccuracy, self)._report_benchmark(
Toby Boyd's avatar
Toby Boyd committed
197
        stats,
198
        wall_time_sec,
Toby Boyd's avatar
Toby Boyd committed
199
200
        top_1_min=MIN_TOP_1_ACCURACY,
        top_1_max=MAX_TOP_1_ACCURACY,
201
        total_batch_size=FLAGS.batch_size,
Toby Boyd's avatar
Toby Boyd committed
202
203
204
205
206
207
208
        log_steps=100)


class Resnet56KerasBenchmarkBase(keras_benchmark.KerasBenchmark):
  """Short performance tests for ResNet56 via Keras and CIFAR-10."""

  def __init__(self, output_dir=None, default_flags=None):
209
    flag_methods = [resnet_cifar_main.define_cifar_flags]
Toby Boyd's avatar
Toby Boyd committed
210
211
212
213
214
215

    super(Resnet56KerasBenchmarkBase, self).__init__(
        output_dir=output_dir,
        flag_methods=flag_methods,
        default_flags=default_flags)

216
  @benchmark_wrappers.enable_runtime_flags
217
218
  def _run_and_report_benchmark(self):
    start_time_sec = time.time()
219
    stats = resnet_cifar_main.run(FLAGS)
220
221
222
223
224
225
226
    wall_time_sec = time.time() - start_time_sec

    super(Resnet56KerasBenchmarkBase, self)._report_benchmark(
        stats,
        wall_time_sec,
        total_batch_size=FLAGS.batch_size,
        log_steps=FLAGS.log_steps)
Toby Boyd's avatar
Toby Boyd committed
227

228
229
  def benchmark_1_gpu(self):
    """Test 1 gpu."""
230
231
232
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
233
    FLAGS.distribution_strategy = 'one_device'
234
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu')
235
236
237
    FLAGS.batch_size = 128
    self._run_and_report_benchmark()

238
239
240
241
242
  def benchmark_1_gpu_xla(self):
    """Test 1 gpu with xla enabled."""
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
243
    FLAGS.run_eagerly = False
244
    FLAGS.enable_xla = True
245
    FLAGS.distribution_strategy = 'one_device'
246
247
248
249
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_xla')
    FLAGS.batch_size = 128
    self._run_and_report_benchmark()

250
251
  def benchmark_graph_1_gpu(self):
    """Test 1 gpu graph."""
Toby Boyd's avatar
Toby Boyd committed
252
253
254
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = False
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
255
    FLAGS.run_eagerly = False
256
    FLAGS.distribution_strategy = 'one_device'
257
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu')
Toby Boyd's avatar
Toby Boyd committed
258
    FLAGS.batch_size = 128
259
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
260

261
262
  def benchmark_1_gpu_no_dist_strat(self):
    """Test 1 gpu without distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
263
264
265
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
266
267
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat')
Toby Boyd's avatar
Toby Boyd committed
268
    FLAGS.batch_size = 128
269
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
270

271
272
  def benchmark_graph_1_gpu_no_dist_strat(self):
    """Test 1 gpu graph mode without distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
273
274
275
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = False
276
277
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu_no_dist_strat')
Toby Boyd's avatar
Toby Boyd committed
278
    FLAGS.batch_size = 128
279
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
280

281
  def benchmark_1_gpu_no_dist_strat_run_eagerly(self):
282
    """Test 1 gpu without distribution strategy and forced eager."""
283
284
285
286
287
288
289
290
291
292
293
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.batch_size = 128
    FLAGS.model_dir = self._get_model_dir(
        'benchmark_1_gpu_no_dist_strat_run_eagerly')
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.run_eagerly = True
    FLAGS.distribution_strategy = 'off'
    self._run_and_report_benchmark()

Toby Boyd's avatar
Toby Boyd committed
294
  def benchmark_2_gpu(self):
295
    """Test 2 gpu."""
Toby Boyd's avatar
Toby Boyd committed
296
297
298
    self._setup()
    FLAGS.num_gpus = 2
    FLAGS.enable_eager = True
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
299
    FLAGS.run_eagerly = False
300
    FLAGS.distribution_strategy = 'mirrored'
301
    FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
302
    FLAGS.batch_size = 128 * 2  # 2 GPUs
303
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
304
305

  def benchmark_graph_2_gpu(self):
306
    """Test 2 gpu graph mode."""
Toby Boyd's avatar
Toby Boyd committed
307
308
309
    self._setup()
    FLAGS.num_gpus = 2
    FLAGS.enable_eager = False
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
310
    FLAGS.run_eagerly = False
311
    FLAGS.distribution_strategy = 'mirrored'
312
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
313
    FLAGS.batch_size = 128 * 2  # 2 GPUs
314
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
315

316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
  def benchmark_cpu(self):
    """Test cpu."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.enable_eager = True
    FLAGS.model_dir = self._get_model_dir('benchmark_cpu')
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_graph_cpu(self):
    """Test cpu graph mode."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.enable_eager = False
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_cpu')
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_cpu_no_dist_strat_run_eagerly(self):
    """Test cpu without distribution strategy and forced eager."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.distribution_strategy = 'off'
    FLAGS.enable_eager = True
    FLAGS.run_eagerly = True
    FLAGS.model_dir = self._get_model_dir(
        'benchmark_cpu_no_dist_strat_run_eagerly')
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_cpu_no_dist_strat(self):
    """Test cpu without distribution strategies."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.enable_eager = True
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir('benchmark_cpu_no_dist_strat')
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

  def benchmark_graph_cpu_no_dist_strat(self):
    """Test cpu graph mode without distribution strategies."""
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.enable_eager = False
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_cpu_no_dist_strat')
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
    self._run_and_report_benchmark()

Toby Boyd's avatar
Toby Boyd committed
371
372
373
374

class Resnet56KerasBenchmarkSynth(Resnet56KerasBenchmarkBase):
  """Synthetic benchmarks for ResNet56 and Keras."""

375
  def __init__(self, output_dir=None, root_data_dir=None, **kwargs):
376
377
378
379
380
    default_flags = {}
    default_flags['skip_eval'] = True
    default_flags['use_synthetic_data'] = True
    default_flags['train_steps'] = 110
    default_flags['log_steps'] = 10
381
    default_flags['use_tensor_lr'] = False
Toby Boyd's avatar
Toby Boyd committed
382

383
    super(Resnet56KerasBenchmarkSynth, self).__init__(
384
        output_dir=output_dir, default_flags=default_flags)
Toby Boyd's avatar
Toby Boyd committed
385
386
387
388
389


class Resnet56KerasBenchmarkReal(Resnet56KerasBenchmarkBase):
  """Real data benchmarks for ResNet56 and Keras."""

390
  def __init__(self, output_dir=None, root_data_dir=None, **kwargs):
391
392
393
394
395
    default_flags = {}
    default_flags['skip_eval'] = True
    default_flags['data_dir'] = os.path.join(root_data_dir, CIFAR_DATA_DIR_NAME)
    default_flags['train_steps'] = 110
    default_flags['log_steps'] = 10
396
    default_flags['use_tensor_lr'] = False
Toby Boyd's avatar
Toby Boyd committed
397

398
    super(Resnet56KerasBenchmarkReal, self).__init__(
399
        output_dir=output_dir, default_flags=default_flags)
400
401
402
403


if __name__ == '__main__':
  tf.test.main()