TensorFlow v1.10 + загрузить SavedModel с другим расположением устройства или вручную установить динамическое размещение устройства? - PullRequest
0 голосов
/ 18 ноября 2018

Таким образом, в руководстве TensorFlow по использованию графических процессоров есть часть об использовании нескольких графических процессоров «в режиме нескольких башен»:

...
for d in ['/device:GPU:2', '/device:GPU:3']:
  with tf.device(d): # <---- manual device placement
...

Видя это, можно испытать желание использовать этот стиль для обучения нескольких графических процессоров в пользовательском Estimator, чтобы указать модели, что он может эффективно распределяться между несколькими графическими процессорами.

Насколько мне известно, если ручное размещение устройства отсутствует, TensorFlow не имеет какой-либо формы оптимального сопоставления устройств (возможно, если у вас установлена ​​версия для графического процессора и доступен графический процессор, используя его поверх центрального процессора). Так какой у тебя есть другой выбор?

В любом случае, вы продолжаете тренировку своего оценщика и экспортируете его в SavedModel через estimator.export_savedmodel(...) и хотите использовать этот SavedModel позже ... возможно, на другой машине, на которой может быть не так много графических процессоров. как устройство, на котором обучалась модель (или, возможно, без графических процессоров)

поэтому при запуске

from tensorflow.contrib import predictor
predict_fn = predictor.from_saved_model(model_dir)

вы получите

Cannot assign a device for operation <OP-NAME>. Operation was 
explicitly assigned to <DEVICE-NAME> but available devices are 
[<AVAILABLE-DEVICE-0>,...]

старше С.О. Пост предполагает, что изменение размещения устройства было невозможно ... но, надеюсь, со временем все изменилось.

Таким образом, мой вопрос:

  1. при загрузке SavedModel можно ли изменить расположение устройства в соответствии с устройством, на котором оно загружено. Например. если я обучаю модель с 6 графическими процессорами, а друг хочет запустить ее дома со своим электронным графическим процессором, могут ли они установить '/device:GPU:1' через '/device:GPU:5' на '/device:GPU:0'?

  2. , если 1 не представляется возможным, есть ли для меня (безболезненный) способ в пользовательском Estimator model_fn указать, как в общем случае распределять график?

например.

with tf.device('available-gpu-3')

где available-gpu-3 - третий доступный графический процессор, если имеется три или более графических процессора, в противном случае второй или первый доступный графический процессор, а если графического процессора нет, то это процессор

Это имеет значение, потому что если есть общая машина, с которой обучается две модели, скажем, одна модель на '/device:GPU:0', то другая модель обучается явно на GPU 1 и 2 ... так что на другой машине с 2 GPU, GPU 2 будет недоступно ....

1 Ответ

0 голосов
/ 21 ноября 2018

В последнее время я изучаю эту тему, и, насколько мне известно, ваш вопрос 1 может сработать, только если вы очистите все устройства при экспорте модели в исходном коде тензорного потока с флагом clear_devices=True.

.

В моем собственном коде это выглядит как

builder = tf.saved_model.builder.SavedModelBuilder('osvos_saved')
builder.add_meta_graph_and_variables(sess, ['serve'], clear_devices=True)
builder.save()

Если у вас есть только экспортированная модель, кажется, что это невозможно. Вы можете обратиться к этой проблеме .

В настоящее время я пытаюсь найти способ исправить это, как указано в моем вопросе stackoverflow . Надеюсь, что обходной путь может помочь вам.

...