我已经在多GPU和CPU设置上训练了网络,并将生成的模型保存为张量流SavedModel
。然后,我有另一个脚本可以加载生成的模型并运行所需的操作以进行预测,即对模型进行推断。这适用于模型训练所用的相同设置。
但是,我需要部署模型以在具有1个CPU但没有GPU的设备上运行。当我尝试运行相同的脚本时,出现以下错误:
InvalidArgumentError(请参阅上面的回溯):从检查点还原失败。这很可能是由于当前图形与来自检查点的图形之间的不匹配。请确保您没有更改基于检查点的预期图形。原始错误:
无法为操作default_policy_1 / tower_1 / variable分配设备:节点default_policy_1 / tower_1 / Variable(在restore.py:56定义)已明确分配给/ device:GPU:0 ,但可用设备是[/ job:localhost / replica:0 / task:0 / device:CPU:0,/ job:localhost / replica:0 / task:0 / device:XLA_CPU:0]。确保设备规格引用的是有效设备。 请求的设备似乎是GPU,但未启用CUDA。 [[node default_policy_1 / tower_1 / Variable(在restore.py:56处定义)]]
这看起来很有希望,但是代码完全没有改变我的图表,删除了0个节点-Remove operation graph tensorflow to run on CPU
通常,删除所有仍未在CPU上运行的操作似乎并不明智
我尝试将所有内容包装在with tf.device('CPU:0')
块中,以及使用config = tf.ConfigProto(device_count={'GPU': 0})
,但都没有改变错误。
相关代码:
from tensorflow.python.saved_model import loader
input_tensor_key_feed_dict = {'observations': np.array([[23]]), 'prev_action': np.array([0]),
'prev_reward': np.array([0]), 'is_training': False}
config = tf.ConfigProto(device_count={'GPU': 0})
with tf.device('CPU:0'):
with session.Session(None, graph=ops_lib.Graph(), config=config) as sess:
loader.load(sess, tag_set.split(','), saved_model_dir) #error occurs here
outputs = sess.run(output_tensor_names_sorted, feed_dict=inputs_feed_dict)
for i, output in enumerate(outputs):
output_tensor_key = output_tensor_keys_sorted[i]
print('Result for output key %s:\t%s' % (output_tensor_key, output))
答案 0 :(得分:1)
我将初始化一个没有设备规格的新模型,然后仅加载模型变量,因为它将成为带有tf.Saver()的标准训练检查点。此时,您应该能够保存SavedModel的版本,tensorflow可以为该版本决定将操作放置在何处。