TensorFlow v1.10 +是否使用不同的设备放置位置加载SavedModel或手动设置动态设备放置位置?

时间:2018-11-17 23:31:31

标签: python tensorflow tensorflow-serving tensorflow-estimator

因此,在TensorFlow的GPUs使用指南中,有一部分涉及以“多塔式”方式使用多个GPU:

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

看到这一点,可能会想将这种样式用于自定义Estimator中的多个GPU训练,以向模型指示它可以有效地分布在多个GPU中。

据我所知,如果没有手动放置设备,TensorFlow不会具有某种形式的最佳设备映射(可能是如果您安装了GPU版本并且可用GPU,并且可以通过CPU使用它)。那么您还有什么选择?

无论如何,您要继续训练估算器,然后通过SavedModel将其导出到estimator.export_savedmodel(...),并希望以后再使用此SavedModel……也许是在另一台机器上,可能没有训练模型的设备那么多的GPU(或者可能没有GPU)

所以当您运行

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>,...]

较老的S.O. Post表示无法更改设备的位置...但是随着时间的推移,希望情况有所改变。

所以我的问题是:

  1. 在加载SavedModel时,我可以更改设备位置以适合其加载的设备。例如。如果我使用6个GPU训练模型,而朋友想使用其e-GPU在家里运行,他们可以将'/device:GPU:1''/device:GPU:5'设置为'/device:GPU:0'吗?

  2. 如果不可能 1 ,在自定义Estimator的{​​{1}}中,我是否有(无痛)方式指定通用方式分发图?

例如

model_fn

其中with tf.device('available-gpu-3') 是存在三个或三个以上GPU的第三个可用GPU,否则是第二个或第一个可用GPU,如果没有GPU,则为CPU

这很重要,因为如果有一台共享的机器正在训练两个模型,例如在available-gpu-3上训练一个模型,则另一个模型在GPU 1和GPU 2上被明确训练...因此在另外2个GPU机器上,GPU 2将不可用。...

1 个答案:

答案 0 :(得分:1)

我最近正在对该主题进行一些研究,据我所知,只有当您在原始张量流代码中导出带有标志clear_devices=True的模型时,清除所有设备时,问题1才能起作用。

在我自己的代码中,看起来像

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

如果只有导出的模型,则似乎不可能。您可以参考this issue

我目前正在尝试解决此问题的方法,如我的stackoverflow question中所述。希望解决方法可以为您提供帮助。