keras_cifar_benchmark.py 15.4 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
Toby Boyd's avatar
Toby Boyd committed
22
from absl import flags
23
import tensorflow as tf  # pylint: disable=g-bad-import-order
Toby Boyd's avatar
Toby Boyd committed
24

25
from official.benchmark import keras_benchmark
26
from official.utils.testing import benchmark_wrappers
27
from official.benchmark.models import resnet_cifar_main
28

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

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

35

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

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

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

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

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

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

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

79
80
81
82
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
  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()

122
123
124
125
126
127
128
129
130
131
132
133
134
  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()

135
  def benchmark_1_gpu_no_dist_strat_run_eagerly(self):
136
    """Test keras based model w/forced eager and no dist_strat."""
137
138
139
140
141
142
143
144
145
146
147
148
149
    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()

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

162
163
  def benchmark_1_gpu_no_dist_strat_force_v1_path(self):
    """No dist strat forced v1 execution path."""
164
165
166
167
168
169
170
    self._setup()
    FLAGS.distribution_strategy = 'off'
    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(
171
        'benchmark_1_gpu_no_dist_strat_force_v1_path')
Toby Boyd's avatar
Toby Boyd committed
172
173
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
174
    FLAGS.force_v2_in_keras_compile = False
175
176
177
178
    self._run_and_report_benchmark()

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

189
190
  def benchmark_graph_2_gpu(self):
    """Test keras based model with Keras fit and distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
191
    self._setup()
192
    FLAGS.num_gpus = 2
193
    FLAGS.data_dir = self.data_dir
Toby Boyd's avatar
Toby Boyd committed
194
195
    FLAGS.batch_size = 128
    FLAGS.train_epochs = 182
196
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
197
    FLAGS.dtype = 'fp32'
198
199
    self._run_and_report_benchmark()

200
  @benchmark_wrappers.enable_runtime_flags
201
202
  def _run_and_report_benchmark(self):
    start_time_sec = time.time()
203
    stats = resnet_cifar_main.run(FLAGS)
204
    wall_time_sec = time.time() - start_time_sec
Toby Boyd's avatar
Toby Boyd committed
205

206
    super(Resnet56KerasAccuracy, self)._report_benchmark(
Toby Boyd's avatar
Toby Boyd committed
207
        stats,
208
        wall_time_sec,
Toby Boyd's avatar
Toby Boyd committed
209
210
        top_1_min=MIN_TOP_1_ACCURACY,
        top_1_max=MAX_TOP_1_ACCURACY,
211
        total_batch_size=FLAGS.batch_size,
Toby Boyd's avatar
Toby Boyd committed
212
213
214
215
216
217
218
        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):
219
    flag_methods = [resnet_cifar_main.define_cifar_flags]
Toby Boyd's avatar
Toby Boyd committed
220
221
222
223
224
225

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

226
  @benchmark_wrappers.enable_runtime_flags
227
228
  def _run_and_report_benchmark(self):
    start_time_sec = time.time()
229
    stats = resnet_cifar_main.run(FLAGS)
230
231
232
233
234
235
236
    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
237

238
239
  def benchmark_1_gpu(self):
    """Test 1 gpu."""
240
241
242
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
243
    FLAGS.distribution_strategy = 'one_device'
244
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu')
245
246
247
    FLAGS.batch_size = 128
    self._run_and_report_benchmark()

248
249
250
251
252
  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
253
    FLAGS.run_eagerly = False
254
    FLAGS.enable_xla = True
255
    FLAGS.distribution_strategy = 'one_device'
256
257
258
259
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_xla')
    FLAGS.batch_size = 128
    self._run_and_report_benchmark()

260
261
  def benchmark_1_gpu_force_v1_path(self):
    """Test 1 gpu using forced v1 execution path."""
262
263
264
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
265
    FLAGS.distribution_strategy = 'one_device'
266
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_force_v1_path')
267
    FLAGS.batch_size = 128
268
    FLAGS.force_v2_in_keras_compile = False
269
270
    self._run_and_report_benchmark()

271
272
  def benchmark_graph_1_gpu(self):
    """Test 1 gpu graph."""
Toby Boyd's avatar
Toby Boyd committed
273
274
275
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = False
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
276
    FLAGS.run_eagerly = False
277
    FLAGS.distribution_strategy = 'one_device'
278
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_1_gpu')
Toby Boyd's avatar
Toby Boyd committed
279
    FLAGS.batch_size = 128
280
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
281

282
283
  def benchmark_1_gpu_no_dist_strat(self):
    """Test 1 gpu without distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
284
285
286
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = True
287
288
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir('benchmark_1_gpu_no_dist_strat')
Toby Boyd's avatar
Toby Boyd committed
289
    FLAGS.batch_size = 128
