Как заставить Google Cloud AI Platform обнаруживать вызовы tf.summary.scalar во время обучения? - PullRequest
2 голосов
/ 28 апреля 2020

(Примечание: я также задавал этот вопрос здесь )

Проблема

Я пытался заставить платформу ИИ Google Cloud отображать точность Кераса модель, обученная на платформе AI. Я настроил настройку гиперпараметра с hptuning_config.yaml, и он работает. Однако я не могу заставить платформу ИИ принимать tf.summary.scalar вызовов во время обучения.

Документация

Я просматриваю следующие страницы документации:

1 , Обзор настройки гиперпараметра

2. Использование настройки гиперпараметра

Согласно [1] :

Как обучение на платформе AI получает ваши метри c Вы можете заметить, что в этой документации нет инструкций по передаче вашего гиперпараметра metri c в службу обучения AI Platform Training. Это связано с тем, что служба отслеживает сводные события TensorFlow, сгенерированные вашим учебным приложением, и извлекает метри c. "

И в соответствии с [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' c в хранилище 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 worker в /tmp/hypertune/*. В Google Cloud ничего нет документация, объясняющая, как это воспринимается платформой ИИ ...

Я что-то упустил, чтобы отобразить tf.summary.scalar событий?

1 Ответ

0 голосов
/ 29 апреля 2020

Мы проверили это в 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

Кажется, идентично вашему коду, за исключением того, что у меня нет доступа к тому, как вы прохождение обратных вызовов. Я помню некоторые проблемы, когда не указывали обратные вызовы напрямую.

Код здесь

...