保存模型时报错
Traceback (most recent call last):
File "./httpserver.py", line 203, in
main_test()
File "./httpserver.py", line 145, in main_test
target_vars=[seg_ids, seg_scores, data_ids], executor=exe)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/io.py", line 1187, in save_inference_model
prepend_feed_ops(main_program, feeded_var_names)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/io.py", line 986, in prepend_feed_ops
out = global_block.var(name)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/framework.py", line 2234, in var
raise ValueError("var %s not in this block" % name)
ValueError: var input_mask_encoder not in this block
核心调用代码如下:
with fluid.program_guard(fluid.default_main_program(), startup_prog):
with fluid.unique_name.guard():
test_graph_vars, seg_ids, seg_scores, data_ids = create_model(
args,
pyreader_name='test_reader',
ernie_config=ernie_config,
is_prediction=args.do_dec)
test_prog = fluid.default_main_program().clone(for_test=True)
exe = fluid.Executor(place)
path = "./infer_model"
exe.run(startup_prog)
fluid.io.save_inference_model(dirname=path, feeded_var_names=['src_ids', "sent_ids","pos_ids", "input_mask", "input_mask_encoder", "tgt_ids", "init_scores", "parent_idx",
"tgt_input_mask", "tgt_start_pos", "data_ids"],
target_vars=[seg_ids, seg_scores, data_ids], executor=exe)
这个变量是存在的, 代码如下:
src_ids = layers.data(name="src_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
sent_ids = layers.data(name="sent_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
pos_ids = layers.data(name="pos_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
input_mask = layers.data(name="input_mask", shape=[-1, args.max_seq_len, args.max_seq_len], dtype='float32',
lod_level=0)
input_mask_encoder = layers.data(name="input_mask_encoder", shape=[-1, args.max_seq_len, args.max_seq_len],
dtype='float32', lod_level=0)
tgt_ids = layers.data(name="tgt_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=2)
init_scores = layers.data(name="init_scores", shape=[-1, 1], dtype='float32', lod_level=2)
parent_idx = layers.data(name="parent_idx", shape=[-1], dtype='int32', lod_level=0)
tgt_input_mask = layers.data(name="tgt_input_mask", shape=[-1, 1, args.max_seq_len], dtype='float32', lod_level=0)
tgt_start_pos = layers.data(name="tgt_start_pos", shape=[-1, 1], dtype='int64', lod_level=0)
data_ids = layers.data(name="data_ids", shape=[-1, -1], dtype='int64', lod_level=0)您好,可能有两个原因导致此问题:
1、变量不存在于 Block 0;
2、变量不在预测模型保存时提供输入输出节点的连通计算图中,在保存模型时被裁剪。
1.怎么确定是由哪个问题导致的?
2.如果不存在于 Block 0, 如何让变量存在于 Block 0?
3.如果变量不在连通计算图中,如何让变量加入到连通计算图中?
保存模型时报错
Traceback (most recent call last):
File "./httpserver.py", line 203, in
main_test()
File "./httpserver.py", line 145, in main_test
target_vars=[seg_ids, seg_scores, data_ids], executor=exe)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/io.py", line 1187, in save_inference_model
prepend_feed_ops(main_program, feeded_var_names)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/io.py", line 986, in prepend_feed_ops
out = global_block.var(name)
File "/run/chenliangyu/title_http/output/python/lib/python2.7/site-packages/paddle/fluid/framework.py", line 2234, in var
raise ValueError("var %s not in this block" % name)
ValueError: var input_mask_encoder not in this block
核心调用代码如下:
with fluid.program_guard(fluid.default_main_program(), startup_prog):
with fluid.unique_name.guard():
test_graph_vars, seg_ids, seg_scores, data_ids = create_model(
args,
pyreader_name='test_reader',
ernie_config=ernie_config,
is_prediction=args.do_dec)
test_prog = fluid.default_main_program().clone(for_test=True)
exe = fluid.Executor(place)
path = "./infer_model"
exe.run(startup_prog)
fluid.io.save_inference_model(dirname=path, feeded_var_names=['src_ids', "sent_ids","pos_ids", "input_mask", "input_mask_encoder", "tgt_ids", "init_scores", "parent_idx",
"tgt_input_mask", "tgt_start_pos", "data_ids"],
target_vars=[seg_ids, seg_scores, data_ids], executor=exe)
这个变量是存在的, 代码如下:
src_ids = layers.data(name="src_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
sent_ids = layers.data(name="sent_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
pos_ids = layers.data(name="pos_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=0)
input_mask = layers.data(name="input_mask", shape=[-1, args.max_seq_len, args.max_seq_len], dtype='float32',
lod_level=0)
input_mask_encoder = layers.data(name="input_mask_encoder", shape=[-1, args.max_seq_len, args.max_seq_len],
dtype='float32', lod_level=0)
tgt_ids = layers.data(name="tgt_ids", shape=[-1, args.max_seq_len, 1], dtype='int64', lod_level=2)
init_scores = layers.data(name="init_scores", shape=[-1, 1], dtype='float32', lod_level=2)
parent_idx = layers.data(name="parent_idx", shape=[-1], dtype='int32', lod_level=0)
tgt_input_mask = layers.data(name="tgt_input_mask", shape=[-1, 1, args.max_seq_len], dtype='float32', lod_level=0)
tgt_start_pos = layers.data(name="tgt_start_pos", shape=[-1, 1], dtype='int64', lod_level=0)
data_ids = layers.data(name="data_ids", shape=[-1, -1], dtype='int64', lod_level=0)