Использование 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
для типа списка.
Какие-либо предложения? Спасибо.