train_and_evaluate () размер пакета с TPU в GCMLE - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь использовать TPUEstimator с train_and_evaluate() для эксперимента на GCMLE.У TPUEstimator есть обязательный аргумент train_batch_size, который явно указывает размер пакета.Однако для train_and_evaluate() я также указываю размер пакета через TrainSpec:

train_input = lambda: input_fn(
    filenames = hparams.train_files,
    batch_size = hparams.train_batch_size,
    hparams = hparams,
    num_epochs = hparams.num_epochs, 
    shuffle=True,
    skip_header_lines=1
    )

train_spec = tf.estimator.TrainSpec(train_input, max_steps = hparams.train_steps)

estimator = tpu_estimator.TPUEstimator(
    use_tpu=True,
    model_fn=model_fn,
    config=run_config,
    train_batch_size = hparams.train_batch_size,
    eval_batch_size = hparams.eval_batch_size,
    )
tf.estimator.train_and_evaluate(tpu_estimator, train_spec, eval_spec)

В этом примере учтите, что train_input в пределах train_spec имеет свой собственный определенный batch_size (для чего-то вроде tf.train.batch() или tf.datasets.batch ()), а также train_batch_size является требованием TPUEstimator.

Мне кажется очень неаккуратным, что train_batch_size передается в двух разных местах - является ли рекомендацией просто убедиться, что один и тот же размер партии передается и TPUEstimator, и TrainSpec?Если batch_size в TPUEstimator отличается от batch_size в TrainSpec, переданном в train_and_evaluate(), что предпочтет?Есть ли лучший способ использовать train_and_evaluate () с TPUEstimator, и нет необходимости передавать этот batch_size в двух разных местах?

Кроме того, кажется, что TPUEstimator автоматически создает параметры ['batch_size'], который выглядит как«эффективный размер партии» в соответствии с документацией.Как эффективный размер партии связан с train_batch_size?Если мой train_batch_size равен 1024, будет ли «эффективный размер партии» 128 (из-за 8 ядер)?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Обработка размера партии немного отличается у обычного оценщика и TPUEstimator.

Для нормального Оценщика размер пакета явно не виден Оценщику;напротив, это часть истории input_fn, как это делает ваш пример.

Для TPU размер партии обрабатывается по-разному.В частности, семейство «xxx_batch_size», например, размер пакета поезда, в конструкторе TPUEstimator является глобальным размером пакета для вашей модели.Изменяя tf.contrib.tpu.TPUConfig.per_host_input_for_training, TPUEstimator вызывает ваш input_fn по-разному.

Здесь params ['batch_size'] - это размер пакета сегмента, вычисляемый через train_batch_size в конструкторе,

Конкретный пример: скажем, train_batch_size равен 64, а для Cloud TPU:

  • , если per_host_input_for_training имеет значение False, input_fn будет вызываться 8 раз в Cloud TPU (этоназывается режим на ядро).В этом случае params ['batch_size'] в input_fn равен 64/8 = 8.Общий глобальный размер пакета, который видит ваша модель, равен 64, что является вышеуказанным train_batch_size, переданным через конструктор TPUEstimator.

  • Если для параметра per_host_input_for_training установить значение bool true, params ['batch_size'] в input_fn будетбудет 64 (не 64/8) и input_fn будет вызываться только один раз.Таким образом, общий размер пакета по-прежнему равен 64.

Один и тот же input_fn может работать в обоих случаях.

Для стручков TPU это та же история, что и params ['batch_size'] - размер пакета сегмента по отношению к каждому хосту.

Подводя итог:

  1. Глобальный размер пакета должен быть передан через конструктор TPUEstimator.

  2. Параметр input_fn должен брать размер пакета осколка из параметров ['batch_size'] и соблюдать его для создания набора данных.

Надеюсь, это поможет.

0 голосов
/ 31 мая 2018

Вы должны звонить train и evaluate отдельно вместо train_and_evaluate.train_and_evaluate, похоже, пытается настроить распределенный кластер не так, как train или evaluate индивидуально.

...