因此,在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表示,改变设备位置是不可能的。。。但希望随着时间的推移,情况有所改变。
因此,我的问题是:
加载
SavedModel
时,我可以更改设备位置以适合加载的设备吗?例如,如果我用6个GPU训练一个模型,而一个朋友想在家里用他们的电子GPU运行它,他们可以将'/device:GPU:1'
到'/device:GPU:5'
设置为'/device:GPU:0'
吗?如果1不可能,那么在自定义
Estimator
的model_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问题中所说的那样,我目前正试图找到解决这个问题的方法。希望这个变通方法能帮到你。