如何使Google Cloud AI平台在训练过程中检测到“ tf.summary.scalar”调用?

时间:2020-04-28 12:20:22

标签: tensorflow keras google-cloud-platform google-cloud-ml gcp-ai-platform-training

(注意:我也问过这个问题here

问题

我一直在尝试获取Google Cloud的AI平台,以显示经过AI平台培训的Keras模型的准确性。我使用hptuning_config.yaml配置了超参数调整,并且可以正常工作。但是,我无法在训练期间使用AI平台接听tf.summary.scalar个电话。

文档

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

1。 Overview of hyperparameter tuning

2。 Using hyperparameter tuning

根据 [1]

AI平台培训如何获取指标 您可能会注意到,本文档中没有关于将超参数指标传递给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中看到它)。但是,尽管 [1] 提出了要求,但AI平台并没有意识到这一点。

部分解决方案:

使用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
        )

有效!但是我不知道如何做,因为它似乎要做的就是在/tmp/hypertune/*的AI平台 worker 上写入文件。 Google Cloud文档中没有任何内容可以解释AI平台是如何获取它的...

我是否想丢失一些东西以便显示tf.summary.scalar事件?

2 个答案:

答案 0 :(得分:1)

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

GCP AI平台工程团队的建议:“不要使用tf.summary.scalar” ,主要原因是使用其他方法:

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

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

设置:

  • Tensoflow 2.2.0
  • TensorBoard 2.2.2
  • keras模型在tf.distribute.MirroredStrategy()范围内创建
  • TensorBoard的
  • keras回调

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

  • 将TensorBoard与update_freq ='epoch'一起使用且仅具有1个历元时

似乎可以与其他设置一起使用。无论如何,我将遵循GCP的建议,并使用自定义解决方案来避免出现问题

enter image description here

答案 1 :(得分:-1)

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

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

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

代码here