ParameterServerStrategy TensorFlow не работает должным образом
Я хочу обучить модель с помощью ParameterServerStrategy, предоставляемого TensorFlow для API-интерфейса оценщика. Принимая во внимание учебник, я реализовал следующий код (я прилагаю часть кода, которая является важной):
strategy = tf.distribute.experimental.ParameterServerStrategy()
server = tf.distribute.Server(
config_json['cluster'], #earlier a config_json for setting TF_CONFIG to env. variables
job_name = job_type, # job_type ps/ worker depending on task
task_index = job_index # corresponding job_index
)
if job_type == 'ps':
server.join()
else:
# Datasets is a class where I create necessary input pipelines with the dataset api
train_input_fn = lambda : Datasets.get_train_data_pipeline_from_tensors(...)
valid_input_fn = lambda : Datasets.get_valid_data_pipeline_from_tensors(...)
run_config = tf.estimator.RunConfig(
save_checkpoints_steps=steps_per_epoch,
log_step_count_steps=steps_per_epoch,
model_dir=<hdfs_path>, # Model checkpoints are made on a hdfs folder
train_distribute=strategy
)
keras_model = ...
estimator = tf.keras.estimator.model_to_estimator(
keras_model=keras_model,
config=run_config
)
train_spec = tf.estimator.TrainSpec(
train_input_fn, max_steps=epochs*steps_per_epoch
)
eval_spec = tf.estimator.EvalSpec(
valid_input_fn, steps=validation_steps
)
tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
Запустив приведенный выше код на моем собственном кластере, имея активное выполнение на TensorFlow v2.3, включенном по умолчанию, я заметил следующее:
- По умолчанию он работает в режиме распределенного координатора INDEPENDENT_WORKER (я полагаю, это правильно, поскольку другой относится к удаленному кластеру, поскольку я не отправляю код другому удаленному кластеру)
- Мониторинг с помощью ганглиев, кажется, что серверы параметров на самом деле не работают (и процессор, и память почти равны нулю). Соответствующий процесс python постоянно спит, как будто он не нужен. Сеть кластера также равна нулю, что указывает на отсутствие связи.
- Каждый воркер работает, но использует только один процессор из 4 (кластер не содержит графических процессоров).
Подводя итог, мои вопросы следующие:
- Как можно не использовать машины с сервером параметров в настройке? Есть ли в приведенном выше коде очевидные ошибки / отсутствующие параметры?
- Как я могу настроить рабочие задачи на использование всех ядер ЦП? Я пробовал с inter/ra_op_parallelism_threads с помощью ConfigProtos, но разницы нет. Я также заметил, что в списке физических устройств отображается только один процессор.
Заранее спасибо за помощь!