logger_test.py 9.52 KB
Newer Older
Scott Zhu's avatar
Scott Zhu committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 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.
# ==============================================================================

"""Tests for benchmark logger."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import json
import os
import tempfile
24
import time
25
import unittest
Scott Zhu's avatar
Scott Zhu committed
26

27
from absl import logging
28
29
from absl.testing import flagsaver
import tensorflow as tf
Scott Zhu's avatar
Scott Zhu committed
30

31
from official.r1.utils.logs import logger
32
from official.utils.flags import core as flags_core
33
from official.utils.misc import keras_utils
Scott Zhu's avatar
Scott Zhu committed
34
35
36
37


class BenchmarkLoggerTest(tf.test.TestCase):

38
39
40
41
42
  @classmethod
  def setUpClass(cls):  # pylint: disable=invalid-name
    super(BenchmarkLoggerTest, cls).setUpClass()
    flags_core.define_benchmark()

Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
43
  def test_get_default_benchmark_logger(self):
44
    with flagsaver.flagsaver(benchmark_logger_type="foo"):
45
46
      self.assertIsInstance(logger.get_benchmark_logger(),
                            logger.BaseBenchmarkLogger)
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
47
48

  def test_config_base_benchmark_logger(self):
49
    with flagsaver.flagsaver(benchmark_logger_type="BaseBenchmarkLogger"):
50
51
52
      logger.config_benchmark_logger()
      self.assertIsInstance(logger.get_benchmark_logger(),
                            logger.BaseBenchmarkLogger)
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
53
54

  def test_config_benchmark_file_logger(self):
55
56
    # Set the benchmark_log_dir first since the benchmark_logger_type will need
    # the value to be set when it does the validation.
57
58
    with flagsaver.flagsaver(benchmark_log_dir="/tmp"):
      with flagsaver.flagsaver(benchmark_logger_type="BenchmarkFileLogger"):
59
60
61
62
        logger.config_benchmark_logger()
        self.assertIsInstance(logger.get_benchmark_logger(),
                              logger.BenchmarkFileLogger)

Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
63
64
65
66
67

class BaseBenchmarkLoggerTest(tf.test.TestCase):

  def setUp(self):
    super(BaseBenchmarkLoggerTest, self).setUp()
68
    self._actual_log = logging.info
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
69
70
71
72
73
74
    self.logged_message = None

    def mock_log(*args, **kwargs):
      self.logged_message = args
      self._actual_log(*args, **kwargs)

75
    logging.info = mock_log
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
76
77
78

  def tearDown(self):
    super(BaseBenchmarkLoggerTest, self).tearDown()
79
    logging.info = self._actual_log
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
80
81
82
83
84
85
86
87
88
89
90

  def test_log_metric(self):
    log = logger.BaseBenchmarkLogger()
    log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"})

    expected_log_prefix = "Benchmark metric:"
    self.assertRegexpMatches(str(self.logged_message), expected_log_prefix)


class BenchmarkFileLoggerTest(tf.test.TestCase):

91
  def setUp(self):
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
92
    super(BenchmarkFileLoggerTest, self).setUp()
93
94
95
96
97
98
    # Avoid pulling extra env vars from test environment which affects the test
    # result, eg. Kokoro test has a TF_PKG env which affect the test case
    # test_collect_tensorflow_environment_variables()
    self.original_environ = dict(os.environ)
    os.environ.clear()

Scott Zhu's avatar
Scott Zhu committed
99
  def tearDown(self):
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
100
    super(BenchmarkFileLoggerTest, self).tearDown()
101
    tf.io.gfile.rmtree(self.get_temp_dir())
102
103
    os.environ.clear()
    os.environ.update(self.original_environ)
Scott Zhu's avatar
Scott Zhu committed
104
105
106

  def test_create_logging_dir(self):
    non_exist_temp_dir = os.path.join(self.get_temp_dir(), "unknown_dir")
107
    self.assertFalse(tf.io.gfile.isdir(non_exist_temp_dir))
Scott Zhu's avatar
Scott Zhu committed
108

Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
109
    logger.BenchmarkFileLogger(non_exist_temp_dir)
110
    self.assertTrue(tf.io.gfile.isdir(non_exist_temp_dir))
Scott Zhu's avatar
Scott Zhu committed
111
112
113

  def test_log_metric(self):
    log_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
114
    log = logger.BenchmarkFileLogger(log_dir)
Scott Zhu's avatar
Scott Zhu committed
115
116
117
    log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"})

    metric_log = os.path.join(log_dir, "metric.log")
118
119
    self.assertTrue(tf.io.gfile.exists(metric_log))
    with tf.io.gfile.GFile(metric_log) as f:
Scott Zhu's avatar
Scott Zhu committed
120
121
122
123
124
      metric = json.loads(f.readline())
      self.assertEqual(metric["name"], "accuracy")
      self.assertEqual(metric["value"], 0.999)
      self.assertEqual(metric["unit"], None)
      self.assertEqual(metric["global_step"], 1e4)
125
      self.assertEqual(metric["extras"], [{"name": "name", "value": "value"}])
Scott Zhu's avatar
Scott Zhu committed
126
127
128

  def test_log_multiple_metrics(self):
    log_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
129
    log = logger.BenchmarkFileLogger(log_dir)
Scott Zhu's avatar
Scott Zhu committed
130
131
132
133
    log.log_metric("accuracy", 0.999, global_step=1e4, extras={"name": "value"})
    log.log_metric("loss", 0.02, global_step=1e4)

    metric_log = os.path.join(log_dir, "metric.log")
134
135
    self.assertTrue(tf.io.gfile.exists(metric_log))
    with tf.io.gfile.GFile(metric_log) as f:
Scott Zhu's avatar
Scott Zhu committed
136
137
138
139
140
      accuracy = json.loads(f.readline())
      self.assertEqual(accuracy["name"], "accuracy")
      self.assertEqual(accuracy["value"], 0.999)
      self.assertEqual(accuracy["unit"], None)
      self.assertEqual(accuracy["global_step"], 1e4)
141
      self.assertEqual(accuracy["extras"], [{"name": "name", "value": "value"}])
Scott Zhu's avatar
Scott Zhu committed
142
143
144
145
146
147

      loss = json.loads(f.readline())
      self.assertEqual(loss["name"], "loss")
      self.assertEqual(loss["value"], 0.02)
      self.assertEqual(loss["unit"], None)
      self.assertEqual(loss["global_step"], 1e4)
148
      self.assertEqual(loss["extras"], [])
Scott Zhu's avatar
Scott Zhu committed
149

Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
150
  def test_log_non_number_value(self):
Scott Zhu's avatar
Scott Zhu committed
151
    log_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
152
    log = logger.BenchmarkFileLogger(log_dir)
Scott Zhu's avatar
Scott Zhu committed
153
154
155
156
    const = tf.constant(1)
    log.log_metric("accuracy", const)

    metric_log = os.path.join(log_dir, "metric.log")
157
    self.assertFalse(tf.io.gfile.exists(metric_log))
Scott Zhu's avatar
Scott Zhu committed
158

159
  def test_log_evaluation_result(self):
160
161
162
    eval_result = {"loss": 0.46237424,
                   "global_step": 207082,
                   "accuracy": 0.9285}
163
    log_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
164
165
    log = logger.BenchmarkFileLogger(log_dir)
    log.log_evaluation_result(eval_result)
166
167

    metric_log = os.path.join(log_dir, "metric.log")
168
169
    self.assertTrue(tf.io.gfile.exists(metric_log))
    with tf.io.gfile.GFile(metric_log) as f:
170
171
172
173
174
175
      accuracy = json.loads(f.readline())
      self.assertEqual(accuracy["name"], "accuracy")
      self.assertEqual(accuracy["value"], 0.9285)
      self.assertEqual(accuracy["unit"], None)
      self.assertEqual(accuracy["global_step"], 207082)

176
177
178
179
180
181
      loss = json.loads(f.readline())
      self.assertEqual(loss["name"], "loss")
      self.assertEqual(loss["value"], 0.46237424)
      self.assertEqual(loss["unit"], None)
      self.assertEqual(loss["global_step"], 207082)

182
183
184
  def test_log_evaluation_result_with_invalid_type(self):
    eval_result = "{'loss': 0.46237424, 'global_step': 207082}"
    log_dir = tempfile.mkdtemp(dir=self.get_temp_dir())
Qianli Scott Zhu's avatar
Qianli Scott Zhu committed
185
186
    log = logger.BenchmarkFileLogger(log_dir)
    log.log_evaluation_result(eval_result)
187
188

    metric_log = os.path.join(log_dir, "metric.log")
189
    self.assertFalse(tf.io.gfile.exists(metric_log))
190

191
192
193
194
  def test_collect_tensorflow_info(self):
    run_info = {}
    logger._collect_tensorflow_info(run_info)
    self.assertNotEqual(run_info["tensorflow_version"], {})
195
196
197
198
    self.assertEqual(run_info["tensorflow_version"]["version"],
                     tf.version.VERSION)
    self.assertEqual(run_info["tensorflow_version"]["git_hash"],
                     tf.version.GIT_VERSION)
199

200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
  def test_collect_run_params(self):
    run_info = {}
    run_parameters = {
        "batch_size": 32,
        "synthetic_data": True,
        "train_epochs": 100.00,
        "dtype": "fp16",
        "resnet_size": 50,
        "random_tensor": tf.constant(2.0)
    }
    logger._collect_run_params(run_info, run_parameters)
    self.assertEqual(len(run_info["run_parameters"]), 6)
    self.assertEqual(run_info["run_parameters"][0],
                     {"name": "batch_size", "long_value": 32})
    self.assertEqual(run_info["run_parameters"][1],
                     {"name": "dtype", "string_value": "fp16"})
216
217
218
219
220
221
    v1_tensor = {"name": "random_tensor", "string_value":
                     "Tensor(\"Const:0\", shape=(), dtype=float32)"}
    v2_tensor = {"name": "random_tensor", "string_value":
                     "tf.Tensor(2.0, shape=(), dtype=float32)"}
    self.assertIn(run_info["run_parameters"][2], [v1_tensor, v2_tensor])

222

223
224
225
226
227
228
229
    self.assertEqual(run_info["run_parameters"][3],
                     {"name": "resnet_size", "long_value": 50})
    self.assertEqual(run_info["run_parameters"][4],
                     {"name": "synthetic_data", "bool_value": "True"})
    self.assertEqual(run_info["run_parameters"][5],
                     {"name": "train_epochs", "float_value": 100.00})

230
231
  def test_collect_tensorflow_environment_variables(self):
    os.environ["TF_ENABLE_WINOGRAD_NONFUSED"] = "1"
232
233
    os.environ["TF_OTHER"] = "2"
    os.environ["OTHER"] = "3"
234
235
236
237

    run_info = {}
    logger._collect_tensorflow_environment_variables(run_info)
    self.assertIsNotNone(run_info["tensorflow_environment_variables"])
238
239
240
241
242
243
    expected_tf_envs = [
        {"name": "TF_ENABLE_WINOGRAD_NONFUSED", "value": "1"},
        {"name": "TF_OTHER", "value": "2"},
    ]
    self.assertEqual(run_info["tensorflow_environment_variables"],
                     expected_tf_envs)
244
245

  def test_collect_memory_info(self):
246
    run_info = {"machine_config": {}}
247
    logger._collect_memory_info(run_info)
248
249
    self.assertIsNotNone(run_info["machine_config"]["memory_total"])
    self.assertIsNotNone(run_info["machine_config"]["memory_available"])
250

251

Scott Zhu's avatar
Scott Zhu committed
252
253
if __name__ == "__main__":
  tf.test.main()