7

(注意:我也在这里问过这个问题)

问题

我一直在尝试让 Google Cloud 的 AI 平台显示在 AI 平台上训练的 Keras 模型的准确性。我配置了超参数调整,hptuning_config.yaml它可以工作。但是我无法让 AI 平台tf.summary.scalar在训练期间接听电话。

文档

我一直在关注以下文档页面:

1.超参数调优概述

2.使用超参数调优

根据[1]

AI Platform Training 如何获取您的指标 您可能会注意到,本文档中没有说明将您的超参数指标传递给 AI Platform Training 培训服务。这是因为该服务会监控您的训练应用程序生成的 TensorFlow 摘要事件并检索指标。”

根据[2],生成此类 Tensorflow 汇总事件的一种方法是创建回调类,如下所示:

class MyMetricCallback(tf.keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs=None):
        tf.summary.scalar('metric1', logs['RootMeanSquaredError'], epoch)

我的代码

所以在我的代码中,我包括:

# hptuning_config.yaml

trainingInput:
  hyperparameters:
    goal: MAXIMIZE
    maxTrials: 4
    maxParallelTrials: 2
    hyperparameterMetricTag: val_accuracy
    params:
    - parameterName: learning_rate
      type: DOUBLE
      minValue: 0.001
      maxValue: 0.01
      scaleType: UNIT_LOG_SCALE
# model.py

class MetricCallback(tf.keras.callbacks.Callback):

    def on_epoch_end(self, epoch, logs):
        tf.summary.scalar('val_accuracy', logs['val_accuracy'], epoch)

我什至试过

# model.py

class MetricCallback(tf.keras.callbacks.Callback):
    def __init__(self, logdir):
        self.writer = tf.summary.create_file_writer(logdir)

    def on_epoch_end(self, epoch, logs):
        with writer.as_default():
            tf.summary.scalar('val_accuracy', logs['val_accuracy'], epoch)

它成功地将“val_accuracy”指标保存到 Google 存储中(我也可以通过 TensorBoard 看到这一点)。但这并没有被 AI 平台采纳,尽管在[1]中提出了声明。

部分解决方案:

使用Cloud ML Hypertune包,我创建了以下类:

# model.py

class MetricCallback(tf.keras.callbacks.Callback):
    def __init__(self):
        self.hpt = hypertune.HyperTune()

    def on_epoch_end(self, epoch, logs):
        self.hpt.report_hyperparameter_tuning_metric(
            hyperparameter_metric_tag='val_accuracy',
            metric_value=logs['val_accuracy'],
            global_step=epoch
        )

哪个有效!但我不知道如何,因为它似乎所做的只是写入 AI 平台工作人员上的文件/tmp/hypertune/*。Google Cloud 文档中没有任何内容可以解释 AI 平台是如何发现这一点的……

为了tf.summary.scalar显示事件,我是否遗漏了一些东西?

4

2 回答 2

1

我遇到了同样的问题,我无法让 AI 平台获取 tf.summary.scalar。在过去的 2 个月里,我尝试通过 GCP 支持和 AI 平台工程团队对其进行调试。即使我们使用几乎相同的代码,他们也无法重现该问题。我们甚至进行了一次编码会议,但仍然有不同的结果。

GCP AI Platform Engineering 团队的建议:“不要使用 tf.summary.scalar”主要原因是通过使用其他方法:

  • 它对每个人都很好
  • 您可以控制并查看会发生什么(不是黑匣子)

他们将更新文档以反映这一新建议。

设置:

  • TensorFlow 2.2.0
  • 张量板 2.2.2
  • keras 模型是在 tf.distribute.MirroredStrategy() 范围内创建的
  • TensorBoard 的 keras 回调

通过以下设置,可以观察到“问题”:

  • 当使用带有 update_freq='epoch' 且仅 1 个 epoch 的 TensorBoard

它似乎适用于其他设置。无论如何,我将遵循 GCP 的建议并使用自定义解决方案来避免问题

在此处输入图像描述

于 2020-07-20T17:41:25.357 回答
-1

我们在 TF 2.1 中使用 TF Keras 和 AI Platform 对此进行了测试,并成功运行:

class CustomCallback(tf.keras.callbacks.TensorBoard):
    """Callback to write out a custom metric used by CAIP for HP Tuning."""

    def on_epoch_end(self, epoch, logs=None):  # pylint: disable=no-self-use
        """Write tf.summary.scalar on epoch end."""
        tf.summary.scalar('epoch_accuracy', logs['accuracy'], epoch)

# Setup TensorBoard callback.
custom_cb = CustomCallback(os.path.join(args.job_dir, 'metric_tb'),
                               histogram_freq=1)

# Train model
keras_model.fit(
        training_dataset,
        steps_per_epoch=int(num_train_examples / args.batch_size),
        epochs=args.num_epochs,
        validation_data=validation_dataset,
        validation_steps=1,
        verbose=1,
        callbacks=[custom_cb])
trainingInput:
  hyperparameters:
    goal: MAXIMIZE
    maxTrials: 4
    maxParallelTrials: 2
    hyperparameterMetricTag: epoch_accuracy
    params:
    - parameterName: batch-size
      type: INTEGER
      minValue: 8
      maxValue: 256
      scaleType: UNIT_LINEAR_SCALE
    - parameterName: learning-rate
      type: DOUBLE
      minValue: 0.01
      maxValue: 0.1
      scaleType: UNIT_LOG_SCALE

似乎与您的代码相同,但我无权了解您如何传递回调。我记得在不直接指定回调时看到了一些问题。

代码在这里

于 2020-04-28T21:34:14.663 回答