TensorFlow v1.10+加载不同设备放置的SavedModel还是手动设置动态设备放置



因此,在TensorFlow的GPU使用指南中,有一部分是关于以"多塔方式"使用多个GPU的:

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

看到这一点,人们可能会想在自定义Estimator中利用这种风格进行多GPU训练,以向模型表明它可以有效地分布在多个GPU之间。

据我所知,如果没有手动设备放置,TensorFlow就没有某种形式的最佳设备映射(可能是安装了GPU版本,并且有可用的GPU,在CPU上使用它(。那么,你还有什么其他选择呢?

无论如何,您继续训练您的估计器,并通过estimator.export_savedmodel(...)将其导出到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训练一个模型,而一个朋友想在家里用他们的电子GPU运行它,他们可以将'/device:GPU:1''/device:GPU:5'设置为'/device:GPU:0'吗?

  2. 如果1不可能,那么在自定义Estimatormodel_fn中,有没有一种(无痛的(方法可以指定如何通用地分布图?

例如

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

其中,如果有三个或更多GPU,available-gpu-3是第三个可用GPU,否则是第二个或第一个可用GPU;如果没有GPU,则是CPU

这很重要,因为如果有一台共享机器正在训练两个模型,比如'/device:GPU:0'上的一个模型,那么另一个模型在GPU 1和2上明确训练……所以在另一台2 GPU机器上,GPU 2将不可用。。。。

我最近正在对此主题进行一些研究,据我所知,只有在导出原始tensorflow代码中的模型时清除所有设备,并带有标志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()

如果你只有一个导出的模型,似乎是不可能的。你可以参考这个问题。

正如我在stackoverflow问题中所说的那样,我目前正试图找到解决这个问题的方法。希望这个变通方法能帮到你。

最新更新