290
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
291

292
293
  def benchmark_graph_1_gpu_no_dist_strat(self):
    """Test 1 gpu graph mode without distribution strategies."""
Toby Boyd's avatar
Toby Boyd committed
294
295
296
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.enable_eager = False
297
298
    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
299
    FLAGS.batch_size = 128
300
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
301

302
  def benchmark_1_gpu_no_dist_strat_run_eagerly(self):
303
    """Test 1 gpu without distribution strategy and forced eager."""
304
305
306
307
308
309
310
311
312
313
314
    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()

315
316
  def benchmark_1_gpu_no_dist_strat_force_v1_path(self):
    """No dist strat but forced v1 execution path."""
317
318
319
320
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.batch_size = 128
    FLAGS.model_dir = self._get_model_dir(
321
        'benchmark_1_gpu_no_dist_strat_force_v1_path')
322
323
324
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.distribution_strategy = 'off'
325
    FLAGS.force_v2_in_keras_compile = False
326
327
    self._run_and_report_benchmark()

328
329
  def benchmark_1_gpu_no_dist_strat_force_v1_path_run_eagerly(self):
    """Forced v1 execution path and forced eager."""
330
331
332
333
    self._setup()
    FLAGS.num_gpus = 1
    FLAGS.batch_size = 128
    FLAGS.model_dir = self._get_model_dir(
334
        'benchmark_1_gpu_no_dist_strat_force_v1_path_run_eagerly')
335
336
337
338
    FLAGS.dtype = 'fp32'
    FLAGS.enable_eager = True
    FLAGS.run_eagerly = True
    FLAGS.distribution_strategy = 'off'
339
    FLAGS.force_v2_in_keras_compile = False
340
341
    self._run_and_report_benchmark()

Toby Boyd's avatar
Toby Boyd committed
342
  def benchmark_2_gpu(self):
343
    """Test 2 gpu."""
Toby Boyd's avatar
Toby Boyd committed
344
345
346
    self._setup()
    FLAGS.num_gpus = 2
    FLAGS.enable_eager = True
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
347
    FLAGS.run_eagerly = False
348
    FLAGS.distribution_strategy = 'mirrored'
349
    FLAGS.model_dir = self._get_model_dir('benchmark_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
350
    FLAGS.batch_size = 128 * 2  # 2 GPUs
351
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
352
353

  def benchmark_graph_2_gpu(self):
354
    """Test 2 gpu graph mode."""
Toby Boyd's avatar
Toby Boyd committed
355
356
357
    self._setup()
    FLAGS.num_gpus = 2
    FLAGS.enable_eager = False
A. Unique TensorFlower's avatar
A. Unique TensorFlower committed
358
    FLAGS.run_eagerly = False
359
    FLAGS.distribution_strategy = 'mirrored'
360
    FLAGS.model_dir = self._get_model_dir('benchmark_graph_2_gpu')
Toby Boyd's avatar
Toby Boyd committed
361
    FLAGS.batch_size = 128 * 2  # 2 GPUs
362
    self._run_and_report_benchmark()
Toby Boyd's avatar
Toby Boyd committed
363

364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
  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()

408
409
  def benchmark_cpu_no_dist_strat_force_v1_path(self):
    """Test cpu without dist strat and force v1 in model.compile."""
410
411
412
413
414
    self._setup()
    FLAGS.num_gpus = 0
    FLAGS.enable_eager = True
    FLAGS.distribution_strategy = 'off'
    FLAGS.model_dir = self._get_model_dir(
415
        'benchmark_cpu_no_dist_strat_force_v1_path')
416
417
    FLAGS.batch_size = 128
    FLAGS.data_format = 'channels_last'
418
    FLAGS.force_v2_in_keras_compile = False
419
420
    self._run_and_report_benchmark()

421
422
423
424
425
426
427
428
429
430
431
  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
432
433
434
435

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

436
  def __init__(self, output_dir=None, root_data_dir=None, **kwargs):
437
438
439
440
441
    default_flags = {}
    default_flags['skip_eval'] = True
    default_flags['use_synthetic_data'] = True
    default_flags['train_steps'] = 110
    default_flags['log_steps'] = 10
Toby Boyd's avatar
Toby Boyd committed
442

443
    super(Resnet56KerasBenchmarkSynth, self).__init__(
444
        output_dir=output_dir, default_flags=default_flags)
Toby Boyd's avatar
Toby Boyd committed
445
446
447
448
449


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

450
  def __init__(self, output_dir=None, root_data_dir=None, **kwargs):
451
452
453
454
455
    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
Toby Boyd's avatar
Toby Boyd committed
456

457
    super(Resnet56KerasBenchmarkReal, self).__init__(
458
        output_dir=output_dir, default_flags=default_flags)
459
460
461
462


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