因此,在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表示无法更改设备的位置...但是随着时间的推移,希望情况有所改变。
所以我的问题是:
在加载SavedModel
时,我可以更改设备位置以适合其加载的设备。例如。如果我使用6个GPU训练模型,而朋友想使用其e-GPU在家里运行,他们可以将'/device:GPU:1'
到'/device:GPU:5'
设置为'/device:GPU:0'
吗?
如果不可能 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将不可用。...
答案 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中所述。希望解决方法可以为您提供帮助。