【问题标题】:How to make Google Cloud AI Platform detect `tf.summary.scalar` calls during training?如何让 Google Cloud AI Platform 在训练期间检测到 `tf.summary.scalar` 调用?
【发布时间】:2020-08-12 06:11:08
【问题描述】:

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

问题

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

文档

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

1. Overview of hyperparameter tuning

2。 Using hyperparameter tuning

根据[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 看到这一点)。但是,尽管在 [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 事件,我是否遗漏了什么?

【问题讨论】:

  • 对于cloudml-hypertune 的情况,服务会读取该文件以报告您的作业的超参数调整指标。如果未获取摘要事件,这是报告超参数调整指标的推荐方法。对于tf.summary.scalar 案例,您使用的是哪个运行时版本?此调用仅针对运行时版本 2.1 或更高版本进行监控。
  • 我遇到了同样的问题,不知何故 tf.summary.scalar 似乎没有传播到 hp 调整引擎。我正在使用 runtine 2.1 和 python 3.7。是的,还有其他方法可以将指标直接提供给 HyperTune()。我还意识到 yaml 文件中的“区域”不会传播到例如训练中
  • 我可以在 tensorboard 中看到新指标,其正确名称与 yaml 文件中的名称相同。
  • @rpasricha 谢谢。我正在使用运行时版本 2.1。对于cloudml-hypertune 的情况,您的意思是说AI 平台已预先配置为从副本中的/tmp/hypertune 文件夹中读取?
  • 是的,没错。

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


【解决方案1】:

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

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

  • 它适用于所有人
  • 您可以控制并查看发生的情况(不是黑盒)

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

设置:

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

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

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

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

【讨论】:

【解决方案2】:

我们在 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

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

代码here

【讨论】:

  • 抱歉,我不能让它工作。我也在使用 TF 2.1。我删除了所有回调并完全按照您的方式实现了它,但 AI 平台没有获取该指标。此外(我认为?)您的示例仅记录训练准确性。或者至少,这是我在os.path.join(args.job_dir, 'metric_tb') 指定的路径中看到的唯一文件夹。我也看不出这个回调是如何做的除了我们可以做的事情之外,只需创建一个 TensorBoard 回调而不用在它周围包装一个类。
  • 您也以与文档不同的方式实现了这一点。文档 [2] 创建了一个继承自 tf.keras.callbacks.Callback 的回调,而您正在环绕 tf.keras.callbacks.TensorBoard。如果我在现有的 TensorBoard 回调中包含您的回调,则会收到以下错误:ValueError: Must enable trace before export. 我可以通过删除我的 TensorBoard 回调并添加 super().on_epoch_end(epoch, logs) 以保留 TensorBoard 功能来解决此问题。但这似乎不是很干净,而且正如我上面提到的那样似乎没有必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 2020-03-13
  • 2019-10-22
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多