Использование TF ElasticAverageOptimizer с API tf.estimators

Я хочу добавить Tensorflow ElasticAverageOptimizer к обучению моей модели с использованием метода серверов параметров. В настоящее время модель обучается распределенным способом с использованием .
Я использую Tensorflow v1.15 api tf.estimator для обучения и оценки моделей, создавая собственный оценщик примерно так:

      run_config = tf.estimator.RunConfig(
    save_summary_steps=train_config.save_summary_steps,
    save_checkpoints_steps=train_config.save_checkpoint_steps,
    keep_checkpoint_max=keep_checkpoint_max,
)
train_input_fn = self.generate_input_fn(train_config.input_reader, run_config, False)
profiler_hook = tf.train.ProfilerHook(
      save_steps=train_config.save_profiler_tracing_steps,
      output_dir=os.path.join(job_dir, "tracing"),
      show_dataflow=True,
      show_memory=True)
train_spec = tf.estimator.TrainSpec({"input_fn": train_input_fn, "hooks": [profiler_hook]})
exporters = []
{..some exporter code...}
eval_input_fn = self.generate_input_fn(eval_config.input_reader, run_config, True)
eval_spec = tf.estimator.EvalSpec(eval_input_fn, steps=eval_config.eval_steps, exporters=exporters)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
model_fn = self.generate_model_fn(optimizer_config=train_config.optimizer)
estimator = tf.estimator.Estimator(model_fn=model_fn,
                               config=run_config)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)

Обучение проводится с использованием схемы сервера параметров с 10 узлами PS и примерно 100 рабочими узлами. Я хочу изменить свой код, чтобы добавить оболочку вокруг моего текущего оптимизатора. AdagradOptimizer. Вот текущий соответствующий код из generate_model_fn:

      optimizer = build_optimizer(optimizer_config)
train_op = tf.contrib.layers.optimize_loss(
        loss=loss,
        global_step=tf.compat.v1.train.get_or_create_global_step(),
        learning_rate=None,  # set by the optimizer
        optimizer=optimizer,
        gradient_multipliers=gradient_multipliers,
        clip_gradients=clip_gradients,
        summaries=tf.contrib.layers.OPTIMIZER_SUMMARIES)
return tf.estimator.EstimatorSpec(
        mode=tf.estimator.ModeKeys.TRAIN,
        predictions=debug_predictions,
        loss=loss,
        # Do not train on a master of distributed training.
        train_op=loss if config.is_chief and config.num_ps_replicas else train_op)

Я не уверен, как настроить для ElasticAverageOptimizerдля работы с моим cluster_spec. Пример из документации предоставляет способ настройки пользовательского геттера для одного рабочего сервера и сервера параметров, но я не знаю, как это применить к моему случаю. Я пытался передать одного работника пользовательскому геттеру, но это, похоже, не работает. Вот код:

          cluster_spec = tf_config['cluster']
    worker_device = cluster_spec['worker'][0]
    ea_custom_getter = tf.contrib.opt.ElasticAverageCustomGetter(worker_device)
    num_worker = len(cluster_spec['worker'])
    device_setter = tf.compat.v1.train.replica_device_setter(cluster=cluster_spec, worker_device=worker_device)
    with tf.device(device_setter), tf.variable_scope('',custom_getter=ea_custom_getter):
      ea_opt = tf.contrib.opt.ElasticAverageOptimizer(
        optimizer, num_worker, ea_custom_getter, communication_period=10
      )
      train_op = tf.contrib.layers.optimize_loss(
        loss=loss,
        global_step=tf.compat.v1.train.get_or_create_global_step(),
        learning_rate=None,  # set by the optimizer
        optimizer=ea_opt,
        gradient_multipliers=gradient_multipliers,
        clip_gradients=clip_gradients,
        summaries=tf.contrib.layers.OPTIMIZER_SUMMARIES)

Что приводит к ValueError: Unknown attribute: 'ixqzvi-worker-0.test.svc' in 'ixqzvi-worker-0.test.svc:2222'Я также пытался пройти весь cluster_spec['worker']к ElasticAverageCustomGetter, но это приводит к TypeErrorдля типа списка.

Какие-либо предложения? Спасибо.

0 ответов

Другие вопросы по тегам